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 2495, Wed Oct 23 21:28:25 2013 UTC revision 2496, Tue Oct 29 05:29:46 2013 UTC
# Line 2  Line 2 
2  structure OrderEin = struct  structure OrderEin = struct
3    
4      local      local
     structure G = GenericEin  
     structure E = Ein  
     structure S = Specialize  
     structure P= Printer  
   
   
5    
6        structure E = Ein
7    
8      in      in
9    
 fun create(b)=P.printerE(Ein.EIN{params=[], index=[], body=b})  
   
 fun match(_,[],s)=0  
     | match([],j1::j2::jx,s)= match(s,j2::jx,s)  
     | match(i::ix, j::jx,s)= if(i=j) then 1  else match(ix, j::jx,s)  
   
 fun matchEps((a,b,c),(d,e,f))=match([a,b,c],[d,e,f],[a,b,c])  
   
10    
11  (*Orders the expression correctly.*)  (*Orders the expression correctly.*)
12  fun orderfn(Ein.EIN{params, index, body})= let  fun orderfn(Ein.EIN{params, index, body})= let
# Line 33  Line 20 
20          | E.Value _ => body          | E.Value _ => body
21          | E.Epsilon _=>body          | E.Epsilon _=>body
22          | E.Partial _ => body          | E.Partial _ => body
23            | E.Conv _=>body
24          | 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))
25            | E.Sum(sumIndex,E.Prod e)=> let
26                fun prodMatch(c,s,p,[])=let
27                    val p'=case p of [e1] => e1
28                        |_=> E.Prod p
29                    val result= (case s
30                            of []=> E.Sum(sumIndex,p')
31                            |_=> E.Prod(s@ [E.Sum(sumIndex,p')])
32                            (*end case*))
33                    in (case c
34                        of 1=> (changed:=true;result)
35                            |_=> result)
36                    end
37                | prodMatch(c,s,[],(E.Value v)::es)= prodMatch(c,s@[E.Value v],[], es)
38                | prodMatch(c,s,p,(E.Value v)::es)= prodMatch(1,s@[E.Value v], p,es)
39                | prodMatch(c,s,[],(E.Const v)::es)= prodMatch(c,s@[E.Const v],[], es)
40                | prodMatch(c,s,p,(E.Const v)::es)= prodMatch(1,s@[E.Const v], p,es)
41                | prodMatch(c,s,[],(E.Tensor(id,[]))::es)= prodMatch(c,s@[E.Tensor(id,[])], [],es)
42                | prodMatch(c,s,p,(E.Tensor(id,[]))::es)= prodMatch(1,s@[E.Tensor(id,[])],p, es)
43                | prodMatch(c,s,p,E.Prod e::es)=  prodMatch(c,s,p,e@ es)
44                | prodMatch(c,s,p,e::es)=  prodMatch(c,s,p@[e], es)
45                val e'= order(E.Prod e)
46                in (case e'
47                    of E.Prod p' => prodMatch (0,[],[],p')
48                    |_=>e')
49                end
50          | E.Sum(c,e)=>E.Sum(c, order e)          | E.Sum(c,e)=>E.Sum(c, order e)
51          | E.Neg e => E.Neg(order e)          | E.Neg e => E.Neg(order e)
52          | E.Add es => E.Add (List.map order es)          | E.Add es => E.Add (List.map order es)
53          | E.Sub(e1,e2) => E.Sub(order e1, order e2)          | E.Sub(e1,e2) => E.Sub(order e1, order e2)
54          | E.Div(e1,e2)=> E.Div(order e1, order e2)          | E.Div(e1,e2)=> E.Div(order e1, order e2)
55          | E.Apply(e1,e2)=> E.Apply(e1, order e2)          | E.Apply(e1,e2)=> E.Apply(e1, order e2)
         | E.Conv(e1,mx)=> E.Conv(order e1, mx)  
56          | E.Probe(e1,e2)=> E.Probe(e1,order e2)          | E.Probe(e1,e2)=> E.Probe(e1,order e2)
57          | E.Img _ => body          | E.Img _ => body
58            | E.Prod [e1]=>e1
59          | E.Prod e=>let          | E.Prod e=>let
60              fun prodMatch(c,eps,dels,p,[])= (c,E.Prod(eps@dels@p))              fun prodMatch(c,s,eps,dels,p,[])= (c,E.Prod(s@eps@dels@p))
61              | prodMatch(c,eps,[],[],(E.Epsilon e)::es)=prodMatch(c,eps@[E.Epsilon e],[],[], es)              | prodMatch(c,s,eps,[],[],(E.Epsilon e)::es)=prodMatch(c,s,eps@[E.Epsilon e],[],[], es)
62              | prodMatch(_,eps,dels,p,(E.Epsilon e)::es)=prodMatch(1,eps@[E.Epsilon e],dels,p, es)              | prodMatch(_,s,eps,dels,p,(E.Epsilon e)::es)=prodMatch(1,s,eps@[E.Epsilon e],dels,p, es)
63              | prodMatch(c,eps,dels,[],(E.Delta d)::es)=prodMatch(c,eps,dels@[E.Delta d],[], es)              | prodMatch(c,s,eps,dels,[],(E.Delta d)::es)=prodMatch(c,s,eps,dels@[E.Delta d],[], es)
64              | prodMatch(_,eps,dels,p,(E.Delta d)::es)=prodMatch(1,eps,dels@[E.Delta d],p, es)              | prodMatch(_,s,eps,dels,p,(E.Delta d)::es)=prodMatch(1,s,eps,dels@[E.Delta d],p, es)
65              | prodMatch(c,eps,dels,p, e::es)= prodMatch(c,eps,dels, p@[order e], es)              | prodMatch(c,s,[],[],[], (E.Value v)::es)= prodMatch(c,s@[E.Value v],[],[], [], es)
66              val(change,result)=prodMatch (0,[],[],[],e)              | prodMatch(c,s,eps,dels,p, (E.Value v)::es)= prodMatch(1,s@[E.Value v],eps,dels, p, es)
67                | prodMatch(c,s,[],[],[], (E.Const v)::es)= prodMatch(c,s@[E.Const v],[],[],[], es)
68                | prodMatch(c,s,eps,dels,p, (E.Const v)::es)= prodMatch(1,s@[E.Const v],eps,dels, p, es)
69                | prodMatch(c,s,[],[],[], (E.Tensor(id,[]))::es)= prodMatch(c,s@[E.Tensor(id,[])],[],[],[], es)
70                | prodMatch(c,s,eps,dels,p, (E.Tensor(id,[]))::es)= prodMatch(1,s@[E.Tensor(id,[])],eps,dels, p, es)
71                | prodMatch(c,s,eps,dels,p, (E.Prod e)::es)= prodMatch(c,s,eps,dels, p,e@es)
72                | prodMatch(c,s,eps,dels,p, e::es)= prodMatch(c,s,eps,dels, p@[order e], es)
73                val(change,result)=prodMatch (0,[],[],[],[],e)
74              in (case change              in (case change
75                  of 1=> (changed:=true;result)                  of 1=> (changed:=true;result)
76                  |_=> result) end                  |_=> result) end
77              )           (*end case*))
78    
79      fun loop body = let      fun loop body = let
80      val body' = order body      val body' = order body
# Line 65  Line 85 
85  end  end
86  val b = loop body  val b = loop body
87  val b'=order b  val b'=order b
    (* val b=order(body)*)  
88     in (Ein.EIN{params=params, index=index, body=b'}) end     in (Ein.EIN{params=params, index=index, body=b'}) end
89    
90  end (* local *)  end (* local *)

Legend:
Removed from v.2495  
changed lines
  Added in v.2496

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