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

SCM Repository

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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3166 - (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 3166 val testing = 0
12 :     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 3166 fun isBodyEq(e1,e2)=let
25 :    
26 :     (*isIndex: mu list *mu list -> int *)
27 :     fun isIndex([],[])=true
28 :     | isIndex(i::ix,j::jx)=if(i=j) then isIndex(ix, jx) else false
29 :     | isIndex _ = false
30 :     fun isSx([],[])=true
31 :     | isSx((i,_,_)::ix,(j,_,_)::jx)=if(i=j) then isIndex(ix, jx) else false
32 :     | isSx _ = false
33 :    
34 :     fun isEqual(e1,e2)=let
35 :     fun iter([],[])= true
36 : cchiw 2845 | iter(a::ax,b::bx)=(case isEqual(a,b)
37 : cchiw 3166 of true => iter(ax,bx)
38 :     | false => false
39 : cchiw 2845 (*end case*))
40 :     in (case (e1,e2)
41 : cchiw 3166 of (E.Field(id,ix),E.Field(id2,ix2)) => (id=id2) andalso isIndex(ix, ix2)
42 :     | (E.Tensor(id,ix),E.Tensor(id2,ix2)) => (id=id2) andalso isIndex(ix, ix2)
43 :     | (E.Const c1,E.Const c2) => (c1=c2)
44 :     | (E.Krn(tid,ix,pos),E.Krn (jid,jx,pos2)) =>
45 :     (tid=jid) andalso isIndex(ix,jx) andalso isEqual(pos,pos2)
46 : cchiw 2845 | (E.Delta(ix,jx), E.Delta(ix2,jx2)) => isIndex([ix, jx],[ix2, jx2])
47 :     | (E.Epsilon(i,j,k),E.Epsilon(i2,j2,k2)) => isIndex([i,j,k], [i2, j2, k2])
48 :     | (E.Eps2(i,j),E.Eps2(i2,j2)) => isIndex([i,j], [i2, j2])
49 :     | (E.Lift e1, E.Lift e2) => isEqual(e1,e2)
50 : cchiw 2903 | (E.Sqrt c1, E.Sqrt c2) => isEqual(c1,c2)
51 : cchiw 2845 | (E.Neg e1, E.Neg e2) => isEqual(e1,e2)
52 :     | (E.Add es, E.Add es2) => iter(es, es2)
53 :     | (E.Sub(a,b),E.Sub(c,d)) => iter([a,b], [c,d])
54 :     | (E.Prod es, E.Prod es2) => iter(es, es2)
55 :     | (E.Div(a,b), E.Div(c,d)) => iter([a,b], [c,d])
56 :     | (E.Partial ix, E.Partial jx) => isIndex(ix,jx)
57 : cchiw 3166 | (E.Apply(a,b),E.Apply(c,d)) => iter([a,b],[c,d])
58 : cchiw 2845 | (E.Conv(fid,alpha,tid,ix),E.Conv(fid2,alpha2,tid2,jx)) =>
59 : cchiw 3166 (fid=fid2) andalso (tid=tid2) andalso isIndex(alpha,alpha2) andalso isIndex(ix,jx)
60 :     | (E.Probe(a,b),E.Probe(c,d)) => iter([a,b],[c,d])
61 :     | (E.Img(id1,ix1,pos1),E.Img (id2,ix2,pos2))=>
62 :     (id1=id2) andalso iter(pos1, pos2) andalso isIndex(ix1, ix2)
63 :     | (E.Sum(c,e1), E.Sum(c2,e2)) => isSx(c,c2) andalso isEqual(e1,e2)
64 :     | (E.Value i, E.Value j) => isIndex([i],[j])
65 : cchiw 3138 | (E.Cosine e1 , E.Cosine e2) => isEqual(e1,e2)
66 :     | (E.ArcCosine e1, E.ArcCosine e2) => isEqual(e1,e2)
67 :     | (E.Sine e1 , E.Sine e2) => isEqual(e1,e2)
68 : cchiw 3166 | (E.ArcSine e1 , E.ArcSine e2) => isEqual(e1,e2)
69 :     | _ => false
70 : cchiw 2605 (*end case*))
71 : cchiw 2870 end
72 :     in isEqual(e1,e2)
73 :     end
74 : cchiw 2845 (*isEinEqual:EIN*EIN-> bool*)
75 : cchiw 3166 fun isEinEqual(e1,e2)=if((Ein.index e1)=(Ein.index e2)) then let
76 :     val body1=E.body e1
77 :     val body2=E.body e2
78 :     val t= isBodyEq(body1,body2)
79 :     val _ =testp["\n** In ein equal: ",boolToString t,": " ,P.printbody body1,"\n\t=?=", P.printbody body2]
80 :     in
81 :     t
82 :     end
83 :     else false
84 : cchiw 2903
85 :     end; (* local *)
86 :    
87 : cchiw 2463 end (* local *)

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