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 2667, Thu Jun 5 18:54:12 2014 UTC revision 2668, Thu Jun 12 03:29:04 2014 UTC
# Line 66  Line 66 
66    
67    
68    
     fun mkDot(n, args)= let  
         val DTy=DstTy.TensorTy [n]  
         val RTy=DstTy.TensorTy []  
         val a=DstIL.Var.new("prod" ,DTy)  
         val b=DstIL.Var.new("sum" ,RTy)  
         val code= [(a, DstIL.OP(DstOp.prodVec n,args@args)),  
             (b, DstIL.OP(DstOp.sumVec n, [a]))]  
         in  
             (code,b)  
         end  
   
   
     fun mkN(n, args)= let  
         val (code, b)=mkDot(n, args)  
         val norm=DstIL.OP(DstOp.Sqrt,[b])  
         in  
             (code,norm)  
         end  
   
   
69      fun expandOp (env, y, rator, args) = let      fun expandOp (env, y, rator, args) = let
70            val args' = Env.renameList (env, args)            val args' = Env.renameList (env, args)
71            fun assign rator' = [(y, DstIL.OP(rator', args'))]            fun assign rator' = [(y, DstIL.OP(rator', args'))]
# Line 109  Line 89 
89                | SrcOp.Min => assign (DstOp.Min)                | SrcOp.Min => assign (DstOp.Min)
90                | SrcOp.Clamp ty => assign (DstOp.Clamp ty)                | SrcOp.Clamp ty => assign (DstOp.Clamp ty)
91                | SrcOp.Lerp ty => assign (DstOp.Lerp ty)                | SrcOp.Lerp ty => assign (DstOp.Lerp ty)
   
                 (*replace norm of vectors and length functions*)  
               | SrcOp.Norm(SrcTy.TensorTy [n]) =>let  
                     val (code,norm)=mkN(n, args')  
                 in  
                         code@[(y,norm)]  
                 end  
   
             (*untested. How should we index matrices?*)  
             | SrcOp.Norm(SrcTy.TensorTy [i,j]) =>let  
                 val argTy=SrcTy.TensorTy [i,j]  
                 val rstTy=DstTy.TensorTy [i]  
   
   
   
   
                 fun sortCol(0,code,SOME var) =let  
                     val norm=DstIL.OP(DstOp.Sqrt,[var])  
                     in  
                         code@[(y,norm)]  
                     end  
                   |sortCol(m,code,NONE)= let  
                     val n=m-1  
                     val ix=DstTy.indexTy [n]  
                     val b=DstIL.Var.new("indexed" ,rstTy)  
                     val opp= DstIL.OP(DstOp.IndexTensor(0,rstTy,ix,argTy),args')  
                     val (code',d)=mkDot(i, [b])  
                     in  
                         sortCol(n, [(b,opp)]@code'@code, SOME d)  
                     end  
                 |sortCol(m,code,SOME var)= let  
                     val n=m-1  
                     val ix=DstTy.indexTy [n]  
                     val b=DstIL.Var.new("indexed" ,rstTy)  
                     val opp=DstIL.OP(DstOp.IndexTensor(0,rstTy,ix,argTy),args')  
                     val (code',d)=mkDot(i, [b])  
                     val c=DstIL.Var.new("add" ,DstTy.TensorTy [])  
                     val add=DstIL.OP(DstOp.addSca,[d,var])  
                     in  
                         sortCol(n, [(b,opp)]@code'@[(c,add)]@code, SOME c)  
                     end  
                 in  
                      sortCol(i,[],NONE)  
                 end  
   
                | SrcOp.Norm ty => assign (DstOp.Norm ty)  
              | SrcOp.Normalize n =>let  
                 val (code,norm)=mkN(n, args')  
                 val Sca=DstTy.TensorTy []  
                 val a=DstIL.Var.new("sqrt" ,Sca)  
                 val b=DstIL.Var.new("Int" ,Sca)  
                 val c=DstIL.Var.new("div" ,Sca)  
   
                 in code@ [(a, norm),  
                     (b, DstIL.LIT(Literal.Int 1)),  
                     (c ,DstIL.OP(DstOp.divSca,[b,a])),  
                     (y, DstIL.OP(DstOp.prodScaV n,[c]@args'))]  
                 end  
   
 (*            | SrcOp.Normalize d => assign (DstOp.Normalize d)*)  
92                | SrcOp.Zero ty => assign (DstOp.Zero ty)                | SrcOp.Zero ty => assign (DstOp.Zero ty)
93                | SrcOp.PrincipleEvec ty => assign (DstOp.PrincipleEvec ty)                | SrcOp.PrincipleEvec ty => assign (DstOp.PrincipleEvec ty)
94            | SrcOp.EigenVals2x2 => assign (DstOp.EigenVals2x2)            | SrcOp.EigenVals2x2 => assign (DstOp.EigenVals2x2)
# Line 176  Line 96 
96            | SrcOp.Select(ty as SrcTy.TupleTy tys, i) => assign (DstOp.Select(ty, i))            | SrcOp.Select(ty as SrcTy.TupleTy tys, i) => assign (DstOp.Select(ty, i))
97            | SrcOp.Index(ty, i) => assign (DstOp.Index(ty, i))            | SrcOp.Index(ty, i) => assign (DstOp.Index(ty, i))
98            | SrcOp.Subscript ty => assign (DstOp.Subscript ty)            | SrcOp.Subscript ty => assign (DstOp.Subscript ty)
99            |SrcOp.Sqrt => assign (DstOp.Sqrt)
100                | SrcOp.Ceiling d => assign (DstOp.Ceiling d)                | SrcOp.Ceiling d => assign (DstOp.Ceiling d)
101                | SrcOp.Floor d => assign (DstOp.Floor d)                | SrcOp.Floor d => assign (DstOp.Floor d)
102                | SrcOp.Round d => assign (DstOp.Round d)                | SrcOp.Round d => assign (DstOp.Round d)

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

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