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

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

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

revision 2955, Wed Mar 4 23:06:28 2015 UTC revision 3033, Tue Mar 10 15:17:25 2015 UTC
# Line 28  Line 28 
28          (*end case*))          (*end case*))
29      val einappzero=DstIL.EINAPP(setEin([],[],E.Const 0),[])      val einappzero=DstIL.EINAPP(setEin([],[],E.Const 0),[])
30      fun setEinZero y=  (y,einappzero)      fun setEinZero y=  (y,einappzero)
31        fun filterSca e=Filter.filterSca e
32        fun printEINAPP e=MidToString.printEINAPP e
33    
34    
     (* isZero:ein_exp->int  
     *  Checks to see if the entire body is 0. If so returns 1.  
     *)  
     fun isZero e=let  
         val _=testp["\n Started Zero",P.printbody e]  
         fun iterList []= 1  
             | iterList(e1::list)=(case (isZero e1)  
             of 0=>0  
             | _ => iterList list  
             (*end case*))  
         fun iterProdList []= 0  
         | iterProdList [e1]=isZero e1  
         | iterProdList(e1::list)=(case (isZero e1)  
             of 1=>1  
             | _ => iterList list  
             (*end case*))  
         val z=(case e  
             of E.Tensor _         => 0  
             | E.Add e             => iterList e  
             | E.Sub(e1,e2)         => iterList [e1,e2]  
             | E.Div(e1,e2)         => iterProdList [e1,e2]  
             | E.Sum(_ ,e)          => isZero e  
             | E.Prod e             => iterProdList e  
             | E.Neg e              => isZero e  
             | E.Probe(E.Conv _,_)  => 0  
             | E.Sqrt e             => isZero e  
             | E.Const 0            => 1  
             | E.Field _            => 1  
             | E.Partial _          => 1  
             | E.Apply _            => 1  
             | E.Lift _             => 1  
             | E.Conv _             => 1  
             | E.PowInt(e ,_)            => isZero e  
             | E.PowReal(e,_)             => isZero e  
             | _                    => 0  
             (*end case*))  
         val _=testp["\n Is it Zero",P.printbody e,"--", iTos z]  
         in  
             z  
         end  
