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 3048 - (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 :     structure DstV = DstIL.Var
18 :     in
19 :    
20 : cchiw 2847 val testing=0
21 : cchiw 2845 fun setEin(params,index,body)=Ein.EIN{params=params, index=index, body=body}
22 :     fun assignEinApp(y,params,index,body,args)= (y,DstIL.EINAPP(setEin(params,index,body),args))
23 :     fun assignEinApp(y,params,index,body,args)= (y,DstIL.EINAPP(setEin(params,index,body),args))
24 :     fun iTos i =Int.toString i
25 :     fun testp n=(case testing
26 :     of 0=> 1
27 :     | _ =>(print(String.concat n);1)
28 :     (*end case*))
29 : cchiw 3048 fun test0 n=(*print(String.concat n)*) 1
30 : cchiw 2845 val einappzero=DstIL.EINAPP(setEin([],[],E.Const 0),[])
31 :     fun setEinZero y= (y,einappzero)
32 : cchiw 3033 fun filterSca e=Filter.filterSca e
33 :     fun printEINAPP e=MidToString.printEINAPP e
34 : cchiw 2845
35 :    
36 : cchiw 3033
37 : cchiw 2923 fun z e=String.concat["\n\n Found: ",P.printbody e,"=> 0\n"]
38 : cchiw 2955 fun sweep e= (z e;case e
39 : cchiw 2870 of E.Tensor _ => e
40 :     | E.Add es => E.Add(List.map sweep es)
41 :     | E.Sub(e1,e2) => E.Sub(sweep e1,sweep e2)
42 :     | E.Div(e1,e2) => E.Div(sweep e1,sweep e2)
43 :     | E.Sum(c ,e) => E.Sum(c, sweep e)
44 :     | E.Prod es => E.Prod(List.map sweep es)
45 :     | E.Neg e => E.Neg(sweep e)
46 :     | E.Probe(E.Conv _,_) => e
47 :     | E.Sqrt e => E.Sqrt(sweep e)
48 :     | E.Const _ => e
49 :     | E.ConstR _ => e
50 :     | E.Delta _ => e
51 :     | E.Epsilon _ => e
52 :     | E.Eps2 _ => e
53 : cchiw 2923 | E.Field _ => (z e;E.Const 0)
54 :     | E.Partial _ => (z e;E.Const 0)
55 :     | E.Apply _ => (z e;E.Const 0)
56 :     | E.Lift _ => (z e;E.Const 0)
57 :     | E.Conv _ => (z e;E.Const 0)
58 : cchiw 2870 | E.PowInt(e ,n) => E.PowInt(sweep e ,n)
59 :     | E.PowReal(e,n) => E.PowReal(sweep e ,n)
60 :     | E.Probe _ =>
61 : cchiw 3033 raise Fail (String.concat["\n Incorrect probe, substition was not made. Is the Field in an if statement? :",P.printbody e])
62 : cchiw 2870 (*end case*))
63 : cchiw 3033
64 :    
65 :     (*Distribute summation if needed*)
66 :     fun distributeSummation(y,einapp as DstIL.EINAPP(Ein.EIN{params, index, body},args))=let
67 :     val changed = ref false
68 :     fun rewrite b=(case b
69 :     of E.Sum(sx,E.Tensor(id,[])) => (changed:=true;E.Tensor(id,[]))
70 :     | E.Sum(sx,E.Const c) => (changed:=true;E.Const c)
71 :     | E.Sum(sx,E.ConstR r) => (changed:=true;E.ConstR r)
72 :     | E.Sum(sx,E.Neg n) => (changed:=true;(E.Neg(E.Sum(sx,n))))
73 :     | E.Sum(sx,E.Add a) =>
74 :     (changed:=true;(E.Add(List.map (fn e=> E.Sum(sx,e)) a)))
75 :     | E.Sum(sx,E.Sub (e1,e2)) =>
76 :     (changed:=true;(E.Sub(E.Sum(sx,e1),E.Sum(sx,e2))))
77 :     | E.Sum(sx,E.Div(E.Const c,e2)) =>
78 :     (changed:=true;(E.Div(E.Const c, E.Sum(sx,e2))))
79 :     | E.Sum(sx,E.Div(e1,e2)) => (changed:=true;
80 :     (E.Sum(sx,E.Prod[e1,E.Div(E.Const 1,rewrite e2)])))
81 :     | E.Sum(sx,E.Lift e ) => (changed:=true;(E.Lift(E.Sum(sx,e))))
82 :     | E.Sum(sx,E.PowReal(e,n1)) => (changed:=true;(E.PowReal(E.Sum(sx,e),n1)))
83 :     | E.Sum(sx,E.Sqrt e) => (changed:=true;(E.Sqrt(E.Sum(sx,e))))
84 :     | E.Sum(sx,E.Sum (c2,e)) => (changed:=true; (E.Sum (sx@c2,e)))
85 :     | E.Sum(sx,E.Prod p) => let
86 :     val p'=List.map (fn e=> rewrite e) p
87 :     val (c,e)=filterSca(sx,p')
88 :     in (case c of 1=> (changed:=true; e) | _=> e ) end
89 :     | E.Div(e1,e2) => E.Div(rewrite e1, rewrite e2)
90 :     | E.Sub(e1,E.Const 0) => (changed:=true; rewrite e1)
91 :     | E.Sub(e1,e2) => E.Sub(rewrite e1, rewrite e2)
92 :     | E.Add es => E.Add(List.map rewrite es)
93 :     | E.Prod es => E.Prod(List.map rewrite es)
94 :     | E.Neg e => E.Neg(rewrite e)
95 :     | E.Sqrt e => E.Sqrt(rewrite e)
96 :     | E.Probe(e1,e2) => E.Probe(rewrite e1, rewrite e2)
97 :     | _ => b
98 :     (*end case*))
99 :     fun loop body = let
100 :     val body' = rewrite body
101 :     in
102 :     if !changed then (changed := false ;loop body') else body'
103 :     end
104 :    
105 :     val b = loop body
106 :     val _ =testp["\nAfter distributeSummation \n",P.printbody b]
107 :     val ein=SummationEin.cleanSummation(Ein.EIN{params=params, index=index, body=b})
108 :     val b = loop(Ein.body ein)
109 :     val ein=Ein.EIN{params=Ein.params ein, index=Ein.index ein, body=b}
110 :     val einapp2= (y,DstIL.EINAPP(ein,args))
111 :     in
112 :     einapp2
113 :     end
114 :     |distributeSummation(y,app) =(y,app)
115 :    
116 :    
117 :     fun expandEinOp einapp00=let
118 :     val star="************"
119 : cchiw 3048 val _ =test0[star,"\n Original EinApp",star,"\n\n","start get test",printEINAPP einapp00]
120 : cchiw 3033 val (y,einapp as DstIL.EINAPP(Ein.EIN{params, index, body},args))=einapp00
121 :    
122 :     (* ************* Sweep for 0's'*********** *)
123 :     val bodysweep=sweep body
124 :     val ein1=Ein.EIN{params=params, index=index, body=bodysweep}
125 :     val _=testp["\nPresweep\n",P.printbody body,"\n\n Sweep\n",P.printbody bodysweep,"\n"]
126 :    
127 :     (* **************Clean Summation*********** *)
128 :     val ein2=SummationEin.cleanSummation(ein1)
129 :     val einapp2=(y,DstIL.EINAPP(ein2, args))
130 :     val _ =testp["\n\n******* after clean summation**",Int.toString (0)," ***** \n \t==>\n",printEINAPP(einapp2)]
131 :    
132 :     (* ************** distribute Summation*********** *)
133 :     val einapp3 = distributeSummation einapp2
134 :    
135 :     (* ************** split initial *********** *)
136 :     val (einapp4,newbies4)=Split.split einapp3
137 :     val _ =testp["\n\t===>\n",printEINAPP(einapp4),"\nand\n",(String.concatWith",\n\t"(List.map printEINAPP newbies4))]
138 :    
139 :     (* ************** split Multiple *********** *)
140 :     val (einapp5,newbies5)= Split.iterMultiple(einapp4,newbies4)
141 :     val _ =testp["\n\n Returning \n\n =>",printEINAPP einapp5,
142 :     " newbies\n\t",String.concatWith",\n\t"(List.map printEINAPP newbies5), "\n",star]
143 :    
144 :     (* ************** ProbeEIN *********** *)
145 :     val code=List.map (fn e=>ProbeEin.expandEinOp e) (newbies5@[einapp5])
146 :     val flatcode= List.foldr op@ [] code
147 : cchiw 3048 (*val _=List.map (fn(_,DstIL.EINAPP(e,_))=>checkEin.checkEIN e | _=> 1) flatcode*)
148 : cchiw 3033 in
149 :     List.map (fn (y,rator)=> DstIL.ASSGN(y,rator)) flatcode
150 :     end
151 :    
152 :    
153 :    
154 : cchiw 2845 end; (* local *)
155 :    
156 :     end (* local *)

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