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

SCM Repository

[diderot] Annotation of /branches/charisee/src/compiler/high-to-mid/expand-integrate.sml
ViewVC logotype

Annotation of /branches/charisee/src/compiler/high-to-mid/expand-integrate.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2499 - (view) (download)

1 : cchiw 2498 (* examples.sml
2 :     *
3 :     * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *)
6 :    
7 :    
8 :     (*Expand ProebConv to Probe of individual field *)
9 :     structure Expand = struct
10 :    
11 :     local
12 :    
13 :     structure E = Ein
14 :    
15 :     in
16 :    
17 :    
18 :     (*
19 :     Dictionary created for Tensor positions
20 :     Tensor X=> fractional and integer tensors in mid-il operators
21 :     Save in variable names.
22 :    
23 :     *)
24 :    
25 :    
26 :     fun insert (key, value) d =fn s =>
27 :     if s = key then SOME value
28 :     else d s
29 :    
30 :     fun lookup k d = d k
31 :    
32 : cchiw 2499
33 :    
34 : cchiw 2498 (*
35 : cchiw 2499
36 :    
37 :     fun createVec d= S.transform(EinOp.tensorOp,[[d]],[])
38 :    
39 :    
40 :     (*create fractional, and integer position*)
41 :     fun createArgs(dim,Kernel?, )=
42 :    
43 :    
44 :     (*create set of positions*)
45 :     val s = Kernel.support h
46 :     val vecsTy =createVec(2*s)
47 :     val vecDimTy = createVec(dim)
48 :     val translate=DstOp.Translate v
49 :     val transform=DstOp.Transform v
50 :    
51 :    
52 :     (* generate the transform code *)
53 :     val x = DstV.new ("x", vecDimTy) (* image-space position *)
54 :     val f = DstV.new ("f", vecDimTy)
55 :     val nd = DstV.new ("nd", vecDimTy)
56 :     val n = DstV.new ("n", DstTy.iVecTy dim)
57 :     val M = DstV.new ("M", transform)
58 :     val T = DstV.new ("T", translate)
59 :    
60 :     val sub= S.transform(EinOp.subTensor,[dim],[])
61 :    
62 :    
63 :     (* M_ij x_i*)
64 :     val MXop=S.transform(EinOp.innerProduct,[[dim],[],[dim]],[])
65 :     val MX = DstV.new ("MX", MXop)
66 :    
67 :    
68 :    
69 :     val PosToImgSpace=S.transform(EinOp.addTensor,[[dim]],[])
70 :    
71 :     val toImgSpaceCode = [
72 :     assignEin(MX, Mxop, [M,pos]), (*M_{ij}X_i*)
73 :     assignEin(x, PosToImgSpace,[MX,T]) (* MX+T*)
74 :     assign(nd, DstOp.Floor dim, [x]), (*nd *)
75 :     assignEin(f, sub,[x,nd]), (*fractional*)
76 :     assign(n, DstOp.RealToInt dim, [nd]) (*real to Int*)
77 :     ]
78 :    
79 :     *)
80 :    
81 :    
82 :    
83 :     (*
84 : cchiw 2498 createDels=> creates the kronecker deltas for each Kernel
85 :     For each dimesnion a, and each index in derivative b create element (a,b)
86 :     *)
87 :     fun createDels([],_)= []
88 : cchiw 2499 | createDels(d::ds,dim)= [( E.C dim,d)]@createDels(ds,dim)
89 : cchiw 2498
90 :    
91 :    
92 : cchiw 2499
93 : cchiw 2498 fun Position(idt,dict,params,args)=let
94 :     val l=lookup idt dict
95 :     in (case l
96 :     of NONE =>let
97 : cchiw 2499 val pos1=length params
98 :     val pos2=pos1+1
99 :     val dict'=insert(idt,(pos1,pos2)) dict
100 :     val params'=params@[E.TEN,E.TEN]
101 :     (*will call create args*)
102 :     in (pos1,pos2, dict',params',args)
103 :     end
104 : cchiw 2498 (*Create new fractional, and n variables,and returns fresh ids*)
105 :     | SOME (fid,nid)=>(fid,nid, dict,params,args)
106 :     (*end case*))
107 :     end
108 :    
109 :    
110 :     fun expandEinProbe(params,body,index,d,args)=(case body
111 :     of E.Probe(E.Conv(id,alpha,kid,deltas),E.Tensor(idt,alphat)) =>
112 :     if(id+1>length params) then (print "not enough params" ;(params,body,index,d,args))
113 :     else (case List.nth(params,id)
114 :     of E.FLD(dim)=>
115 :     let
116 :     val s=2 (*support*)
117 :     val (fid,nid,d',params',args')=Position(idt,d,params,args)
118 :     val shift=length index
119 :    
120 :     (*sumIndex creating summaiton Index for body*)
121 :     fun sumIndex(0)=[]
122 : cchiw 2499 |sumIndex(dim)= sumIndex(dim-1)@[(E.V (dim+shift-1),1-s,s)]
123 : cchiw 2498
124 :     (*createKRN Image field and kernels *)
125 :     fun createKRN(0,imgpos,rest)=E.Prod ([E.Img(id,alpha,imgpos)] @rest)
126 :     | createKRN(dim,imgpos,rest)=
127 :     let
128 :     val dim'=dim-1
129 :     val sum=dim'+shift
130 :     val dels=createDels(deltas,dim')
131 :     val pos=[E.Add[E.Tensor(fid,[E.C dim']),E.Value(sum)]]
132 :     val rest'= E.Krn(kid,dels,E.Sub(E.Tensor(nid,[E.C dim']),E.Value(sum)))
133 :     in
134 :     createKRN(dim',pos@imgpos,[rest']@rest)
135 :     end
136 :    
137 :    
138 :     val i=createKRN(dim, [],[])
139 :     val esum=sumIndex dim
140 : cchiw 2499 val index'=index
141 : cchiw 2498
142 :     in (params', E.Sum(esum, i),index', d',args') end
143 :     | _=>(print "err: non field in param spot";(params,E.Const(0.0) ,index,d,args))
144 :     (*end case*))
145 :     |_=>(print "unexpected body" ;(params,body,index,d,args))
146 :     (*end case*))
147 :    
148 :    
149 :    
150 :     (*copied from high-to-mid.sml*)
151 :     fun expandEinOp ( Ein.EIN{params, index, body}, args) = let
152 :    
153 :     val dummy=E.Const 0.0 (*tmp variables*)
154 :    
155 :     fun rewriteBody exp= let
156 :     val (p,body,ix,d,args')= exp
157 :     in (case body
158 :     of E.Const _=>exp
159 :     | E.Tensor _=>exp
160 :     | E.Krn _=>exp
161 :     | E.Delta _=>exp
162 :     | E.Value _ =>exp
163 :     | E.Epsilon _=>exp
164 :     | E.Partial _=>exp
165 :     | E.Img _=> exp
166 :     | E.Conv _=>(p,dummy,ix,d,args')
167 :     | E.Field _ =>(p,dummy,ix,d,args')
168 :     | E.Apply _ =>(p,dummy,ix,d,args')
169 :     | E.Neg e=> let
170 :     val (p',body',ix',d',args'')=rewriteBody (p,e,ix,d,args')
171 :     in
172 :     (p',E.Neg body',ix',d',args'')
173 :     end
174 :     | E.Sum (c,e)=> let
175 :     val (p',body',ix',d',args'')=rewriteBody (p,e,ix,d,args')
176 :     in
177 :     (p',E.Sum(c,body'),ix',d',args'')
178 :     end
179 :     | E.Probe(E.Conv _, _) =>expandEinProbe exp
180 :     | E.Sub(a,b)=>let
181 :     val(pa,a',ax,da,args'')= rewriteBody (p,a,ix,d,args')
182 :     val(pb,b',bx,db,args''')= rewriteBody (pa,b,ax,da,args'')
183 :     in (pb,E.Sub( a', b'),bx,db,args''')
184 :     end
185 :     | E.Div(a,b)=>let
186 :     val(pa,a',ax,da,args'')= rewriteBody (p,a,ix,d,args')
187 :     val(pb,b',bx,db,args''')= rewriteBody (pa,b,ax,da,args'')
188 :     in (pb,E.Div( a', b'),bx,db,args''')
189 :     end
190 :     | E.Add es=> let
191 :     fun addFilter(p1,ix1,d1,[],done,args')=(p1,E.Add done, ix1,d1,args')
192 :     | addFilter(p1,ix1,d1, e::es,done,args')=let
193 :     val(p2,e2,ix2,d2,args'')= rewriteBody(p1,e,ix1,d1,args')
194 :     in addFilter(p2, ix2, d2, es, done@[e2],args'')
195 :     end
196 :     in
197 :     addFilter(p,ix,d,es,[],args')
198 :     end
199 :     | E.Prod es=> let
200 :     fun addFilter(p1,ix1,d1,[],done,args')=(p1,E.Prod done, ix1,d1,args')
201 :     | addFilter(p1,ix1,d1, e::es,done,args')=let
202 :     val(p2,e2,ix2,d2,args'')= rewriteBody(p1,e,ix1,d1,args')
203 :     in addFilter(p2, ix2, d2, es, done@[e2],args'')
204 :     end
205 :     in
206 :     addFilter(p,ix,d,es,[],args')
207 :     end
208 :     | E.Probe _=> exp
209 :    
210 :     (* end case *))
211 :     end
212 :    
213 :    
214 :     val empty =fn key =>NONE
215 :     val (params',body',ix',_,args')=rewriteBody(params,body,index,empty,args)
216 :     val newbie=Ein.EIN{params=params', index=ix', body=body'}
217 :     in (newbie,args') end
218 :    
219 :     end; (* local *)
220 :    
221 :     end (* local *)

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