Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/charisee/src/compiler/mid-to-low/helper.sml
ViewVC logotype

Diff of /branches/charisee/src/compiler/mid-to-low/helper.sml

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

revision 2859, Thu Jan 22 07:37:46 2015 UTC revision 3196, Fri May 29 18:42:37 2015 UTC
# Line 11  Line 11 
11      structure SrcOp = MidOps      structure SrcOp = MidOps
12      structure E = Ein      structure E = Ein
13      structure LowToS= LowToString      structure LowToS= LowToString
14        structure FL=FloatLit
15        structure IMap = IntRedBlackMap
16      in      in
17    
18      val testing=0      val testing=0
# Line 21  Line 22 
22      val intTy=DstTy.intTy      val intTy=DstTy.intTy
23      fun iTos e1=Int.toString e1      fun iTos e1=Int.toString e1
24      fun iToss es=String.concat(List.map iTos es)      fun iToss es=String.concat(List.map iTos es)
     fun lookup k d = d k  
25      fun testp n= (case testing      fun testp n= (case testing
26          of 0=> 0          of 0=> 0
27          | _ =>((print (String.concat n));1)          | _ =>((print (String.concat n));1)
28          (*end case*))          (*end case*))
29    
30      fun insert (key, value) d =fn s =>      val empty = IMap.empty
31          if s = key then SOME value      fun lookup k d = IMap.find(d, k)
32          else d s      fun insert (k, v) d = IMap.insert(d, k, v)
33        fun find (v, mapp) = (case IMap.find(mapp, v)
34      fun find(v, mapp)=(case (lookup v mapp)             of NONE => raise Fail(concat["Outside Bound(", Int.toString v, ")"])
         of NONE=> raise Fail ("Outside Bound("^Int.toString(v)^")")  
35          |SOME s => s          |SOME s => s
36          (*end case*))            (* end *))
37    
38      (*mapIndex:E.mu * dict-> int      (*mapIndex:E.mu * dict-> int
39      * lookup      * lookup
# Line 45  Line 44 
44          (*end case*))          (*end case*))
45    
46    
47      (* mkReal:int->Var*LowIL.ASSGN list      (* intToReal:int->Var*LowIL.ASSGN list
48      *)      *)
49      fun mkReal n=let      fun intToReal n=let
50          val a=DstIL.Var.new("Real" ,realTy)          val a=DstIL.Var.new("real" ,realTy)
51          val code=DstIL.ASSGN (a,DstIL.LIT(Literal.Int(IntInf.fromInt n)))          val b=DstIL.Var.new("cast" ,realTy)
52          val _ =testp[LowToS.toStringAll(realTy,code)]          val code=[DstIL.ASSGN (a,DstIL.LIT(Literal.Int(IntInf.fromInt n))),
53                      DstIL.ASSGN (b,DstIL.OP(DstOp.IntToReal,[a]))]
54          in          in
55              (a,[code])              (b,code)
56          end          end
57    
58    
59    
60      (* mkINt:int->Var*LowIL.ASSGN list      (* mkINt:int->Var*LowIL.ASSGN list
61      *)      *)
62      fun mkInt n=let      fun mkInt n=let
# Line 70  Line 72 
72      *)      *)
73      fun assgnCons(pre,shape, args)=let      fun assgnCons(pre,shape, args)=let
74          val ty=DstTy.TensorTy shape          val ty=DstTy.TensorTy shape
75          val a=DstIL.Var.new("cons"^"_"^pre^"_" ,ty)          val a=DstIL.Var.new("cons"^"_" ,ty)
76          val code=DstIL.ASSGN (a,DstIL.CONS(ty ,args))          val code=DstIL.ASSGN (a,DstIL.CONS(ty ,args))
77          val _ =testp[LowToS.toStringAll(ty,code)]          val _ =testp[LowToS.toStringAll(ty,code)]
78          in          in
# Line 102  Line 104 
104      * ->Var*LowIL.ASSGN list      * ->Var*LowIL.ASSGN list
105      * Index Tensor at specific indices to give a scalar result      * Index Tensor at specific indices to give a scalar result
106      *)      *)
107      fun indexTensor(_,(_,_,args,id, [],ty)) = (List.nth(args,id),[])      fun indexTensor(_,(_,_,args,id, [],ty)) =
108            (List.nth(args,id),[])
109        | indexTensor(mapp,(lhs,params,args,id,ix,ty))= let        | indexTensor(mapp,(lhs,params,args,id,ix,ty))= let
110          val nU=List.nth(args,id)          val nU=List.nth(args,id)
111          val ixx=(List.map (fn (e1)=> mapIndex(e1,mapp)) ix)          val ixx=(List.map (fn (e1)=> mapIndex(e1,mapp)) ix)
112          val ix'=DstTy.indexTy ixx          val ix'=DstTy.indexTy ixx
113          val argTy=getTensorTy(params,id)          val argTy=getTensorTy(params,id)
114          val opp=DstOp.IndexTensor(id,ix',argTy)          val opp=DstOp.IndexTensor(id,ix',argTy)
115          val name=String.concat[Var.name nU,"_",iToss ixx,"_"]          val name=String.concat["Indx_",iToss ixx,"_"]
116          in          in
117              assgn(opp,[nU],name,ty)              assgn(opp,[nU],name,ty)
118          end          end
# Line 118  Line 121 
121      * projects tensor to a vector      * projects tensor to a vector
122      *just used by EintoVecOps but made sense to keep it here      *just used by EintoVecOps but made sense to keep it here
123      *)      *)
124      fun projTensor(_,(_,_,args,_,id,[]))= (List.nth(args,id),[])      fun (* projTensor(_,(_,_,args,3,id,[]))=let
125            val opp=DstOp.LdVec 3
126            val nU=List.nth(args,id)
127            val name=String.concat["LdVec_"]
128            val vecTy=DstTy.TensorTy [3]
129            in
130                assgn(opp,[nU],name,vecTy)
131            end
132        |*) projTensor(_,(_,_,args,_,id,[]))= (List.nth(args,id),[])
133      | projTensor(mapp,(lhs,params,args,vecIX,id,ix))= let      | projTensor(mapp,(lhs,params,args,vecIX,id,ix))= let
134          val nU=List.nth(args,id)          val nU=List.nth(args,id)
135          val ixx=(List.map (fn (e1)=> mapIndex(e1,mapp)) ix)          val ixx=(List.map (fn (e1)=> mapIndex(e1,mapp)) ix)
136          val ix'=DstTy.indexTy ixx          val ix'=DstTy.indexTy ixx
137          val argTy= getTensorTy(params,id)          val argTy= getTensorTy(params,id)
138          val vecTy=DstTy.TensorTy [vecIX]          val vecTy=DstTy.TensorTy [vecIX]
139          val opp=DstOp.ProjectTensor(id,vecIX,ix',argTy)          val opp=DstOp.ProjectLast(id,vecIX,ix',argTy)
140          val name=String.concat[Var.name nU,"V_",iToss ixx,"_"]          val name=String.concat["ProjLast_",iToss ixx,"_"]
141          in          in
142              assgn(opp,[nU],name,vecTy)              assgn(opp,[nU],name,vecTy)
143          end          end
144    
145    
146        fun projFirst(mapp,(lhs,params,args,vecIX,id,ix))= let
147            val nU=List.nth(args,id)
148            val argTy= getTensorTy(params,id)
149            val vecTy=DstTy.TensorTy [vecIX]
150            val ixx=(List.map (fn (e1)=> mapIndex(e1,mapp)) ix)
151            fun f cnt = let
152                val ix'=DstTy.indexTy ([cnt]@ixx)
153                val opp=DstOp.IndexTensor(id,ix',argTy)
154                val name=String.concat["IndexTensor_",iToss ixx,"_"]
155                in
156                    assgn(opp,[nU],name,realTy)
157                end
158            val ops=List.tabulate( vecIX, fn e=> f e)
159            fun iter ([],vCs,Cs)=(vCs,Cs)
160              | iter((vB,B)::es,vCs,Cs)= iter(es,vCs@[vB],Cs@B)
161    
162             val (vCs,Cs)=iter(ops,[],[])
163             val (vD,D)=assgnCons("projFirstCons", [vecIX], vCs)
164            in
165                (vD, Cs@D)
166            end
167    
168    
169    
170        fun projFirst2(mapp,(lhs,params,args,vecIX,id,ix))= let
171            val nU=List.nth(args,id)
172            val argTy= getTensorTy(params,id)
173            val vecTy=DstTy.TensorTy [vecIX]
174            val ixx=(List.map (fn (e1)=> mapIndex(e1,mapp)) ix)
175            val ix'=DstTy.indexTy ixx
176            val opp=DstOp.ProjectFirst(id,vecIX,ix',argTy)
177            val name=String.concat["ProjFirst_",iToss ixx,"_"]
178            in assgn(opp,[nU],name,vecTy)
179            end
180    
181    
182    
183        fun mkSqrt(nU,code)= let
184            val opp=DstOp.Sqrt
185            val name=String.concat["_Sqrt_"]
186            val (vA,A)=assgn(opp,[nU],name,realTy)
187            in
188                (vA,code@A)
189            end
190    
191        fun mkCosine(nU,code)= let
192            val opp=DstOp.Cosine
193            val name=String.concat["_Cosine_"]
194            val (vA,A)=assgn(opp,[nU],name,realTy)
195            in
196                (vA,code@A)
197            end
198    
199        fun mkArcCosine(nU,code)= let
200            val opp=DstOp.ArcCosine
201            val name=String.concat["_ArcCosine_"]
202            val (vA,A)=assgn(opp,[nU],name,realTy)
203            in
204            (vA,code@A)
205            end
206    
207        fun mkSine(nU,code)= let
208            val opp=DstOp.Sine
209            val name=String.concat["_Sine_"]
210            val (vA,A)=assgn(opp,[nU],name,realTy)
211            in
212                (vA,code@A)
213            end
214    
215        fun mkArcSine(nU,code)= let
216            val opp=DstOp.ArcSine
217            val name=String.concat["_ArcSine_"]
218            val (vA,A)=assgn(opp,[nU],name,realTy)
219            in
220                (vA,code@A)
221            end
222    
223    
224        fun mkPowInt((nU,code),n)= let
225            val opp=DstOp.powInt
226            val name=String.concat["_PowInt_"]
227            val (r,rcode)=mkInt n
228            val (vA,A)=assgn(opp,[nU,r],name,realTy)
229            in
230                (vA,code@rcode@A)
231            end
232    
233        fun mkPowRat((nU,code),rat)= let
234            val opp=DstOp.powRat(DstTy.R rat)
235            val name=String.concat["_PowRat_"]
236    
237            val (vA,A)=assgn(opp,[nU],name,realTy)
238            in
239                (vA,code@A)
240            end
241    
242    
243    
244    
245    
246    
247      (* Some shortcuts. Arguements are Low-IL variables already indexed/projected      (* Some shortcuts. Arguements are Low-IL variables already indexed/projected
248      * string*Var list ->Var*LowIL.ASSGN list      * string*Var list ->Var*LowIL.ASSGN list
249      *)      *)
250      fun mkAddSca(lhs,args)= assgn(DstOp.addSca,args,lhs^"addSca",realTy)      fun mkAddSca(lhs,args)= assgn(DstOp.addSca,args,"addSca",realTy)
251      fun mkAddInt(lhs,args)= assgn(DstOp.addSca,args,lhs^"addInt",intTy)      fun mkAddInt(lhs,args)= assgn(DstOp.addSca,args,"addInt",intTy)
252      fun mkAddPtr(lhs,args,ty)= assgn(DstOp.addSca,args,lhs^"addPtr",ty)      fun mkAddPtr(lhs,args,ty)= assgn(DstOp.addSca,args,"addPtr",ty)
253      fun mkAddVec(lhs,vecIX,args)=assgn(DstOp.addVec vecIX,args,lhs^"addV",DstTy.TensorTy([vecIX]))      fun mkAddVec(lhs,vecIX,args)=assgn(DstOp.addVec vecIX,args,"addV",DstTy.TensorTy([vecIX]))
254      fun mkSubSca(lhs,args)= assgn(DstOp.subSca,args,lhs^"subSca",realTy)      fun mkSubSca(lhs,args)= assgn(DstOp.subSca,args,"subSca",realTy)
255      fun mkProdSca(lhs,args)=assgn(DstOp.prodSca,args,lhs^"prodSca",realTy)      fun mkProdSca(lhs,args)=assgn(DstOp.prodSca,args,"prodSca",realTy)
256      fun mkProdInt(lhs,args)=assgn(DstOp.prodSca,args,lhs^"prodInt",intTy)      fun mkProdInt(lhs,args)=assgn(DstOp.prodSca,args,"prodInt",intTy)
257      fun mkProdVec(lhs,vecIX,args)=assgn(DstOp.prodVec vecIX,args,lhs^"prodV",DstTy.TensorTy([vecIX]))      fun mkProdVec(lhs,vecIX,args)=assgn(DstOp.prodVec vecIX,args,"prodV",DstTy.TensorTy([vecIX]))
258      fun mkDivSca(lhs,args)= assgn(DstOp.divSca,args,lhs^"divSca",realTy)      fun mkDivSca(lhs,args)= assgn(DstOp.divSca,args,"divSca",realTy)
259      fun mkSumVec(lhs,vecIX,args)= assgn(DstOp.sumVec vecIX,args,lhs^"sumVec",realTy)      fun mkSumVec(lhs,vecIX,args)= assgn(DstOp.sumVec vecIX,args,"sumVec",realTy)
260      fun mkDotVec(lhs,vecIX,args)=let      fun mkDotVec(lhs,vecIX,args)=let
261          val (vD, D)=mkProdVec(lhs,vecIX,args)          val (vD, D)=mkProdVec("",vecIX,args)
262          val (vE, E)=mkSumVec(lhs,vecIX,[vD])          val (vE, E)=mkSumVec("",vecIX,[vD])
263          in (vE,D@E) end          in (vE,D@E) end
264    
265    
# Line 157  Line 270 
270          fun add([],_,_)         = err"no element in mkMultiple"          fun add([],_,_)         = err"no element in mkMultiple"
271          | add([e1],_,_)         = (e1,[])          | add([e1],_,_)         = (e1,[])
272          | add([e1,e2],code,_)     = let          | add([e1,e2],code,_)     = let
273              val (vA,A)=assgn(rator,[e1,e2],lhs^"_2",ty)              val (vA,A)=assgn(rator,[e1,e2],"mult_2",ty)
274              in  (vA,code@A) end              in  (vA,code@A) end
275          | add(e1::e2::es,code,count)  = let          | add(e1::e2::es,code,count)  = let
276              val (vA,A)=assgn(rator,[e1,e2],String.concat[lhs,"_",iTos count],ty)              val (vA,A)=assgn(rator,[e1,e2],String.concat["mult_",iTos count],ty)
277              in  add(vA::es,code@A,count-1)              in  add(vA::es,code@A,count-1)
278              end              end
279          in          in
# Line 177  Line 290 
290              if(i=j) then 1 else  0              if(i=j) then 1 else  0
291          end          end
292    
293      fun evalDelta(mapp,a,b)= mkReal(deltaToInt(mapp,a,b))      fun evalDelta(mapp,a,b)= intToReal(deltaToInt(mapp,a,b))
294    
295      (*eval Epsilon-2d*)      (*eval Epsilon-2d*)
296      fun evalEps2(mapp,a,b)=let      fun evalEps2(mapp,a,b)=let
297          val i=mapIndex(E.V a,mapp)          val i=mapIndex(E.V a,mapp)
298          val j=mapIndex(E.V b,mapp)          val j=mapIndex(E.V b,mapp)
299          in          in
300              if(i=j) then mkReal 0              if(i=j) then intToReal 0
301              else              else
302                  if(j>i) then mkReal 1                  if(j>i) then intToReal 1
303                  else mkReal ~1                  else intToReal ~1
304          end          end
305    
306      (*eval Epsilon-3d*)      (*eval Epsilon-3d*)
# Line 196  Line 309 
309          val j=mapIndex(E.V b,mapp)          val j=mapIndex(E.V b,mapp)
310          val k=mapIndex(E.V c,mapp)          val k=mapIndex(E.V c,mapp)
311          in          in
312              if(i=j orelse j=k orelse i=k) then mkReal 0              if(i=j orelse j=k orelse i=k) then intToReal 0
313              else              else
314                  if(j>i) then                  if(j>i) then
315                      if(j>k andalso k>i) then mkReal ~1 else mkReal 1                      if(j>k andalso k>i) then intToReal ~1 else intToReal 1
316                  else if(i>k andalso k>j) then mkReal 1 else mkReal ~1                  else if(i>k andalso k>j) then intToReal 1 else intToReal ~1
317    
318          end          end
319    

Legend:
Removed from v.2859  
changed lines
  Added in v.3196

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