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 3174 - (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 3166 fun sweep e= (case e
40 :     of E.Tensor _ => e
41 : cchiw 2870 | E.Add es => E.Add(List.map sweep es)
42 :     | E.Sub(e1,e2) => E.Sub(sweep e1,sweep e2)
43 :     | E.Div(e1,e2) => E.Div(sweep e1,sweep e2)
44 :     | E.Sum(c ,e) => E.Sum(c, sweep e)
45 : cchiw 3166 | E.Prod es => E.Prod(List.map sweep es)
46 : cchiw 2870 | E.Neg e => E.Neg(sweep e)
47 :     | E.Probe(E.Conv _,_) => e
48 :     | E.Sqrt e => E.Sqrt(sweep e)
49 : cchiw 3138 | E.Cosine e => E.Cosine(sweep e)
50 :     | E.ArcCosine e => E.ArcCosine(sweep e)
51 :     | E.Sine e => E.Sine(sweep e)
52 : cchiw 3166 | E.ArcSine e => E.ArcSine(sweep e)
53 : cchiw 2870 | E.Const _ => e
54 :     | E.ConstR _ => e
55 : cchiw 3166 | E.Delta _ => e
56 :     | E.Epsilon _ => e
57 :     | E.Eps2 _ => e
58 : cchiw 2923 | E.Field _ => (z e;E.Const 0)
59 :     | E.Partial _ => (z e;E.Const 0)
60 :     | E.Apply _ => (z e;E.Const 0)
61 :     | E.Lift _ => (z e;E.Const 0)
62 :     | E.Conv _ => (z e;E.Const 0)
63 : cchiw 2870 | E.PowInt(e ,n) => E.PowInt(sweep e ,n)
64 :     | E.PowReal(e,n) => E.PowReal(sweep e ,n)
65 :     | E.Probe _ =>
66 : cchiw 3033 raise Fail (String.concat["\n Incorrect probe, substition was not made. Is the Field in an if statement? :",P.printbody e])
67 : cchiw 2870 (*end case*))
68 : cchiw 3033
69 :    
70 :     (*Distribute summation if needed*)
71 :     fun distributeSummation(y,einapp as DstIL.EINAPP(Ein.EIN{params, index, body},args))=let
72 :     val changed = ref false
73 :     fun rewrite b=(case b
74 :     of E.Sum(sx,E.Tensor(id,[])) => (changed:=true;E.Tensor(id,[]))
75 :     | E.Sum(sx,E.Const c) => (changed:=true;E.Const c)
76 :     | E.Sum(sx,E.ConstR r) => (changed:=true;E.ConstR r)
77 :     | E.Sum(sx,E.Neg n) => (changed:=true;(E.Neg(E.Sum(sx,n))))
78 :     | E.Sum(sx,E.Add a) =>
79 :     (changed:=true;(E.Add(List.map (fn e=> E.Sum(sx,e)) a)))
80 :     | E.Sum(sx,E.Sub (e1,e2)) =>
81 :     (changed:=true;(E.Sub(E.Sum(sx,e1),E.Sum(sx,e2))))
82 :     | E.Sum(sx,E.Div(E.Const c,e2)) =>
83 :     (changed:=true;(E.Div(E.Const c, E.Sum(sx,e2))))
84 :     | E.Sum(sx,E.Div(e1,e2)) => (changed:=true;
85 :     (E.Sum(sx,E.Prod[e1,E.Div(E.Const 1,rewrite e2)])))
86 :     | E.Sum(sx,E.Lift e ) => (changed:=true;(E.Lift(E.Sum(sx,e))))
87 :     | E.Sum(sx,E.PowReal(e,n1)) => (changed:=true;(E.PowReal(E.Sum(sx,e),n1)))
88 :     | E.Sum(sx,E.Sqrt e) => (changed:=true;(E.Sqrt(E.Sum(sx,e))))
89 :     | E.Sum(sx,E.Sum (c2,e)) => (changed:=true; (E.Sum (sx@c2,e)))
90 :     | E.Sum(sx,E.Prod p) => let
91 :     val p'=List.map (fn e=> rewrite e) p
92 :     val (c,e)=filterSca(sx,p')
93 :     in (case c of 1=> (changed:=true; e) | _=> e ) end
94 :     | E.Div(e1,e2) => E.Div(rewrite e1, rewrite e2)
95 :     | E.Sub(e1,E.Const 0) => (changed:=true; rewrite e1)
96 :     | E.Sub(e1,e2) => E.Sub(rewrite e1, rewrite e2)
97 :     | E.Add es => E.Add(List.map rewrite es)
98 :     | E.Prod es => E.Prod(List.map rewrite es)
99 :     | E.Neg e => E.Neg(rewrite e)
100 :     | E.Sqrt e => E.Sqrt(rewrite e)
101 : cchiw 3138 | E.Cosine e => E.Cosine(rewrite e)
102 :     | E.ArcCosine e => E.ArcCosine(rewrite e)
103 :     | E.Sine e => E.Sine(rewrite e)
104 :     | E.ArcSine e => E.ArcSine(rewrite e)
105 : cchiw 3033 | E.Probe(e1,e2) => E.Probe(rewrite e1, rewrite e2)
106 :     | _ => b
107 :     (*end case*))
108 :     fun loop body = let
109 :     val body' = rewrite body
110 :     in
111 :     if !changed then (changed := false ;loop body') else body'
112 :     end
113 :    
114 :     val b = loop body
115 :     val _ =testp["\nAfter distributeSummation \n",P.printbody b]
116 :     val ein=SummationEin.cleanSummation(Ein.EIN{params=params, index=index, body=b})
117 :     val b = loop(Ein.body ein)
118 :     val ein=Ein.EIN{params=Ein.params ein, index=Ein.index ein, body=b}
119 :     val einapp2= (y,DstIL.EINAPP(ein,args))
120 :     in
121 :     einapp2
122 :     end
123 :     |distributeSummation(y,app) =(y,app)
124 :    
125 :    
126 : cchiw 3166
127 : cchiw 3033 fun expandEinOp einapp00=let
128 : cchiw 3166
129 :    
130 : cchiw 3033 val star="************"
131 : cchiw 3048 val _ =test0[star,"\n Original EinApp",star,"\n\n","start get test",printEINAPP einapp00]
132 : cchiw 3033 val (y,einapp as DstIL.EINAPP(Ein.EIN{params, index, body},args))=einapp00
133 : cchiw 3166
134 : cchiw 3033
135 :     (* ************* Sweep for 0's'*********** *)
136 :     val bodysweep=sweep body
137 :     val ein1=Ein.EIN{params=params, index=index, body=bodysweep}
138 :     val _=testp["\nPresweep\n",P.printbody body,"\n\n Sweep\n",P.printbody bodysweep,"\n"]
139 :    
140 :     (* **************Clean Summation*********** *)
141 :     val ein2=SummationEin.cleanSummation(ein1)
142 :     val einapp2=(y,DstIL.EINAPP(ein2, args))
143 :     val _ =testp["\n\n******* after clean summation**",Int.toString (0)," ***** \n \t==>\n",printEINAPP(einapp2)]
144 :    
145 :     (* ************** distribute Summation*********** *)
146 :     val einapp3 = distributeSummation einapp2
147 :    
148 : cchiw 3166 (* **************** split phase ************* *)
149 :     val (newbies5)= Split.splitEinApp einapp3
150 :     val _ =testp["\n\n Returning \n\n =>",
151 : cchiw 3174 String.concatWith",\n\t"(List.map printEINAPP newbies5)]
152 :     (* val _ =print(String.concat[
153 :     "\n",star,"Number of pieces: ",Int.toString (List.length(newbies5))])
154 :     *)
155 : cchiw 3166 (* ************** ProbeEIN *********** *)
156 : cchiw 3033
157 : cchiw 3174 (*val code=List.map (fn e=>ProbeEin.expandEinOp e) (newbies5)*)
158 :     val fieldset= einSet.EinSet.empty
159 :     fun iter([],_)=[]
160 :     | iter(e1::es,fieldset)= let
161 :     val (e2,fieldset) = ProbeEin.expandEinOp(e1,fieldset)
162 :     in [e2]@(iter(es,fieldset))
163 :     end
164 :     val code=iter(newbies5, fieldset)
165 :     (*val _ =print(String.concat[
166 :     "\n",star,"Number of pieces now: ",Int.toString (List.length(code))])
167 :     *)
168 : cchiw 3033 val flatcode= List.foldr op@ [] code
169 : cchiw 3048 (*val _=List.map (fn(_,DstIL.EINAPP(e,_))=>checkEin.checkEIN e | _=> 1) flatcode*)
170 : cchiw 3166
171 : cchiw 3033 in
172 :     List.map (fn (y,rator)=> DstIL.ASSGN(y,rator)) flatcode
173 :     end
174 :    
175 :    
176 : cchiw 2845 end; (* local *)
177 :    
178 :     end (* local *)

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