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 2844, Tue Dec 9 18:05:29 2014 UTC revision 2845, Fri Dec 12 06:46:23 2014 UTC
# Line 1  Line 1 
1  (*Test of two EIN expressions are equal*)  (*Test to determine if two EIN expressions are equal
2    * Very trivial approach
3    *)
4  structure  EqualEin = struct  structure  EqualEin = struct
5    
6      local      local
# Line 6  Line 8 
8      structure P=Printer      structure P=Printer
9      in      in
10    
11        (*isIndex: mu list *mu list -> int *)
12  fun isIndex([],[])=0  fun isIndex([],[])=0
13      | isIndex(i::ix,j::jx)=if(i=j) then isIndex(ix, jx) else 1      | isIndex(i::ix,j::jx)=if(i=j) then isIndex(ix, jx) else 1
14      | isIndex _ = 1      | isIndex _ = 1
15    
16  fun isEqual(e1,e2)=(case (e1,e2)      (*isEqual:ein_exp*ein_exp->int *)
17        fun isEqual(e1,e2)=let
18            fun iter([],[])= 0
19              | iter(a::ax,b::bx)=(case isEqual(a,b)
20                    of 0 => iter(ax,bx)
21                    | _ =>1
22                    (*end case*))
23            in (case (e1,e2)
24      of (E.Field(id,ix),E.Field(id2,ix2))        => if(id=id2) then isIndex(ix, ix2) else 1      of (E.Field(id,ix),E.Field(id2,ix2))        => if(id=id2) then isIndex(ix, ix2) else 1
25      | (E.Tensor(id,ix),E.Tensor(id2,ix2))       => if(id=id2) then isIndex(ix, ix2) else 1      | (E.Tensor(id,ix),E.Tensor(id2,ix2))       => if(id=id2) then isIndex(ix, ix2) else 1
26      | (E.Const c1,E.Const c2)                   => if (c1=c2) then 0 else 1      | (E.Const c1,E.Const c2)                   => if (c1=c2) then 0 else 1
27      | (E.Krn(tid,ix,pos),E.Krn (jid,jx,pos2))   => if(tid=jid) then isIndex(ix,jx)              | (E.Krn(tid,ix,pos),E.Krn (jid,jx,pos2))   => if(tid=jid)
28                                                          + isEqual(pos,pos2)                                                              then isIndex(ix,jx) + isEqual(pos,pos2)
29                                                      else 1                                                      else 1
30      | (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])
31      | (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])
32      | (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])
33      | (E.Lift e1, E.Lift e2)                    => isEqual(e1,e2)      | (E.Lift e1, E.Lift e2)                    => isEqual(e1,e2)
34      | (E.Neg e1, E.Neg e2)                      => isEqual(e1,e2)      | (E.Neg e1, E.Neg e2)                      => isEqual(e1,e2)
35      | (E.Add es, E.Add es2)                     => let              | (E.Add es, E.Add es2)                     => iter(es, es2)
36          fun filter X =(case X              | (E.Sub(a,b),E.Sub(c,d))                   => iter([a,b], [c,d])
37              of ([],[])=> 0              | (E.Prod es, E.Prod es2)                   => iter(es, es2)
38              |(a::ax,b::bx)=>let              | (E.Div(a,b), E.Div(c,d))                  => iter([a,b], [c,d])
                 val v=isEqual(a,b)  
                 in if(v>0) then 1  
                     else filter(ax,bx)  
                 end  
             | _ => 1  
             (*end case*))  
         in filter(es, es2)  
         end  
     | (E.Sub(a,b),E.Sub(c,d))                   => isEqual(a,c)+isEqual(b,d)  
     | (E.Prod es, E.Prod es2)                   => let  
         fun filter X=(case X  
             of ([],[])=> 0  
             | (a::ax,b::bx)=>let  
                 val v=isEqual(a,b)  
                 in if(v>0) then 1  
                     else filter(ax,bx)  
                 end  
             |  _ => 1  
             (*end case*))  
         in filter(es, es2) end  
     | (E.Div(a,b), E.Div(c,d))                  => isEqual(a,c)+isEqual(b,d)  
39      | (E.Partial ix, E.Partial jx)              => isIndex(ix,jx)      | (E.Partial ix, E.Partial jx)              => isIndex(ix,jx)
40      | (E.Apply(a,b),E.Apply(c,d))               => isEqual(a,c)+isEqual(b,d)      | (E.Apply(a,b),E.Apply(c,d))               => isEqual(a,c)+isEqual(b,d)
41      | (E.Conv(fid,alpha,tid,ix),E.Conv(fid2,alpha2,tid2,jx)) =>      | (E.Conv(fid,alpha,tid,ix),E.Conv(fid2,alpha2,tid2,jx)) =>
42          if(fid=fid2) andalso (tid=tid2) then isIndex(alpha,alpha2)+ isIndex(ix,jx)                  if(fid=fid2) andalso (tid=tid2)
43                    then isIndex(alpha,alpha2)+ isIndex(ix,jx)
44          else 0          else 0
45      | (E.Probe(a,b),E.Probe(c,d))               => isEqual(a,c)+isEqual(b,d)      | (E.Probe(a,b),E.Probe(c,d))               => isEqual(a,c)+isEqual(b,d)
46      | (E.Img(id1,ix1,pos1),E.Img (id2,ix2,pos2))=>let              | (E.Img(id1,ix1,pos1),E.Img (id2,ix2,pos2))=> iter(pos1, pos2)
         fun filter X=(case X  
             of ([],[])=>0  
             | (a::ax,b::bx)=> let  
                 val v=isEqual(a,b)  
                 in if(v>0) then 1  
                 else filter(ax,bx)  
                 end  
             |  _ => 1  
             (*end case*))  
         in filter(pos1, pos2) end  
47      | (E.Sum(c,e1), E.Sum(c2,e2))               => isEqual(e1,e2)      | (E.Sum(c,e1), E.Sum(c2,e2))               => isEqual(e1,e2)
48      | (E.Value i, E.Value j)=> isIndex([i],[j])      | (E.Value i, E.Value j)=> isIndex([i],[j])
49      | _                                          =>1      | _                                          =>1
   
50  (*end case*))  (*end case*))
51            end
52        (*isEinEqual:EIN*EIN-> bool*)
53  fun isEinEqual(e1,e2)=let  fun isEinEqual(e1,e2)=let
54      val E.EIN{params, index, body}=e1          val body1=E.body e1
55      val body1=body          val body2=E.body e2
56      val E.EIN{params, index, body}=e2          val n=isEqual(body1,body2)
     val n=isEqual(body1,body)  
57      in      in
58          if(n=0) then (true)              if(n=0) then true
59          else (false)              else  false
60      end      end
61    end; (* local *)    end; (* local *)
62    

Legend:
Removed from v.2844  
changed lines
  Added in v.2845

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