Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/charisee/src/compiler/high-to-mid/split.sml
ViewVC logotype

Diff of /branches/charisee/src/compiler/high-to-mid/split.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3165, Sun Mar 29 19:06:39 2015 UTC revision 3166, Sun Mar 29 20:00:49 2015 UTC
# Line 31  Line 31 
31    
32      in      in
33    
34        val numFlag=1   (*remove common subexpression*)
35      val testing=0      val testing=0
36      fun setEin(params,index,body)=Ein.EIN{params=params, index=index, body=body}      fun setEin(params,index,body)=Ein.EIN{params=params, index=index, body=body}
37      fun assignEinApp(y,params,index,body,args)= (y,DstIL.EINAPP(setEin(params,index,body),args))      fun assignEinApp(y,params,index,body,args)= (y,DstIL.EINAPP(setEin(params,index,body),args))
# Line 43  Line 44 
44      fun filterSca e=Filter.filterSca e      fun filterSca e=Filter.filterSca e
45      fun err str=raise Fail str      fun err str=raise Fail str
46      val cnt = ref 0      val cnt = ref 0
47        fun incUse (DstIL.V{useCnt, ...}) = (useCnt := !useCnt + 1)
48      fun genName prefix = let      fun genName prefix = let
49          val n = !cnt          val n = !cnt
50      in      in
# Line 54  Line 56 
56          | _ =>(print(String.concat n);1)          | _ =>(print(String.concat n);1)
57          (*end case*))          (*end case*))
58    
   
59      (* lift:ein_app*params*index*sum_id*args-> (ein_exp* params*args*code)      (* lift:ein_app*params*index*sum_id*args-> (ein_exp* params*args*code)
60      *lifts expression and returns replacement tensor      *lifts expression and returns replacement tensor
61      * cleans the index and params of subexpression      * cleans the index and params of subexpression
62      *creates new param and replacement tensor for the original ein_exp      *creates new param and replacement tensor for the original ein_exp
63      *)      *)
64      fun lift(name,e,params,index,sx,args)=let      fun lift(name,e,params,index,sx,args,fieldset,flag)=let
   
65          val (tshape,sizes,body)=cleanIndex(e,index,sx)          val (tshape,sizes,body)=cleanIndex(e,index,sx)
66          val id=length(params)          val id=length(params)
67          val Rparams=params@[E.TEN(1,sizes)]          val Rparams=params@[E.TEN(1,sizes)]
# Line 69  Line 69 
69          val M  = DstV.new (genName (name^"_l_"^itos id), DstTy.TensorTy sizes)          val M  = DstV.new (genName (name^"_l_"^itos id), DstTy.TensorTy sizes)
70          val Rargs=args@[M]          val Rargs=args@[M]
71          val einapp=cleanParams(M,body,Rparams,sizes,Rargs)          val einapp=cleanParams(M,body,Rparams,sizes,Rargs)
72            val (_,einapp0)=einapp
73            val (Rargs,newbies,fieldset) =(case flag
74                of 1=> let
75                    val (fieldset,var) = einSet.rtnVar(fieldset,M,einapp0)
76                    in (case var
77                        of NONE=> (args@[M],[einapp],fieldset)
78                        | SOME v=> (incUse v ;(args@[v],[],fieldset))
79                        (*end case*))
80                    end
81                | _=>(args@[M],[einapp],fieldset)
82                  (*end case*))
83      in      in
84          (Re,Rparams,Rargs,[einapp])              (Re,Rparams,Rargs,newbies,fieldset)
85      end      end
86    
87    
88      (* isOp: ein->int      (* isOp: ein->int
89       * checks to see if this sub-expression is pulled out or split form original       * checks to see if this sub-expression is pulled out or split form original
90       * 0-becomes zero,1-remains the same, 2-operator       * 0-becomes zero,1-remains the same, 2-operator
# Line 104  Line 115 
115          | _           => 2          | _           => 2
116      (*end case*))      (*end case*))
117    
118    
119    
120        fun rewriteOp3(name,sx,e1,x)=let
121            val ((y, DstIL.EINAPP(ein,args)),fieldset,flag)=x
122            val params=Ein.params ein
123            val index=Ein.index ein
124            in (case (isOp e1)
125                of  0   => (E.Const 0,params,args,[],fieldset)
126                | 1     => lift(name,e1,params,index,sx,args,fieldset,flag)
127                | 2     => (e1,params,args,[],fieldset)
128                (*end*))
129            end
130    
131      (* rewriteOp:ein_exp*params*index*args-> ein_exp*params*args*code      (* rewriteOp:ein_exp*params*index*args-> ein_exp*params*args*code
132       * If e1 an op then call lift() to replace it       * If e1 an op then call lift() to replace it
      * Otherwise rewrite to 0 or it remains the same  
133       *)       *)
134      fun rewriteOp(name,e1,params,index,sx,args)=(case (isOp e1)      fun rewriteOp(name,e1,params,index,sx,args,fieldset,flag)=(case (isOp e1)
135          of  0   => (E.Const 0,params,args,[])          of  0   => (E.Const 0,params,args,[],fieldset)
136          | 2     => (e1,params,args,[])          | 1     => lift(name,e1,params,index,sx,args,fieldset,flag)
137          | _     =>   lift(name,e1,params,index,sx,args)          | 2     => (e1,params,args,[],fieldset)             (*not lifted*)
138          (*end*))          (*end*))
139    
     (* rewriteOps:ein_exp list*params*index*sum_id list*mid-il vars  
            -> ein_exp list*params*args*code  
      * calls rewriteOp on ein_exp list  
      *)  
     fun rewriteOps(name,list1,params,index,sx,args)=let  
         fun m([],rest,params,args,code)=(rest,params,args,code)  
         | m(e1::es,rest,params,args,code)=let  
