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/mid-to-low.sml
ViewVC logotype

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

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

revision 2666, Wed Jun 4 01:59:49 2014 UTC revision 2667, Thu Jun 5 18:54:12 2014 UTC
# Line 65  Line 65 
65      end (* local *)      end (* local *)
66    
67    
68    
69        fun mkDot(n, args)= let
70            val DTy=DstTy.TensorTy [n]
71            val RTy=DstTy.TensorTy []
72            val a=DstIL.Var.new("prod" ,DTy)
73            val b=DstIL.Var.new("sum" ,RTy)
74            val code= [(a, DstIL.OP(DstOp.prodVec n,args@args)),
75                (b, DstIL.OP(DstOp.sumVec n, [a]))]
76            in
77                (code,b)
78            end
79    
80    
81        fun mkN(n, args)= let
82            val (code, b)=mkDot(n, args)
83            val norm=DstIL.OP(DstOp.Sqrt,[b])
84            in
85                (code,norm)
86            end
87    
88    
89      fun expandOp (env, y, rator, args) = let      fun expandOp (env, y, rator, args) = let
90            val args' = Env.renameList (env, args)            val args' = Env.renameList (env, args)
91            fun assign rator' = [(y, DstIL.OP(rator', args'))]            fun assign rator' = [(y, DstIL.OP(rator', args'))]
# Line 88  Line 109 
109                | SrcOp.Min => assign (DstOp.Min)                | SrcOp.Min => assign (DstOp.Min)
110                | SrcOp.Clamp ty => assign (DstOp.Clamp ty)                | SrcOp.Clamp ty => assign (DstOp.Clamp ty)
111                | SrcOp.Lerp ty => assign (DstOp.Lerp ty)                | SrcOp.Lerp ty => assign (DstOp.Lerp ty)
112    
113                    (*replace norm of vectors and length functions*)
114                  | SrcOp.Norm(SrcTy.TensorTy [n]) =>let
115                        val (code,norm)=mkN(n, args')
116                    in
117                            code@[(y,norm)]
118                    end
119    
120                (*untested. How should we index matrices?*)
121                | SrcOp.Norm(SrcTy.TensorTy [i,j]) =>let
122                    val argTy=SrcTy.TensorTy [i,j]
123                    val rstTy=DstTy.TensorTy [i]
124    
125    
126    
127    
128                    fun sortCol(0,code,SOME var) =let
129                        val norm=DstIL.OP(DstOp.Sqrt,[var])
130                        in
131                            code@[(y,norm)]
132                        end
133                      |sortCol(m,code,NONE)= let
134                        val n=m-1
135                        val ix=DstTy.indexTy [n]
136                        val b=DstIL.Var.new("indexed" ,rstTy)
137                        val opp= DstIL.OP(DstOp.IndexTensor(0,rstTy,ix,argTy),args')
138                        val (code',d)=mkDot(i, [b])
139                        in
140                            sortCol(n, [(b,opp)]@code'@code, SOME d)
141                        end
142                    |sortCol(m,code,SOME var)= let
143                        val n=m-1
144                        val ix=DstTy.indexTy [n]
145                        val b=DstIL.Var.new("indexed" ,rstTy)
146                        val opp=DstIL.OP(DstOp.IndexTensor(0,rstTy,ix,argTy),args')
147                        val (code',d)=mkDot(i, [b])
148                        val c=DstIL.Var.new("add" ,DstTy.TensorTy [])
149                        val add=DstIL.OP(DstOp.addSca,[d,var])
150                        in
151                            sortCol(n, [(b,opp)]@code'@[(c,add)]@code, SOME c)
152                        end
153                    in
154                         sortCol(i,[],NONE)
155                    end
156    
157                    | SrcOp.Norm ty => assign (DstOp.Norm ty)                    | SrcOp.Norm ty => assign (DstOp.Norm ty)
158                | SrcOp.Normalize d => assign (DstOp.Normalize d)               | SrcOp.Normalize n =>let
159                    val (code,norm)=mkN(n, args')
160                    val Sca=DstTy.TensorTy []
161                    val a=DstIL.Var.new("sqrt" ,Sca)
162                    val b=DstIL.Var.new("Int" ,Sca)
163                    val c=DstIL.Var.new("div" ,Sca)
164    
165                    in code@ [(a, norm),
166                        (b, DstIL.LIT(Literal.Int 1)),
167                        (c ,DstIL.OP(DstOp.divSca,[b,a])),
168                        (y, DstIL.OP(DstOp.prodScaV n,[c]@args'))]
169                    end
170    
171    (*            | SrcOp.Normalize d => assign (DstOp.Normalize d)*)
172                | SrcOp.Zero ty => assign (DstOp.Zero ty)                | SrcOp.Zero ty => assign (DstOp.Zero ty)
173                | SrcOp.PrincipleEvec ty => assign (DstOp.PrincipleEvec ty)                | SrcOp.PrincipleEvec ty => assign (DstOp.PrincipleEvec ty)
174            | SrcOp.EigenVals2x2 => assign (DstOp.EigenVals2x2)            | SrcOp.EigenVals2x2 => assign (DstOp.EigenVals2x2)

Legend:
Removed from v.2666  
changed lines
  Added in v.2667

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