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 3165, Sun Mar 29 19:06:39 2015 UTC revision 3166, Sun Mar 29 20:00:49 2015 UTC
# Line 8  Line 8 
8      structure P=Printer      structure P=Printer
9      in      in
10    
11      (*isIndex: mu list *mu list -> int *)      val testing = 0
12      fun isIndex([],[])=0      fun testp e=(case testing
13        | isIndex(i::ix,j::jx)=if(i=j) then isIndex(ix, jx) else 1          of 1 => (print(String.concat e);1)
14        | isIndex _ = 1          | _ => 1
15            (*end case*))
16    
17        fun boolToString t=(case t
18            of true => "true"
19            | _     => "false"
20            (*end case*))
21    
22    
23      (*isEqual:ein_exp*ein_exp->int *)      (*isEqual:ein_exp*ein_exp->int *)
24      fun isEqual2(e1,e2)=let      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          fun isEqual(e1,e2)=let
35          fun iter([],[])= 0          fun iter([],[])= true
36            | iter(a::ax,b::bx)=(case isEqual(a,b)            | iter(a::ax,b::bx)=(case isEqual(a,b)
37                  of 0 => iter(ax,bx)                  of true => iter(ax,bx)
38                  | _ =>1                  | false => false
39                  (*end case*))                  (*end case*))
40          in (case (e1,e2)          in (case (e1,e2)
41              of (E.Field(id,ix),E.Field(id2,ix2))        =>              of (E.Field(id,ix),E.Field(id2,ix2))        => (id=id2) andalso isIndex(ix, ix2)
42                  if(id=id2)              | (E.Tensor(id,ix),E.Tensor(id2,ix2))       => (id=id2) andalso isIndex(ix, ix2)
43                  then isIndex(ix, ix2)              | (E.Const c1,E.Const c2)                   => (c1=c2)
44                  else  1              | (E.Krn(tid,ix,pos),E.Krn (jid,jx,pos2))   =>
45              | (E.Tensor(id,ix),E.Tensor(id2,ix2))       => if(id=id2) then isIndex(ix, ix2) else 1                      (tid=jid) andalso isIndex(ix,jx) andalso isEqual(pos,pos2)
             | (E.Const c1,E.Const c2)                   => if (c1=c2) then 0 else 1  
             | (E.Krn(tid,ix,pos),E.Krn (jid,jx,pos2))   => if(tid=jid)  
                                                             then isIndex(ix,jx) + isEqual(pos,pos2)  
                                                             else 1  
46              | (E.Delta(ix,jx), E.Delta(ix2,jx2))        => isIndex([ix, jx],[ix2, jx2])              | (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])              | (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])              | (E.Eps2(i,j),E.Eps2(i2,j2))               => isIndex([i,j], [i2, j2])
# Line 42  Line 54 
54              | (E.Prod es, E.Prod es2)                   => iter(es, es2)              | (E.Prod es, E.Prod es2)                   => iter(es, es2)
55              | (E.Div(a,b), E.Div(c,d))                  => iter([a,b], [c,d])              | (E.Div(a,b), E.Div(c,d))                  => iter([a,b], [c,d])
56              | (E.Partial ix, E.Partial jx)              => isIndex(ix,jx)              | (E.Partial ix, E.Partial jx)              => isIndex(ix,jx)
57              | (E.Apply(a,b),E.Apply(c,d))               => isEqual(a,c)+isEqual(b,d)              | (E.Apply(a,b),E.Apply(c,d))               => iter([a,b],[c,d])
58              | (E.Conv(fid,alpha,tid,ix),E.Conv(fid2,alpha2,tid2,jx)) =>              | (E.Conv(fid,alpha,tid,ix),E.Conv(fid2,alpha2,tid2,jx)) =>
59                  if(fid=fid2) andalso (tid=tid2)                      (fid=fid2) andalso (tid=tid2)   andalso  isIndex(alpha,alpha2) andalso  isIndex(ix,jx)
60                  then isIndex(alpha,alpha2)+ isIndex(ix,jx)              | (E.Probe(a,b),E.Probe(c,d))               => iter([a,b],[c,d])
61                  else 0              | (E.Img(id1,ix1,pos1),E.Img (id2,ix2,pos2))=>
62              | (E.Probe(a,b),E.Probe(c,d))               => isEqual(a,c)+isEqual(b,d)                    (id1=id2) andalso  iter(pos1, pos2) andalso  isIndex(ix1, ix2)
63              | (E.Img(id1,ix1,pos1),E.Img (id2,ix2,pos2))=> if(id1=id2) then iter(pos1, pos2)+ isIndex(ix1, ix2) else 1              | (E.Sum(c,e1), E.Sum(c2,e2))               => isSx(c,c2) andalso isEqual(e1,e2)
             | (E.Sum(c,e1), E.Sum(c2,e2))               => isEqual(e1,e2)  
64              | (E.Value i, E.Value j)=> isIndex([i],[j])              | (E.Value i, E.Value j)=> isIndex([i],[j])
 (*          | (E.PowInt (e1,n1), E.PowInt (e2,n2))      => if(n1=n2) then isEqual(e1,e2) else 1  
             | (E.PowReal(e1,n1), E.PowReal (e2,n2))     =>  1  
 *)  
