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 2829 - (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 2680 E.Tensor(2,[E.V 0])]
351 : cchiw 2502 }
352 : cchiw 2499
353 : cchiw 2680
354 : cchiw 2829 fun transformA(i, j) = E.EIN{
355 : cchiw 2680 params = [E.TEN(1,[i,j]), E.TEN(1,[j])],
356 :     index = [i],
357 :     body = 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])])
358 :     }
359 :    
360 : cchiw 2576
361 : cchiw 2829 fun transformB i = E.EIN{
362 :     params = [E.TEN(1,[i]), E.TEN(1,[i])],
363 : cchiw 2680 index = [i],
364 :     body = E.Add[E.Tensor(0, [E.V 0]), E.Tensor(1,[E.V 0])]
365 : cchiw 2829 }
366 : cchiw 2680
367 :    
368 :    
369 : cchiw 2576 (*New OPs*)
370 :     fun mulFieldss dim = E.EIN{
371 :     params = [E.FLD(dim),E.FLD(dim)],
372 :     index = [],
373 :     body = E.Prod[E.Field(0, []),E.Field(1, [])]
374 :     }
375 :    
376 :     fun mulFieldsf(dim,shape) =let
377 :     val (index', expindex')= specialize(shape,0)
378 :     in E.EIN{
379 :     params = [E.FLD(dim),E.FLD(dim)],
380 :     index = index',
381 :     body = E.Prod[E.Field(0, []),E.Field(1, expindex')]
382 :     }
383 :     end
384 :    
385 : cchiw 2608 fun divFieldss dim = E.EIN{
386 :     params = [E.FLD(dim),E.FLD(dim)],
387 :     index = [],
388 :     body = E.Div(E.Field(0, []),E.Field(1, []))
389 :     }
390 : cchiw 2576
391 : cchiw 2608
392 : cchiw 2585 (*
393 :     (*Outer Product Fields : < F{i} + G_{j}>_{ij} *)
394 :     fun outerField(dim,i, j) =let
395 :     val (index', expindex')= specialize(i@j,0)
396 :     in
397 :     E.EIN{
398 :     params = [E.FLD(dim),E.FLD(dim)],
399 :     index = index',
400 :     body = E.Prod[E.Field(0, [E.V 0]),E.Field(1, [E.V 1])]
401 :     }
402 :     end
403 : cchiw 2499
404 : cchiw 2585 *)
405 :    
406 :     (*Assumes same dimension vetcor field *)
407 :     fun outerField(dim) =
408 :     E.EIN{
409 :     params = [E.FLD(dim),E.FLD(dim)],
410 :     index = [dim, dim],
411 :     body = E.Prod[E.Field(0, [E.V 0]),E.Field(1, [E.V 1])]
412 :     }
413 :    
414 :     fun fs x=Int.toString(x)
415 :     fun f x=fs(length(x))
416 :    
417 :     (* generic inner product: <T_{\alpha i} * T_{i \beta}>_{\alpha \beta} *)
418 : cchiw 2606
419 : cchiw 2585 fun innerProductField(shape1,dim,i::beta) = let
420 :     val alpha= List.take(shape1,length(shape1)-1)
421 :     val (indexA, expindexA)= specialize(alpha,0)
422 :     val (indexB, expindexB)= specialize(beta,(length(alpha)))
423 :     val s'=E.V(length(alpha)+ length(beta))
424 :     val s''=[(s',0,i-1)]
425 :    
426 :     val _=print(String.concat["Inner product Field. ",f(indexA)])
427 :     in E.EIN{
428 :     params = [E.FLD(dim) ,E.FLD(dim)], (* T and T' *)
429 : cchiw 2611 index = indexA@indexB,(* \alpha \beta, i *)
430 : cchiw 2585 body = E.Sum(s'', E.Prod[
431 :     E.Field(0, expindexA@[s']), (* F_{\alpha i} *)
432 :     E.Field(1, [s']@expindexB ) (* F'_{i \beta} *)
433 :     ])}
434 :     end
435 : cchiw 2605 | innerProductField _ = raise Fail "Wrong shape for innerProductField"
436 : cchiw 2585
437 : cchiw 2603 (*Field Cross Product*)
438 :     val crossProductField = E.EIN{
439 :     params = [E.FLD(3), E.FLD(3)],
440 :     index= [3],
441 :     body=E.Sum([(E. V 1,0,2),(E.V 2,0,2)],
442 :     E.Prod[ E.Epsilon(0, 1, 2), E.Field(0, [E.V 1]), E.Field(1, [E.V 2 ]) ])
443 :     }
444 :    
445 :    
446 :     (* Trace: <Sigma_i F_{\alpha i, i}> This one Sx represents both i's*)
447 :     fun traceField(dim,alpha) =let
448 :     val (indexA, expindexA)= specialize(alpha,0)
449 :     val s=E.V(length(alpha))
450 :     in
451 :     E.EIN{
452 :     params = [E.FLD(dim)],
453 :     index = indexA,
454 :     body = E.Sum([(s,0,dim-1)],E.Field(0, expindexA@[s,s]))
455 :     }
456 :     end
457 :    
458 :     (*Transpose Field F_{ji}*)
459 :     fun transposeField(dim,i,j) =E.EIN{
460 :     params = [E.FLD(dim)], index= [i,j],
461 :     body= E.Field(0, [E.V 1,E.V 0])
462 :     }
463 :    
464 : cchiw 2611
465 :     (*<F_{\alpha i j} * G{i j \beta }>_\alpha \beta*)
466 :     fun doubleDotField(shape1,i::j::beta) = let
467 :     val alpha= List.take(shape1,length(shape1)-2)
468 :     val (indexA, expindexA)= specialize(alpha,0)
469 :     val (indexB, expindexB)= specialize(beta,(length(alpha)))
470 :     val sumi=length(alpha)+ length(beta)
471 :     val s'=[E.V sumi,E.V(sumi+1)]
472 :     val s''=[(E.V sumi,0,i-1),(E.V(sumi+1),0,j-1)]
473 :     in
474 :     E.EIN{
475 :     params = [E.TEN(1,shape1),E.TEN(1,i::j::beta)],
476 :     index = indexA@indexB,
477 :     body = E.Sum(s'',E.Prod[E.Field(0, expindexA@s'), E.Field(1,s'@expindexB)])
478 :     }
479 :     end
480 :     | doubleDotField _ = raise Fail "Wrong shape for double dot "
481 :    
482 : cchiw 2585
483 : cchiw 2499 end; (* local *)
484 :    
485 :     end (* local *)

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