speedup
authorbdemsky <bdemsky>
Tue, 24 Mar 2009 01:35:30 +0000 (01:35 +0000)
committerbdemsky <bdemsky>
Tue, 24 Mar 2009 01:35:30 +0000 (01:35 +0000)
Robust/src/Analysis/OwnershipAnalysis/ReachabilitySet.java
Robust/src/Analysis/OwnershipAnalysis/TokenTupleSet.java

index 49cf1a9f41c9a5e456e305370255ea3ab8728ea7..03c56c080c5dcee3b6fbfa2c628ee8d9be84e689 100644 (file)
@@ -39,7 +39,7 @@ public class ReachabilitySet extends Canonical {
 
 
   public ReachabilitySet makeCanonical() {
-    return (ReachabilitySet) Canonical.makeCanonical(this);
+    return (ReachabilitySet) ReachabilitySet.makeCanonical(this);
   }
 
   public Iterator<TokenTupleSet> iterator() {
@@ -119,43 +119,63 @@ public class ReachabilitySet extends Canonical {
     return false;
   }
 
-  public ReachabilitySet union(ReachabilitySet rsIn) {
-    assert rsIn != null;
+    private static Hashtable<ReachOperation, ReachOperation> unionhash=new Hashtable<ReachOperation, ReachOperation>();
+    private static Hashtable<ReachOperation, ReachOperation> interhash=new Hashtable<ReachOperation, ReachOperation>();
 
-    ReachabilitySet rsOut = new ReachabilitySet(this);
-    rsOut.possibleReachabilities.addAll(rsIn.possibleReachabilities);
-    return rsOut.makeCanonical();
-  }
+    public ReachabilitySet union(TokenTupleSet ttsIn) {
+       assert ttsIn != null;
+       ReachabilitySet rsOut = new ReachabilitySet(this);
+       rsOut.possibleReachabilities.add(ttsIn);
+       return rsOut.makeCanonical();
+    }
 
-  public ReachabilitySet union(TokenTupleSet ttsIn) {
-    assert ttsIn != null;
 
-    ReachabilitySet rsOut = new ReachabilitySet(this);
-    rsOut.possibleReachabilities.add(ttsIn);
-    return rsOut.makeCanonical();
+  public ReachabilitySet union(ReachabilitySet rsIn) {
+      //    assert rsIn != null;
+    
+      //    assert can.containsKey(this);
+      //    assert can.containsKey(rsIn);
+
+    ReachOperation ro=new ReachOperation(this, rsIn);
+    if (unionhash.containsKey(ro))
+       return unionhash.get(ro).c;
+    else {
+       ReachabilitySet rsOut = new ReachabilitySet(this);
+       rsOut.possibleReachabilities.addAll(rsIn.possibleReachabilities);
+       ro.c=rsOut.makeCanonical();
+       unionhash.put(ro, ro);
+       return ro.c;
+    }
   }
 
   public ReachabilitySet intersection(ReachabilitySet rsIn) {
-    assert rsIn != null;
-
-    ReachabilitySet rsOut = new ReachabilitySet();
-
-    Iterator i = this.iterator();
-    while( i.hasNext() ) {
-      TokenTupleSet tts = (TokenTupleSet) i.next();
-      if( rsIn.possibleReachabilities.contains(tts) ) {
-       rsOut.possibleReachabilities.add(tts);
-      }
+      //    assert rsIn != null;
+
+    //    assert can.containsKey(this);
+    //    assert can.containsKey(rsIn);
+
+    ReachOperation ro=new ReachOperation(this, rsIn);
+    if (interhash.containsKey(ro))
+       return interhash.get(ro).c;
+    else {
+       ReachabilitySet rsOut = new ReachabilitySet();
+       Iterator i = this.iterator();
+       while( i.hasNext() ) {
+           TokenTupleSet tts = (TokenTupleSet) i.next();
+           if( rsIn.possibleReachabilities.contains(tts) ) {
+               rsOut.possibleReachabilities.add(tts);
+           }
+       }
+       ro.c=rsOut.makeCanonical();
+       interhash.put(ro,ro);
+       return ro.c;
     }
-
-    return rsOut.makeCanonical();
   }
 
 
   public ReachabilitySet add(TokenTupleSet tts) {
     assert tts != null;
-    ReachabilitySet rsOut = new ReachabilitySet(tts);
-    return rsOut.union(this);
+    return union(tts);
   }
 
   public ReachabilitySet remove(TokenTupleSet tts) {
@@ -452,6 +472,22 @@ public class ReachabilitySet extends Canonical {
     return s;
   }
 
+    private static Hashtable <Canonical, Canonical> can=new Hashtable<Canonical, Canonical>();
+
+    private static int canonicalcount=0;
+
+    int canonicalvalue;
+
+  public static Canonical makeCanonical(Canonical c) {
+      if (can.containsKey(c)) {
+         return can.get(c);
+      } else {
+         ((ReachabilitySet)c).canonicalvalue=canonicalcount++;
+         can.put(c,c);
+         return c;
+      }
+  }
+
   public String toString() {
     String s = "[";
 
@@ -467,3 +503,23 @@ public class ReachabilitySet extends Canonical {
     return s;
   }
 }
+
+
+class ReachOperation {
+    ReachabilitySet a;
+    ReachabilitySet b;
+    ReachabilitySet c;
+
+    ReachOperation(ReachabilitySet a, ReachabilitySet b) {
+       this.a=a;
+       this.b=b;
+    }
+    public int hashCode() {
+       return a.canonicalvalue^(b.canonicalvalue<<1);
+    }
+    public boolean equals(Object o) {
+       ReachOperation ro=(ReachOperation)o;
+       return ro.a.canonicalvalue==a.canonicalvalue&&
+           ro.b.canonicalvalue==b.canonicalvalue;
+    }
+}
\ No newline at end of file
index 13fa65ead90ae8db8f87f15e7d533bf037ecb12d..3451c8e8737da3a928e9adb93df0cce97047a698 100644 (file)
@@ -159,8 +159,8 @@ public class TokenTupleSet extends Canonical {
     return tokenTuples.equals(tts.tokenTuples);
   }
 
-    boolean hashcodecomputed;
-    int ourhashcode;
+    boolean hashcodecomputed=false;
+    int ourhashcode=0;
 
 
   public int hashCode() {
@@ -168,6 +168,7 @@ public class TokenTupleSet extends Canonical {
          return ourhashcode;
       else {
          ourhashcode=tokenTuples.hashCode();
+         hashcodecomputed=true;
          return ourhashcode;
       }
   }