65              | (E.Cosine e1 , E.Cosine e2)               => isEqual(e1,e2)              | (E.Cosine e1 , E.Cosine e2)               => isEqual(e1,e2)
66              | (E.ArcCosine e1, E.ArcCosine e2)          => isEqual(e1,e2)              | (E.ArcCosine e1, E.ArcCosine e2)          => isEqual(e1,e2)
67              | (E.Sine e1 , E.Sine e2)                   => isEqual(e1,e2)              | (E.Sine e1 , E.Sine e2)                   => isEqual(e1,e2)
68              | (E.ArcSine e1 , E.ArcSine e2)                   => isEqual(e1,e2)              | (E.ArcSine e1 , E.ArcSine e2)                   => isEqual(e1,e2)
69              | _                                         =>1              | _                                         => false
70              (*end case*))              (*end case*))
71          end          end
72          in isEqual(e1,e2)          in isEqual(e1,e2)
73          end          end
74      (*isEinEqual:EIN*EIN-> bool*)      (*isEinEqual:EIN*EIN-> bool*)
75      fun isEinEqual(e1,e2)=let      fun isEinEqual(e1,e2)=if((Ein.index e1)=(Ein.index e2)) then let
   
   
76          val body1=E.body e1          val body1=E.body e1
77          val body2=E.body e2          val body2=E.body e2
78          (*val _=print(String.concat["\n** In ein equal", P.printbody body1,"\n\t=?=", P.printbody body2])*)              val t= isBodyEq(body1,body2)
79          val n=isEqual2(body1,body2)              val _ =testp["\n** In ein equal: ",boolToString t,": " ,P.printbody body1,"\n\t=?=", P.printbody body2]
   
80          in          in
81              if(n=0) then true                  t
             else  false  
         end  
   
   
     (*isEqual:ein_exp*ein_exp->int *)  
     fun isEqual3(e1,e2,args)=let  
     fun isEqual(e1,e2)=let  
     fun iter([],[])= 0  
     | iter(a::ax,b::bx)=(case isEqual(a,b)  
     of 0 => iter(ax,bx)  
     | _ =>1  
     (*end case*))  
     in (case (e1,e2)  
     of (E.Field(id,ix),E.Field(id2,ix2))        =>let  
         val a=List.nth(args,id)  
            val b=List.nth(args,id2)  
             val _ =print"bunndy"  
         in if(id=id2)  
             then isIndex(ix, ix2)  
             else  (*)if (a=b) then 0 else *)1  
82          end          end
83      | (E.Tensor(id,ix),E.Tensor(id2,ix2))       => if(id=id2) then isIndex(ix, ix2) else 1          else false
     | (E.Const c1,E.Const c2)                   => if (c1=c2) then 0 else 1  
     | (E.Krn(tid,ix,pos),E.Krn (jid,jx,pos2))   => if(tid=jid)  
     then isIndex(ix,jx) + isEqual(pos,pos2)  
     else 1  
     | (E.Delta(ix,jx), E.Delta(ix2,jx2))        => isIndex([ix, jx],[ix2, jx2])  
     | (E.Epsilon(i,j,k),E.Epsilon(i2,j2,k2))    => isIndex([i,j,k], [i2, j2, k2])  
     | (E.Eps2(i,j),E.Eps2(i2,j2))               => isIndex([i,j], [i2, j2])  
     | (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))               => isEqual(a,c)+isEqual(b,d)  
     | (E.Conv(fid,alpha,tid,ix),E.Conv(fid2,alpha2,tid2,jx)) =>let  
             val a=List.nth(args,tid)  
             val b=List.nth(args,tid2)  
             in    if(fid=fid2) andalso (tid=tid2)  
             then isIndex(alpha,alpha2)+ isIndex(ix,jx)  
             else 0 end  
     | (E.Probe(a,b),E.Probe(c,d))               => isEqual(a,c)+isEqual(b,d)  
     | (E.Img(id1,ix1,pos1),E.Img (id2,ix2,pos2))=> iter(pos1, pos2)  
     | (E.Sum(c,e1), E.Sum(c2,e2))               => isEqual(e1,e2)  
     | (E.Value i, E.Value j)=> isIndex([i],[j])  
     (*          | (E.PowInt (e1,n1), E.PowInt (e2,n2))      => if(n1=n2) then isEqual(e1,e2) else 1  
     | (E.PowReal(e1,n1), E.PowReal (e2,n2))     =>  1  
     *)  
     | (E.Cosine e1 , E.Cosine e2)               => isEqual(e1,e2)  
     | (E.ArcCosine e1, E.ArcCosine e2)          => isEqual(e1,e2)  
     | (E.Sine e1 , E.Sine e2)                   => isEqual(e1,e2)  
     | (E.ArcSine e1 , E.ArcSine e2)                   => isEqual(e1,e2)  
     | _                                         =>1  
     (*end case*))  
     end  
     in isEqual(e1,e2)  
     end  
   
84    
85  end; (* local *)  end; (* local *)
86    

Legend:
Removed from v.3165  
changed lines
  Added in v.3166

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