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

SCM Repository

[diderot] Diff of /branches/charisee/src/compiler/translate/translate-basis.sml
ViewVC logotype

Diff of /branches/charisee/src/compiler/translate/translate-basis.sml

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

revision 2843, Mon Dec 8 01:27:25 2014 UTC revision 2845, Fri Dec 12 06:46:23 2014 UTC
# Line 23  Line 23 
23      structure Op = HighOps      structure Op = HighOps
24      structure Ty = SimpleTypes      structure Ty = SimpleTypes
25      structure VTbl = Var.Tbl      structure VTbl = Var.Tbl
   
26      structure mk= mkOperators      structure mk= mkOperators
27    
28      fun trType (Ty.TY ty) = TranslateTy.tr ty      fun trType (Ty.TY ty) = TranslateTy.tr ty
# Line 51  Line 50 
50    
51      fun kernel h (y, [], []) = assign(y, Op.Kernel(h, 0), [])      fun kernel h (y, [], []) = assign(y, Op.Kernel(h, 0), [])
52    
53        val cnt = ref 0
54        fun genName prefix = let
55            val n = !cnt
56            in
57                cnt := n+1;
58                String.concat[prefix, "_", Int.toString n]
59            end
60    (* utility functions for synthesizing eigenvector/eigenvalue code *)    (* utility functions for synthesizing eigenvector/eigenvalue code *)
61      fun eigenVec (rator, dim) = let      fun eigenVec (rator, dim) = let
62            val ty = DstTy.SeqTy(DstTy.realTy, dim)            val ty = DstTy.SeqTy(DstTy.realTy, dim)
# Line 75  Line 81 
81    
82      fun  simpleEOp rator (y, _,xs) = [assignEin(y, rator, xs)]      fun  simpleEOp rator (y, _,xs) = [assignEin(y, rator, xs)]
83    
   
     fun mkNorm (shape,A) =let  
         val RTy=DstTy.TensorTy []  
         val b=IL.Var.new("dot" ,RTy)  
         val c=IL.Var.new("sqrt" ,RTy)  
         val rator=(case shape  
             of [_]=>mk.innerProduct(shape,shape)  
             | [_,_]=>mk.doubleDot(shape,shape)  
             | _ => raise Fail "unsupported norm"  
             (*end case*))  
         val dot=assignEin(b,rator, [A,A])  
         val rator= IL.OP(Op.Sqrt, [b])  
         in (c,rator,dot)  
         end  
   
   
   
   
84  (* shape is an int list, DIM is in int|variable, k-level of differntiation *)  (* shape is an int list, DIM is in int|variable, k-level of differntiation *)
85    
86   (* build a table that maps Basis variables to their translation functions *)   (* build a table that maps Basis variables to their translation functions *)
# Line 132  Line 120 
120    
121                  (BV.add_rf,             fn (y, [_,Ty.DIM d], xs) =>                  (BV.add_rf,             fn (y, [_,Ty.DIM d], xs) =>
122                                              [assignEin(y, mk.addTenField(d),xs)]),                                              [assignEin(y, mk.addTenField(d),xs)]),
   
   
123                  (BV.sub_ii,             simpleOp Op.ISub),                  (BV.sub_ii,             simpleOp Op.ISub),
124                  (BV.sub_tt,             fn (y, [shp], xs) => let                  (BV.sub_tt,             fn (y, [shp], xs) => let
125                                          val ty1 as DstTy.TensorTy dd1 = shapeVarToTensor shp                                          val ty1 as DstTy.TensorTy dd1 = shapeVarToTensor shp
# Line 143  Line 129 
129                                          end),                                          end),
130                  (BV.sub_ff,             fn (y, [_,Ty.DIM d, Ty.SHAPE dd], xs) =>                  (BV.sub_ff,             fn (y, [_,Ty.DIM d, Ty.SHAPE dd], xs) =>
131                                                [assignEin(y, mk.subField(d, dd),xs)]),                                                [assignEin(y, mk.subField(d, dd),xs)]),
   
   
132                  (BV.sub_fr,             fn (y, [_,Ty.DIM d], xs) =>                  (BV.sub_fr,             fn (y, [_,Ty.DIM d], xs) =>
133                                              [assignEin(y, mk.subFieldTen(d),xs)]),                                              [assignEin(y, mk.subFieldTen(d),xs)]),
134    
135                  (BV.sub_rf,             fn (y, [_,Ty.DIM d], xs) =>                  (BV.sub_rf,             fn (y, [_,Ty.DIM d], xs) =>
136                                            [assignEin(y, mk.subTenField(d),xs)]),                                            [assignEin(y, mk.subTenField(d),xs)]),
   
