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 2603 - (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 2603 fun pushApply (del,p)= let
12 :     val _=print "In push Apply"
13 :     val(pre,post)=F.filterField p
14 :     in (case (pre,post)
15 :     of ([],[]) => raise Fail"No Field in Apply expression"
16 :     | ([],[keep]) => (0,E.Apply(del,keep))
17 :     | ([],keep) => (0,E.Apply(del,E.Prod(keep)))
18 :     | (_,[keep]) => (1,E.Prod(pre@[E.Apply(del,keep)]))
19 :     | _ => (1,E.Prod(pre@[E.Apply(del,E.Prod(post))]))
20 :     (*end case*))
21 :     end
22 : cchiw 2394
23 : cchiw 2603
24 : cchiw 2394 (*Orders the expression correctly.*)
25 : cchiw 2448 fun orderfn(Ein.EIN{params, index, body})= let
26 : cchiw 2584 (* val _ = print "\n IN ORDER \n"*)
27 : cchiw 2448 val changed =ref false
28 :     fun order(body)=(case body
29 :     of E.Const _ => body
30 :     | E.Tensor _=> body
31 :     | E.Field _ => body
32 : cchiw 2485 | E.Krn _ => body
33 : cchiw 2448 | E.Delta _ => body
34 :     | E.Value _ => body
35 :     | E.Epsilon _=>body
36 :     | E.Partial _ => body
37 : cchiw 2496 | E.Conv _=>body
38 : cchiw 2448 | E.Sum(c1,E.Sum(c2, e))=>(changed:=true;E.Sum(c1@c2,order e))
39 : cchiw 2603 | E.Sum([c1],E.Prod p)=> let
40 :     val _ =print "\n Sum prod"
41 :     val p'=order(E.Prod p)
42 :     val (change,e')= (case p'
43 :     of E.Prod p''=> F.pushSum(c1,p'')
44 :     | _=> (1,E.Sum([c1],p'))
45 :     (*end case *))
46 :     in (case change of 1=>(changed:=true; e') |_=> e')
47 : cchiw 2496 end
48 : cchiw 2603 | E.Sum(c,e)=>(print "\n other sum"; E.Sum(c, order e))
49 :     | E.Lift e => E.Lift(order e)
50 : cchiw 2448 | E.Neg e => E.Neg(order e)
51 :     | E.Add es => E.Add (List.map order es)
52 :     | E.Sub(e1,e2) => E.Sub(order e1, order e2)
53 :     | E.Div(e1,e2)=> E.Div(order e1, order e2)
54 : cchiw 2603 | E.Apply(e1,E.Prod e2) => let
55 :     val(change,e')=pushApply (e1,e2)
56 :     in (case change of 1=>(changed:=true; e') |_=> e')
57 :     end
58 :     |E.Apply(e1,E.Add[e2,e3]) => E.Add[E.Apply(e1,e2),E.Apply(e1,e3)]
59 :     | E.Apply(e1,e2)=> (print "\n Found apply"; E.Apply(e1, order e2))
60 :     | E.Probe(e1,e2)=> E.Probe(order e1,order e2)
61 : cchiw 2485 | E.Img _ => body
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