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 2867, Tue Feb 10 06:52:58 2015 UTC revision 3138, Thu Mar 26 16:27:35 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 126  Line 129 
129          val argTy= getTensorTy(params,id)          val argTy= getTensorTy(params,id)
130          val vecTy=DstTy.TensorTy [vecIX]          val vecTy=DstTy.TensorTy [vecIX]
131          val opp=DstOp.ProjectTensor(id,vecIX,ix',argTy)          val opp=DstOp.ProjectTensor(id,vecIX,ix',argTy)
132          val name=String.concat[Var.name nU,"V_",iToss ixx,"_"]          val name=String.concat["Proj_",iToss ixx,"_"]
133          in          in
134              assgn(opp,[nU],name,vecTy)              assgn(opp,[nU],name,vecTy)
135          end          end
136    
   
137      fun mkSqrt(nU,code)= let      fun mkSqrt(nU,code)= let
138          val opp=DstOp.Sqrt          val opp=DstOp.Sqrt
139          val name=String.concat[Var.name nU,"_Sqrt_"]          val name=String.concat["_Sqrt_"]
140            val (vA,A)=assgn(opp,[nU],name,realTy)
141            in
142                (vA,code@A)
143            end
144    
145        fun mkCosine(nU,code)= let
146            val opp=DstOp.Cosine
147            val name=String.concat["_Cosine_"]
148            val (vA,A)=assgn(opp,[nU],name,realTy)
149            in
150                (vA,code@A)
151            end
152    
153        fun mkArcCosine(nU,code)= let
154            val opp=DstOp.ArcCosine
155            val name=String.concat["_ArcCosine_"]
156          val (vA,A)=assgn(opp,[nU],name,realTy)          val (vA,A)=assgn(opp,[nU],name,realTy)
157          in          in
158              (vA,code@A)              (vA,code@A)
159          end          end
160    
161        fun mkSine(nU,code)= let
162            val opp=DstOp.Sine
163            val name=String.concat["_Sine_"]
164            val (vA,A)=assgn(opp,[nU],name,realTy)
165            in
166                (vA,code@A)
167            end
168    
169        fun mkArcSine(nU,code)= let
170            val opp=DstOp.ArcSine
171            val name=String.concat["_ArcSine_"]
172            val (vA,A)=assgn(opp,[nU],name,realTy)
173            in
174                (vA,code@A)
175            end
176    
177    
178        fun mkPowInt((nU,code),n)= let
179            val opp=DstOp.powInt
180            val name=String.concat["_PowInt_"]
181            val (r,rcode)=mkInt n
182            val (vA,A)=assgn(opp,[nU,r],name,realTy)
183            in
184                (vA,code@rcode@A)
185            end
186    
187        fun mkPowRat((nU,code),rat)= let
188            val opp=DstOp.powRat(DstTy.R rat)
189            val name=String.concat["_PowRat_"]
190    
191            val (vA,A)=assgn(opp,[nU],name,realTy)
192            in
193                (vA,code@A)
194            end
195    
196    
197    
198    
199    
200    
201      (* Some shortcuts. Arguements are Low-IL variables already indexed/projected      (* Some shortcuts. Arguements are Low-IL variables already indexed/projected
202      * string*Var list ->Var*LowIL.ASSGN list      * string*Var list ->Var*LowIL.ASSGN list
203      *)      *)
204      fun mkAddSca(lhs,args)= assgn(DstOp.addSca,args,lhs^"addSca",realTy)      fun mkAddSca(lhs,args)= assgn(DstOp.addSca,args,"addSca",realTy)
205      fun mkAddInt(lhs,args)= assgn(DstOp.addSca,args,lhs^"addInt",intTy)      fun mkAddInt(lhs,args)= assgn(DstOp.addSca,args,"addInt",intTy)
206      fun mkAddPtr(lhs,args,ty)= assgn(DstOp.addSca,args,lhs^"addPtr",ty)      fun mkAddPtr(lhs,args,ty)= assgn(DstOp.addSca,args,"addPtr",ty)
207      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]))
208      fun mkSubSca(lhs,args)= assgn(DstOp.subSca,args,lhs^"subSca",realTy)      fun mkSubSca(lhs,args)= assgn(DstOp.subSca,args,"subSca",realTy)
209      fun mkProdSca(lhs,args)=assgn(DstOp.prodSca,args,lhs^"prodSca",realTy)      fun mkProdSca(lhs,args)=assgn(DstOp.prodSca,args,"prodSca",realTy)
210      fun mkProdInt(lhs,args)=assgn(DstOp.prodSca,args,lhs^"prodInt",intTy)      fun mkProdInt(lhs,args)=assgn(DstOp.prodSca,args,"prodInt",intTy)
211      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]))
212      fun mkDivSca(lhs,args)= assgn(DstOp.divSca,args,lhs^"divSca",realTy)      fun mkDivSca(lhs,args)= assgn(DstOp.divSca,args,"divSca",realTy)
213      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)
214      fun mkDotVec(lhs,vecIX,args)=let      fun mkDotVec(lhs,vecIX,args)=let
215          val (vD, D)=mkProdVec(lhs,vecIX,args)          val (vD, D)=mkProdVec("",vecIX,args)
216          val (vE, E)=mkSumVec(lhs,vecIX,[vD])          val (vE, E)=mkSumVec("",vecIX,[vD])
217          in (vE,D@E) end          in (vE,D@E) end
218    
219    
# Line 169  Line 224 
224          fun add([],_,_)         = err"no element in mkMultiple"          fun add([],_,_)         = err"no element in mkMultiple"
225          | add([e1],_,_)         = (e1,[])          | add([e1],_,_)         = (e1,[])
226          | add([e1,e2],code,_)     = let          | add([e1,e2],code,_)     = let
227              val (vA,A)=assgn(rator,[e1,e2],lhs^"_2",ty)              val (vA,A)=assgn(rator,[e1,e2],"mult_2",ty)
228              in  (vA,code@A) end              in  (vA,code@A) end
229          | add(e1::e2::es,code,count)  = let          | add(e1::e2::es,code,count)  = let
230              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)
231              in  add(vA::es,code@A,count-1)              in  add(vA::es,code@A,count-1)
232              end              end
233          in          in
# Line 189  Line 244 
244              if(i=j) then 1 else  0              if(i=j) then 1 else  0
245          end          end
246    
247      fun evalDelta(mapp,a,b)= mkReal(deltaToInt(mapp,a,b))      fun evalDelta(mapp,a,b)= intToReal(deltaToInt(mapp,a,b))
248    
249      (*eval Epsilon-2d*)      (*eval Epsilon-2d*)
250      fun evalEps2(mapp,a,b)=let      fun evalEps2(mapp,a,b)=let
251          val i=mapIndex(E.V a,mapp)          val i=mapIndex(E.V a,mapp)
252          val j=mapIndex(E.V b,mapp)          val j=mapIndex(E.V b,mapp)
253          in          in
254              if(i=j) then mkReal 0              if(i=j) then intToReal 0
255              else              else
256                  if(j>i) then mkReal 1                  if(j>i) then intToReal 1
257                  else mkReal ~1                  else intToReal ~1
258          end          end
259    
260      (*eval Epsilon-3d*)      (*eval Epsilon-3d*)
# Line 208  Line 263 
263          val j=mapIndex(E.V b,mapp)          val j=mapIndex(E.V b,mapp)
264          val k=mapIndex(E.V c,mapp)          val k=mapIndex(E.V c,mapp)
265          in          in
266              if(i=j orelse j=k orelse i=k) then mkReal 0              if(i=j orelse j=k orelse i=k) then intToReal 0
267              else              else
268                  if(j>i) then                  if(j>i) then
269                      if(j>k andalso k>i) then mkReal ~1 else mkReal 1                      if(j>k andalso k>i) then intToReal ~1 else intToReal 1
270                  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
271    
272          end          end
273    

Legend:
Removed from v.2867  
changed lines
  Added in v.3138

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