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

SCM Repository

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

Annotation of /branches/charisee/src/compiler/ein/order-ein.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2605 - (view) (download)

1 : cchiw 2394 (*Orders Ein Function after substitution*)
2 :     structure OrderEin = struct
3 :    
4 :     local
5 : cchiw 2496
6 : cchiw 2394 structure E = Ein
7 : cchiw 2603 structure F = Filter
8 : cchiw 2394
9 :     in
10 :    
11 : cchiw 2605 fun rewriteProd A=(case A
12 :     of [A]=> A
13 :     | A => E.Prod A
14 :     (*end case*))
15 : cchiw 2394
16 : cchiw 2605 fun rewriteApply(c,p)= E.Apply(c, rewriteProd p)
17 : cchiw 2603
18 : cchiw 2605
19 :     fun pushApply (del,p)=(case F.filterField p
20 :     of ([],[]) => raise Fail"No Field in Apply expression"
21 :     | ([],post) => (0,rewriteApply(del,post))
22 :     | (pre,post)=> (1,rewriteProd(pre@[rewriteApply(del,post)]))
23 :     (*end case*))
24 :    
25 :    
26 : cchiw 2394 (*Orders the expression correctly.*)
27 : cchiw 2448 fun orderfn(Ein.EIN{params, index, body})= let
28 :     val changed =ref false
29 :     fun order(body)=(case body
30 :     of E.Const _ => body
31 :     | E.Tensor _=> body
32 :     | E.Field _ => body
33 : cchiw 2485 | E.Krn _ => body
34 : cchiw 2605 | E.Img _ => body
35 : cchiw 2448 | E.Delta _ => body
36 :     | E.Value _ => body
37 :     | E.Epsilon _=>body
38 :     | E.Partial _ => body
39 : cchiw 2496 | E.Conv _=>body
40 : cchiw 2448 | E.Sum(c1,E.Sum(c2, e))=>(changed:=true;E.Sum(c1@c2,order e))
41 : cchiw 2605 (* | E.Sum([c1],E.Prod p)=> let
42 : cchiw 2603 val _ =print "\n Sum prod"
43 :     val p'=order(E.Prod p)
44 :     val (change,e')= (case p'
45 :     of E.Prod p''=> F.pushSum(c1,p'')
46 :     | _=> (1,E.Sum([c1],p'))
47 :     (*end case *))
48 :     in (case change of 1=>(changed:=true; e') |_=> e')
49 : cchiw 2605 end*)
50 : cchiw 2603 | E.Sum(c,e)=>(print "\n other sum"; E.Sum(c, order e))
51 :     | E.Lift e => E.Lift(order e)
52 : cchiw 2448 | E.Neg e => E.Neg(order e)
53 :     | E.Add es => E.Add (List.map order es)
54 :     | E.Sub(e1,e2) => E.Sub(order e1, order e2)
55 :     | E.Div(e1,e2)=> E.Div(order e1, order e2)
56 : cchiw 2603 | E.Apply(e1,E.Prod e2) => let
57 :     val(change,e')=pushApply (e1,e2)
58 :     in (case change of 1=>(changed:=true; e') |_=> e')
59 :     end
60 : cchiw 2605 | E.Apply(e1,e2)=> E.Apply(e1, order e2)
61 : cchiw 2603 | E.Probe(e1,e2)=> E.Probe(order e1,order e2)
62 : cchiw 2496 | E.Prod [e1]=>e1
63 : cchiw 2603 | E.Prod e=> let
64 :     val(s,eps,dels,p)= F.filterGreek e
65 :     val p'=List.map order p
66 :     in E.Prod(s@eps@dels@p')
67 :     end
68 :     (*end case*))
69 : cchiw 2584
70 : cchiw 2448 fun loop body = let
71 :     val body' = order body
72 :     in
73 : cchiw 2496 if !changed
74 :     then (changed := false; loop body')
75 :     else body'
76 :     end
77 :     val b = loop body
78 :     val b'=order b
79 : cchiw 2448 in (Ein.EIN{params=params, index=index, body=b'}) end
80 :    
81 : cchiw 2394 end (* local *)
82 :    
83 :     end

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