137                  (BV.mul_ii,             simpleOp Op.IMul),                  (BV.mul_ii,             simpleOp Op.IMul),
138                  (BV.mul_rr,             fn (y,_,args) => [assignEin(y, mk.prodScalar,args)]),                  (BV.mul_rr,             fn (y,_,args) => [assignEin(y, mk.prodScalar,args)]),
139                  (BV.mul_rt,             fn (y, [shp], xs) => let                  (BV.mul_rt,             fn (y, [shp], xs) => let
# Line 175  Line 158 
158                                              [assignEin(y, mk.mulFieldsf(d,dd),xs)]),                                              [assignEin(y, mk.mulFieldsf(d,dd),xs)]),
159                  (BV.mul_fs,             fn (y, [_,Ty.DIM d, Ty.SHAPE dd], [f,s]) =>                  (BV.mul_fs,             fn (y, [_,Ty.DIM d, Ty.SHAPE dd], [f,s]) =>
160                                          [assignEin(y, mk.mulFieldsf(d,dd),[s,f])]),                                          [assignEin(y, mk.mulFieldsf(d,dd),[s,f])]),
   
161                  (BV.div_ii,             simpleOp Op.IDiv),                  (BV.div_ii,             simpleOp Op.IDiv),
162                  (BV.div_rr,             fn (y,_,args) => [assignEin(y, mk.divScalar,args)]),                  (BV.div_rr,             fn (y,_,args) => [assignEin(y, mk.divScalar,args)]),
163                  (BV.div_tr,             fn (y, [shp], xs) => let                  (BV.div_tr,             fn (y, [shp], xs) => let
# Line 188  Line 170 
170                                              [assignEin(y, mk.divideField(d, dd),xs)]),                                              [assignEin(y, mk.divideField(d, dd),xs)]),
171                  (BV.div_ss,             fn (y, [_,Ty.DIM d], xs) =>                  (BV.div_ss,             fn (y, [_,Ty.DIM d], xs) =>
172                                              [assignEin(y, mk.divFieldss d,xs)]),                                              [assignEin(y, mk.divFieldss d,xs)]),
   
173                  (BV.exp_ri,             simpleOp(Op.Power)),                  (BV.exp_ri,             simpleOp(Op.Power)),
174                  (BV.exp_rr,             basisFn MathFuns.pow),                  (BV.exp_rr,             basisFn MathFuns.pow),
175                  (BV.curl2D,              simpleEOp mk.curl2d),                  (BV.curl2D,              simpleEOp mk.curl2d),
# Line 209  Line 190 
190                  (BV.op_probe,           fn (y, [_, Ty.DIM d, Ty.SHAPE dd], xs) =>                  (BV.op_probe,           fn (y, [_, Ty.DIM d, Ty.SHAPE dd], xs) =>
191                                              [assignEin(y, (mk.probe(dd,d)),xs)]),                                              [assignEin(y, (mk.probe(dd,d)),xs)]),
192                  (BV.op_D,               fn (y, [_, Ty.DIM d], xs) =>  [assignEin(y, mk.grad([d]),xs)]),                  (BV.op_D,               fn (y, [_, Ty.DIM d], xs) =>  [assignEin(y, mk.grad([d]),xs)]),
   
