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

SCM Repository

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

Annotation of /branches/charisee_dev/src/compiler/high-to-mid/split.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3378 - (view) (download)

1 : cchiw 2843 (* Currently under construction
2 : cchiw 2838 *
3 : jhr 3349 * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     *
5 :     * COPYRIGHT (c) 2015 The University of Chicago
6 : cchiw 2838 * All rights reserved.
7 :     *)
8 : cchiw 2843
9 :     (*
10 :     During the transition from high-IL to mid-IL, complicated EIN expressions are split into simpler ones in order to better identify methods for code generation and common subexpressions. Combining EIN operators in the optimization phase can lead to large and complicated EIN operators. A general code generator would need to expand every operation to work on scalars, which could miss the opportunity for vectorization and lead to poor code generation. Instead, every EIN operator is split into a set of simple EIN operators. Each EIN expression then only has one operation working on constants, tensors, deltas, epsilons, images and kernels.
11 :    
12 :     (1) When the outer EIN operator is $ \in {--, +, -, *, /, \sum}$ then for each subexpression analyze to see if they need to be rewritten.
13 :    
14 :     (1a.) When a subexpression is a field expression $\circledast,\nabla $ then it becomes 0. When it is another operation $ {@ --, +, -, *, /, \sum}$ then we lift that subexpression and create a new EIN operator. We replace the subexpression with a tensor expression that represent it's size.
15 :    
16 :     (1b) Call cleanIndex.sml to clean the indices in the subexpression, and get the shape for the tensor replacement.
17 :    
18 :     (1c) Call cleanParams.sml to clean the params in the subexpression.\\
19 :     *)
20 : cchiw 2838
21 :     structure Split = struct
22 :    
23 :     local
24 :    
25 :     structure E = Ein
26 :     structure DstIL = MidIL
27 :     structure DstTy = MidILTypes
28 :     structure DstV = DstIL.Var
29 : cchiw 3174
30 : cchiw 2838 structure P=Printer
31 :     structure cleanP=cleanParams
32 :     structure cleanI=cleanIndex
33 :    
34 : cchiw 3033
35 : cchiw 2838 in
36 :    
37 : cchiw 3325 val numFlag=1 (*remove common subexpression*)
38 : cchiw 3033 val testing=0
39 : cchiw 3378 val splitlimit=500
40 : cchiw 3260 fun mkEin e = E.mkEin e
41 :     val einappzero= DstIL.EINAPP(mkEin([],[],E.Const 0),[])
42 : cchiw 2843 fun setEinZero y= (y,einappzero)
43 : cchiw 3260 fun cleanParams e = cleanP.cleanParams e
44 :     fun cleanIndex e = cleanI.cleanIndex e
45 :     fun toStringBind e= MidToString.toStringBind e
46 :     fun itos i = Int.toString i
47 :     fun err str = raise Fail str
48 : cchiw 2838 val cnt = ref 0
49 : cchiw 3166 fun incUse (DstIL.V{useCnt, ...}) = (useCnt := !useCnt + 1)
50 : cchiw 2838 fun genName prefix = let
51 :     val n = !cnt
52 :     in
53 :     cnt := n+1;
54 :     String.concat[prefix, "_", Int.toString n]
55 :     end
56 :     fun testp n=(case testing
57 :     of 0=> 1
58 :     | _ =>(print(String.concat n);1)
59 :     (*end case*))
60 :    
61 :     (* lift:ein_app*params*index*sum_id*args-> (ein_exp* params*args*code)
62 :     *lifts expression and returns replacement tensor
63 : cchiw 2843 * cleans the index and params of subexpression
64 :     *creates new param and replacement tensor for the original ein_exp
65 : cchiw 2838 *)
66 : cchiw 3166 fun lift(name,e,params,index,sx,args,fieldset,flag)=let
67 : cchiw 2838 val (tshape,sizes,body)=cleanIndex(e,index,sx)
68 : cchiw 2843 val id=length(params)
69 :     val Rparams=params@[E.TEN(1,sizes)]
70 :     val Re=E.Tensor(id,tshape)
71 : cchiw 2845 val M = DstV.new (genName (name^"_l_"^itos id), DstTy.TensorTy sizes)
72 : cchiw 2843 val Rargs=args@[M]
73 :     val einapp=cleanParams(M,body,Rparams,sizes,Rargs)
74 : cchiw 3166 val (_,einapp0)=einapp
75 :     val (Rargs,newbies,fieldset) =(case flag
76 :     of 1=> let
77 :     val (fieldset,var) = einSet.rtnVar(fieldset,M,einapp0)
78 :     in (case var
79 :     of NONE=> (args@[M],[einapp],fieldset)
80 :     | SOME v=> (incUse v ;(args@[v],[],fieldset))
81 :     (*end case*))
82 :     end
83 :     | _=>(args@[M],[einapp],fieldset)
84 :     (*end case*))
85 :     in
86 :     (Re,Rparams,Rargs,newbies,fieldset)
87 :     end
88 : cchiw 2838
89 : cchiw 3166
90 : cchiw 2838 (* isOp: ein->int
91 :     * checks to see if this sub-expression is pulled out or split form original
92 :     * 0-becomes zero,1-remains the same, 2-operator
93 :     *)
94 :     fun isOp e =(case e
95 :     of E.Field _ => 0
96 :     | E.Conv _ => 0
97 :     | E.Apply _ => 0
98 :     | E.Lift _ => 0
99 :     | E.Neg _ => 1
100 : cchiw 2870 | E.Sqrt _ => 1
101 : cchiw 3138 | E.Cosine _ => 1
102 :     | E.ArcCosine _ => 1
103 :     | E.Sine _ => 1
104 : cchiw 3166 | E.ArcSine _ => 1
105 : cchiw 3138 | E.PowInt _ => 1
106 :     | E.PowReal _ => 1
107 : cchiw 2838 | E.Add _ => 1
108 :     | E.Sub _ => 1
109 :     | E.Prod _ => 1
110 :     | E.Div _ => 1
111 :     | E.Sum _ => 1
112 :     | E.Probe _ => 1
113 :     | E.Partial _ => err(" Partial used after normalize")
114 :     | E.Krn _ => err("Krn used before expand")
115 :     | E.Value _ => err("Value used before expand")
116 :     | E.Img _ => err("Probe used before expand")
117 : cchiw 3374 | Ein.PowEmb(e1,sx1,n1) =>1
118 : cchiw 2838 | _ => 2
119 :     (*end case*))
120 :    
121 : cchiw 3166 fun rewriteOp3(name,sx,e1,x)=let
122 :     val ((y, DstIL.EINAPP(ein,args)),fieldset,flag)=x
123 :     val params=Ein.params ein
124 :     val index=Ein.index ein
125 :     in (case (isOp e1)
126 :     of 0 => (E.Const 0,params,args,[],fieldset)
127 :     | 1 => lift(name,e1,params,index,sx,args,fieldset,flag)
128 :     | 2 => (e1,params,args,[],fieldset)
129 :     (*end*))
130 :     end
131 :    
132 : cchiw 2843 (* rewriteOp:ein_exp*params*index*args-> ein_exp*params*args*code
133 : cchiw 3166 * If e1 an op then call lift() to replace it
134 :     *)
135 :     fun rewriteOp(name,e1,params,index,sx,args,fieldset,flag)=(case (isOp e1)
136 :     of 0 => (E.Const 0,params,args,[],fieldset)
137 :     | 1 => lift(name,e1,params,index,sx,args,fieldset,flag)
138 :     | 2 => (e1,params,args,[],fieldset) (*not lifted*)
139 : cchiw 2838 (*end*))
140 :    
141 : cchiw 3166 fun rewriteOps(name,list1,params,index,sx,args,fieldset0,flag)=let
142 :     fun m([],rest,params,args,code,fieldset)=(rest,params,args,code,fieldset)
143 :     | m(e1::es,rest,params,args,code,fieldset)=let
144 :    
145 :     val (e1',params',args',code',fieldset)= rewriteOp(name,e1,params,index,sx,args,fieldset,flag)
146 : cchiw 2838 in
147 : cchiw 3166 m(es,rest@[e1'],params',args',code@code',fieldset)
148 : cchiw 2838 end
149 :     in
150 : cchiw 3166 m(list1,[],params,args,[],fieldset0)
151 : cchiw 2838 end
152 : cchiw 3166
153 :    
154 : cchiw 2845 (*rewriteOrig: var* ein_exp* params*index list*mid-il vars
155 : cchiw 2843 When the operation is zero then we return a real.
156 : cchiw 2845 -Moved is Zero to before split.
157 : cchiw 2843 *)
158 : cchiw 3033 fun rewriteOrig(y,body,params,index,sx,args) =cleanParams(y,body,params,index,args)
159 : cchiw 2838
160 : cchiw 3166 fun rewriteOrig3(sx,body,params,args,x) =let
161 :     val ((y,DstIL.EINAPP(ein,_)),_,_)=x
162 :     val index=Ein.index ein
163 :     in cleanParams(y,body,params,index,args)
164 :     end
165 :    
166 : cchiw 2838 (* handleNeg:var*ein_exp *params*index*args-> (var*einap)*code
167 : cchiw 2843 * calls rewriteOp() lift on ein_exp
168 : cchiw 2838 *)
169 : cchiw 3166 fun handleNeg(e1,x)=let
170 :     val (e1',params',args',code,fieldset)= rewriteOp3("neg",[],e1,x)
171 :     val body' =E.Neg e1'
172 :     val einapp= rewriteOrig3([],body',params',args',x)
173 : cchiw 2845 in
174 : cchiw 3166 (einapp,code,fieldset)
175 : cchiw 2845 end
176 : cchiw 2838
177 : cchiw 2867 (* handleSqrt:var*ein_exp *params*index*args-> (var*einap)*code
178 :     * calls rewriteOp() lift on ein_exp
179 :     *)
180 : cchiw 3166 fun handleSqrt(y,e1,params,index,args,fieldset,flag)=let
181 :     val (e1',params',args',code,fieldset)= rewriteOp("sqrt", e1,params,index,[],args,fieldset,flag)
182 : cchiw 2867 val body =E.Sqrt e1'
183 :     val einapp= rewriteOrig(y,body,params',index,[],args')
184 :     in
185 : cchiw 3166 (einapp,code,fieldset)
186 : cchiw 2867 end
187 :    
188 :    
189 : cchiw 3138 (* handleCosine:var*ein_exp *params*index*args-> (var*einap)*code
190 :     * calls rewriteOp() lift on ein_exp
191 :     *)
192 : cchiw 3166 fun handleCosine(y,e1,params,index,args,fieldset,flag)=let
193 :     val (e1',params',args',code,fieldset)= rewriteOp("cosine", e1,params,index,[],args,fieldset,flag)
194 : cchiw 3138 val body =E.Cosine e1'
195 :     val einapp= rewriteOrig(y,body,params',index,[],args')
196 :     in
197 : cchiw 3166 (einapp,code,fieldset)
198 : cchiw 3138 end
199 :    
200 :     (* handleArcCosine:var*ein_exp *params*index*args-> (var*einap)*code
201 :     * calls rewriteOp() lift on ein_exp
202 :     *)
203 : cchiw 3166 fun handleArcCosine(y,e1,params,index,args,fieldset,flag)=let
204 :     val (e1',params',args',code,fieldset)= rewriteOp("ArcCosine", e1,params,index,[],args,fieldset,flag)
205 : cchiw 3138 val body =E.ArcCosine e1'
206 :     val einapp= rewriteOrig(y,body,params',index,[],args')
207 :     in
208 : cchiw 3166 (einapp,code,fieldset)
209 : cchiw 3138 end
210 :    
211 :     (* handleSine:var*ein_exp *params*index*args-> (var*einap)*code
212 :     * calls rewriteOp() lift on ein_exp
213 :     *)
214 : cchiw 3166 fun handleSine(y,e1,params,index,args,fieldset,flag)=let
215 :     val (e1',params',args',code,fieldset)= rewriteOp("sine", e1,params,index,[],args,fieldset,flag)
216 : cchiw 3138 val body =E.Sine e1'
217 :     val einapp= rewriteOrig(y,body,params',index,[],args')
218 :     in
219 : cchiw 3166 (einapp,code,fieldset)
220 : cchiw 3138 end
221 :    
222 :     (* handleSine:var*ein_exp *params*index*args-> (var*einap)*code
223 :     * calls rewriteOp() lift on ein_exp
224 :     *)
225 : cchiw 3166 fun handleArcSine(y,e1,params,index,args,fieldset,flag)=let
226 :     val (e1',params',args',code,fieldset)= rewriteOp("ArcSine", e1,params,index,[],args,fieldset,flag)
227 :     val body =E.ArcSine e1'
228 : cchiw 3033 val einapp= rewriteOrig(y,body,params',index,[],args')
229 :     in
230 : cchiw 3166 (einapp,code,fieldset)
231 : cchiw 3033 end
232 : cchiw 2870
233 :    
234 : cchiw 2838 (* handleSub:var*ein_exp*ein_exp *params*index*args-> (var*einap)*code
235 : cchiw 2843 * calls rewriteOps() lift on ein_exp
236 : cchiw 2838 *)
237 : cchiw 3166 fun handleSub(y,e1,e2,params,index,args,fieldset,flag)=let
238 :     val ([e1',e2'],params',args',code,fieldset)= rewriteOps("subt",[e1,e2],params,index,[],args,fieldset,flag)
239 : cchiw 2838 val body =E.Sub(e1',e2')
240 : cchiw 2845 val einapp= rewriteOrig(y,body,params',index,[],args')
241 :     in
242 : cchiw 3166 (einapp,code,fieldset)
243 : cchiw 2845 end
244 : cchiw 2838
245 :     (* handleDiv:var*ein_exp *ein_exp*params*index*args-> (var*einap)*code
246 : cchiw 2843 * calls rewriteOp() lift on ein_exp
247 : cchiw 2838 *)
248 : cchiw 3166 fun handleDiv(y,e1,e2,params,index,args,fieldset,flag)=let
249 :     val (e1',params1',args1',code1',fieldset)=rewriteOp("div-num",e1,params,index,[],args,fieldset,flag)
250 :     val (e2',params2',args2',code2',fieldset)=rewriteOp("div-denom",e2,params1',index,[],args1',fieldset,flag)
251 : cchiw 2838 val body =E.Div(e1',e2')
252 : cchiw 2845 val einapp= rewriteOrig(y,body,params2',index,[],args2')
253 :     in
254 : cchiw 3166 (einapp,code1'@code2',fieldset)
255 : cchiw 2845 end
256 : cchiw 2838
257 :     (* handleAdd:var*ein_exp list *params*index*args-> (var*einap)*code
258 : cchiw 2843 * calls rewriteOps() lift on ein_exp
259 : cchiw 2838 *)
260 : cchiw 3193 fun handleAdd(y,e1 as [_,_,_,_],params,index,args,fieldset,flag)=let
261 : cchiw 3030
262 : cchiw 3193 val (e1',params',args',code,fieldset)= rewriteOps("add",e1,params,index,[],args,fieldset,flag)
263 :     fun pb es=String.concatWith "\n\n\t-*-" (List.map P.printbody es)
264 : cchiw 3194 (*)val _ =print("\n****Inside Add:"^Int.toString(length index)^"\n -"^ pb e1 ^"----- newbies\n-"^ pb e1')*)
265 : cchiw 3193
266 :     val body =E.Add e1'
267 :     val einapp= rewriteOrig(y,body,params',index,[],args')
268 :     in
269 :     (einapp,code,fieldset)
270 :     end
271 :     | handleAdd(y,e1,params,index,args,fieldset,flag)=let
272 :    
273 : cchiw 3166 val (e1',params',args',code,fieldset)= rewriteOps("add",e1,params,index,[],args,fieldset,flag)
274 : cchiw 3193 fun pb es=String.concatWith "\n-" (List.map P.printbody es)
275 :    
276 :    
277 : cchiw 2838 val body =E.Add e1'
278 : cchiw 2845 val einapp= rewriteOrig(y,body,params',index,[],args')
279 :     in
280 : cchiw 3166 (einapp,code,fieldset)
281 : cchiw 2845 end
282 : cchiw 2838
283 :     (* handleProd:var*ein_exp list*params*index*args-> (var*einap)*code
284 : cchiw 2843 * calls rewriteOps() lift on ein_exp
285 : cchiw 2838 *)
286 : cchiw 3166 fun handleProd(y,e1,params,index,args,fieldset,flag)=let
287 :     val (e1',params',args',code,fieldset)= rewriteOps("prod",e1,params,index,[],args,fieldset,flag)
288 : cchiw 2838 val body =E.Prod e1'
289 : cchiw 2845 val einapp= rewriteOrig(y,body,params',index,[],args')
290 :     in
291 : cchiw 3166 (einapp,code,fieldset)
292 : cchiw 2845 end
293 : cchiw 2838
294 :     (* handleSumProd:var*ein_exp *params*index*args-> (var*einap)*code
295 : cchiw 2843 * calls rewriteOps() lift on ein_exp
296 : cchiw 2838 *)
297 : cchiw 3166 fun handleSumProd(y,e1,params,index,sx,args,fieldset,flag)=let
298 :     val (e1',params',args',code,fieldset)= rewriteOps("sumprod",e1,params,index,sx,args,fieldset,flag)
299 : cchiw 2838 val body= E.Sum(sx,E.Prod e1')
300 : cchiw 2845 val einapp= rewriteOrig(y,body,params',index,sx,args')
301 :     in
302 : cchiw 3166 (einapp,code,fieldset)
303 : cchiw 2845 end
304 : cchiw 2838
305 : cchiw 3374 fun handlePowEmb(y,e1,sx1,n1,params,index,args,fieldset,flag)=let
306 :     val (e1',params',args',code,fieldset)= rewriteOp("mag",e1,params,index,sx1,args,fieldset,flag)
307 :     val body= E.Sum(sx1,E.Prod[e1',e1'])
308 :     val einapp= rewriteOrig(y,body,params',index,sx1,args')
309 :     val _=print(String.concat["\nhandlePowEmb:",P.printbody(E.PowEmb(e1,sx1,n1)),"\n=>",
310 :     P.printbody(body)])
311 :     in
312 :     (einapp,code,fieldset)
313 :     end
314 :    
315 :    
316 : cchiw 2838 (* split:var*ein_app-> (var*einap)*code
317 :     * split ein expression into smaller pieces
318 : cchiw 2843 note we leave summation around probe exp
319 : cchiw 2838 *)
320 : cchiw 3166 fun split((y,einapp as DstIL.EINAPP(Ein.EIN{params, index, body},args)),fieldset,flag) =let
321 :     val x= ((y,einapp),fieldset,flag)
322 :     val zero= (setEinZero y,[],fieldset)
323 :     val default=((y,einapp),[],fieldset)
324 : cchiw 2838 val sumIndex=ref []
325 : cchiw 2867 val str="Poorly formed EIN operator. Argument needs to be applied in High-IL"^(P.printbody body)
326 : cchiw 3017 val _=testp["\n\nStarting split",P.printbody body]
327 :     fun rewrite b=(case b
328 : cchiw 3229 of E.Probe(E.Conv _,_) => default
329 : cchiw 2870 | E.Probe(E.Field _,_) => raise Fail str
330 : cchiw 2847 | E.Probe _ => raise Fail str
331 : cchiw 3229 | E.Conv _ => raise Fail "should have been swept"
332 :     | E.Field _ => raise Fail "should have been swept"
333 :     | E.Apply _ => raise Fail "should have been swept"
334 :     | E.Lift e => raise Fail "should have been swept"
335 : cchiw 2838 | E.Delta _ => default
336 :     | E.Epsilon _ => default
337 : cchiw 2843 | E.Eps2 _ => default
338 : cchiw 2838 | E.Tensor _ => default
339 :     | E.Const _ => default
340 : cchiw 2923 | E.ConstR _ => default
341 : cchiw 3166 | E.Neg e1 => handleNeg(e1,x)
342 :     | E.Sqrt e1 => handleSqrt(y,e1,params,index,args,fieldset,flag)
343 :     | E.Cosine e1 => handleCosine(y,e1,params,index,args,fieldset,flag)
344 :     | E.ArcCosine e1 => handleArcCosine(y,e1,params,index,args,fieldset,flag)
345 :     | E.Sine e1 => handleSine(y,e1,params,index,args,fieldset,flag)
346 :     | E.ArcSine e1 => handleArcSine(y,e1,params,index,args,fieldset,flag)
347 :     | E.PowInt e1 => err(" PowInt unsupported")
348 :     | E.PowReal e1 => err(" PowReal unsupported")
349 :     | E.Sub (e1,e2) => handleSub(y,e1,e2,params,index,args,fieldset,flag)
350 :     | E.Div (e1,e2) => handleDiv(y,e1,e2,params,index,args,fieldset,flag)
351 : cchiw 3189 (*
352 : cchiw 2847 | E.Sum(_,E.Prod[E.Eps2 _, E.Probe(E.Conv _,_) ]) => default
353 :     | E.Sum(_,E.Prod[E.Epsilon _, E.Probe(E.Conv _,_) ]) => default
354 : cchiw 3189 *)
355 : cchiw 2847 | E.Sum(_,E.Probe(E.Conv _,_)) => default
356 : cchiw 3166 | E.Sum(sx,E.Prod e1) => handleSumProd(y,e1,params,index,sx,args,fieldset,flag)
357 :     | E.Sum(sx,E.Delta d) => handleSumProd(y,[E.Delta d],params,index,sx,args,fieldset,flag)
358 : cchiw 3194 | E.Sum(sx,E.Tensor _) => default
359 : cchiw 3033 | E.Sum(sx,_) => err(" summation not distributed:"^str)
360 : cchiw 3166 | E.Add e1 => handleAdd(y,e1,params,index,args,fieldset,flag)
361 : cchiw 3276 | E.Prod[E.Tensor(id0,[]),E.Tensor(id1,[i]),E.Tensor(id2,[])]=>
362 :     rewrite (E.Prod[E.Prod[E.Tensor(id0,[]),E.Tensor(id2,[])],E.Tensor(id1,[i])])
363 : cchiw 3166 | E.Prod e1 => handleProd(y,e1,params,index,args,fieldset,flag)
364 : cchiw 2838 | E.Partial _ => err(" Partial used after normalize")
365 :     | E.Krn _ => err("Krn used before expand")
366 :     | E.Value _ => err("Value used before expand")
367 :     | E.Img _ => err("Probe used before expand")
368 : cchiw 3374 | Ein.PowEmb(e1,sx1,n1) =>handlePowEmb(y,e1,sx1,n1,params,index,args,fieldset,flag)
369 :    
370 : cchiw 2838 (*end case *))
371 : cchiw 3166 val (einapp2,newbies,fieldset) =rewrite body
372 : cchiw 2838 in
373 : cchiw 3166 ((einapp2,newbies),fieldset)
374 : cchiw 2838 end
375 : cchiw 3166 |split((y,app),fieldset,_) =(((y,app),[]),fieldset)
376 : cchiw 2923
377 : cchiw 3166
378 : cchiw 3344 (*
379 :     B
380 :     NoISSUE (1,3,4)
381 :     Fail(2,5,6)
382 :    
383 :     *)
384 :    
385 :     fun iterAll2(einapp2,fields2)=let
386 :     val fieldset= einSet.EinSet.empty
387 : cchiw 3378 val _ =print ("\nSPLit with limit"^(Int.toString(splitlimit)))
388 : cchiw 3344 fun itercode([],rest,code,cnt)=(("\n Empty-SplitCount: "^Int.toString(cnt));(rest,code))
389 :     | itercode(e1::newbies,rest,code,cnt)=let
390 :     val ((einapp3,code3),_) = split(e1,fieldset,numFlag)
391 :     val (rest4,code4)=itercode(code3,[],[],cnt+1)
392 :     val _ =testp [toStringBind(e1),"\n\t===>\n",toStringBind(einapp3),"\nand\n",(String.concatWith",\n\t"(List.map toStringBind (code4@rest4)))]
393 :     in
394 : cchiw 3378 if (length(rest@newbies@code) > splitlimit) then let
395 : cchiw 3344 val _ =("\n SplitCount: "^Int.toString(cnt))
396 :     val code5=code4@rest4@code
397 :     val rest5=rest@[einapp3]
398 :     in
399 :     (*
400 :     (newbies,code5@rest5)(*tab1*)
401 :     (newbies,rest5@code5)(*tab2*)
402 :     (rest5,newbies@code5)(*tab3*)
403 :     *)
404 :     (rest5,code5@newbies)(*tab4*)
405 :     (*
406 :     (code5,rest5@newbies)(*tab5*)
407 :     (code5,newbies@rest5)(*tab6*)
408 :     *)
409 :     end
410 :     else itercode(newbies,rest@[einapp3],code4@rest4@code,cnt+2)
411 :     end
412 :     val(rest,code)= itercode([einapp2],[],[],0)
413 : cchiw 3166 in
414 : cchiw 3344 (*fields2@rest@code (*A*)*)
415 :     fields2@code@rest (*B*)
416 : cchiw 3166 end
417 :    
418 :    
419 : cchiw 3344
420 :    
421 : cchiw 3166 fun iterAll(einapp2,fieldset)=let
422 : cchiw 3378 val _=print"\nSplit All"
423 : cchiw 3166 fun itercode([],rest,code,_)=(rest,code)
424 : cchiw 3017 | itercode(e1::newbies,rest,code,cnt)=let
425 : cchiw 3166 val ((einapp3,code3),_) = split(e1,fieldset,numFlag)
426 : cchiw 3017 val (rest4,code4)=itercode(code3,[],[],cnt+1)
427 : cchiw 3260 val _ =testp [toStringBind(e1),"\n\t===>\n",toStringBind(einapp3),"\nand\n",(String.concatWith",\n\t"(List.map toStringBind (code4@rest4)))]
428 : cchiw 3166 in
429 :     itercode(newbies,rest@[einapp3],code4@( rest4)@code,cnt+2)
430 : cchiw 2838 end
431 : cchiw 3166 val(rest,code)= itercode(einapp2,[],[],0)
432 : cchiw 2838 in
433 : cchiw 3166 (code@rest)
434 : cchiw 2838 end
435 :    
436 : cchiw 3017
437 : cchiw 3166
438 : cchiw 3344 fun splitEinApp (einapp3,splitflag)= let
439 :     val fieldset= einSet.EinSet.empty
440 :     val (newbies5)=(case splitflag
441 :     of 1 =>let
442 :     (* **** split single **** *)
443 :     val ((einapp4,newbies4),fieldset)=split(einapp3,fieldset,0)
444 :     in newbies4@[einapp4] end
445 :     | _=> (* **** split all at once **** *)
446 :     iterAll([einapp3],fieldset)
447 :     (* end case *))
448 : cchiw 3166 in
449 :     newbies5
450 :     end
451 :    
452 :    
453 : cchiw 2838 end; (* local *)
454 :    
455 :     end (* local *)

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