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

SCM Repository

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

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

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

revision 2524, Fri Jan 17 20:17:12 2014 UTC revision 2525, Tue Jan 21 19:14:22 2014 UTC
# Line 18  Line 18 
18  (*Iterate over the outside index*)  (*Iterate over the outside index*)
19  (*nextfn is the next function*)  (*nextfn is the next function*)
20  (*m are arguements*)  (*m are arguements*)
21  fun prodIter(index,nextfn,args)=let  fun prodIter(origIndex,index,nextfn,args)=let
22    
23      val index'=List.map (fn (e)=>(e-1)) index      val index'=List.map (fn (e)=>(e-1)) index
24      fun M(mapp,[],rest,code)=let      fun M(mapp,[],rest,code,shape)=let
25          val (vF,code')=nextfn(mapp,args)          val (vF,code')=nextfn(mapp,args)
26          in (vF, code'@code)          in (vF, code'@code)
27          end          end
28      | M(a,[0], rest, code)=let      | M(a,[0], rest, code,shape)=let
29          val mapp=a@[0]          val mapp=a@[0]
30          val (vF,code')=nextfn(mapp,args)          val (vF,code')=nextfn(mapp,args)
31          val(vE,E)=genHelper.aaV(DstOp.cons(DstTy.consTy []),[vF]@rest)          val(vE,E)=genHelper.aaV(DstOp.cons(DstTy.TensorTy shape),[vF]@rest,"Cons",DstTy.TensorTy(shape))
32          in (vE, code'@code@E)          in (vE, code'@code@E)
33          end          end
34      | M(a,[c],rest,code)=let      | M(a,[c],rest,code,shape)=let
35          val mapp=a@[c]          val mapp=a@[c]
36          val (vE,E)=nextfn(mapp,args)          val (vE,E)=nextfn(mapp,args)
37          in  M(a, [c-1], [vE]@rest,E@code) end        in  M(a, [c-1], [vE]@rest,E@code,shape) end
38      | M (a,b::c,rest,ccode)=let      | M (a,b::c,rest,ccode,s::shape)=let
39          fun S(0, rest,code)=let          fun S(0, rest,code)=let
40              val (v',code')=M(a@[0],c,[],[])              val (v',code')=M(a@[0],c,[],[],shape)
41              val(vA,A)=genHelper.aaV(DstOp.cons(DstTy.consTy []),[v']@rest)              val(vA,A)=genHelper.aaV(DstOp.cons(DstTy.TensorTy (s::shape)),[v']@rest,"Cons",DstTy.TensorTy(s::shape))
42              in (vA, code'@code@A) end              in (vA, code'@code@A) end
43          | S(i, rest, code)= let          | S(i, rest, code)= let
44              val (v',code')=M(a@[i],c,[],[])              val (v',code')=M(a@[i],c,[],[],shape)
45              in S(i-1,[v']@rest,code'@code) end              in S(i-1,[v']@rest,code'@code) end
46          val (vA,code')=S(b, [],[])          val (vA,code')=S(b, [],[])
47          in (vA,code'@ccode) end          in (vA,code'@ccode) end
48      val (rest',code')= M([],index',[],[])      val (rest',code')= M([],index',[],[],origIndex)
49      in (rest',code')      in (rest',code')
50      end      end
51    
52    
53    
54  (* general expressions*)  (* general expressions*)
55  fun generalfn(ap,(body,_,args))= let  fun generalfn(ap,(body,_,origargs, args))= let
56      val a=print "in general fn"      val a=print "in general fn"
57      val  mappA= ref ap      val  mappA= ref ap
58    
# Line 78  Line 78 
78          | E.Epsilon(i,j,k)=> let          | E.Epsilon(i,j,k)=> let
79              val ref mapp=mappA              val ref mapp=mappA
80              val n=genHelper.evalEps(i,j,k,mapp)              val n=genHelper.evalEps(i,j,k,mapp)
81              in genHelper.aaV(DstOp.C(n),[]) end              in genHelper.aaV(DstOp.C(n),[],"Const",DstTy.TensorTy([])) end
82          | E.Neg e => let          | E.Neg e => let
83              val (vA,A)=gen e              val (vA,A)=gen e
84              val s=genHelper.skeleton A              val s=genHelper.skeleton A
# Line 87  Line 87 
87                  | ~1 => genHelper.mkC 1                  | ~1 => genHelper.mkC 1
88                  | 1 =>  genHelper.mkC ~1                  | 1 =>  genHelper.mkC ~1
89                  |  _=> let                  |  _=> let
90                      val (vB,B)=genHelper.aaV(DstOp.C (~1),[])                      val (vB,B)=genHelper.aaV(DstOp.C (~1),[],"Const",DstTy.TensorTy([]))
91                      val (vD,D)=genHelper.aaV(DstOp.prodSca,[vB,vA])                      val (vD,D)=genHelper.aaV(DstOp.prodSca,[vB,vA],"prodSca",DstTy.TensorTy([]))
92                      in (vD,A@B@D) end                      in (vD,A@B@D) end
93                  (*end case*))                  (*end case*))
94              end              end
95    
96          | E.Add e=> let          | E.Add e=> let
97              (*check0 function removes 0 from list *)              (*check0 function removes 0 from list *)
98              fun checkO ([],[],[])=let val (vA,A)=genHelper.aaV(DstOp.C(1),[]) in ([vA],A) end              fun checkO ([],[],[])=let val (vA,A)=genHelper.aaV(DstOp.C(1),[],"Const",DstTy.TensorTy([])) in ([vA],A) end
99                  | checkO(ids,code,[])=(ids,code)                  | checkO(ids,code,[])=(ids,code)
100                  | checkO(ids,code, e1::es)=let                  | checkO(ids,code, e1::es)=let
101                      val (a,b)=gen e1                      val (a,b)=gen e1
# Line 108  Line 108 
108              val (ids,code)=checkO([],[],e)              val (ids,code)=checkO([],[],e)
109              in  (case ids              in  (case ids
110                  of [id1]=> (id1,code)                  of [id1]=> (id1,code)
111                  | _=>let  val (vB,B)=genHelper.mkMultiple(ids,DstOp.addSca)                  | _=>let  val (vB,B)=genHelper.mkMultiple(ids,DstOp.addSca,DstTy.TensorTy([]))
112                      in (vB,code@B) end                      in (vB,code@B) end
113                  (*end case*))                  (*end case*))
114              end              end
# Line 124  Line 124 
124                  of (0,0)=> genHelper.mkC 0                  of (0,0)=> genHelper.mkC 0
125                  |(0,_)=> let                  |(0,_)=> let
126                      val (vD,D)= genHelper.mkC ~1                      val (vD,D)= genHelper.mkC ~1
127                      val (vE,E)= genHelper.aaV(DstOp.prodSca,[vD,vB])                      val (vE,E)= genHelper.aaV(DstOp.prodSca,[vD,vB],"prodSca",DstTy.TensorTy([]))
128                      in (vE,B@D@E) end                      in (vE,B@D@E) end
129    
130                  | (_,0)=> (vA,A)                  | (_,0)=> (vA,A)
131                  | _ => let                  | _ => let
132                      val (vD,D)= genHelper.aaV(DstOp.subSca,[vA,vB])                      val (vD,D)= genHelper.aaV(DstOp.subSca,[vA,vB],"subSca",DstTy.TensorTy([]))
133                      in (vD, A@B@D) end                      in (vD, A@B@D) end
134                  (*end case*))                  (*end case*))
135              end              end
136         (* | E.Sum(sx,E.Prod(E.Img im::es))=>let         | E.Sum(sx,E.Prod(E.Img im::E.Krn(id,del,pos)::es))=>let
137              val ref mapp=mappA              val ref mapp=mappA
138              val m=print "\n match img in genfn \n"              val harg=List.nth(origargs,id)
139              in genKrn.mkkrns(mapp,(E.Prod(E.Img im::es),sx,args))              val h=genHelper.getKernel(harg)
140                in genKrn.mkkrns(mapp,(body,h,args))
141              end              end
142  *)  
143          | E.Prod e => let          | E.Prod e => let
144              (*checkO removes 1 from list, and returns 0  if there is one*)              (*checkO removes 1 from list, and returns 0  if there is one*)
145              fun checkO ([],[],[])=let val (vA,A)=genHelper.aaV(DstOp.C 1,[]) in ([vA],A) end              fun checkO ([],[],[])=let val (vA,A)=genHelper.aaV(DstOp.C 1,[],"Const",DstTy.TensorTy([])) in ([vA],A) end
146                  | checkO(ids,code,[])=(ids,code)                  | checkO(ids,code,[])=(ids,code)
147                  | checkO(ids,code, e1::es)=let                  | checkO(ids,code, e1::es)=let
148                      val (a,b)=gen e1                      val (a,b)=gen e1
# Line 156  Line 157 
157              in  (case ids              in  (case ids
158                  of [id1]=> (id1,code)                  of [id1]=> (id1,code)
159                  | _=>let                  | _=>let
160                      val (vB,B)=genHelper.mkMultiple(ids,DstOp.prodSca)                      val (vB,B)=genHelper.mkMultiple(ids,DstOp.prodSca,DstTy.TensorTy([]))
161                      in (vB,code@B) end                      in (vB,code@B) end
162                  (*end case*))                  (*end case*))
163              end              end
# Line 167  Line 168 
168                  of 0=> genHelper.mkC 0                  of 0=> genHelper.mkC 0
169                  | _=> let                  | _=> let
170                      val (vB,B)=gen e2                      val (vB,B)=gen e2
171                      val (vD,D)= genHelper.aaV(DstOp.divSca,[vA,vB])                      val (vD,D)= genHelper.aaV(DstOp.divSca,[vA,vB],"divSca",DstTy.TensorTy([]))
172                      in (vD, A@B@D) end                      in (vD, A@B@D) end
173                  (*end case*))                  (*end case*))
174    
# Line 201  Line 202 
202              val(li, code)=sumI1([],(ub-lb,lb),tl(sumx),[],[])              val(li, code)=sumI1([],(ub-lb,lb),tl(sumx),[],[])
203              in (case li              in (case li
204                  of [l1] => (l1,code)                  of [l1] => (l1,code)
205                  |_=>let val(vF,F)=genHelper.mkMultiple(li,DstOp.addSca)                  |_=>let val(vF,F)=genHelper.mkMultiple(li,DstOp.addSca,DstTy.TensorTy([]))
206                  in (vF,code@F) end                  in (vF,code@F) end
207                  (*end case*))                  (*end case*))
208                  end                  end
# Line 212  Line 213 
213    
214  (*Below functions are used to check for vectorization*)  (*Below functions are used to check for vectorization*)
215  (*Check Addition expression *)  (*Check Addition expression *)
216  fun handleSimpleAdd(E.Add body,index,args)=let  fun handleSimpleAdd(E.Add body,index,origargs, args)=let
217      val n=length(index)-1      val n=length(index)-1
218      fun add (lft,[])=let      fun add (lft,[])=let
219              val index'=List.take(index,n)              val index'=List.take(index,n)
220              in prodIter(index',genHelper.handleAddVec,(lft,[],args)) end              val m=List.nth(index,n)
221          | add(lft,E.Tensor(id,[])::es) =prodIter(index,generalfn,(E.Add body,[],args))              in prodIter(index,index',genHelper.handleAddVec,(lft,index,m,args)) end
222            | add(lft,E.Tensor(id,[])::es) =prodIter(index,index,generalfn,(E.Add body,[],origargs, args))
223          | add(lft,E.Tensor(id,list1)::es) =let          | add(lft,E.Tensor(id,list1)::es) =let
224                  val aaaa=print "\n A"  
225              val n1=length(list1)-1              val n1=length(list1)-1
226                    val aaaa=print "\n B"  
227              val E.V i=List.nth(list1, n1)              val E.V i=List.nth(list1, n1)
228              in if(i=n) then let              in if(i=n) then let
                           val aaaa=print "\n Found match"  
229                      val list1'=List.take(list1,n1)                      val list1'=List.take(list1,n1)
                          val aassaa=print "\n POst pull"  
230                      in add(lft@[(id,list1')],es) end                      in add(lft@[(id,list1')],es) end
231                  else prodIter(index,generalfn,(E.Add body,[],args))                  else prodIter(index,index,generalfn,(E.Add body,[],origargs, args))
232              end              end
233          | add(lft,e::es)=prodIter(index,generalfn,(E.Add body,[],args))          | add(lft,e::es)=prodIter(index,index,generalfn,(E.Add body,[],origargs, args))
234      in  add([],body)      in  add([],body)
235      end      end
236    
# Line 251  Line 251 
251              val list1'=List.take(list1,n1)              val list1'=List.take(list1,n1)
252              val list2'=List.take(list2,n2)              val list2'=List.take(list2,n2)
253              val index'=List.take(index,n)              val index'=List.take(index,n)
254              in prodIter(index',f1,([(id1,list1'),(id2,list2')],[],args)) end               val m=List.nth(index,n)
255          else  prodIter(index,f2,(orig,[],args))              in prodIter(index,index',f1,([(id1,list1'),(id2,list2')],[],m,args)) end
256            else  prodIter(index,index,f2,(orig,[],args))
257      end      end
258    
259  (*Need to double check here*)  (*Need to double check here*)
260  fun handleNeg(orig,index,id, ix,args)=let  fun handleNeg(orig,index,id, ix,origargs, args)=let
261      (*Create a Vector from Tensor*)      (*Create a Vector from Tensor*)
262      val n=(length index)-1      val n=(length index)-1
263      val i=List.nth(ix, n)      val i=List.nth(ix, n)
# Line 265  Line 266 
266              if(v=n) (*can use vectorization*)              if(v=n) (*can use vectorization*)
267              then let              then let
268                  val (vA,A)= genHelper.mkC(0)                  val (vA,A)= genHelper.mkC(0)
269                    val uuu=print "post genHelper Call"
270                  val index'=List.take(index,n)                  val index'=List.take(index,n)
271                  val ix'=List.take(ix,n)                  val ix'=List.take(ix,n)
272                  in prodIter(index',genHelper.mkNegV,((vA,id,ix'),[],args)) end                   val m=List.nth(index,n)
273              else prodIter(index,generalfn,(orig,[],args))                  val g=print "IN HANDLE NEG-- PUPPY\n"
274          |_ => prodIter(index,generalfn,(orig,[],args))                  val ggg=print(Int.toString(m))
275                    val (vB,B)=prodIter(index,index',genHelper.mkNegV,((vA,id,ix'),[],m,args))
276                    in (vB,A@B)
277                    end
278                else prodIter(index,index,generalfn,(orig,[],origargs, args))
279            |_ => prodIter(index,index,generalfn,(orig,[],origargs, args))
280          (*end case *))          (*end case *))
281      end      end
282    
# Line 278  Line 285 
285    
286    
287    
288  fun handleProd(orig,index,sx,args)=let  fun handleProd(orig,index,sx,origargs, args)=let
289      val [(id1,list1),(id2,list2)]=orig      val [(id1,list1),(id2,list2)]=orig
290      val n1=length(list1)-1      val n1=length(list1)-1
291      val n2=length(list2)-1      val n2=length(list2)-1
# Line 295  Line 302 
302              val E.V i=vi              val E.V i=vi
303              val E.V j=vj              val E.V j=vj
304              val index'=List.take(index,n)              val index'=List.take(index,n)
305                 val mm=List.nth(index,n)
306              in (case m              in (case m
307                  of NONE =>                  of NONE =>
308                      (*{A_.. B_..j}_...j ? i.e, outproduct*)                      (*{A_.. B_..j}_...j ? i.e, outproduct*)
309                      (* s*v  otherwise s*s *)                      (* s*v  otherwise s*s *)
310                      if(j=n) then  prodIter(index',genHelper.mkprodScaV,([(id1,list1),(id2,list2')],[],args))                      if(j=n) then
311                      else prodIter(index,genHelper.mkprodSca,(orig,[],args))                      prodIter(index,index',genHelper.mkprodScaV,([(id1,list1),(id2,list2')],[],mm,args))
312                        else prodIter(index,index,genHelper.mkprodSca,(orig,[],args))
313                  | _ =>                  | _ =>
314                      (*{A_i B_i}_i? i.e. modoulate*)                      (*{A_i B_i}_i? i.e. modoulate*)
315                      (* v*v  otherwise s*s*)                      (* v*v  otherwise s*s*)
316                      if(i=j andalso i=n)                      if(i=j andalso i=n)
317                      then prodIter(index',genHelper.mkprodVec,([(id1,list1'),(id2,list2')],[],args))                      then prodIter(index,index',genHelper.mkprodVec,([(id1,list1'),(id2,list2')],[],mm,args))
318                      else prodIter(index,genHelper.mkprodSca,(orig,[],args))                      else prodIter(index,index,genHelper.mkprodSca,(orig,[],args))
319              (*end case*)) end              (*end case*)) end
320          else if (ns=1) then let          else if (ns=1) then let
321                  val [(sx1,lb,ub)]=sx                  val [(sx1,lb,ub)]=sx
322    
323                  in                  in
324                      if(vi=vj andalso vi=sx1)                      if(vi=vj andalso vi=sx1)
325                      then prodIter(index,genHelper.mkprodSumVec,([(id1,list1'),(id2,list2')],[],args)) (*v,v*)                      then prodIter(index,index,genHelper.mkprodSumVec,([(id1,list1'),(id2,list2')],[],ub,args)) (*v,v*)
326                      else prodIter(index,genHelper.sum,(orig,sx,args)) (*s,s *)                      else prodIter(index,index,genHelper.sum,(orig,sx,args)) (*s,s *)
327                  end                  end
328          else if (ns=2)          else if (ns=2)
329              then let val [(sx1,lb1,ub1),(sx2,lb2,ub2)]=sx              then let val [(sx1,lb1,ub1),(sx2,lb2,ub2)]=sx
330    
331                  in  if(vi=vj andalso vi=sx1)                  in  if(vi=vj andalso vi=sx1)
332                      then prodIter(index,genHelper.sumDot,([(id1,list1'),(id2,list2')],[(sx2,lb2,ub2)],args))  
333                        then prodIter(index,index,genHelper.sumDot,([(id1,list1'),(id2,list2')],[(sx2,lb2,ub2)],ub1,args))
334                      else if(vi=vj andalso vi=sx2)                      else if(vi=vj andalso vi=sx2)
335                          then prodIter(index,genHelper.sumDot,([(id1,list1'),(id2,list2')],[(sx1,lb1,ub1)],args))                          then prodIter(index,index,genHelper.sumDot,([(id1,list1'),(id2,list2')],[(sx1,lb1,ub1)],ub2,args))
336                          else prodIter(index,genHelper.sum,(orig,sx,args))                          else prodIter(index,index,genHelper.sum,(orig,sx,args))
337                  end                  end
338          else prodIter(index,genHelper.sum,(orig,sx,args))          else prodIter(index,index,genHelper.sum,(orig,sx,args))
339      end      end
340    
341    
342    
343  fun handleScVProd(body,orig,index,sx,args)=let  fun handleScVProd(body,orig,index,sx,origargs, args)=let
344      val (id1,id2,list2)=orig      val (id1,id2,list2)=orig
345      val n2=length(list2)-1      val n2=length(list2)-1
346      val vj=List.nth(list2,n2)      val vj=List.nth(list2,n2)
347      val E.V j=vj      val E.V j=vj
348      val nsx=length sx      val nsx=length sx
349       val n=length(index)-1       val n=length(index)-1
350            val m=List.nth(index,n)
351      in if(j=n andalso nsx=0)      in if(j=n andalso nsx=0)
352          then  let          then  let
353                  val index'=List.take(index,n)     val list2'=List.take(list2,n2)                  val index'=List.take(index,n)     val list2'=List.take(list2,n2)
354              in prodIter(index',genHelper.mkprodScaV,([(id1,[]),(id2,list2')],[],args)) end                  val q=print(String.concat["Puppy-Make Vector index",Int.toString(m)])
355          else prodIter(index,generalfn,(body,[],args))              in prodIter(index,index',genHelper.mkprodScaV,([(id1,[]),(id2,list2')],[],m, args)) end
356            else prodIter(index,index,generalfn,(body,[],origargs, args))
357      end      end
358    
359    
360  (*Simple Operators on two tensors, examine to see if we could use vectors *)  (*Simple Operators on two tensors, examine to see if we could use vectors *)
361    (*Have to pass orig args to everyone in case we have a kernel or image in a later stage of iteration*)
362    
363  fun genfn(Ein.EIN{params, index, body},origargs,args)= let  fun genfn(y,Ein.EIN{params, index, body},origargs,a)= let
364      val  sx= ref[]      val  sx= ref[]
365      val n=length index      val n=length index
366        val args=(a,params)
367     (*Potential for Vectorization here *)     (*Potential for Vectorization here *)
368     fun gen b=(case b     fun gen b=(case b
369          of  E.Field _ =>raise Fail(concat["Invalid Field here "]   )          of  E.Field _ =>raise Fail(concat["Invalid Field here "]   )
# Line 361  Line 376 
376    
377    
378    
379          | E.Neg(E.Tensor(id,ix))=> handleNeg(body,index,id, ix,args)          | E.Neg(E.Tensor(id,ix))=> handleNeg(body,index,id, ix,origargs, args)
380          | E.Add _ => handleSimpleAdd(body,index,args)          | E.Add _ => handleSimpleAdd(body,index,origargs,  args)
381          | E.Sub(E.Tensor(id1, ix1), E.Tensor(id2, ix2)) =>          | E.Sub(E.Tensor(id1, ix1), E.Tensor(id2, ix2)) =>
382              handleSimpleOp([(id1,ix1),(id2,ix2)],index,genHelper.mksubVec,genHelper.mksubSca,args)              handleSimpleOp([(id1,ix1),(id2,ix2)],index,genHelper.mksubVec,genHelper.mksubSca,args)
383          | E.Prod[E.Tensor(id1, []), E.Tensor(id2, ix2)] =>let          | E.Prod[E.Tensor(id1, []), E.Tensor(id2, ix2)] =>let
384                  val ref x=sx                  val ref x=sx
385                  in handleScVProd(body,(id1,id2,ix2),index,x,args) end                  in handleScVProd(body,(id1,id2,ix2),index,x,origargs, args) end
386          | E.Prod[E.Tensor(id1, ix1), E.Tensor(id2, [])] =>let          | E.Prod[E.Tensor(id1, ix1), E.Tensor(id2, [])] =>let
387                  val ref x=sx                  val ref x=sx
388                  in handleScVProd(body,(id2,id1,ix1),index,x,args) end                  in handleScVProd(body,(id2,id1,ix1),index,x, origargs, args) end
389         (* | E.Prod[E.Tensor(id1, ix1), E.Tensor(id2, ix2)] =>         (* | E.Prod[E.Tensor(id1, ix1), E.Tensor(id2, ix2)] =>
390                  let                  let
391              val ref x=sx              val ref x=sx
# Line 379  Line 394 
394              end*)              end*)
395          (*| E.Div(E.Tensor _,E.Tensor _ )=>[]*)          (*| E.Div(E.Tensor _,E.Tensor _ )=>[]*)
396    
397          | E.Sum(ss,E.Prod(E.Img im::es))=>let          | E.Sum(ss,E.Prod(E.Img im::E.Krn(id,del,pos)::es))=>let
398              val ref x=sx              val ref x=sx
399              val m=print "\n match img"              val m=print "\n match img"
400    
401              in              in
402                  if(length x=0) then prodIter(index,genKrn.mkkrns,(E.Prod(E.Img im::es),ss, origargs,args))                  if(length x=0) then let
403                  else prodIter(index,generalfn,(body,[],args))                      val harg=List.nth(origargs,id)
404                        val h=genHelper.getKernel(harg)
405    
406                        in prodIter(index,index,genKrn.mkkrns,(b, h,args)) end
407                    else prodIter(index,index,generalfn,(body,[],origargs, args))
408              end              end
409          | E.Sum(sx', e)=> (let          | E.Sum(sx', e)=> (let
410              val ref x=sx              val ref x=sx
411              in   sx:=x@sx' end ;gen e)              in   sx:=x@sx' end ;gen e)
412          | _ => prodIter(index,generalfn,(body,[],args))          | _ => prodIter(index,index,generalfn,(body,[],origargs, args))
413          (*end case*))          (*end case*))
414    
415      (*Scalars only, not vectorization potential*)      (*Scalars only, not vectorization potential*)
416      fun single b=(case b      fun single b=(case b
417          of E.Tensor(id,[]) =>genHelper.mkSca([],(id,[],args))          of E.Tensor(id,[]) =>genHelper.mkSca([],(id,[],args))
418          | E.Const _=>generalfn([],(b,[],args))          | E.Const _=>generalfn([],(b,[],origargs, args))
419          | E.Neg _ => generalfn([],(b,[],args))          | E.Neg _ => generalfn([],(b,[],origargs, args))
420          | E.Add _ =>generalfn([],(b,[],args))          | E.Add _ =>generalfn([],(b,[],origargs, args))
421          | E.Sub _=> generalfn([],(b,[],args))          | E.Sub _=> generalfn([],(b,[],origargs, args))
422          | E.Div _=> generalfn([],(b,[],args))          | E.Div _=> generalfn([],(b,[],origargs, args))
423          | E.Prod [E.Tensor(_,[]),E.Tensor(_,[])] => generalfn([],(b,[],args))          | E.Prod [E.Tensor(_,[]),E.Tensor(_,[])] => generalfn([],(b,[],origargs, args))
424          | _=> gen b          | _=> gen b
425    
426          (*end case*))          (*end case*))

Legend:
Removed from v.2524  
changed lines
  Added in v.2525

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