193                  (BV.op_Dotimes,         fn (y, [_, Ty.DIM d1, Ty.SHAPE dd, Ty.DIM d2], xs) =>                                    [assignEin(y, mk.dotimes(d1, dd@[d2]),xs)]),                  (BV.op_Dotimes,         fn (y, [_, Ty.DIM d1, Ty.SHAPE dd, Ty.DIM d2], xs) =>                                    [assignEin(y, mk.dotimes(d1, dd@[d2]),xs)]),
194                  (BV.op_Ddot,         fn (y, [_, Ty.DIM d1,  Ty.SHAPE dd, Ty.DIM d2], xs) =>                  (BV.op_Ddot,         fn (y, [_, Ty.DIM d1,  Ty.SHAPE dd, Ty.DIM d2], xs) =>
195                                          [assignEin(y, mk.divergence(d1, dd),xs)] ),                                          [assignEin(y, mk.divergence(d1, dd),xs)] ),
196                    (BV.op_norm,            fn (y, [sv], xs) => let
197                                                val ty=shapeVarToTensor sv
198                  (BV.op_norm,            fn (y, [sv], [x]) => (case shapeVarToTensor sv                                              in (case shapeVarToTensor sv
199                                             of DstTy.TensorTy[] => assign(y, Op.Abs DstTy.realTy, [x])                                                  of DstTy.TensorTy[]     => assign(y, Op.Abs DstTy.realTy, xs)
200                                              | DstTy.TensorTy dd=> let                                                  | DstTy.TensorTy[_]     => assign(y, Op.Norm ty, xs)
201                                                  val RTy=DstTy.TensorTy []                                                  | DstTy.TensorTy[_,_]   => assign(y, Op.Norm ty, xs)
202                                                  val (_,sqrtop,dot)= mkNorm (dd,x)                                                  | DstTy.TensorTy[_,_,_] => assign(y, Op.Norm ty, xs)
203                                                  in                                                  | _ => raise Fail"unsupported norm of TensorTy"
204                                                      [dot ,IL.ASSGN (y,sqrtop)]                                                  (* end case *))
205                                                  end                                              end),
   
   
                                             | ty => assign(y, Op.Norm ty, [x])  
                                           (* end case *))),  
206                  (BV.op_not,             simpleOp Op.Not),                  (BV.op_not,             simpleOp Op.Not),
207                  (BV.op_cross,            simpleEOp mk.crossProduct),                  (BV.op_cross,            simpleEOp mk.crossProduct),
208                  (BV.op_cross2,            simpleEOp mk.crossProduct2),                  (BV.op_cross2,            simpleEOp mk.crossProduct2),
209                  (BV.op_crossField,       simpleEOp mk.crossProductField),                  (BV.op_crossField,       simpleEOp mk.crossProductField),
210                  (BV.op_outer,           fn (y, [Ty.DIM d1, Ty.DIM d2], xs) =>                  (BV.op_outer,           fn (y, [Ty.DIM d1, Ty.DIM d2], xs) =>
211                                              [assignEin(y, (mk.outerProduct(d1, d2)), xs)]),                                              [assignEin(y, (mk.outerProduct(d1, d2)), xs)]),
 (* Any Shape fields  
                  (BV.op_outerField,      fn (y, [_, Ty.DIM d1, Ty.SHAPE dd1, Ty.SHAPE dd2], xs)=>  
                                         [assignEin(y, mk.outerField(d1, dd1, dd2),   xs)]),  
 *)  
