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

SCM Repository

[diderot] Annotation of /branches/ein16/src/compiler/ein/equal.sml
ViewVC logotype

Annotation of /branches/ein16/src/compiler/ein/equal.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3687 - (view) (download)

1 : cchiw 2845 (*Test to determine if two EIN expressions are equal
2 :     * Very trivial approach
3 :     *)
4 : cchiw 2553 structure EqualEin = struct
5 : cchiw 2463
6 :     local
7 :     structure E = Ein
8 : cchiw 2553 structure P=Printer
9 : cchiw 2463 in
10 :    
11 : cchiw 3440 val testing = 0
12 : cchiw 3166 fun testp e=(case testing
13 :     of 1 => (print(String.concat e);1)
14 :     | _ => 1
15 :     (*end case*))
16 :    
17 :     fun boolToString t=(case t
18 :     of true => "true"
19 :     | _ => "false"
20 :     (*end case*))
21 :    
22 :    
23 : cchiw 2845 (*isEqual:ein_exp*ein_exp->int *)
24 : cchiw 3440 fun isBodyEq(b1,b2)=let
25 : cchiw 3687 (* val _ = testp ["\n equal is body",P.printbody b1,"==",P.printbody b2]*)
26 : cchiw 3166 (*isIndex: mu list *mu list -> int *)
27 :     fun isIndex([],[])=true
28 : cchiw 3440 | isIndex((E.V i)::ix,(E.V j)::jx)= if(i=j) then isIndex(ix, jx) else false
29 : cchiw 3472 | isIndex((E.C( i,flagi))::ix,(E.C (j,flagj))::jx)= if(i=j) andalso (flagi=flagj) then isIndex(ix, jx) else false
30 : cchiw 3440 | isIndex _ = false
31 : cchiw 3344
32 : cchiw 3440 fun isKx([],[])=true
33 :     | isKx((E.V i,_)::ix,(E.V j,_)::jx)= if(i=j) then isKx(ix, jx) else false
34 : cchiw 3472 | isKx((E.C (i,true),_)::ix,(E.C (j,true),_)::jx)= if(i=j) then isKx(ix, jx) else false
35 :     | isKx((E.C (i,false),_)::ix,(E.C (j,false),_)::jx)= if(i=j) then isKx(ix, jx) else false
36 : cchiw 3440 | isKx _ = false
37 : cchiw 3344
38 : cchiw 3166 fun isSx([],[])=true
39 : cchiw 3174 | isSx((i,_,_)::ix,(j,_,_)::jx)=if(i=j) then isSx(ix, jx) else false
40 : cchiw 3166 | isSx _ = false
41 :    
42 :     fun isEqual(e1,e2)=let
43 : cchiw 3440 fun iter([],[])= true
44 :     | iter(a::ax,b::bx)=(case isEqual(a,b)
45 :     of true => iter(ax,bx)
46 :     | false => false
47 :     (*end case*))
48 :     | iter _ =false
49 : cchiw 3441 fun checkop1(e1,e2)=(case (e1,e2)
50 :     of (E.Sqrt,E.Sqrt) => true
51 :     | (E.Neg, E.Neg ) => true
52 :     | (E.Exp, E.Exp ) => true
53 :     | (E.Cosine , E.Cosine ) => true
54 :     | (E.ArcCosine, E.ArcCosine ) => true
55 :     | (E.Sine , E.Sine ) => true
56 :     | (E.ArcSine , E.ArcSine ) => true
57 :     | (E.Tangent , E.Tangent ) => true
58 :     | (E.ArcTangent , E.ArcTangent) => true
59 :     | _ => false
60 :     (*end case*))
61 :     fun checkop2(e1,e2)=(case (e1,e2)
62 :     of (E.Div,E.Div) => true
63 :     | (E.Sub, E.Sub ) => true
64 :     | _ => false
65 :     (*end case*))
66 :     fun checkopn(e1,e2)=(case (e1,e2)
67 :     of (E.Add,E.Add) => true
68 :     | (E.Prod,E.Prod) => true
69 :     | _ => false
70 :     (*end case*))
71 :     fun base(b1,b2)= (case (b1, b2)
72 :     of (E.Const c1,E.Const c2) => (c1=c2)
73 :     (*end case*))
74 :     fun greek(g1, g2) =(case (g1,g2)
75 :     of (E.Delta(ix,jx), E.Delta(ix2,jx2)) => isIndex([ix, jx],[ix2, jx2])
76 : cchiw 3344 | (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])
77 :     | (E.Eps2(i,j),E.Eps2(i2,j2)) => isIndex([E.V i,E.V j], [E.V i2, E.V j2])
78 : cchiw 3441 | _ => false
79 :     (*end case*))
80 :     in (case (e1,e2)
81 :     of (E.B b1,E.B b2)=> base(b1, b2)
82 :     | (E.Tensor(id,ix),E.Tensor(id2,ix2)) => (id=id2) andalso isIndex(ix, ix2)
83 :     | (E.G g1, E.G g2) => greek(g1,g2)
84 :     | (E.Field(id,ix),E.Field(id2,ix2)) => (id=id2) andalso isIndex(ix, ix2)
85 : cchiw 2845 | (E.Lift e1, E.Lift e2) => isEqual(e1,e2)
86 : cchiw 3441 | (E.Conv(fid,alpha,tid,ix),E.Conv(fid2,alpha2,tid2,jx)) =>
87 :     (fid=fid2) andalso (tid=tid2) andalso isIndex(alpha,alpha2) andalso isIndex(ix,jx)
88 : cchiw 2845 | (E.Partial ix, E.Partial jx) => isIndex(ix,jx)
89 : cchiw 3440 | (E.Apply(a,b),E.Apply(c,d)) => iter([a,b],[c,d])
90 : cchiw 3441 | (E.Probe(a,b),E.Probe(c,d)) => iter([a,b],[c,d])
91 :     | (E.Value i, E.Value j) => isIndex([E.V i],[E.V j])
92 : cchiw 3166 | (E.Img(id1,ix1,pos1),E.Img (id2,ix2,pos2))=>
93 : cchiw 3441 (id1=id2) andalso iter(pos1, pos2) andalso isIndex(ix1, ix2)
94 :     | (E.Krn(tid,ix,pos),E.Krn (jid,jx,pos2)) =>
95 :     (tid=jid) andalso isKx(ix,jx) andalso isEqual(pos,pos2)
96 : cchiw 3166 | (E.Sum(c,e1), E.Sum(c2,e2)) => isSx(c,c2) andalso isEqual(e1,e2)
97 : cchiw 3441 | (E.Op1(op1,e1), E.Op1(op2,e2))=> checkop1(op1,op2) andalso isEqual(e1,e2)
98 :     | (E.Op2(op1,e1,e2), E.Op2(op2,e3,e4))=> checkop2(op1,op2) andalso isEqual(e1,e3) andalso isEqual(e2,e4)
99 :     | (E.Opn(op1,e1), E.Opn(op2,e2))=> checkopn(op1,op2) andalso iter(e1,e2)
100 : cchiw 3541 | (E.BuildPos(e1,e2),E.BuildPos(e3,e4)) => (e1=e3) andalso isEqual(e2,e4)
101 :     | (E.EvalKrn del1, E.EvalKrn del2) => (del1=del2)
102 :     | (E.Holder n1, E.Holder n2) => (n1=n2)
103 : cchiw 3166 | _ => false
104 : cchiw 2605 (*end case*))
105 : cchiw 2870 end
106 : cchiw 3441 in
107 :     isEqual(b1,b2)
108 : cchiw 2870 end
109 : cchiw 2845 (*isEinEqual:EIN*EIN-> bool*)
110 : cchiw 3174 fun isEinEqual(e1,e2)=let
111 :    
112 :     val b=if(((Ein.index e1)=(Ein.index e2)) andalso ((Ein.params e1)=(Ein.params e2)))
113 :     then let
114 : cchiw 3166 val body1=E.body e1
115 :     val body2=E.body e2
116 :     val t= isBodyEq(body1,body2)
117 :     in
118 :     t
119 :     end
120 :     else false
121 : cchiw 3174 in b end
122 : cchiw 2903
123 : cchiw 3174
124 :    
125 : cchiw 2903 end; (* local *)
126 :    
127 : cchiw 2463 end (* local *)

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