140    
141              val (e1',params',args',code')= rewriteOp(name,e1,params,index,sx,args)  
142              (*val _ =testp["rewriteOP:\n",P.printbody e1,"\n\t=>", P.printbody e1']*)  
143        fun rewriteOps(name,list1,params,index,sx,args,fieldset0,flag)=let
144            fun m([],rest,params,args,code,fieldset)=(rest,params,args,code,fieldset)
145            | m(e1::es,rest,params,args,code,fieldset)=let
146    
147                val (e1',params',args',code',fieldset)= rewriteOp(name,e1,params,index,sx,args,fieldset,flag)
148              in              in
149                  m(es,rest@[e1'],params',args',code@code')                  m(es,rest@[e1'],params',args',code@code',fieldset)
150              end              end
151          in          in
152              m(list1,[],params,args,[])                  m(list1,[],params,args,[],fieldset0)
153          end          end
154    
155    
156      (*rewriteOrig: var* ein_exp* params*index list*mid-il vars      (*rewriteOrig: var* ein_exp* params*index list*mid-il vars
157             When the operation is zero then we return a real.             When the operation is zero then we return a real.
158          -Moved is Zero to before split.          -Moved is Zero to before split.
159      *)      *)
160      fun rewriteOrig(y,body,params,index,sx,args) =cleanParams(y,body,params,index,args)      fun rewriteOrig(y,body,params,index,sx,args) =cleanParams(y,body,params,index,args)
161    
162        fun rewriteOrig3(sx,body,params,args,x) =let
163            val ((y,DstIL.EINAPP(ein,_)),_,_)=x
164            val index=Ein.index ein
165            in  cleanParams(y,body,params,index,args)
166            end
167    
168      (* handleNeg:var*ein_exp *params*index*args-> (var*einap)*code      (* handleNeg:var*ein_exp *params*index*args-> (var*einap)*code
169      * calls rewriteOp() lift  on ein_exp      * calls rewriteOp() lift  on ein_exp
170      *)      *)
171      fun handleNeg(y,e1,params,index,args)=let      fun handleNeg(e1,x)=let
172          val (e1',params',args',code)=  rewriteOp("neg", e1,params,index,[],args)          val (e1',params',args',code,fieldset)=  rewriteOp3("neg",[],e1,x)
173          val body =E.Neg e1'          val body' =E.Neg e1'
174          val einapp= rewriteOrig(y,body,params',index,[],args')          val einapp= rewriteOrig3([],body',params',args',x)
175          in          in
176              (einapp,code)              (einapp,code,fieldset)
177          end          end
178    
179      (* handleSqrt:var*ein_exp *params*index*args-> (var*einap)*code      (* handleSqrt:var*ein_exp *params*index*args-> (var*einap)*code
180      * calls rewriteOp() lift  on ein_exp      * calls rewriteOp() lift  on ein_exp
181      *)      *)
182      fun handleSqrt(y,e1,params,index,args)=let      fun handleSqrt(y,e1,params,index,args,fieldset,flag)=let
183          val (e1',params',args',code)=  rewriteOp("sqrt", e1,params,index,[],args)          val (e1',params',args',code,fieldset)=  rewriteOp("sqrt", e1,params,index,[],args,fieldset,flag)
184          val body =E.Sqrt e1'          val body =E.Sqrt e1'
185          val einapp= rewriteOrig(y,body,params',index,[],args')          val einapp= rewriteOrig(y,body,params',index,[],args')
186      in      in
187          (einapp,code)          (einapp,code,fieldset)
188      end      end
189    
190    
191      (* handleCosine:var*ein_exp *params*index*args-> (var*einap)*code      (* handleCosine:var*ein_exp *params*index*args-> (var*einap)*code
192      * calls rewriteOp() lift  on ein_exp      * calls rewriteOp() lift  on ein_exp
193      *)      *)
194      fun handleCosine(y,e1,params,index,args)=let      fun handleCosine(y,e1,params,index,args,fieldset,flag)=let
195          val (e1',params',args',code)=  rewriteOp("cosine", e1,params,index,[],args)          val (e1',params',args',code,fieldset)=  rewriteOp("cosine", e1,params,index,[],args,fieldset,flag)
196          val body =E.Cosine e1'          val body =E.Cosine e1'
197          val einapp= rewriteOrig(y,body,params',index,[],args')          val einapp= rewriteOrig(y,body,params',index,[],args')
198          in          in
199              (einapp,code)              (einapp,code,fieldset)
200      end      end
201    
202      (* handleArcCosine:var*ein_exp *params*index*args-> (var*einap)*code      (* handleArcCosine:var*ein_exp *params*index*args-> (var*einap)*code
203      * calls rewriteOp() lift  on ein_exp      * calls rewriteOp() lift  on ein_exp
204      *)      *)
205      fun handleArcCosine(y,e1,params,index,args)=let      fun handleArcCosine(y,e1,params,index,args,fieldset,flag)=let
206          val (e1',params',args',code)=  rewriteOp("ArcCosine", e1,params,index,[],args)          val (e1',params',args',code,fieldset)=  rewriteOp("ArcCosine", e1,params,index,[],args,fieldset,flag)
207          val body =E.ArcCosine e1'          val body =E.ArcCosine e1'
208          val einapp= rewriteOrig(y,body,params',index,[],args')          val einapp= rewriteOrig(y,body,params',index,[],args')
209          in          in
210              (einapp,code)              (einapp,code,fieldset)
211      end      end
212    
213      (* handleSine:var*ein_exp *params*index*args-> (var*einap)*code      (* handleSine:var*ein_exp *params*index*args-> (var*einap)*code
214      * calls rewriteOp() lift  on ein_exp      * calls rewriteOp() lift  on ein_exp
215      *)      *)
216      fun handleSine(y,e1,params,index,args)=let      fun handleSine(y,e1,params,index,args,fieldset,flag)=let
217          val (e1',params',args',code)=  rewriteOp("sine", e1,params,index,[],args)          val (e1',params',args',code,fieldset)=  rewriteOp("sine", e1,params,index,[],args,fieldset,flag)
218          val body =E.Sine e1'          val body =E.Sine e1'
219          val einapp= rewriteOrig(y,body,params',index,[],args')          val einapp= rewriteOrig(y,body,params',index,[],args')
220          in          in
221              (einapp,code)              (einapp,code,fieldset)
222      end      end
223    
224      (* handleSine:var*ein_exp *params*index*args-> (var*einap)*code      (* handleSine:var*ein_exp *params*index*args-> (var*einap)*code
225      * calls rewriteOp() lift  on ein_exp      * calls rewriteOp() lift  on ein_exp
226      *)      *)
227      fun handleArcSine(y,e1,params,index,args)=let      fun handleArcSine(y,e1,params,index,args,fieldset,flag)=let
228      val (e1',params',args',code)=  rewriteOp("ArcSine", e1,params,index,[],args)          val (e1',params',args',code,fieldset)=  rewriteOp("ArcSine", e1,params,index,[],args,fieldset,flag)
229      val body =E.ArcSine e1'      val body =E.ArcSine e1'
230      val einapp= rewriteOrig(y,body,params',index,[],args')      val einapp= rewriteOrig(y,body,params',index,[],args')
231      in      in
232      (einapp,code)              (einapp,code,fieldset)
     end  
   
   
     (* handlePowInt:var*ein_exp *params*index*args-> (var*einap)*code  
     * calls rewriteOp() lift  on ein_exp  
     *)  
     fun handlePowInt(y,(e1,n1),params,index,args)=let  
         val (e1',params',args',code)=  rewriteOp("powint", e1,params,index,[],args)  
         val body =E.PowInt(e1',n1)  
         val einapp= rewriteOrig(y,body,params',index,[],args')  
         in  
             (einapp,code)  
         end  
   
   
     (* handlePowReal:var*ein_exp *params*index*args-> (var*einap)*code  
     * calls rewriteOp() lift  on ein_exp  
     *)  
     fun handlePowReal(y,(e1,n1),params,index,args)=let  
     val (e1',params',args',code)=  rewriteOp("powreal", e1,params,index,[],args)  
     val body =E.PowReal(e1',n1)  
     val einapp= rewriteOrig(y,body,params',index,[],args')  
     in  
     (einapp,code)  
233      end      end
234    
235    
236     (* handleSub:var*ein_exp*ein_exp *params*index*args-> (var*einap)*code     (* handleSub:var*ein_exp*ein_exp *params*index*args-> (var*einap)*code
237      * calls rewriteOps() lift  on ein_exp      * calls rewriteOps() lift  on ein_exp
238      *)      *)
239      fun handleSub(y,e1,e2,params,index,args)=let      fun handleSub(y,e1,e2,params,index,args,fieldset,flag)=let
240          val ([e1',e2'],params',args',code)=  rewriteOps("subt",[e1,e2],params,index,[],args)          val ([e1',e2'],params',args',code,fieldset)=  rewriteOps("subt",[e1,e2],params,index,[],args,fieldset,flag)
241          val body =E.Sub(e1',e2')          val body =E.Sub(e1',e2')
242          val einapp= rewriteOrig(y,body,params',index,[],args')          val einapp= rewriteOrig(y,body,params',index,[],args')
243          in          in
244              (einapp,code)              (einapp,code,fieldset)
245          end          end
246    
247      (* handleDiv:var*ein_exp *ein_exp*params*index*args-> (var*einap)*code      (* handleDiv:var*ein_exp *ein_exp*params*index*args-> (var*einap)*code
248      * calls rewriteOp() lift  on ein_exp      * calls rewriteOp() lift  on ein_exp
249      *)      *)
250      fun handleDiv(y,e1,e2,params,index,args)=let      fun handleDiv(y,e1,e2,params,index,args,fieldset,flag)=let
251          val (e1',params1',args1',code1')=rewriteOp("div-num",e1,params,index,[],args)          val (e1',params1',args1',code1',fieldset)=rewriteOp("div-num",e1,params,index,[],args,fieldset,flag)
252          val (e2',params2',args2',code2')=rewriteOp("div-denom",e2,params1',index,[],args1')          val (e2',params2',args2',code2',fieldset)=rewriteOp("div-denom",e2,params1',index,[],args1',fieldset,flag)
         (*val (e2',params2',args2',code2')=rewriteOp("div-denom",e2,params1',[],[],args1')*)  
253          val body =E.Div(e1',e2')          val body =E.Div(e1',e2')
254          val einapp= rewriteOrig(y,body,params2',index,[],args2')          val einapp= rewriteOrig(y,body,params2',index,[],args2')
255          in          in
256                  (einapp,code1'@code2')                  (einapp,code1'@code2',fieldset)
257          end          end
258    
259      (* handleAdd:var*ein_exp list *params*index*args-> (var*einap)*code      (* handleAdd:var*ein_exp list *params*index*args-> (var*einap)*code
260      * calls rewriteOps() lift  on ein_exp      * calls rewriteOps() lift  on ein_exp
261      *)      *)
262      fun handleAdd(y,e1,params,index,args)=let      fun handleAdd(y,e1,params,index,args,fieldset,flag)=let
263    
264          val (e1',params',args',code)=  rewriteOps("add",e1,params,index,[],args)          val (e1',params',args',code,fieldset)=  rewriteOps("add",e1,params,index,[],args,fieldset,flag)
265          val body =E.Add e1'          val body =E.Add e1'
266          val einapp= rewriteOrig(y,body,params',index,[],args')          val einapp= rewriteOrig(y,body,params',index,[],args')
267          in          in
268              (einapp,code)              (einapp,code,fieldset)
269          end          end
270    
271      (* handleProd:var*ein_exp list*params*index*args-> (var*einap)*code      (* handleProd:var*ein_exp list*params*index*args-> (var*einap)*code
272       * calls rewriteOps() lift  on ein_exp       * calls rewriteOps() lift  on ein_exp
273       *)       *)
274      fun handleProd(y,e1,params,index,args)=let      fun handleProd(y,e1,params,index,args,fieldset,flag)=let
275          val (e1',params',args',code)=  rewriteOps("prod",e1,params,index,[],args)          val (e1',params',args',code,fieldset)=  rewriteOps("prod",e1,params,index,[],args,fieldset,flag)
276          val body =E.Prod e1'          val body =E.Prod e1'
277          val einapp= rewriteOrig(y,body,params',index,[],args')          val einapp= rewriteOrig(y,body,params',index,[],args')
278          in          in
279              (einapp,code)              (einapp,code,fieldset)
280          end          end
281    
282     (* handleSumProd:var*ein_exp *params*index*args-> (var*einap)*code     (* handleSumProd:var*ein_exp *params*index*args-> (var*einap)*code
283      * calls rewriteOps() lift  on ein_exp      * calls rewriteOps() lift  on ein_exp
284      *)      *)
285      fun handleSumProd(y,e1,params,index,sx,args)=let      fun handleSumProd(y,e1,params,index,sx,args,fieldset,flag)=let
286          val (e1',params',args',code)=  rewriteOps("sumprod",e1,params,index,sx,args)          val (e1',params',args',code,fieldset)=  rewriteOps("sumprod",e1,params,index,sx,args,fieldset,flag)
287          val body= E.Sum(sx,E.Prod e1')          val body= E.Sum(sx,E.Prod e1')
288          val einapp= rewriteOrig(y,body,params',index,sx,args')          val einapp= rewriteOrig(y,body,params',index,sx,args')
289          in          in
290              (einapp,code)              (einapp,code,fieldset)
291          end          end
292    
293      (* split:var*ein_app-> (var*einap)*code      (* split:var*ein_app-> (var*einap)*code
294      * split ein expression into smaller pieces      * split ein expression into smaller pieces
295        note we leave summation around probe exp        note we leave summation around probe exp
296      *)      *)
297      fun split(y,einapp as DstIL.EINAPP(Ein.EIN{params, index, body},args))=let      fun split((y,einapp as DstIL.EINAPP(Ein.EIN{params, index, body},args)),fieldset,flag) =let
298          val zero=   (setEinZero y,[])          val x= ((y,einapp),fieldset,flag)
299          val default=((y,einapp),[])          val zero=   (setEinZero y,[],fieldset)
300            val default=((y,einapp),[],fieldset)
301          val sumIndex=ref []          val sumIndex=ref []
302          val str="Poorly formed EIN operator. Argument needs to be applied in High-IL"^(P.printbody body)          val str="Poorly formed EIN operator. Argument needs to be applied in High-IL"^(P.printbody body)
303          val _=testp["\n\nStarting split",P.printbody body]          val _=testp["\n\nStarting split",P.printbody body]
# Line 311  Line 315 
315              | E.Tensor _              => default              | E.Tensor _              => default
316              | E.Const _               => default              | E.Const _               => default
317              | E.ConstR _              => default              | E.ConstR _              => default
318              | E.Neg e1                => handleNeg(y,e1,params,index,args)              | E.Neg e1                => handleNeg(e1,x)
319              | E.Sqrt e1               => handleSqrt(y,e1,params,index,args)              | E.Sqrt e1               => handleSqrt(y,e1,params,index,args,fieldset,flag)
320              | E.Cosine e1             => handleCosine(y,e1,params,index,args)              | E.Cosine e1             => handleCosine(y,e1,params,index,args,fieldset,flag)
321              | E.ArcCosine e1          => handleArcCosine(y,e1,params,index,args)              | E.ArcCosine e1          => handleArcCosine(y,e1,params,index,args,fieldset,flag)
322              | E.Sine e1               => handleSine(y,e1,params,index,args)              | E.Sine e1               => handleSine(y,e1,params,index,args,fieldset,flag)
323              | E.ArcSine e1            => handleArcSine(y,e1,params,index,args)              | E.ArcSine e1            => handleArcSine(y,e1,params,index,args,fieldset,flag)
324              | E.PowInt e1             => handlePowInt(y,e1,params,index,args)              | E.PowInt e1             => err(" PowInt unsupported")
325              | E.PowReal e1            => handlePowReal(y,e1,params,index,args)              | E.PowReal e1            => err(" PowReal unsupported")
326              | E.Sub (e1,e2)           => handleSub(y,e1,e2,params,index,args)              | E.Sub (e1,e2)           => handleSub(y,e1,e2,params,index,args,fieldset,flag)
327              | E.Div (e1,e2)           => handleDiv(y,e1,e2,params,index,args)              | E.Div (e1,e2)           => handleDiv(y,e1,e2,params,index,args,fieldset,flag)
328              | E.Sum(_,E.Prod[E.Eps2 _, E.Probe(E.Conv _,_)  ])      => default              | E.Sum(_,E.Prod[E.Eps2 _, E.Probe(E.Conv _,_)  ])      => default
329              | E.Sum(_,E.Prod[E.Epsilon _, E.Probe(E.Conv _,_)  ])      => default              | E.Sum(_,E.Prod[E.Epsilon _, E.Probe(E.Conv _,_)  ])      => default
330              | E.Sum(_,E.Probe(E.Conv _,_))    => default              | E.Sum(_,E.Probe(E.Conv _,_))    => default
331              | E.Sum(sx,E.Prod e1)     => handleSumProd(y,e1,params,index,sx,args)              | E.Sum(sx,E.Prod e1)     => handleSumProd(y,e1,params,index,sx,args,fieldset,flag)
332              | E.Sum(sx,E.Delta d)     => handleSumProd(y,[E.Delta d],params,index,sx,args)              | E.Sum(sx,E.Delta d)     => handleSumProd(y,[E.Delta d],params,index,sx,args,fieldset,flag)
333              | E.Sum(sx,_)             => err(" summation not distributed:"^str)              | E.Sum(sx,_)             => err(" summation not distributed:"^str)
334              | E.Add e1                => handleAdd(y,e1,params,index,args)              | E.Add e1                => handleAdd(y,e1,params,index,args,fieldset,flag)
335              | E.Prod e1               => handleProd(y,e1,params,index,args)              | E.Prod e1               => handleProd(y,e1,params,index,args,fieldset,flag)
336              | E.Partial _             => err(" Partial used after normalize")              | E.Partial _             => err(" Partial used after normalize")
337              | E.Krn _                 => err("Krn used before expand")              | E.Krn _                 => err("Krn used before expand")
338              | E.Value _               => err("Value used before expand")              | E.Value _               => err("Value used before expand")
339              | E.Img _                 => err("Probe used before expand")              | E.Img _                 => err("Probe used before expand")
340              (*end case *))              (*end case *))
341          val (einapp2,newbies) =rewrite body          val (einapp2,newbies,fieldset) =rewrite body
342          in          in
343              (einapp2,newbies)              ((einapp2,newbies),fieldset)
344          end          end
345          |split(y,app) =((y,app),[])          |split((y,app),fieldset,_) =(((y,app),[]),fieldset)
346    
347      (* iterMultiple:code*code=> (code*code)  
348       * recursively split ein expression into smaller pieces      fun iterMultiple(einapp2,newbies2,fieldset)=let
     *)  
     fun iterMultiple(einapp2,newbies2)=let  
349          fun itercode([],rest,code,_)=(rest,code)          fun itercode([],rest,code,_)=(rest,code)
350          | itercode(e1::newbies,rest,code,cnt)=let          | itercode(e1::newbies,rest,code,cnt)=let
351              val _ =testp["\n\n******* split term **",Int.toString cnt," *****","\n \n",printEINAPP(e1),"\n=>\n"]                  val ((einapp3,code3),_) = split(e1,fieldset,numFlag)
              val (einapp3,code3) = split e1  
             val _ =testp["\n\t===>\n",printEINAPP(einapp3),"\nand\n",(String.concatWith",\n\t"(List.map printEINAPP code3))]  
352              val (rest4,code4)=itercode(code3,[],[],cnt+1)              val (rest4,code4)=itercode(code3,[],[],cnt+1)
353              in itercode(newbies,rest@[einapp3],code4@rest4@code,cnt+2)          in
354                itercode(newbies,rest@[einapp3],code4@( rest4)@code,cnt+2)
355              end              end
356          val(rest,code)= itercode(newbies2,[],[],1)          val(rest,code)= itercode(newbies2,[],[],1)
357          in          in
358              (einapp2,code@rest)              ((code)@rest@[einapp2])
359            end
360    
361    
362        fun iterAll(einapp2,fieldset)=let
363            fun itercode([],rest,code,_)=(rest,code)
364            | itercode(e1::newbies,rest,code,cnt)=let
365                val ((einapp3,code3),_) = split(e1,fieldset,numFlag)
366                val (rest4,code4)=itercode(code3,[],[],cnt+1)
367                in
368                    itercode(newbies,rest@[einapp3],code4@( rest4)@code,cnt+2)
369                end
370            val(rest,code)= itercode(einapp2,[],[],0)
371            in
372                (code@rest)
373            end
374    
375        fun splitEinApp einapp3= let
376            val fieldset= einSet.EinSet.empty
377    
378            (* **** split in parts **** *)
379            (*
380            val ((einapp4,newbies4),fieldset)=split(einapp3,fieldset,0)
381            val _ =testp["\n\t===>\n",printEINAPP(einapp4),"\nand\n",(String.concatWith",\n\t"(List.map printEINAPP newbies4))]
382            val (newbies5)= iterMultiple(einapp4,newbies4,fieldset)
383            *)
384    
385            (* **** split all at once **** *)
386            val (newbies5)= iterAll([einapp3],fieldset)
387    
388            in
389                newbies5
390          end          end
391    
392    

Legend:
Removed from v.3165  
changed lines
  Added in v.3166

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0