all fixed...
[IRC.git] / Robust / src / Analysis / SSJava / SSJavaLattice.java
index 4343f2de3576345407918939954d5dd4da8a08f9..406b72eca8c2671f0f1e326d4c72039819976848 100644 (file)
@@ -18,6 +18,10 @@ public class SSJavaLattice<T> extends Lattice<T> {
     sharedLocSet = new HashSet<T>();
   }
 
+  public void setSharedLocSet(Set<T> in) {
+    sharedLocSet.addAll(in);
+  }
+
   public Set<T> getSharedLocSet() {
     return sharedLocSet;
   }
@@ -241,43 +245,30 @@ public class SSJavaLattice<T> extends Lattice<T> {
   }
 
   public void removeRedundantEdges() {
-    boolean isUpdated;
-    do {
-      isUpdated = recurRemoveRedundant();
-    } while (isUpdated);
-  }
 
-  public boolean recurRemoveRedundant() {
-
-    Set<T> keySet = getKeySet();
-    Set<T> visited = new HashSet<T>();
+    Set<T> keySet = getTable().keySet();
 
     for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
-      T key = (T) iterator.next();
-      Set<T> connectedSet = getTable().get(key);
-      if (connectedSet != null) {
-        Set<T> toberemovedSet = new HashSet<T>();
-        for (Iterator iterator2 = connectedSet.iterator(); iterator2.hasNext();) {
-          T dst = (T) iterator2.next();
-          Set<T> otherNeighborSet = new HashSet<T>();
-          otherNeighborSet.addAll(connectedSet);
-          otherNeighborSet.remove(dst);
-          for (Iterator iterator3 = otherNeighborSet.iterator(); iterator3.hasNext();) {
-            T neighbor = (T) iterator3.next();
-            if (isReachable(neighbor, visited, dst)) {
-              toberemovedSet.add(dst);
-            }
+      T src = (T) iterator.next();
+      Set<T> connectedSet = getTable().get(src);
+      Set<T> toberemovedSet = new HashSet<T>();
+      for (Iterator iterator2 = connectedSet.iterator(); iterator2.hasNext();) {
+        T dst = (T) iterator2.next();
+        Set<T> otherNeighborSet = new HashSet<T>();
+        otherNeighborSet.addAll(connectedSet);
+        otherNeighborSet.remove(dst);
+        for (Iterator iterator3 = otherNeighborSet.iterator(); iterator3.hasNext();) {
+          T neighbor = (T) iterator3.next();
+          if (isReachable(neighbor, new HashSet<T>(), dst)) {
+            toberemovedSet.add(dst);
           }
         }
-        if (toberemovedSet.size() > 0) {
-          connectedSet.removeAll(toberemovedSet);
-          return true;
-        }
+      }
+      if (toberemovedSet.size() > 0) {
+        connectedSet.removeAll(toberemovedSet);
       }
     }
 
-    return false;
-
   }
 
   private boolean isReachable(T neighbor, Set<T> visited, T dst) {
@@ -319,4 +310,73 @@ public class SSJavaLattice<T> extends Lattice<T> {
 
     return map;
   }
+
+  public void insertNewLocationBetween(T higher, T lower, T newLoc) {
+    Set<T> connectedSet = get(higher);
+    connectedSet.remove(lower);
+    connectedSet.add(newLoc);
+
+    put(newLoc, lower);
+  }
+
+  public void insertNewLocationBetween(T higher, Set<T> lowerSet, T newLoc) {
+    // System.out.println("---insert new location=" + newLoc + "   between=" + higher + "<->"
+    // + lowerSet);
+    Set<T> connectedSet = get(higher);
+    if (connectedSet == null) {
+      connectedSet = new HashSet<T>();
+    } else {
+      connectedSet.removeAll(lowerSet);
+    }
+    connectedSet.add(newLoc);
+
+    for (Iterator iterator = lowerSet.iterator(); iterator.hasNext();) {
+      T lower = (T) iterator.next();
+      put(newLoc, lower);
+    }
+  }
+
+  public SSJavaLattice<T> clone() {
+
+    SSJavaLattice<T> clone = new SSJavaLattice<T>(getTopItem(), getBottomItem());
+    clone.setTable(getTable());
+    clone.setSharedLocSet(getSharedLocSet());
+    return clone;
+  }
+
+  public int countPaths() {
+    T bottom = getBottomItem();
+
+    Map<T, Set<T>> map = getIncomingElementMap();
+    Map<T, Integer> countMap = new HashMap<T, Integer>();
+
+    Set<T> visited = new HashSet<T>();
+    visited.add(bottom);
+
+    countMap.put(bottom, new Integer(1));
+    recur_countPaths(bottom, map, countMap, visited);
+    if (countMap.containsKey(getTopItem())) {
+      return countMap.get(getTopItem());
+    }
+    return 0;
+  }
+
+  private void recur_countPaths(T cur, Map<T, Set<T>> map, Map<T, Integer> countMap, Set<T> visited) {
+    int curCount = countMap.get(cur).intValue();
+    Set<T> inSet = map.get(cur);
+
+    for (Iterator iterator = inSet.iterator(); iterator.hasNext();) {
+      T in = (T) iterator.next();
+      int inCount = 0;
+      if (countMap.containsKey(in)) {
+        inCount = countMap.get(in).intValue();
+      }
+      inCount += curCount;
+      countMap.put(in, inCount);
+      if (visited.containsAll(get(in))) {
+        visited.add(in);
+        recur_countPaths(in, map, countMap, visited);
+      }
+    }
+  }
 }