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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3193 - (view) (download)
Original Path: branches/charisee/src/compiler/high-to-mid/handleEin.sml

1 : cchiw 2845 (* Expands probe ein
2 :     *
3 :     * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *)
6 :    
7 :     structure handleEin = struct
8 :    
9 :     local
10 :    
11 :     structure E = Ein
12 :     structure DstIL = MidIL
13 :     structure DstOp = MidOps
14 :     structure P=Printer
15 :     structure T=TransformEin
16 :     structure MidToS=MidToString
17 : cchiw 3166 structure DstV = DstIL.Var
18 : cchiw 2845 in
19 :    
20 : cchiw 3166 val testinitial=0
21 : cchiw 2847 val testing=0
22 : cchiw 2845 fun setEin(params,index,body)=Ein.EIN{params=params, index=index, body=body}
23 :     fun assignEinApp(y,params,index,body,args)= (y,DstIL.EINAPP(setEin(params,index,body),args))
24 :     fun assignEinApp(y,params,index,body,args)= (y,DstIL.EINAPP(setEin(params,index,body),args))
25 :     fun iTos i =Int.toString i
26 :     fun testp n=(case testing
27 :     of 0=> 1
28 :     | _ =>(print(String.concat n);1)
29 :     (*end case*))
30 : cchiw 3166 fun test0 n=(case testinitial
31 :     of 0=>1
32 :     | _ => (print(String.concat n);1))
33 : cchiw 2845 val einappzero=DstIL.EINAPP(setEin([],[],E.Const 0),[])
34 :     fun setEinZero y= (y,einappzero)
35 : cchiw 3033 fun filterSca e=Filter.filterSca e
36 :     fun printEINAPP e=MidToString.printEINAPP e
37 : cchiw 2845
38 : cchiw 2923 fun z e=String.concat["\n\n Found: ",P.printbody e,"=> 0\n"]
39 : cchiw 3193
40 :     (*Turn High-IL ein expressions to 0
41 :     * Also, sweep for 0's
42 :     *)
43 :    
44 :     fun sortadd []=[]
45 :     | sortadd(E.Const 0::es)= sortadd es
46 :     | sortadd(e1::es) =[e1]@(sortadd es)
47 :    
48 :     fun sortprod( [],rest)=E.Prod rest
49 :     | sortprod(E.Const 0::_,_)= E.Const 0
50 :     | sortprod(e1::es,rest) =sortprod(es,rest@[e1])
51 :    
52 :    
53 : cchiw 3166 fun sweep e= (case e
54 :     of E.Tensor _ => e
55 : cchiw 3193 | E.Add es => (case sortadd(List.map sweep es)
56 :     of [] => E.Const 0
57 :     | es => E.Add es)
58 : cchiw 2870 | E.Sub(e1,e2) => E.Sub(sweep e1,sweep e2)
59 : cchiw 3193 | E.Div(e1,e2) => (case (sweep e1,sweep e2)
60 :     of (E.Const 0,e2)=> E.Const 0
61 :     | (e1,e2)=> E.Div(e1,e2))
62 : cchiw 2870 | E.Sum(c ,e) => E.Sum(c, sweep e)
63 : cchiw 3193 | E.Prod es => sortprod(List.map sweep es,[])
64 : cchiw 2870 | E.Neg e => E.Neg(sweep e)
65 :     | E.Probe(E.Conv _,_) => e
66 :     | E.Sqrt e => E.Sqrt(sweep e)
67 : cchiw 3138 | E.Cosine e => E.Cosine(sweep e)
68 :     | E.ArcCosine e => E.ArcCosine(sweep e)
69 :     | E.Sine e => E.Sine(sweep e)
70 : cchiw 3166 | E.ArcSine e => E.ArcSine(sweep e)
71 : cchiw 2870 | E.Const _ => e
72 :     | E.ConstR _ => e
73 : cchiw 3166 | E.Delta _ => e
74 :     | E.Epsilon _ => e
75 :     | E.Eps2 _ => e
76 : cchiw 2923 | E.Field _ => (z e;E.Const 0)
77 :     | E.Partial _ => (z e;E.Const 0)
78 :     | E.Apply _ => (z e;E.Const 0)
79 :     | E.Lift _ => (z e;E.Const 0)
80 :     | E.Conv _ => (z e;E.Const 0)
81 : cchiw 2870 | E.PowInt(e ,n) => E.PowInt(sweep e ,n)
82 :     | E.PowReal(e,n) => E.PowReal(sweep e ,n)
83 :     | E.Probe _ =>
84 : cchiw 3033 raise Fail (String.concat["\n Incorrect probe, substition was not made. Is the Field in an if statement? :",P.printbody e])
85 : cchiw 2870 (*end case*))
86 : cchiw 3033
87 :    
88 :     (*Distribute summation if needed*)
89 :     fun distributeSummation(y,einapp as DstIL.EINAPP(Ein.EIN{params, index, body},args))=let
90 :     val changed = ref false
91 :     fun rewrite b=(case b
92 :     of E.Sum(sx,E.Tensor(id,[])) => (changed:=true;E.Tensor(id,[]))
93 :     | E.Sum(sx,E.Const c) => (changed:=true;E.Const c)
94 :     | E.Sum(sx,E.ConstR r) => (changed:=true;E.ConstR r)
95 :     | E.Sum(sx,E.Neg n) => (changed:=true;(E.Neg(E.Sum(sx,n))))
96 :     | E.Sum(sx,E.Add a) =>
97 :     (changed:=true;(E.Add(List.map (fn e=> E.Sum(sx,e)) a)))
98 :     | E.Sum(sx,E.Sub (e1,e2)) =>
99 :     (changed:=true;(E.Sub(E.Sum(sx,e1),E.Sum(sx,e2))))
100 : cchiw 3193
101 : cchiw 3033 | E.Sum(sx,E.Div(E.Const c,e2)) =>
102 :     (changed:=true;(E.Div(E.Const c, E.Sum(sx,e2))))
103 :     | E.Sum(sx,E.Div(e1,e2)) => (changed:=true;
104 :     (E.Sum(sx,E.Prod[e1,E.Div(E.Const 1,rewrite e2)])))
105 :     | E.Sum(sx,E.Lift e ) => (changed:=true;(E.Lift(E.Sum(sx,e))))
106 :     | E.Sum(sx,E.PowReal(e,n1)) => (changed:=true;(E.PowReal(E.Sum(sx,e),n1)))
107 :     | E.Sum(sx,E.Sqrt e) => (changed:=true;(E.Sqrt(E.Sum(sx,e))))
108 :     | E.Sum(sx,E.Sum (c2,e)) => (changed:=true; (E.Sum (sx@c2,e)))
109 :     | E.Sum(sx,E.Prod p) => let
110 :     val p'=List.map (fn e=> rewrite e) p
111 :     val (c,e)=filterSca(sx,p')
112 :     in (case c of 1=> (changed:=true; e) | _=> e ) end
113 :     | E.Div(e1,e2) => E.Div(rewrite e1, rewrite e2)
114 :     | E.Sub(e1,E.Const 0) => (changed:=true; rewrite e1)
115 :     | E.Sub(e1,e2) => E.Sub(rewrite e1, rewrite e2)
116 :     | E.Add es => E.Add(List.map rewrite es)
117 :     | E.Prod es => E.Prod(List.map rewrite es)
118 :     | E.Neg e => E.Neg(rewrite e)
119 :     | E.Sqrt e => E.Sqrt(rewrite e)
120 : cchiw 3138 | E.Cosine e => E.Cosine(rewrite e)
121 :     | E.ArcCosine e => E.ArcCosine(rewrite e)
122 :     | E.Sine e => E.Sine(rewrite e)
123 :     | E.ArcSine e => E.ArcSine(rewrite e)
124 : cchiw 3033 | E.Probe(e1,e2) => E.Probe(rewrite e1, rewrite e2)
125 :     | _ => b
126 :     (*end case*))
127 :     fun loop body = let
128 :     val body' = rewrite body
129 :     in
130 :     if !changed then (changed := false ;loop body') else body'
131 :     end
132 :    
133 :     val b = loop body
134 :     val _ =testp["\nAfter distributeSummation \n",P.printbody b]
135 :     val ein=SummationEin.cleanSummation(Ein.EIN{params=params, index=index, body=b})
136 :     val b = loop(Ein.body ein)
137 :     val ein=Ein.EIN{params=Ein.params ein, index=Ein.index ein, body=b}
138 :     val einapp2= (y,DstIL.EINAPP(ein,args))
139 :     in
140 :     einapp2
141 :     end
142 :     |distributeSummation(y,app) =(y,app)
143 :    
144 :    
145 : cchiw 3166
146 : cchiw 3033 fun expandEinOp einapp00=let
147 : cchiw 3166
148 :    
149 : cchiw 3033 val star="************"
150 : cchiw 3048 val _ =test0[star,"\n Original EinApp",star,"\n\n","start get test",printEINAPP einapp00]
151 : cchiw 3033 val (y,einapp as DstIL.EINAPP(Ein.EIN{params, index, body},args))=einapp00
152 : cchiw 3166
153 : cchiw 3033
154 :     (* ************* Sweep for 0's'*********** *)
155 :     val bodysweep=sweep body
156 :     val ein1=Ein.EIN{params=params, index=index, body=bodysweep}
157 :     val _=testp["\nPresweep\n",P.printbody body,"\n\n Sweep\n",P.printbody bodysweep,"\n"]
158 :    
159 :     (* **************Clean Summation*********** *)
160 :     val ein2=SummationEin.cleanSummation(ein1)
161 :     val einapp2=(y,DstIL.EINAPP(ein2, args))
162 :     val _ =testp["\n\n******* after clean summation**",Int.toString (0)," ***** \n \t==>\n",printEINAPP(einapp2)]
163 :    
164 :     (* ************** distribute Summation*********** *)
165 :     val einapp3 = distributeSummation einapp2
166 :    
167 : cchiw 3166 (* **************** split phase ************* *)
168 :     val (newbies5)= Split.splitEinApp einapp3
169 :     val _ =testp["\n\n Returning \n\n =>",
170 : cchiw 3174 String.concatWith",\n\t"(List.map printEINAPP newbies5)]
171 :     (* val _ =print(String.concat[
172 :     "\n",star,"Number of pieces: ",Int.toString (List.length(newbies5))])
173 :     *)
174 : cchiw 3166 (* ************** ProbeEIN *********** *)
175 : cchiw 3033
176 : cchiw 3174 (*val code=List.map (fn e=>ProbeEin.expandEinOp e) (newbies5)*)
177 : cchiw 3189
178 :     (*gives probeEIN the set. Could split into a sepearate step*)
179 : cchiw 3174 val fieldset= einSet.EinSet.empty
180 :     fun iter([],_)=[]
181 :     | iter(e1::es,fieldset)= let
182 :     val (e2,fieldset) = ProbeEin.expandEinOp(e1,fieldset)
183 :     in [e2]@(iter(es,fieldset))
184 :     end
185 :     val code=iter(newbies5, fieldset)
186 : cchiw 3189 (*val _ =print(String.concat[
187 :     "\n",star,"Number of pieces now: ",Int.toString (List.length(code))])
188 :     *)
189 : cchiw 3033 val flatcode= List.foldr op@ [] code
190 : cchiw 3048 (*val _=List.map (fn(_,DstIL.EINAPP(e,_))=>checkEin.checkEIN e | _=> 1) flatcode*)
191 : cchiw 3166
192 : cchiw 3033 in
193 :     List.map (fn (y,rator)=> DstIL.ASSGN(y,rator)) flatcode
194 :     end
195 :    
196 :    
197 : cchiw 2845 end; (* local *)
198 :    
199 :     end (* local *)

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