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

SCM Repository

[diderot] Annotation of /branches/charisee/src/compiler/ein/mkoperators.sml
ViewVC logotype

Annotation of /branches/charisee/src/compiler/ein/mkoperators.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2608 - (view) (download)

1 : cchiw 2499 (* examples.sml
2 :     *
3 :     * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *)
6 :    
7 :     structure mkOperators = struct
8 :    
9 :     local
10 :    
11 :     structure E = Ein
12 :     structure P=Printer
13 :     in
14 :    
15 :    
16 :     fun expIndex(n,inc)=List.tabulate(n, (fn(x)=>E.V (x+inc)))
17 : cchiw 2506 fun expIndexP(n,inc)=List.tabulate(n, (fn(x)=> (x+inc)))
18 : cchiw 2499
19 :     fun specialize(alpha,inc)=(alpha,expIndex(length(alpha),inc))
20 : cchiw 2506 fun specializeP(alpha,inc)=(alpha,expIndexP(length(alpha),inc))
21 : cchiw 2499
22 :     (*mkTensor functions*)
23 :     (* Adding tensors : < X{\alpha} + Y_{\alpha}>_{\alpha} *)
24 :     fun addTen(alpha)=let
25 :     val (index', expindex')= specialize(alpha,0)
26 :     in
27 :     E.EIN{
28 : cchiw 2525 params = [E.TEN(1,alpha), E.TEN(1,alpha)], index = index',
29 : cchiw 2499 body = E.Add[E.Tensor(0, expindex'), E.Tensor(1, expindex')]
30 :     }
31 :     end
32 :    
33 : cchiw 2502 fun createVec(dim)=E.EIN{
34 : cchiw 2525 params = [E.TEN(1,[dim])], index = [dim],
35 : cchiw 2502 body = E.Tensor(0, [E.V 0])
36 :     }
37 :    
38 :    
39 : cchiw 2508 val zero=E.EIN{
40 :     params = [], index = [],
41 : cchiw 2553 body = E.Const(0)
42 : cchiw 2508 }
43 : cchiw 2502
44 : cchiw 2515
45 : cchiw 2508
46 : cchiw 2499 (* Subtracting tensors *)
47 :     fun subTen(alpha)=let
48 :     val (index', expindex')= specialize(alpha,0)
49 :     in
50 :     E.EIN{
51 : cchiw 2525 params = [E.TEN(1,alpha), E.TEN(1,alpha)], index = index',
52 : cchiw 2499 body = E.Sub(E.Tensor(0, expindex'), E.Tensor(1, expindex'))}
53 :     end
54 :    
55 :     fun divTen(alpha) =let
56 :     val (index', expindex')= specialize(alpha,0)
57 :     in E.EIN{
58 : cchiw 2525 params = [E.TEN(1,alpha), E.TEN(1,[])], index = index',
59 : cchiw 2499 body = E.Div(E.Tensor(0, expindex'), E.Tensor(1,[]))
60 :     }
61 :     end
62 :    
63 :     (* Trace: <M_{i, i}> This one Sx represents both i's*)
64 :     fun trace(dim) = E.EIN{
65 : cchiw 2525 params = [E.TEN(1,[dim,dim])], (* M *)
66 : cchiw 2499 index = [], (* i *)
67 : cchiw 2553 body = E.Sum([(E.V 0,0,dim-1)],E.Tensor(0, [E.V 0, E.V 0]))
68 : cchiw 2499 }
69 :    
70 :     fun negTen(alpha)=let
71 :     val (index', expindex')= specialize(alpha,0)
72 :     in E.EIN{
73 : cchiw 2525 params = [E.TEN(1,alpha)],
74 : cchiw 2499 index = index',
75 :     body = E.Neg(E.Tensor(0, expindex'))
76 :     }
77 :     end
78 :    
79 :     (* scalar times tensor product: <s * T_{\alpha}>_{\alpha} *)
80 :     fun scaleTen(alpha) = let
81 :     val (index', expindex')= specialize(alpha,0)
82 :     in E.EIN{
83 : cchiw 2525 params = [E.TEN(1,[]), E.TEN(1,alpha)], (* s and T *)
84 : cchiw 2499 index = index', (* \alpha *)
85 :     body = E.Prod[ E.Tensor(0, []), E.Tensor(1, expindex')]
86 :     }
87 :     end
88 :    
89 :     (* generic inner product: <T_{\alpha i} * T_{i \beta}>_{\alpha \beta} *)
90 :     fun innerProduct(shape1,i::beta) = let
91 :     val alpha= List.take(shape1,length(shape1)-1)
92 :     val (indexA, expindexA)= specialize(alpha,0)
93 :     val (indexB, expindexB)= specialize(beta,(length(alpha)))
94 :     val s'=E.V(length(alpha)+ length(beta))
95 : cchiw 2515 val s''=[(s',0,i-1)]
96 : cchiw 2499 in E.EIN{
97 : cchiw 2525 params = [E.TEN(1,shape1) ,E.TEN(1,i::beta)], (* T and T' *)
98 : cchiw 2499 index = indexA@indexB, (* \alpha \beta, i *)
99 :     body = E.Sum(s'', E.Prod[
100 :     E.Tensor(0, expindexA@[s']), (* T_{\alpha i} *)
101 :     E.Tensor(1, [s']@expindexB ) (* T'_{i \beta} *)
102 :     ])
103 :     }
104 : cchiw 2605 end
105 :     | innerProduct _ = raise Fail "Wrong shape for inner product"
106 : cchiw 2499
107 :     (*<T_{\alpha i j} * B{i j \beta }>_\alpha \beta*)
108 :     fun doubleDot(shape1,i::j::beta) = let
109 :     val alpha= List.take(shape1,length(shape1)-2)
110 :     val (indexA, expindexA)= specialize(alpha,0)
111 :     val (indexB, expindexB)= specialize(beta,(length(alpha)))
112 :     val sumi=length(alpha)+ length(beta)
113 :     val s'=[E.V sumi,E.V(sumi+1)]
114 : cchiw 2515 val s''=[(E.V sumi,0,i-1),(E.V(sumi+1),0,j-1)]
115 : cchiw 2499 in E.EIN{
116 : cchiw 2525 params = [E.TEN(1,shape1),E.TEN(1,i::j::beta)],
117 : cchiw 2499 index = indexA@indexB,
118 :     body = E.Sum(s'',E.Prod[
119 :     E.Tensor(0, expindexA@s'),
120 :     E.Tensor(1,s'@expindexB)
121 :     ])
122 :     }
123 :     end
124 : cchiw 2605 | doubleDot _ = raise Fail "Wrong shape for double dot "
125 : cchiw 2499
126 : cchiw 2507 (*Vector Examples : <T_i * T_j>_ij..t0⊗t1*)
127 : cchiw 2499 fun outerProduct(dimA,dimB) =E.EIN{
128 : cchiw 2525 params = [E.TEN(1,[dimA]), E.TEN(1,[dimB])],
129 : cchiw 2499 index= [dimA,dimB],
130 :     body= E.Prod[E.Tensor(0, [E.V 0]), E.Tensor(1, [E.V 1])]
131 :     }
132 :    
133 :    
134 :     fun transpose([i,j]) =E.EIN{
135 : cchiw 2603 params = [E.TEN(1,[i,j])], index= [j,i],
136 : cchiw 2499 body= E.Tensor(0, [E.V 1,E.V 0])
137 :     }
138 : cchiw 2605 | transpose _= raise Fail "too many indices for transpose"
139 : cchiw 2499
140 : cchiw 2515
141 : cchiw 2499 fun modulate(dim) =E.EIN{
142 : cchiw 2525 params = [E.TEN(1,[dim]), E.TEN(1,[dim])],
143 : cchiw 2499 index = [dim],
144 :     body = E.Prod[E.Tensor(0, [E.V 0]), E.Tensor(1, [E.V 0])]
145 :     }
146 :    
147 :    
148 : cchiw 2507 (*crossProduct is on 3D vectors ..vec3 t8=t0 × t1; *)
149 : cchiw 2499 val crossProduct = E.EIN{
150 : cchiw 2525 params = [E.TEN(1,[3]), E.TEN(1,[3])],
151 : cchiw 2499 index= [3],
152 : cchiw 2515 body=E.Sum([(E. V 1,0,2),(E.V 2,0,2)],
153 : cchiw 2499 E.Prod[ E.Epsilon(0, 1, 2), E.Tensor(0, [E.V 1]), E.Tensor(1, [E.V 2 ]) ])
154 :     }
155 :    
156 :     (* Identiy: <\delta_{i j}>_{i j} *)
157 : cchiw 2502 fun identity(dim) =E.EIN{
158 : cchiw 2499 params = [],
159 : cchiw 2502 index = [dim,dim],
160 : cchiw 2499 body = E.Delta(E.V(0), E.V(1))
161 :     }
162 :    
163 :     (*Tensor and Fields*)
164 :     fun addTenField(dim) = E.EIN{
165 : cchiw 2525 params = [E.TEN(1,[]),E.FLD(dim)],
166 : cchiw 2499 index = [],
167 : cchiw 2603 body = E.Add[E.Lift(E.Tensor(0, [])),E.Field(1, [])]
168 : cchiw 2499 }
169 :    
170 :     fun subTenField(dim) = E.EIN{
171 : cchiw 2525 params = [E.TEN(1,[]),E.FLD(dim)],
172 : cchiw 2499 index = [],
173 : cchiw 2603 body = E.Add[E.Lift(E.Tensor(0, [])),E.Neg(E.Field(1, []))]
174 : cchiw 2499 }
175 :    
176 :     fun subFieldTen(dim) = E.EIN{
177 : cchiw 2525 params = [E.TEN(1,[]),E.FLD(dim)],
178 : cchiw 2499 index = [],
179 : cchiw 2603 body = E.Sub(E.Field(1, []),E.Lift(E.Tensor(0, [])))
180 : cchiw 2499 }
181 :    
182 :     (* mkField functions*)
183 :     (*Adding Fields : < F{\alpha} + G_{\alpha}>_{\alpha} *)
184 :     fun addField(dim,shape) =let
185 :     val (index', expindex')= specialize(shape,0)
186 :     in E.EIN{
187 :     params = [E.FLD(dim),E.FLD(dim)],
188 :     index = index',
189 :     body = E.Add[E.Field(0, expindex'),E.Field(1, expindex')]
190 :     }
191 :     end
192 :    
193 :     fun subField(dim,shape) =let
194 :     val (index', expindex')= specialize(shape,0)
195 :     in E.EIN{
196 :     params = [E.FLD(dim),E.FLD(dim)],
197 :     index = index',
198 :     body = E.Sub(E.Field(0, expindex'),E.Field(1, expindex'))
199 :     }
200 :     end
201 :    
202 :     fun scaleField(dim,shape) =let
203 :     val (index', expindex')= specialize(shape,0)
204 :     in E.EIN{
205 : cchiw 2525 params = [E.TEN(1,[]),E.FLD(dim)],
206 : cchiw 2499 index = index',
207 : cchiw 2603 body = E.Prod[E.Lift( E.Tensor(0,[])), E.Field(1,expindex')]
208 : cchiw 2499 }
209 :     end
210 :    
211 :     fun divideField(dim,shape) = let
212 :     val (index', expindex')= specialize(shape,0)
213 :     in E.EIN{
214 : cchiw 2525 params = [E.FLD(dim),E.TEN(1,[])],
215 : cchiw 2499 index = index',
216 : cchiw 2603 body = E.Div(E.Field(0, expindex'),E.Lift( E.Tensor(1, [])))
217 : cchiw 2499 }
218 :     end
219 :    
220 :     fun negField(dim,shape) = let
221 :     val (index', expindex')= specialize(shape,0)
222 :     in E.EIN{
223 :     params = [E.FLD(dim)],
224 :     index = index',
225 :     body = E.Neg(E.Field(0, expindex'))
226 :     }
227 :     end
228 :    
229 : cchiw 2509 (*< d F / d_i>_i *)
230 : cchiw 2605 fun grad(alpha)=let
231 :     val a=List.hd(alpha)
232 :    
233 :     val (index', expindex')= specialize(alpha,0)
234 : cchiw 2499 in E.EIN{
235 :     params = [E.FLD(a)],
236 :     index =index',
237 :     body = E.Apply(E.Partial(expindex'),E.Field(0,[]))
238 :     }
239 :     end
240 : cchiw 2506
241 : cchiw 2530 (*< Sigma d F_alpha / d x_i>ALpha i CHANGE HERE *)
242 : cchiw 2515 fun dotimes(dim,alpha)= let
243 : cchiw 2506 val n=length(alpha)
244 :     fun expIndex(n,inc)=List.tabulate(n, (fn(x)=>E.V (x+inc)))
245 : cchiw 2530 val i'=expIndex(n,0)
246 : cchiw 2506
247 : cchiw 2525
248 : cchiw 2515 in E.EIN{
249 : cchiw 2530 params = [E.FLD(dim)], index =alpha@[dim],
250 :     body = E.Apply(E.Partial [E.V n] ,E.Field(0,i'))
251 : cchiw 2515 }
252 :     end
253 : cchiw 2506
254 : cchiw 2499 (* <d F_i /d_i> *)
255 : cchiw 2585 (*Need to change here *)
256 :    
257 :     fun fs i =Int.toString(length(i))
258 :     fun f i =Int.toString(i)
259 :    
260 : cchiw 2499 fun divergence(dim,alpha)=let
261 : cchiw 2603
262 :     val (index', expindex')= specialize(alpha,0)
263 :     val sumI=length(alpha)
264 :     val _=print (String.concat["\n\n Divergence, length alpha", fs(alpha),"length expindex", fs(expindex'),"\n Dimension", f(dim),
265 :     "SumI", f(sumI)
266 : cchiw 2585 ])
267 :    
268 :     val sumIndex=E.V(sumI)
269 :     val sumIndexL=[sumIndex]
270 :     val S=expindex'@sumIndexL
271 : cchiw 2603
272 : cchiw 2499 in E.EIN{
273 :     params = [E.FLD(dim)],
274 : cchiw 2585 index = index',
275 :     body = E.Sum([(sumIndex,0,dim-1)],E.Apply(E.Partial(sumIndexL),E.Field(0,S)))
276 : cchiw 2499 }
277 :     end
278 :    
279 :     (*FLD here is bounded to image field, and dimension of h*)
280 :     fun conv(dim,shape) =let
281 :     val (index', expindex')= specialize(shape,0)
282 :     in E.EIN{
283 : cchiw 2507 params = [E.IMG(dim),E.KRN],
284 : cchiw 2499 index = index',
285 :     body= E.Conv(0,expindex',1,[])
286 :     }
287 :     end
288 :    
289 :     (* Probe: <F(x)>_{\alpha} *)
290 : cchiw 2510 fun probe(alpha,dim) = let
291 : cchiw 2499 val (indexT, expindexT)= specialize(alpha,0)
292 : cchiw 2510
293 : cchiw 2499 in E.EIN{
294 : cchiw 2525 params = [E.FLD(dim),E.TEN(0,[])],
295 : cchiw 2510 index= indexT,
296 :     body= E.Probe(E.Field(0, expindexT), E.Tensor(1,[]))
297 : cchiw 2499 }
298 :     end
299 :    
300 :     (*(F_y/dx - F_x/dy )k*)
301 :     val curl2d=E.EIN{
302 :     params = [E.FLD 2],
303 :     index = [],
304 :     body = E.Sub(E.Apply(E.Partial([E.C 0]), E.Field(0,[E.C 1])),
305 :     E.Apply(E.Partial([E.C 1]), E.Field(0,[E.C 0])))
306 :     }
307 :    
308 :     val curl3d=E.EIN{
309 : cchiw 2525 params = [E.TEN(1,[3])],
310 : cchiw 2499 index = [3],
311 : cchiw 2515 body = E.Sum([(E.V 1,0,2), (E.V 2,0,2)],E.Prod[E.Epsilon(0, 1, 2),E.Apply( E.Partial([E.V 1]), E.Field(0,[E.V 2]))])
312 : cchiw 2499 }
313 :    
314 :     (*Scalars*)
315 :     (* Add Scalars*)
316 :     val addScalar = E.EIN{
317 : cchiw 2525 params = [E.TEN(1,[]), E.TEN(1,[])] ,
318 : cchiw 2499 index = [],
319 :     body = E.Add[ E.Tensor(0, []), E.Tensor(1, [])]
320 :     }
321 :    
322 :     (* Subtract Scalars*)
323 :     val subScalar = E.EIN{
324 : cchiw 2525 params = [E.TEN(1,[]), E.TEN(1,[])],
325 : cchiw 2499 index = [],
326 :     body = E.Sub( E.Tensor(0, []), E.Tensor(1, []))
327 :     }
328 :    
329 :     (* Divide Scalars*)
330 :     val divScalar = E.EIN{
331 : cchiw 2525 params = [E.TEN(1,[]), E.TEN(1,[])],
332 : cchiw 2499 index = [],
333 :     body = E.Div( E.Tensor(0, []), E.Tensor(1, []))
334 :     }
335 :    
336 :    
337 :     (* Product Scalars*)
338 :     val prodScalar = E.EIN{
339 : cchiw 2525 params =[E.TEN(1,[]), E.TEN(1,[])],
340 : cchiw 2499 index = [],
341 :     body = E.Prod[ E.Tensor(0, []), E.Tensor(1, [])]
342 :     }
343 :    
344 : cchiw 2502 (*Transform M_ij x_j+T*)
345 :     fun transform(i, j) = E.EIN{
346 : cchiw 2525 params = [E.TEN(1,[i,j]), E.TEN(1,[j]), E.TEN(1,[j])],
347 : cchiw 2502 index = [i],
348 :     body = E.Add
349 : cchiw 2515 [E.Sum([(E.V 1, 0,j-1)],E.Prod[E.Tensor(0, [E.V 0, E.V 1]), E.Tensor(1, [E.V 1])]),
350 : cchiw 2502 E.Tensor(1,[E.V 0])]
351 :     }
352 : cchiw 2499
353 : cchiw 2576
354 :     (*New OPs*)
355 :     fun mulFieldss dim = E.EIN{
356 :     params = [E.FLD(dim),E.FLD(dim)],
357 :     index = [],
358 :     body = E.Prod[E.Field(0, []),E.Field(1, [])]
359 :     }
360 :    
361 :     fun mulFieldsf(dim,shape) =let
362 :     val (index', expindex')= specialize(shape,0)
363 :     in E.EIN{
364 :     params = [E.FLD(dim),E.FLD(dim)],
365 :     index = index',
366 :     body = E.Prod[E.Field(0, []),E.Field(1, expindex')]
367 :     }
368 :     end
369 :    
370 : cchiw 2608 fun divFieldss dim = E.EIN{
371 :     params = [E.FLD(dim),E.FLD(dim)],
372 :     index = [],
373 :     body = E.Div(E.Field(0, []),E.Field(1, []))
374 :     }
375 : cchiw 2576
376 : cchiw 2608
377 : cchiw 2585 (*
378 :     (*Outer Product Fields : < F{i} + G_{j}>_{ij} *)
379 :     fun outerField(dim,i, j) =let
380 :     val (index', expindex')= specialize(i@j,0)
381 :     in
382 :     E.EIN{
383 :     params = [E.FLD(dim),E.FLD(dim)],
384 :     index = index',
385 :     body = E.Prod[E.Field(0, [E.V 0]),E.Field(1, [E.V 1])]
386 :     }
387 :     end
388 : cchiw 2499
389 : cchiw 2585 *)
390 :    
391 :     (*Assumes same dimension vetcor field *)
392 :     fun outerField(dim) =
393 :     E.EIN{
394 :     params = [E.FLD(dim),E.FLD(dim)],
395 :     index = [dim, dim],
396 :     body = E.Prod[E.Field(0, [E.V 0]),E.Field(1, [E.V 1])]
397 :     }
398 :    
399 :     fun fs x=Int.toString(x)
400 :     fun f x=fs(length(x))
401 :    
402 :     (* generic inner product: <T_{\alpha i} * T_{i \beta}>_{\alpha \beta} *)
403 : cchiw 2606
404 : cchiw 2585 fun innerProductField(shape1,dim,i::beta) = let
405 :     val alpha= List.take(shape1,length(shape1)-1)
406 :     val (indexA, expindexA)= specialize(alpha,0)
407 :     val (indexB, expindexB)= specialize(beta,(length(alpha)))
408 :     val s'=E.V(length(alpha)+ length(beta))
409 :     val s''=[(s',0,i-1)]
410 :    
411 :     val _=print(String.concat["Inner product Field. ",f(indexA)])
412 :     in E.EIN{
413 :     params = [E.FLD(dim) ,E.FLD(dim)], (* T and T' *)
414 : cchiw 2606 index = [],(*indexA@indexB, *) (* \alpha \beta, i *)
415 : cchiw 2585 body = E.Sum(s'', E.Prod[
416 :     E.Field(0, expindexA@[s']), (* F_{\alpha i} *)
417 :     E.Field(1, [s']@expindexB ) (* F'_{i \beta} *)
418 :     ])}
419 :     end
420 : cchiw 2605 | innerProductField _ = raise Fail "Wrong shape for innerProductField"
421 : cchiw 2585
422 : cchiw 2603 (*Field Cross Product*)
423 :     val crossProductField = E.EIN{
424 :     params = [E.FLD(3), E.FLD(3)],
425 :     index= [3],
426 :     body=E.Sum([(E. V 1,0,2),(E.V 2,0,2)],
427 :     E.Prod[ E.Epsilon(0, 1, 2), E.Field(0, [E.V 1]), E.Field(1, [E.V 2 ]) ])
428 :     }
429 :    
430 :    
431 :     (* Trace: <Sigma_i F_{\alpha i, i}> This one Sx represents both i's*)
432 :     fun traceField(dim,alpha) =let
433 :     val (indexA, expindexA)= specialize(alpha,0)
434 :     val s=E.V(length(alpha))
435 :     in
436 :     E.EIN{
437 :     params = [E.FLD(dim)],
438 :     index = indexA,
439 :     body = E.Sum([(s,0,dim-1)],E.Field(0, expindexA@[s,s]))
440 :     }
441 :     end
442 :    
443 :     (*Transpose Field F_{ji}*)
444 :     fun transposeField(dim,i,j) =E.EIN{
445 :     params = [E.FLD(dim)], index= [i,j],
446 :     body= E.Field(0, [E.V 1,E.V 0])
447 :     }
448 :    
449 :    
450 : cchiw 2585
451 : cchiw 2499 end; (* local *)
452 :    
453 :     end (* local *)

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