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

SCM Repository

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

Diff of /branches/charisee/src/compiler/ein/equal.sml

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

revision 3447, Fri Nov 20 17:21:39 2015 UTC revision 3448, Fri Nov 20 20:33:38 2015 UTC
# Line 22  Line 22 
22    
23      (*isEqual:ein_exp*ein_exp->int *)      (*isEqual:ein_exp*ein_exp->int *)
24      fun isBodyEq(b1,b2)=let      fun isBodyEq(b1,b2)=let
25            val _ = testp ["\n equal is body",P.printbody b1,"==",P.printbody b2]
26          (*isIndex: mu list *mu list -> int *)          (*isIndex: mu list *mu list -> int *)
27          fun isIndex([],[])=true          fun isIndex([],[])=true
28           | isIndex((E.V i)::ix,(E.V j)::jx)= if(i=j) then isIndex(ix, jx) else false           | isIndex((E.V i)::ix,(E.V j)::jx)= if(i=j) then isIndex(ix, jx) else false
# Line 44  Line 45 
45                      | false => false                      | false => false
46                      (*end case*))                      (*end case*))
47              | iter _ =false              | iter _ =false
48          in (case (e1,e2)          fun checkop1(e1,e2)=(case (e1,e2)
49              of (E.Field(id,ix),E.Field(id2,ix2))        => (id=id2) andalso isIndex(ix, ix2)              of  (E.Sqrt,E.Sqrt)                    => true
50              | (E.Tensor(id,ix),E.Tensor(id2,ix2))       => (id=id2) andalso isIndex(ix, ix2)              | (E.Neg,  E.Neg )       => true
51              | (E.Const c1,E.Const c2)                   => (c1=c2)              | (E.Exp,  E.Exp )       => true
52              | (E.Krn(tid,ix,pos),E.Krn (jid,jx,pos2))   =>              | (E.Cosine  , E.Cosine )              => true
53                      (tid=jid) andalso isKx(ix,jx) andalso isEqual(pos,pos2)              | (E.ArcCosine, E.ArcCosine )           => true
54              | (E.Delta(ix,jx), E.Delta(ix2,jx2))        => isIndex([ix, jx],[ix2, jx2])              | (E.Sine , E.Sine )                    => true
55                | (E.ArcSine , E.ArcSine )              => true
56                | (E.Tangent  , E.Tangent )             => true
57                | (E.ArcTangent  , E.ArcTangent)        => true
58                | _ => false
59                (*end case*))
60            fun checkop2(e1,e2)=(case (e1,e2)
61                of  (E.Div,E.Div)                    => true
62                | (E.Sub,  E.Sub )       => true
63                | _ => false
64                (*end case*))
65            fun checkopn(e1,e2)=(case (e1,e2)
66                of  (E.Add,E.Add)                    => true
67                | (E.Prod,E.Prod)       => true
68                | _ => false
69                (*end case*))
70           fun base(b1,b2)= (case (b1, b2)
71                of (E.Const c1,E.Const c2)                   => (c1=c2)
72                (*end case*))
73            fun greek(g1, g2) =(case (g1,g2)
74                of (E.Delta(ix,jx), E.Delta(ix2,jx2))       => isIndex([ix, jx],[ix2, jx2])
75              | (E.Epsilon(i,j,k),E.Epsilon(i2,j2,k2))    => isIndex([E.V i,E.V j,E.V k], [E.V i2, E.V j2, E.V k2])              | (E.Epsilon(i,j,k),E.Epsilon(i2,j2,k2))    => isIndex([E.V i,E.V j,E.V k], [E.V i2, E.V j2, E.V k2])
76              | (E.Eps2(i,j),E.Eps2(i2,j2))               => isIndex([E.V i,E.V j], [E.V i2, E.V j2])              | (E.Eps2(i,j),E.Eps2(i2,j2))               => isIndex([E.V i,E.V j], [E.V i2, E.V j2])
77                | _                                         => false
78                (*end case*))
79            in (case (e1,e2)
80                of (E.B b1,E.B b2)=> base(b1, b2)
81                | (E.Tensor(id,ix),E.Tensor(id2,ix2))       => (id=id2) andalso isIndex(ix, ix2)
82                | (E.G g1, E.G g2) =>  greek(g1,g2)
83                | (E.Field(id,ix),E.Field(id2,ix2))        => (id=id2) andalso isIndex(ix, ix2)
84              | (E.Lift e1, E.Lift e2)                    => isEqual(e1,e2)              | (E.Lift e1, E.Lift e2)                    => isEqual(e1,e2)
             | (E.Sqrt c1, E.Sqrt c2)                    => isEqual(c1,c2)  
             | (E.Neg e1, E.Neg e2)                      => isEqual(e1,e2)  
             | (E.Add es, E.Add es2)                     => iter(es, es2)  
             | (E.Sub(a,b),E.Sub(c,d))                   => iter([a,b], [c,d])  
             | (E.Prod es, E.Prod es2)                   => iter(es, es2)  
             | (E.Div(a,b), E.Div(c,d))                  => iter([a,b], [c,d])  
             | (E.Partial ix, E.Partial jx)              => isIndex(ix,jx)  
             | (E.Apply(a,b),E.Apply(c,d))               => iter([a,b],[c,d])  
85              | (E.Conv(fid,alpha,tid,ix),E.Conv(fid2,alpha2,tid2,jx)) =>              | (E.Conv(fid,alpha,tid,ix),E.Conv(fid2,alpha2,tid2,jx)) =>
86                      (fid=fid2) andalso (tid=tid2)   andalso  isIndex(alpha,alpha2) andalso  isIndex(ix,jx)                      (fid=fid2) andalso (tid=tid2)   andalso  isIndex(alpha,alpha2) andalso  isIndex(ix,jx)
87                | (E.Partial ix, E.Partial jx)              => isIndex(ix,jx)
88                | (E.Apply(a,b),E.Apply(c,d))               => iter([a,b],[c,d])
89              | (E.Probe(a,b),E.Probe(c,d))               => iter([a,b],[c,d])              | (E.Probe(a,b),E.Probe(c,d))               => iter([a,b],[c,d])
90                | (E.Value i, E.Value j)                    => isIndex([E.V i],[E.V j])
91              | (E.Img(id1,ix1,pos1),E.Img (id2,ix2,pos2))=>              | (E.Img(id1,ix1,pos1),E.Img (id2,ix2,pos2))=>
   
92                    (id1=id2) andalso  iter(pos1, pos2) andalso  isIndex(ix1, ix2)                    (id1=id2) andalso  iter(pos1, pos2) andalso  isIndex(ix1, ix2)
93                | (E.Krn(tid,ix,pos),E.Krn (jid,jx,pos2))   =>
94                    (tid=jid) andalso isKx(ix,jx) andalso isEqual(pos,pos2)
95              | (E.Sum(c,e1), E.Sum(c2,e2))               => isSx(c,c2) andalso isEqual(e1,e2)              | (E.Sum(c,e1), E.Sum(c2,e2))               => isSx(c,c2) andalso isEqual(e1,e2)
96              | (E.Value i, E.Value j)                    => isIndex([E.V i],[E.V j])              | (E.Op1(op1,e1), E.Op1(op2,e2))=> checkop1(op1,op2) andalso isEqual(e1,e2)
97              | (E.Trig(t1,e1) ,E.Trig(t2,e2))=> (case (t1,t2)              | (E.Op2(op1,e1,e2), E.Op2(op2,e3,e4))=> checkop2(op1,op2) andalso isEqual(e1,e3) andalso isEqual(e2,e4)
98                  of (E.Cosine  , E.Cosine )              => isEqual(e1,e2)              | (E.Opn(op1,e1), E.Opn(op2,e2))=> checkopn(op1,op2) andalso iter(e1,e2)
                 | (E.ArcCosine, E.ArcCosine )           => isEqual(e1,e2)  
                 | (E.Sine , E.Sine )                    => isEqual(e1,e2)  
                 | (E.ArcSine , E.ArcSine )              => isEqual(e1,e2)  
                 | (E.Tangent  , E.Tangent )             => isEqual(e1,e2)  
                 | (E.ArcTangent  , E.ArcTangent)        => isEqual(e1,e2)  
                 | _         => false  
                 (*end case*))  
             | (E.Exp e1, E.Exp e2)                      => isEqual(e1,e2)  
99              | _                                         => false              | _                                         => false
100              (*end case*))              (*end case*))
101          end          end
102          val t= isEqual(b1,b2)          in
103          in t              isEqual(b1,b2)
104          end          end
105      (*isEinEqual:EIN*EIN-> bool*)      (*isEinEqual:EIN*EIN-> bool*)
106      fun isEinEqual(e1,e2)=let      fun isEinEqual(e1,e2)=let

Legend:
Removed from v.3447  
changed lines
  Added in v.3448

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