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 2845 - (view) (download)

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

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