35    
36      fun z e=String.concat["\n\n Found: ",P.printbody e,"=> 0\n"]      fun z e=String.concat["\n\n Found: ",P.printbody e,"=> 0\n"]
37      fun sweep e= (z e;case e      fun sweep e= (z e;case e
# Line 96  Line 59 
59          | E.Probe _            =>          | E.Probe _            =>
60  raise Fail (String.concat["\n Incorrect probe, substition was not made. Is the Field in an if statement? :",P.printbody e])  raise Fail (String.concat["\n Incorrect probe, substition was not made. Is the Field in an if statement? :",P.printbody e])
61      (*end case*))      (*end case*))
62    
63    
64        (*Distribute summation if needed*)
65        fun distributeSummation(y,einapp as DstIL.EINAPP(Ein.EIN{params, index, body},args))=let
66            val changed = ref false
67            fun rewrite b=(case b
68                of E.Sum(sx,E.Tensor(id,[]))    => (changed:=true;E.Tensor(id,[]))
69                | E.Sum(sx,E.Const c)           => (changed:=true;E.Const c)
70                | E.Sum(sx,E.ConstR r)          => (changed:=true;E.ConstR r)
71                | E.Sum(sx,E.Neg n)             => (changed:=true;(E.Neg(E.Sum(sx,n))))
72                | E.Sum(sx,E.Add a)             =>
73                (changed:=true;(E.Add(List.map (fn e=> E.Sum(sx,e)) a)))
74                | E.Sum(sx,E.Sub (e1,e2))       =>
75                    (changed:=true;(E.Sub(E.Sum(sx,e1),E.Sum(sx,e2))))
76                | E.Sum(sx,E.Div(E.Const c,e2)) =>
77                    (changed:=true;(E.Div(E.Const c, E.Sum(sx,e2))))
78                | E.Sum(sx,E.Div(e1,e2))        => (changed:=true;
79                    (E.Sum(sx,E.Prod[e1,E.Div(E.Const 1,rewrite e2)])))
80                | E.Sum(sx,E.Lift e )           => (changed:=true;(E.Lift(E.Sum(sx,e))))
81                | E.Sum(sx,E.PowReal(e,n1))     => (changed:=true;(E.PowReal(E.Sum(sx,e),n1)))
82                | E.Sum(sx,E.Sqrt e)            => (changed:=true;(E.Sqrt(E.Sum(sx,e))))
83                | E.Sum(sx,E.Sum (c2,e))        => (changed:=true; (E.Sum (sx@c2,e)))
84                | E.Sum(sx,E.Prod p)            => let
85                    val p'=List.map (fn e=> rewrite e) p
86                    val (c,e)=filterSca(sx,p')
87                    in (case c of 1=> (changed:=true; e) | _=> e ) end
88                | E.Div(e1,e2)                  => E.Div(rewrite e1, rewrite e2)
89                | E.Sub(e1,E.Const 0)           => (changed:=true; rewrite e1)
90                | E.Sub(e1,e2)                  => E.Sub(rewrite e1, rewrite e2)
91                | E.Add es                      => E.Add(List.map rewrite es)
92                | E.Prod es                     => E.Prod(List.map rewrite es)
93                | E.Neg e                       => E.Neg(rewrite e)
94                | E.Sqrt e                      => E.Sqrt(rewrite e)
95                | E.Probe(e1,e2)                => E.Probe(rewrite e1, rewrite e2)
96                | _                             => b
97                (*end case*))
98            fun loop body  = let
99                val body' = rewrite body
100                in
101                    if !changed then  (changed := false ;loop body') else  body'
102                end
103    
104            val  b = loop body
105            val _ =testp["\nAfter distributeSummation \n",P.printbody b]
106            val ein=SummationEin.cleanSummation(Ein.EIN{params=params, index=index, body=b})
107            val b = loop(Ein.body ein)
108            val ein=Ein.EIN{params=Ein.params ein, index=Ein.index ein, body=b}
109            val einapp2= (y,DstIL.EINAPP(ein,args))
110            in
111                einapp2
112            end
113        |distributeSummation(y,app) =(y,app)
114    
115    
116        fun expandEinOp einapp00=let
117            val star="************"
118            val _ =testp[star,"\n Original EinApp",star,"\n\n","start get test",printEINAPP einapp00]
119            val (y,einapp as DstIL.EINAPP(Ein.EIN{params, index, body},args))=einapp00
120    
121            (* ************* Sweep for 0's'*********** *)
122            val bodysweep=sweep body
123            val ein1=Ein.EIN{params=params, index=index, body=bodysweep}
124            val _=testp["\nPresweep\n",P.printbody body,"\n\n Sweep\n",P.printbody bodysweep,"\n"]
125    
126            (* **************Clean Summation*********** *)
127            val ein2=SummationEin.cleanSummation(ein1)
128            val einapp2=(y,DstIL.EINAPP(ein2, args))
129            val _ =testp["\n\n******* after clean summation**",Int.toString (0)," ***** \n \t==>\n",printEINAPP(einapp2)]
130    
131            (* ************** distribute Summation*********** *)
132            val einapp3 = distributeSummation einapp2
133    
134            (* ************** split initial *********** *)
135            val (einapp4,newbies4)=Split.split einapp3
136            val _ =testp["\n\t===>\n",printEINAPP(einapp4),"\nand\n",(String.concatWith",\n\t"(List.map printEINAPP newbies4))]
137    
138            (* ************** split Multiple *********** *)
139            val (einapp5,newbies5)= Split.iterMultiple(einapp4,newbies4)
140            val _ =testp["\n\n Returning \n\n =>",printEINAPP einapp5,
141            " newbies\n\t",String.concatWith",\n\t"(List.map printEINAPP newbies5), "\n",star]
142    
143    
144             (* ************** ProbeEIN *********** *)
145            val code=List.map (fn e=>ProbeEin.expandEinOp e) (newbies5@[einapp5])
146            val flatcode= List.foldr op@ [] code
147            in
148                List.map (fn (y,rator)=> DstIL.ASSGN(y,rator)) flatcode
149            end
150    
151    
152    
153    end; (* local *)    end; (* local *)
154    
155  end (* local *)  end (* local *)

Legend:
Removed from v.2955  
changed lines
  Added in v.3033

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