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

SCM Repository

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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2602, Wed Apr 23 20:01:52 2014 UTC revision 2603, Thu Apr 24 03:58:37 2014 UTC
# Line 4  Line 4 
4      local      local
5    
6      structure E = Ein      structure E = Ein
7        structure F = Filter
8    
9      in      in
10    
11    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    
23    
24  (*Orders the expression correctly.*)  (*Orders the expression correctly.*)
25  fun orderfn(Ein.EIN{params, index, body})= let  fun orderfn(Ein.EIN{params, index, body})= let
# Line 23  Line 36 
36          | E.Partial _ => body          | E.Partial _ => body
37          | E.Conv _=>body          | E.Conv _=>body
38          | E.Sum(c1,E.Sum(c2, e))=>(changed:=true;E.Sum(c1@c2,order e))          | E.Sum(c1,E.Sum(c2, e))=>(changed:=true;E.Sum(c1@c2,order e))
39          | E.Sum(sumIndex,E.Prod e)=> let          | E.Sum([c1],E.Prod p)=> let
40              (*val _ =print "\n NOPE"*)              val _ =print "\n Sum prod"
41              fun prodMatch(c,s,p,[])=let              val p'=order(E.Prod p)
42                  val p'=case p of [e1] => e1              val (change,e')= (case p'
43                      |_=> E.Prod p                  of E.Prod p''=> F.pushSum(c1,p'')
44                  val result= (case s                  | _=> (1,E.Sum([c1],p'))
                         of []=> E.Sum(sumIndex,p')  
                         |_=> E.Prod(s@ [E.Sum(sumIndex,p')])  
45                          (*end case*))                          (*end case*))
46                  in (case c              in (case change of 1=>(changed:=true; e') |_=> e')
                     of 1=> (changed:=true;result)  
                         |_=> result)  
                 end  
             | prodMatch(c,s,[],(E.Value v)::es)= prodMatch(c,s@[E.Value v],[], es)  
             | prodMatch(c,s,p,(E.Value v)::es)= prodMatch(1,s@[E.Value v], p,es)  
             | prodMatch(c,s,[],(E.Const v)::es)= prodMatch(c,s@[E.Const v],[], es)  
             | prodMatch(c,s,p,(E.Const v)::es)= prodMatch(1,s@[E.Const v], p,es)  
             | prodMatch(c,s,[],(E.Tensor(id,[]))::es)= prodMatch(c,s@[E.Tensor(id,[])], [],es)  
             | prodMatch(c,s,p,(E.Tensor(id,[]))::es)= prodMatch(1,s@[E.Tensor(id,[])],p, es)  
             | prodMatch(c,s,[],(E.Conv(v,[],h,[]))::es)=  
                 (prodMatch(c,s@[E.Conv(v,[],h,[])], [],es))  
             | prodMatch(c,s,p,(E.Conv(v,[],h,[]))::es)=  
                     (prodMatch(1,s@[E.Conv(v,[],h,[])],p, es))  
             | prodMatch(c,s,[],(E.Probe(E.Conv(v,[],h,[]),E.Tensor(t,[])))::es)=  
                 (prodMatch(c,s@[E.Probe(E.Conv(v,[],h,[]),E.Tensor(t,[]))], [],es))  
             | prodMatch(c,s,p,(E.Probe(E.Conv(v,[],h,[]),E.Tensor(t,[])))::es)=  
                 (prodMatch(1,s@[E.Probe(E.Conv(v,[],h,[]),E.Tensor(t,[]))],p, es))  
             | prodMatch(c,s,p,E.Prod e::es)=  prodMatch(c,s,p,e@ es)  
             | prodMatch(c,s,p,e::es)=  prodMatch(c,s,p@[e], es)  
             val e'= order(E.Prod e)  
             in (case e'  
                 of E.Prod p' => prodMatch (0,[],[],p')  
                 |_=>e')  
47              end              end
48          | E.Sum(c,e)=>E.Sum(c, order e)          | E.Sum(c,e)=>(print "\n other sum"; E.Sum(c, order e))
49            | E.Lift e => E.Lift(order e)
50          | E.Neg e => E.Neg(order e)          | E.Neg e => E.Neg(order e)
51          | E.Add es => E.Add (List.map order es)          | E.Add es => E.Add (List.map order es)
52          | E.Sub(e1,e2) => E.Sub(order e1, order e2)          | E.Sub(e1,e2) => E.Sub(order e1, order e2)
53          | E.Div(e1,e2)=> E.Div(order e1, order e2)          | E.Div(e1,e2)=> E.Div(order e1, order e2)
54          | E.Apply(e1,e2)=> E.Apply(e1, order e2)          | E.Apply(e1,E.Prod e2) => let
55          | E.Probe(e1,e2)=> (print "\n probe \n"; E.Probe(order e1,order e2))              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          | E.Img _ => body          | E.Img _ => body
62          | E.Prod [e1]=>e1          | E.Prod [e1]=>e1
63          | E.Prod e=>let          | E.Prod e=>let
64                val(s,eps,dels,p)= F.filterGreek e
65              fun prodMatch(c,s,eps,dels,p,[])= (c,E.Prod(s@eps@dels@p))              val p'=List.map order p
66              | prodMatch(c,s,eps,[],[],(E.Epsilon e)::es)=prodMatch(c,s,eps@[E.Epsilon e],[],[], es)              in E.Prod(s@eps@dels@p')
67              | prodMatch(_,s,eps,dels,p,(E.Epsilon e)::es)=prodMatch(1,s,eps@[E.Epsilon e],dels,p, es)              end
             | prodMatch(c,s,eps,dels,[],(E.Delta d)::es)=prodMatch(c,s,eps,dels@[E.Delta d],[], es)  
             | prodMatch(_,s,eps,dels,p,(E.Delta d)::es)=prodMatch(1,s,eps,dels@[E.Delta d],p, es)  
             | prodMatch(c,s,[],[],[], (E.Value v)::es)= prodMatch(c,s@[E.Value v],[],[], [], es)  
             | prodMatch(c,s,eps,dels,p, (E.Value v)::es)= prodMatch(1,s@[E.Value v],eps,dels, p, es)  
             | prodMatch(c,s,[],[],[], (E.Const v)::es)= prodMatch(c,s@[E.Const v],[],[],[], es)  
             | prodMatch(c,s,eps,dels,p, (E.Const v)::es)= prodMatch(1,s@[E.Const v],eps,dels, p, es)  
             | prodMatch(c,s,[],[],[], (E.Tensor(id,[]))::es)= prodMatch(c,s@[E.Tensor(id,[])],[],[],[], es)  
             | prodMatch(c,s,eps,dels,p, (E.Tensor(id,[]))::es)= prodMatch(1,s@[E.Tensor(id,[])],eps,dels, p, es)  
             | prodMatch(c,s,eps,dels,p, (E.Prod e)::es)= prodMatch(c,s,eps,dels, p,e@es)  
             | prodMatch(c,s,eps,dels,p, e::es)= prodMatch(c,s,eps,dels, p@[order e], es)  
             val(change,result)=prodMatch (0,[],[],[],[],e)  
             in (case change  
                 of 1=> (changed:=true;result)  
                 |_=> result) end  
68           (*end case*))           (*end case*))
69    
70      fun loop body = let      fun loop body = let

Legend:
Removed from v.2602  
changed lines
  Added in v.2603

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