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

SCM Repository

[diderot] Annotation of /branches/charisee/src/compiler/mid-to-low/gen-ein.sml
ViewVC logotype

Annotation of /branches/charisee/src/compiler/mid-to-low/gen-ein.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2605 - (view) (download)

1 : cchiw 2522 (*hashs Ein Function after substitution*)
2 :     structure genEin = struct
3 :     local
4 :     structure E = Ein
5 : cchiw 2553 structure gHelper=gHelper
6 : cchiw 2522 structure genKrn=genKrn
7 :    
8 :    
9 :    
10 :     structure DstIL = LowIL
11 :     structure DstTy = LowILTypes
12 :     structure DstOp = LowOps
13 :     structure Var = LowIL.Var
14 :     in
15 :    
16 :    
17 : cchiw 2553 fun insert (key, value) d =fn s =>
18 :     if s = key then SOME value
19 :     else d s
20 : cchiw 2522
21 : cchiw 2553 fun lookup k d = d k
22 :     val empty =fn key =>NONE
23 :    
24 : cchiw 2522 (*Iterate over the outside index*)
25 :     (*nextfn is the next function*)
26 :     (*m are arguements*)
27 : cchiw 2525 fun prodIter(origIndex,index,nextfn,args)=let
28 : cchiw 2522
29 :     val index'=List.map (fn (e)=>(e-1)) index
30 : cchiw 2553 fun M(mapp,[],rest,code,shape,n)=let
31 : cchiw 2522 val (vF,code')=nextfn(mapp,args)
32 :     in (vF, code'@code)
33 :     end
34 : cchiw 2553 | M(a,[0], rest, code,shape,n)=let
35 :     (* val mapp=a@[0]*)
36 :     val mapp =insert(n, 0) a
37 : cchiw 2522 val (vF,code')=nextfn(mapp,args)
38 : cchiw 2553 val(vE,E)=gHelper.aaV(DstOp.cons(DstTy.TensorTy shape,0),[vF]@rest,"Cons",DstTy.TensorTy(shape))
39 : cchiw 2522 in (vE, code'@code@E)
40 :     end
41 : cchiw 2553 | M(a,[c],rest,code,shape,n)=let
42 :     (*val mapp=a@[c]*)
43 :     val mapp =insert(n, c) a
44 : cchiw 2522 val (vE,E)=nextfn(mapp,args)
45 : cchiw 2553 in M(a, [c-1], [vE]@rest,E@code,shape,n) end
46 :     | M (a,b::c,rest,ccode,s::shape,n)=let
47 :     val n'=n+1
48 : cchiw 2522 fun S(0, rest,code)=let
49 : cchiw 2553 val mapp =insert(n, 0) a
50 :     val (v',code')=M(mapp,c,[],[],shape,n')
51 :     val(vA,A)=gHelper.aaV(DstOp.cons(DstTy.TensorTy (s::shape),0),[v']@rest,"Cons",DstTy.TensorTy(s::shape))
52 : cchiw 2522 in (vA, code'@code@A) end
53 :     | S(i, rest, code)= let
54 : cchiw 2553 val mapp =insert(n, i) a
55 :     val (v',code')=M(mapp,c,[],[],shape,n')
56 : cchiw 2522 in S(i-1,[v']@rest,code'@code) end
57 :     val (vA,code')=S(b, [],[])
58 :     in (vA,code'@ccode) end
59 : cchiw 2553 val (rest',code')= M(empty,index',[],[],origIndex,0)
60 : cchiw 2522 in (rest',code')
61 :     end
62 :    
63 : cchiw 2553 (*
64 :     fun createDic(n,[],dict)=dict
65 :     | createDic(n,a::ap, dict)=let
66 :     val d'=insert(n, a) dict
67 :     in createDic(n+1,ap, d')
68 :     end
69 :     *)
70 :     fun find(v, mapp)=let
71 :     val a=lookup v mapp
72 :     in (case a of NONE=> raise Fail "Outside Bound"
73 :     |SOME s => s)
74 :     end
75 :    
76 : cchiw 2522 (* general expressions*)
77 : cchiw 2525 fun generalfn(ap,(body,_,origargs, args))= let
78 : cchiw 2522
79 : cchiw 2553 val jx= ref ap
80 :     fun getMapp _ = let
81 :     val ref mappC=jx
82 :     in mappC end
83 : cchiw 2605
84 : cchiw 2522 fun gen body=(case body
85 :     of E.Field _ =>raise Fail(concat["Invalid Field here "] )
86 :     | E.Partial _ =>raise Fail(concat["Invalid FieldPartial here "] )
87 :     | E.Apply _ =>raise Fail(concat["Invalid FieldApply here "] )
88 :     | E.Probe _ =>raise Fail(concat["Invalid FieldProbe here "] )
89 :     | E.Conv _ =>raise Fail(concat["Invalid FieldConv here "] )
90 :     | E.Krn _ =>raise Fail(concat["Invalid FieldKrn here "] )
91 :     | E.Img _=> raise Fail(concat["Invalid FieldImg here "] )
92 :     | E.Value v =>let
93 : cchiw 2553 val n=find(v ,getMapp(1))
94 :     in gHelper.mkC(n) end
95 : cchiw 2522
96 : cchiw 2553 | E.Const c=> gHelper.mkC(c)
97 :     | E.Tensor(id,[])=> gHelper.mkSca(empty,(id,[],args))
98 :     | E.Tensor(id,ix)=> gHelper.mkSca(getMapp(1),(id,ix,args))
99 :    
100 :     | E.Delta(i,j)=> gHelper.evalDelta2(i,j,getMapp(1))
101 : cchiw 2522 | E.Epsilon(i,j,k)=> let
102 : cchiw 2553 val n=gHelper.evalEps(i,j,k,getMapp(1))
103 :     in gHelper.aaV(DstOp.C(n),[],"Const",DstTy.TensorTy([])) end
104 : cchiw 2522 | E.Neg e => let
105 :     val (vA,A)=gen e
106 : cchiw 2553 val s=gHelper.skeleton A
107 : cchiw 2522 in (case s
108 :     of 0 => (vA,A)
109 : cchiw 2553 | ~1 => gHelper.mkC 1
110 :     | 1 => gHelper.mkC ~1
111 : cchiw 2522 | _=> let
112 : cchiw 2553 val (vB,B)=gHelper.aaV(DstOp.C (~1),[],"Const",DstTy.TensorTy([]))
113 :     val (vD,D)=gHelper.aaV(DstOp.prodSca,[vB,vA],"prodSca",DstTy.TensorTy([]))
114 : cchiw 2522 in (vD,A@B@D) end
115 :     (*end case*))
116 :     end
117 :    
118 :     | E.Add e=> let
119 :     (*check0 function removes 0 from list *)
120 : cchiw 2553 fun checkO ([],[],[])=let val (vA,A)=gHelper.aaV(DstOp.C(1),[],"Const",DstTy.TensorTy([])) in ([vA],A) end
121 : cchiw 2522 | checkO(ids,code,[])=(ids,code)
122 :     | checkO(ids,code, e1::es)=let
123 :     val (a,b)=gen e1
124 : cchiw 2553 val s=gHelper.skeleton b
125 : cchiw 2522 in (case s
126 :     of 0 => checkO(ids,code,es)
127 :     | _ => checkO(ids@[a],code@b,es)
128 :     (*end case*))
129 :     end
130 :     val (ids,code)=checkO([],[],e)
131 :     in (case ids
132 :     of [id1]=> (id1,code)
133 : cchiw 2553 | _=>let val (vB,B)=gHelper.mkMultiple(ids,DstOp.addSca,DstTy.TensorTy([]))
134 : cchiw 2522 in (vB,code@B) end
135 :     (*end case*))
136 :     end
137 :    
138 :     | E.Sub (e1,e2)=>let
139 :     val (vA,A)=gen e1
140 :     val (vB,B)=gen e2
141 : cchiw 2553 val sA=gHelper.skeleton A
142 :     val sB=gHelper.skeleton B
143 : cchiw 2522
144 :     (* checks if either expression evaluates to 0*)
145 :     in (case (sA,sB)
146 : cchiw 2553 of (0,0)=> gHelper.mkC 0
147 : cchiw 2522 |(0,_)=> let
148 : cchiw 2553 val (vD,D)= gHelper.mkC ~1
149 :     val (vE,E)= gHelper.aaV(DstOp.prodSca,[vD,vB],"prodSca",DstTy.TensorTy([]))
150 : cchiw 2522 in (vE,B@D@E) end
151 :    
152 :     | (_,0)=> (vA,A)
153 :     | _ => let
154 : cchiw 2553 val (vD,D)= gHelper.aaV(DstOp.subSca,[vA,vB],"subSca",DstTy.TensorTy([]))
155 : cchiw 2522 in (vD, A@B@D) end
156 :     (*end case*))
157 :     end
158 : cchiw 2553
159 : cchiw 2533 | E.Sum(sx,E.Prod(E.Img (Vid,_,_)::E.Krn(id,del,pos)::es))=>let
160 : cchiw 2553 val mapp= getMapp 1
161 : cchiw 2525 val harg=List.nth(origargs,id)
162 : cchiw 2553 val h=gHelper.getKernel(harg)
163 : cchiw 2533 val imgarg=List.nth(origargs,Vid)
164 : cchiw 2553 val v=gHelper.getImage(imgarg)
165 : cchiw 2533 in genKrn.evalField(mapp,(body,v,h,args))
166 : cchiw 2522 end
167 : cchiw 2525
168 : cchiw 2522 | E.Prod e => let
169 :     (*checkO removes 1 from list, and returns 0 if there is one*)
170 : cchiw 2605 fun checkO ([],[],[])=let
171 :     val (vA,A)=gHelper.aaV(DstOp.C 1,[],"Const",DstTy.TensorTy([]))
172 :     in ([vA],A) end
173 : cchiw 2522 | checkO(ids,code,[])=(ids,code)
174 :     | checkO(ids,code, e1::es)=let
175 :     val (a,b)=gen e1
176 : cchiw 2553 val sB=gHelper.skeleton b
177 : cchiw 2522 in (case sB
178 :     of 0 => ([a],b)
179 :     | 1 => checkO(ids,code,es)
180 :     | _ => checkO(ids@[a],code@b,es)
181 :     (*end case*))
182 :     end
183 :     val (ids,code)=checkO([],[],e)
184 :     in (case ids
185 :     of [id1]=> (id1,code)
186 :     | _=>let
187 : cchiw 2553 val (vB,B)=gHelper.mkMultiple(ids,DstOp.prodSca,DstTy.TensorTy([]))
188 : cchiw 2522 in (vB,code@B) end
189 :     (*end case*))
190 :     end
191 :     | E.Div(e1,e2)=>(let
192 :     val (vA,A)=gen e1
193 : cchiw 2553 val sA=gHelper.skeleton A
194 : cchiw 2522 in (case sA
195 : cchiw 2553 of 0=> gHelper.mkC 0
196 : cchiw 2522 | _=> let
197 :     val (vB,B)=gen e2
198 : cchiw 2553 val (vD,D)= gHelper.aaV(DstOp.divSca,[vA,vB],"divSca",DstTy.TensorTy([]))
199 : cchiw 2522 in (vD, A@B@D) end
200 :     (*end case*))
201 :    
202 :     end)
203 : cchiw 2543
204 : cchiw 2522 | E.Sum(sumx, e)=> let
205 : cchiw 2605
206 : cchiw 2553 fun sumloop(mapsum)= (jx:=mapsum; let
207 :    
208 : cchiw 2522 val(vA,A)=gen e
209 : cchiw 2553 val sA=gHelper.skeleton A
210 : cchiw 2522 in (case sA
211 : cchiw 2605 (*of 0 =>([],[])*)
212 :     of _=>([vA],A)
213 : cchiw 2522 (*end case*))
214 :    
215 :     end )
216 : cchiw 2553 fun sumI1(left,(v,0,lb1),[],rest,code)=let
217 :     val mapp=insert(v, lb1) left
218 : cchiw 2522 val (vD,pre)= sumloop(mapp)
219 :     in (vD@rest,pre@code) end
220 : cchiw 2553 | sumI1(left,(v,i,lb1),[],rest,code)=let
221 :    
222 :     val mapp=insert(v, (i+lb1)) left
223 : cchiw 2522 val (vD,pre)=sumloop(mapp)
224 : cchiw 2553 in sumI1(mapp,( v,i-1,lb1),[],vD@rest,pre@code) end
225 :     | sumI1(left,(v,0,lb1),(E.V a,lb2,ub)::sx,rest,code)=let
226 :     val mapp=insert(v, lb1) left
227 :     in sumI1(mapp,(a,ub-lb2,lb2),sx,rest,code) end
228 :     | sumI1(left,(v,s,lb1),(E.V a,lb2,ub)::sx,rest,code)=let
229 :     val mapp=insert(v, (s+lb1)) left
230 :     val (rest',code')=sumI1(mapp,(a,ub-lb2,lb2),sx,rest,code)
231 :     in sumI1(mapp,(v,s-1,lb1),(E.V a,lb2,ub)::sx,rest',code') end
232 :    
233 :    
234 :     val (E.V v,lb,ub)=hd(sumx)
235 :     val(li, code)=sumI1(getMapp 1,(v,ub-lb,lb),tl(sumx),[],[])
236 : cchiw 2522 in (case li
237 :     of [l1] => (l1,code)
238 : cchiw 2553 |_=>let val(vF,F)=gHelper.mkMultiple(li,DstOp.addSca,DstTy.TensorTy([]))
239 :     in (vF,code@F) end
240 :     (*end case*))
241 : cchiw 2522 end
242 :    
243 :     (*end case*))
244 :    
245 :     in gen body end
246 :    
247 :     (*Below functions are used to check for vectorization*)
248 :     (*Check Addition expression *)
249 : cchiw 2525 fun handleSimpleAdd(E.Add body,index,origargs, args)=let
250 : cchiw 2605
251 : cchiw 2522 val n=length(index)-1
252 :     fun add (lft,[])=let
253 :     val index'=List.take(index,n)
254 : cchiw 2525 val m=List.nth(index,n)
255 : cchiw 2553 in prodIter(index,index',gHelper.handleAddVec,(lft,index,m,args)) end
256 : cchiw 2525 | add(lft,E.Tensor(id,[])::es) =prodIter(index,index,generalfn,(E.Add body,[],origargs, args))
257 : cchiw 2522 | add(lft,E.Tensor(id,list1)::es) =let
258 : cchiw 2525
259 : cchiw 2522 val n1=length(list1)-1
260 : cchiw 2525
261 : cchiw 2522 val E.V i=List.nth(list1, n1)
262 :     in if(i=n) then let
263 :     val list1'=List.take(list1,n1)
264 :     in add(lft@[(id,list1')],es) end
265 : cchiw 2525 else prodIter(index,index,generalfn,(E.Add body,[],origargs, args))
266 : cchiw 2522 end
267 : cchiw 2525 | add(lft,e::es)=prodIter(index,index,generalfn,(E.Add body,[],origargs, args))
268 : cchiw 2522 in add([],body)
269 :     end
270 :    
271 :    
272 :     (*Addition and sutraction, with just two tensors *)
273 :     fun handleSimpleOp (orig,index,f1,f2,args)=let
274 :     val [(id1,list1),(id2,list2)]=orig
275 :     val n1=length(list1)-1
276 :     val n2=length(list2)-1
277 :     val n=length(index)-1
278 :     val vi=List.nth(list1, n1)
279 :     val vj=List.nth(list2,n2)
280 :     val E.V i=vi
281 :     val E.V j=vj
282 :     in
283 :     if(j=n andalso i=j)
284 :     then let
285 :     val list1'=List.take(list1,n1)
286 :     val list2'=List.take(list2,n2)
287 :     val index'=List.take(index,n)
288 : cchiw 2525 val m=List.nth(index,n)
289 :     in prodIter(index,index',f1,([(id1,list1'),(id2,list2')],[],m,args)) end
290 :     else prodIter(index,index,f2,(orig,[],args))
291 : cchiw 2522 end
292 :    
293 :     (*Need to double check here*)
294 : cchiw 2525 fun handleNeg(orig,index,id, ix,origargs, args)=let
295 : cchiw 2522 (*Create a Vector from Tensor*)
296 :     val n=(length index)-1
297 :     val i=List.nth(ix, n)
298 :     in (case i
299 :     of E.V v =>
300 :     if(v=n) (*can use vectorization*)
301 :     then let
302 : cchiw 2605 val (vA,A)= gHelper.mkC(~1)
303 : cchiw 2553
304 : cchiw 2522 val index'=List.take(index,n)
305 :     val ix'=List.take(ix,n)
306 : cchiw 2525 val m=List.nth(index,n)
307 : cchiw 2605
308 : cchiw 2553 val (vB,B)=prodIter(index,index',gHelper.mkNegV,((vA,id,ix'),[],m,args))
309 : cchiw 2525 in (vB,A@B)
310 :     end
311 :     else prodIter(index,index,generalfn,(orig,[],origargs, args))
312 :     |_ => prodIter(index,index,generalfn,(orig,[],origargs, args))
313 : cchiw 2522 (*end case *))
314 :     end
315 :    
316 :    
317 :     (*Prodduct of two tensors*)
318 :    
319 :    
320 :    
321 : cchiw 2525 fun handleProd(orig,index,sx,origargs, args)=let
322 : cchiw 2522 val [(id1,list1),(id2,list2)]=orig
323 :     val n1=length(list1)-1
324 :     val n2=length(list2)-1
325 :     val vi=List.nth(list1, n1)
326 :     val vj=List.nth(list2,n2)
327 :     val list1'=List.take(list1,n1)
328 :     val list2'=List.take(list2,n2)
329 :     val ns=length(sx)
330 :     in
331 :     if(ns=0)
332 :     then let
333 : cchiw 2553 val m=gHelper.findDup(list1,list2)
334 : cchiw 2522 val n=length(index)-1
335 :     val E.V i=vi
336 :     val E.V j=vj
337 :     val index'=List.take(index,n)
338 : cchiw 2525 val mm=List.nth(index,n)
339 : cchiw 2522 in (case m
340 :     of NONE =>
341 :     (*{A_.. B_..j}_...j ? i.e, outproduct*)
342 :     (* s*v otherwise s*s *)
343 : cchiw 2525 if(j=n) then
344 : cchiw 2553 prodIter(index,index',gHelper.mkprodScaV,([(id1,list1),(id2,list2')],[],mm,args))
345 :     else prodIter(index,index,gHelper.mkprodSca,(orig,[],args))
346 : cchiw 2522 | _ =>
347 :     (*{A_i B_i}_i? i.e. modoulate*)
348 :     (* v*v otherwise s*s*)
349 :     if(i=j andalso i=n)
350 : cchiw 2553 then prodIter(index,index',gHelper.mkprodVec,([(id1,list1'),(id2,list2')],[],mm,args))
351 :     else prodIter(index,index,gHelper.mkprodSca,(orig,[],args))
352 : cchiw 2522 (*end case*)) end
353 :     else if (ns=1) then let
354 :     val [(sx1,lb,ub)]=sx
355 : cchiw 2605
356 : cchiw 2522 in
357 :     if(vi=vj andalso vi=sx1)
358 : cchiw 2553 then
359 : cchiw 2605 (prodIter(index,index,gHelper.mkprodSumVec,([(id1,list1'),(id2,list2')],[],ub,args))) (*v,v*)
360 :     else (
361 : cchiw 2553 prodIter(index,index,gHelper.sum,(orig,sx,args))) (*s,s *)
362 : cchiw 2522 end
363 :     else if (ns=2)
364 :     then let val [(sx1,lb1,ub1),(sx2,lb2,ub2)]=sx
365 : cchiw 2525
366 : cchiw 2522 in if(vi=vj andalso vi=sx1)
367 : cchiw 2525
368 : cchiw 2553 then prodIter(index,index,gHelper.sumDot,([(id1,list1'),(id2,list2')],[(sx2,lb2,ub2)],ub1,args))
369 : cchiw 2522 else if(vi=vj andalso vi=sx2)
370 : cchiw 2553 then prodIter(index,index,gHelper.sumDot,([(id1,list1'),(id2,list2')],[(sx1,lb1,ub1)],ub2,args))
371 :     else prodIter(index,index,gHelper.sum,(orig,sx,args))
372 : cchiw 2522 end
373 : cchiw 2553 else prodIter(index,index,gHelper.sum,(orig,sx,args))
374 : cchiw 2522 end
375 :    
376 :    
377 :    
378 : cchiw 2525 fun handleScVProd(body,orig,index,sx,origargs, args)=let
379 : cchiw 2522 val (id1,id2,list2)=orig
380 :     val n2=length(list2)-1
381 :     val vj=List.nth(list2,n2)
382 :     val E.V j=vj
383 :     val nsx=length sx
384 :     val n=length(index)-1
385 : cchiw 2525 val m=List.nth(index,n)
386 : cchiw 2522 in if(j=n andalso nsx=0)
387 :     then let
388 :     val index'=List.take(index,n) val list2'=List.take(list2,n2)
389 : cchiw 2605
390 : cchiw 2553 in prodIter(index,index',gHelper.mkprodScaV,([(id1,[]),(id2,list2')],[],m, args)) end
391 : cchiw 2525 else prodIter(index,index,generalfn,(body,[],origargs, args))
392 : cchiw 2522 end
393 :    
394 :    
395 :     (*Simple Operators on two tensors, examine to see if we could use vectors *)
396 : cchiw 2525 (*Have to pass orig args to everyone in case we have a kernel or image in a later stage of iteration*)
397 : cchiw 2522
398 : cchiw 2525 fun genfn(y,Ein.EIN{params, index, body},origargs,a)= let
399 : cchiw 2522 val sx= ref[]
400 :     val n=length index
401 : cchiw 2525 val args=(a,params)
402 : cchiw 2605
403 :    
404 : cchiw 2522 fun gen b=(case b
405 :     of E.Field _ =>raise Fail(concat["Invalid Field here "] )
406 :     | E.Partial _ =>raise Fail(concat["Invalid Field here "] )
407 :     | E.Apply _ =>raise Fail(concat["Invalid Field here "] )
408 :     | E.Probe _ =>raise Fail(concat["Invalid Field here "] )
409 :     | E.Conv _ =>raise Fail(concat["Invalid Field here "] )
410 : cchiw 2605 | E.Neg(E.Tensor(id,ix))=> handleNeg(body,index,id, ix,origargs, args)
411 :     | E.Add _ =>(case !sx
412 :     of [] => handleSimpleAdd(body,index,origargs, args)
413 :     | _ => prodIter(index,index,generalfn,(body,[],origargs, args))
414 :     (*end case*))
415 : cchiw 2522
416 : cchiw 2605 | E.Sub(E.Tensor(id1, ix1), E.Tensor(id2, ix2)) =>(case !sx
417 :     of [] => handleSimpleOp([(id1,ix1),(id2,ix2)],index,gHelper.mksubVec,gHelper.mksubSca,args)
418 :     | _ => prodIter(index,index,generalfn,(body,[],origargs, args))
419 :     (*end case*))
420 : cchiw 2584 | E.Prod[E.Tensor(id1,[]), E.Tensor(id2, [])]=>
421 :     gHelper.mkprodSca(empty,([(id1,[]),(id2,[])],[],args))
422 : cchiw 2522 | E.Prod[E.Tensor(id1, []), E.Tensor(id2, ix2)] =>let
423 : cchiw 2605 val ref x=sx
424 :     in
425 :     handleScVProd(body,(id1,id2,ix2),index,x,origargs, args)
426 :     end
427 : cchiw 2522 | E.Prod[E.Tensor(id1, ix1), E.Tensor(id2, [])] =>let
428 : cchiw 2605 val ref x=sx
429 :     in
430 :     handleScVProd(body,(id2,id1,ix1),index,x, origargs, args)
431 :     end
432 : cchiw 2543 | E.Prod[E.Tensor(id1, ix1), E.Tensor(id2, ix2)] =>
433 : cchiw 2605 handleProd([(id1,ix1),(id2,ix2)],index,!sx,origargs, args)
434 : cchiw 2543
435 : cchiw 2533 | E.Sum(ss,E.Prod(E.Img(Vid,_,_)::E.Krn(id,del,pos)::es))=>let
436 : cchiw 2522 val ref x=sx
437 : cchiw 2605 in
438 : cchiw 2525 if(length x=0) then let
439 :     val harg=List.nth(origargs,id)
440 : cchiw 2553 val h=gHelper.getKernel(harg)
441 : cchiw 2533 val imgarg=List.nth(origargs,Vid)
442 : cchiw 2553 val v=gHelper.getImage(imgarg)
443 : cchiw 2533 in prodIter(index,index,genKrn.evalField,(b,v, h,args)) end
444 : cchiw 2525 else prodIter(index,index,generalfn,(body,[],origargs, args))
445 : cchiw 2522 end
446 : cchiw 2553
447 : cchiw 2522 | E.Sum(sx', e)=> (let
448 :     val ref x=sx
449 : cchiw 2605
450 : cchiw 2522 in sx:=x@sx' end ;gen e)
451 : cchiw 2525 | _ => prodIter(index,index,generalfn,(body,[],origargs, args))
452 : cchiw 2522 (*end case*))
453 :    
454 :     (*Scalars only, not vectorization potential*)
455 :     fun single b=(case b
456 : cchiw 2553 of E.Tensor(id,[]) =>gHelper.mkSca(empty,(id,[], args))
457 :     | E.Const c=>gHelper.mkC(c)
458 :     | E.Neg _ => generalfn(empty,(b,[],origargs, args))
459 :     | E.Add _ =>generalfn(empty,(b,[],origargs, args))
460 :     | E.Sub _=> generalfn(empty,(b,[],origargs, args))
461 :     | E.Div _=> generalfn(empty,(b,[],origargs, args))
462 :     | E.Prod [E.Tensor(_,[]),E.Tensor(_,[])] => generalfn(empty,(b,[],origargs, args))
463 : cchiw 2605 | _=> gen b
464 : cchiw 2522
465 :     (*end case*))
466 :    
467 : cchiw 2605 in (case n of 0 =>single body | _=> gen body) end
468 : cchiw 2522
469 :     end (* local *)
470 :    
471 :     end

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