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

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/high-to-mid/high-to-mid.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/high-to-mid/high-to-mid.sml

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

revision 819, Wed Apr 13 22:02:50 2011 UTC revision 820, Wed Apr 13 22:15:08 2011 UTC
# Line 94  Line 94 
94              | _ => raise Fail "bogus field binding"              | _ => raise Fail "bogus field binding"
95            (* end case *))            (* end case *))
96    
97      (* expand the outer product of vectors v1 and v2, with dimensions d1 and d2 (resp.) *)
98        fun expandOuter (env, y, d1, d2, v1, v2) = let
99              val rowTy = DstTy.tensorTy[d1]
100              val colTy = DstTy.tensorTy[d2]
101              fun mkVar (i, j) = DstIL.Var.new (concat["o_", Int.toString i, "_", Int.toString j], DstTy.realTy)
102              fun mkRowVar i = DstIL.Var.new ("r_" ^ Int.toString i, DstTy.TensorTy[d2])
103              fun rowLp (i, rowVars, code) = if (i < d1)
104                    then let
105                      fun colLp (j, colVars, code) = if (j < d2)
106                            then let
107                              val a = DstIL.Var.new("a", DstTy.realTy)
108                              val ix = DstIL.Var.new("i", DstTy.intTy)
109                              val b = DstIL.Var.new("b", DstTy.realTy)
110                              val jx = DstIL.Var.new("j", DstTy.intTy)
111                              val x = mkVar (i, j)
112                              val code = (x, DstIL.OP(DstOp.Mul DstTy.realTy, [a, b]))
113                                    :: (a, DstIL.OP(DstOp.Subscript rowTy, [v1, ix]))
114                                    :: (ix, DstIL.LIT(Literal.intLit i))
115                                    :: (b, DstIL.OP(DstOp.Subscript colTy, [v1, ix]))
116                                    :: (jx, DstIL.LIT(Literal.intLit j))
117                                    :: code
118                              in
119                                colLp (j+1, x::colVars, code)
120                              end
121                            else let
122                              val r = mkRowVar i
123                              in
124                                (r, DstIL.CONS(rowTy, List.rev colVars)) :: code
125                              end
126                      in
127                        colLp (0, [], code)
128                      end
129                    else List.rev ((y, DstIL.CONS(DstTy.TensorTy[d1,d2], List.rev rowVars)) :: code)
130              in
131                rowLp (0, [], [])
132              end
133    
134      fun arity (SrcTy.TensorTy[]) = 1      fun arity (SrcTy.TensorTy[]) = 1
135        | arity (SrcTy.TensorTy[d]) = d        | arity (SrcTy.TensorTy[d]) = d
136        | arity _ = raise Fail "arity"        | arity _ = raise Fail "arity"
# Line 132  Line 169 
169                | SrcOp.MulMatMat(SrcTy.TensorTy[d1, d2], SrcTy.TensorTy[d2', d3]) =>                | SrcOp.MulMatMat(SrcTy.TensorTy[d1, d2], SrcTy.TensorTy[d2', d3]) =>
170                    assign (DstOp.MulMatMat(d1, d2, d3))                    assign (DstOp.MulMatMat(d1, d2, d3))
171                | SrcOp.Cross => assign DstOp.Cross                | SrcOp.Cross => assign DstOp.Cross
172                  | SrcOp.Outer(SrcTy.TensorTy[d1, d2]) => let
173                      val [v1, v2] = renameList(env, args)
174                      in
175                        expandOuter (env, y, d1, d2, v1, v2)
176                      end
177                | SrcOp.Norm ty => assign (DstOp.Norm(arity ty))                | SrcOp.Norm ty => assign (DstOp.Norm(arity ty))
178                | SrcOp.Normalize ty => assign (DstOp.Normalize(arity ty))                | SrcOp.Normalize ty => assign (DstOp.Normalize(arity ty))
179                | SrcOp.Scale ty => assign (DstOp.Scale(arity ty))                | SrcOp.Scale ty => assign (DstOp.Scale(arity ty))
# Line 141  Line 183 
183                | SrcOp.Identity n => assign (DstOp.Identity n)                | SrcOp.Identity n => assign (DstOp.Identity n)
184                | SrcOp.Trace(SrcTy.TensorTy[d, _]) => assign (DstOp.Trace d)                | SrcOp.Trace(SrcTy.TensorTy[d, _]) => assign (DstOp.Trace d)
185                | SrcOp.Slice(ty, mask) => raise Fail "FIXME: Slice"                | SrcOp.Slice(ty, mask) => raise Fail "FIXME: Slice"
 (* FIXME: tensors get flattened into slow-to-fast order *)  
186                | SrcOp.Subscript ty => assign (DstOp.Subscript(cvtTy ty))                | SrcOp.Subscript ty => assign (DstOp.Subscript(cvtTy ty))
187                | SrcOp.IntToReal => assign DstOp.IntToReal                | SrcOp.IntToReal => assign DstOp.IntToReal
188                | SrcOp.TruncToInt => cvtToInt (DstOp.Trunc 1)                | SrcOp.TruncToInt => cvtToInt (DstOp.Trunc 1)

Legend:
Removed from v.819  
changed lines
  Added in v.820

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