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/expand-integrate.sml
ViewVC logotype

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

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

revision 2602, Wed Apr 23 20:01:52 2014 UTC revision 2603, Thu Apr 24 03:58:37 2014 UTC
# Line 36  Line 36 
36  structure P=Printer  structure P=Printer
37  structure shiftHtM=shiftHtM  structure shiftHtM=shiftHtM
38  structure split=splitHtM  structure split=splitHtM
39    structure F=Filter
40    
41  datatype peanut=    O of  DstOp.rator | E of Ein.ein|C of DstTy.ty|S of int  datatype peanut=    O of  DstOp.rator | E of Ein.ein|C of DstTy.ty|S of int
42  datatype peanut2=    O2 of  SrcOp.rator | E2 of Ein.ein|C2 of SrcTy.ty|S2 of int  datatype peanut2=    O2 of  SrcOp.rator | E2 of Ein.ein|C2 of SrcTy.ty|S2 of int
# Line 46  Line 46 
46  fun assign (x, rator, args) = (x, DstIL.OP(rator, args))  fun assign (x, rator, args) = (x, DstIL.OP(rator, args))
47  fun assignEin (x, rator, args) = ((x, DstIL.EINAPP(rator, args)))  fun assignEin (x, rator, args) = ((x, DstIL.EINAPP(rator, args)))
48    
 fun assign2(x, rator, args) = (x, SrcIL.OP(rator, args))  
 fun assignEin2 (x, rator, args) = (x, SrcIL.EINAPP(rator, args))  
49    
50  fun insert (key, value) d =fn s =>  
         if s = key then SOME value  
         else d s  
 fun lookup k d = d k  
51    
52    
53    
# Line 256  Line 251 
251      val dummy=E.Const 0      val dummy=E.Const 0
252      val sumIndex=ref []      val sumIndex=ref []
253    
254    
255    
256      (*b-current body, info-original ein op, data-new assigments*)      (*b-current body, info-original ein op, data-new assigments*)
257      fun rewriteBody(b,info)= let      fun rewriteBody(b,info)= let
258          val t=print(String.concat["\n\n ***:",Printer.printbody(b),"$ \n"])  
259            fun callfn(c1,body)=let
260                val ref x=sumIndex
261                val c'=[c1]@x
262                val (bodyK,infoK,dataK)= (sumIndex:=c';rewriteBody(body ,info))
263                val ref s=sumIndex
264                val z=hd(s)
265                in
266                    (sumIndex:=tl(s);(E.Sum(z,bodyK),infoK,dataK))
267                end
268    
269            (*val t=print(String.concat["\n\n ***:",Printer.printbody(b),"$ \n"])*)
270          in (case b          in (case b
271              of  E.Sum(c,  E.Probe(E.Conv v, E.Tensor t)) =>let              of  E.Sum(c,  E.Probe(E.Conv v, E.Tensor t)) =>let
272                  val ref sx=sumIndex                  val ref sx=sumIndex
# Line 276  Line 284 
284              end              end
285          | E.Probe _=> (dummy,info,[])          | E.Probe _=> (dummy,info,[])
286          | E.Conv _=>  (dummy,info,[])          | E.Conv _=>  (dummy,info,[])
287            | E.Lift _=> (dummy,info,[])
288          | E.Field _ => (dummy,info,[])          | E.Field _ => (dummy,info,[])
289          | E.Apply _ => (dummy,info,[])          | E.Apply _ => (dummy,info,[])
290          | E.Neg e=> let          | E.Neg e=> let
# Line 283  Line 292 
292              in              in
293                  (E.Neg(body'),info',data')                  (E.Neg(body'),info',data')
294              end              end
295            | E.Sum([c1],E.Prod p1) => (case F.pushSum2(c1,p1)
296          | E.Sum([(v,lb,ub)], E.Prod(e1::es)) => let              of ([],[])=>raise Fail"Empty summation product"
297              fun findIndex searchspace =List.find (fn x => x = v) searchspace              | ([],[keep])=> callfn([c1],keep)
298              val c=[(v,lb,ub)]              | ([],keep)=> callfn([c1],E.Prod(keep))
299              val found=SOME(E.V 0)              | ([s], [])=> rewriteBody(s ,info)
300              val m=(case e1              | (s, [])=> rewriteBody(E.Prod s ,info)
301                  of E.Probe(E.Conv(V,alpha, h, dx),E.Tensor(id,talpha))=> findIndex(alpha@dx@talpha)              | (s,keep)=>let
302                  | E.Conv(V,alpha, h, dx) => findIndex(alpha@dx)                  val (bodyS,infoS,dataS)= rewriteBody(E.Prod s ,info)
                 | E.Tensor(id,alpha)=> findIndex(alpha)  
                 | E.Const _=> NONE  
                 | E.Delta(i,j)=> findIndex([i,j])  
                 | E.Epsilon(i,j,k) =>findIndex([E.V i,E.V j,E.V k])  
                 | _ => found  
                 (* end case*))  
             in (case m  
                 of SOME _ =>let  
303                      val ref x=sumIndex                      val ref x=sumIndex
304                      val c'=[c]@x                  val c'=[[c1]]@x
305                      val (body',info',data')=(sumIndex:=c';rewriteBody ( E.Prod(e1::es),info))                  val (bodyK,infoK,dataK)= (sumIndex:=c';rewriteBody(E.Prod keep ,infoS))
306                      val ref s=sumIndex                      val ref s=sumIndex
307                      val z=hd(s)                      val z=hd(s)
308                      in                  in (sumIndex:=tl(s);(E.Prod[bodyS,E.Sum(z,bodyK)],infoK, dataS@dataK))
                         (sumIndex:=tl(s);(E.Sum(z, body'),info',data'))  
309                      end                      end
                 | NONE =>  rewriteBody(E.Prod[e1, E.Sum(c,E.Prod es)],info)  
310                  (* end case*))                  (* end case*))
311              end          | E.Sum([(v, lb, ub)],e1)=>(case F.foundSx(v,e1)
312          | E.Sum (c,e)=> let              of NONE => rewriteBody(e1, info)
313              val ref x=sumIndex              | SOME _ => callfn([(v, lb, ub)],e1)
314              val c'=[c]@x              (* end case *))
315              val (body',info',data')=(sumIndex:=c';rewriteBody (e,info))          | E.Sum (c,e)=> callfn(c,e)
             val ref s=sumIndex  
             val z=hd(s)  
             in  
                 (sumIndex:=tl(s);(E.Sum(z, body'),info',data'))  
             end  
316          | E.Sub(a,b)=>let          | E.Sub(a,b)=>let
317              val (bodyA,infoA,dataA)= rewriteBody(a,info)              val (bodyA,infoA,dataA)= rewriteBody(a,info)
318              val (bodyB, infoB, dataB)= rewriteBody(b,infoA)              val (bodyB, infoB, dataB)= rewriteBody(b,infoA)

Legend:
Removed from v.2602  
changed lines
  Added in v.2603

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