212                  (BV.op_outerField,      fn (y, [_, Ty.DIM d1], xs)=>                  (BV.op_outerField,      fn (y, [_, Ty.DIM d1], xs)=>
213                                              [assignEin(y, mk.outerField(d1),   xs)]),                                              [assignEin(y, mk.outerField(d1),   xs)]),
   
   
214                  (BV.op_inner,           fn (y, [sh1, sh2, _], xs) => let                  (BV.op_inner,           fn (y, [sh1, sh2, _], xs) => let
215                                              val ty1 as DstTy.TensorTy dd1 = shapeVarToTensor sh1                                              val ty1 as DstTy.TensorTy dd1 = shapeVarToTensor sh1
216                                              val ty2 as DstTy.TensorTy dd2 = shapeVarToTensor sh2                                              val ty2 as DstTy.TensorTy dd2 = shapeVarToTensor sh2
# Line 284  Line 254 
254                  (*  modulate is vector * vector pointwise multiplication *)                  (*  modulate is vector * vector pointwise multiplication *)
255                  (BV.fn_modulate,        fn (y,[Ty.DIM dd1], xs) =>                  (BV.fn_modulate,        fn (y,[Ty.DIM dd1], xs) =>
256                                  [assignEin(y, (mk.modulate dd1),xs)]),                                  [assignEin(y, (mk.modulate dd1),xs)]),
 (*  
 vectorOp Op.Normalize),*)  
   
257                  (BV.fn_normalize, vectorOp Op.Normalize),                  (BV.fn_normalize, vectorOp Op.Normalize),
   
                     (* fn (y, [Ty.DIM i], [x]) =>let  
                             val (c,sqrtop,dot)= mkNorm ([i],x)  
                             val d = IL.Var.new ("int", DstTy.intTy)  
                             val e=IL.Var.new("divide" ,DstTy.TensorTy [])  
                     in     [dot ,IL.ASSGN (c,sqrtop),  
                             IL.ASSGN (d, IL.LIT(Literal.Int 1)),  
                             assignEin(e,mk.divScalar,[d,c]),  
                             assignEin(y,mk.scaleTen [i],[e,x])]  
                     end)*)  
   
258                  (BV.fn_principleEvec,   vectorOp Op.PrincipleEvec),                  (BV.fn_principleEvec,   vectorOp Op.PrincipleEvec),
259                  (BV.fn_trace,           fn (y, [Ty.DIM d], xs) =>                  (BV.fn_trace,           fn (y, [Ty.DIM d], xs) =>
260                                            [assignEin(y,(mk.trace d), xs)]),                                            [assignEin(y,(mk.trace d), xs)]),
261                  (BV.fn_traceField,           fn (y, [_,Ty.DIM d,Ty.SHAPE dd], xs) =>                  (BV.fn_traceField,           fn (y, [_,Ty.DIM d,Ty.SHAPE dd], xs) =>
262                          [assignEin(y,mk.traceField(d,dd), xs)]),                          [assignEin(y,mk.traceField(d,dd), xs)]),
   
263                  (BV.fn_transpose,       fn (y, [Ty.DIM d1, Ty.DIM d2], xs) =>                  (BV.fn_transpose,       fn (y, [Ty.DIM d1, Ty.DIM d2], xs) =>
264                                            [assignEin(y, (mk.transpose [d1,d2]), xs)]),                                            [assignEin(y, (mk.transpose [d1,d2]), xs)]),
   
265                  (BV.fn_transposeField,  fn (y, [_,Ty.DIM d1, Ty.DIM d2,Ty.DIM d3], xs) =>                  (BV.fn_transposeField,  fn (y, [_,Ty.DIM d1, Ty.DIM d2,Ty.DIM d3], xs) =>
266                      [assignEin(y, (mk.transposeField (d1,d2,d3)), xs)]),                      [assignEin(y, (mk.transposeField (d1,d2,d3)), xs)]),
   
267                  (BV.kn_bspln3,          kernel Kernel.bspln3),                  (BV.kn_bspln3,          kernel Kernel.bspln3),
268                  (BV.kn_bspln5,          kernel Kernel.bspln5),                  (BV.kn_bspln5,          kernel Kernel.bspln5),
269                  (BV.kn_ctmr,            kernel Kernel.ctmr),                  (BV.kn_ctmr,            kernel Kernel.ctmr),

Legend:
Removed from v.2843  
changed lines
  Added in v.2845

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