a bug fix...
[IRC.git] / Robust / src / Util / Lattice.java
index 0ce2cee1ccf2bd670df19243f184d6386ca45c14..0418d237b3d7645a3fbf0582fe4d18350cb58098 100644 (file)
@@ -3,6 +3,7 @@ package Util;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Set;
 
 public class Lattice<T> {
@@ -19,6 +20,7 @@ public class Lattice<T> {
     this.bottom = bottom;
 
     table.put(top, new HashSet<T>());
+    table.put(bottom, new HashSet<T>());
 
   }
 
@@ -34,11 +36,45 @@ public class Lattice<T> {
     return table.keySet();
   }
 
+  public Map<T, Set<T>> getTable() {
+    return table;
+  }
+
+  public void setTable(Map<T, Set<T>> in) {
+    Set<T> keySet = in.keySet();
+    for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
+      T key = (T) iterator.next();
+      Set<T> setIn = in.get(key);
+      Set<T> newSet = new HashSet<T>();
+      newSet.addAll(setIn);
+      table.put(key, newSet);
+    }
+  }
+
+  public boolean put(T key) {
+    if (table.containsKey(key)) {
+      return false;
+    } else {
+      // new key, need to be connected with top/bottom
+      size++;
+      table.get(top).add(key);
+      Set<T> neightborSet = new HashSet<T>();
+      neightborSet.add(bottom);
+      table.put(key, neightborSet);
+      return true;
+    }
+  }
+
   public boolean put(T key, T value) {
+
+    if (isComparable(key, value) && isGreaterThan(key, value)) {
+      // this relation already exists
+      return false;
+    }
+
     Set<T> s;
 
     Set<T> topNeighbor = table.get(top);
-
     if (table.containsKey(key)) {
       s = table.get(key);
     } else {
@@ -52,17 +88,21 @@ public class Lattice<T> {
       size++;
       s.add(value);
 
-      if (!table.containsKey(value)) {
-       Set<T> lowerNeighbor = new HashSet<T>();
-       lowerNeighbor.add(bottom);
-       table.put(value, lowerNeighbor);
+      if ((!table.containsKey(value)) && (!value.equals(bottom))) {
+        Set<T> lowerNeighbor = new HashSet<T>();
+        lowerNeighbor.add(bottom);
+        table.put(value, lowerNeighbor);
       }
 
       // if value is already connected with top, it is no longer to be
-      topNeighbor.remove(value);
+      if (!key.equals(top)) {
+        topNeighbor.remove(value);
+      }
 
       // if key is already connected with bottom,, it is no longer to be
-      table.get(key).remove(getBottomItem());
+      if (!value.equals(getBottomItem())) {
+        table.get(key).remove(getBottomItem());
+      }
 
       return true;
     } else
@@ -84,18 +124,18 @@ public class Lattice<T> {
     do {
       oldReachableSize = reachableSet.size();
       Set<T> nextLevelNeighbors = new HashSet<T>();
-      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext(); ) {
-       T element = iterator.next();
-       Set<T> neighbors = get(element);
-       if (neighbors != null) {
-         nextLevelNeighbors.addAll(neighbors);
-         reachableSet.addAll(neighbors);
-       }
-
-       if (reachableSet.contains(key)) {
-         // found cycle
-         return true;
-       }
+      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
+        T element = iterator.next();
+        Set<T> neighbors = get(element);
+        if (neighbors != null) {
+          nextLevelNeighbors.addAll(neighbors);
+          reachableSet.addAll(neighbors);
+        }
+
+        if (reachableSet.contains(key)) {
+          // found cycle
+          return true;
+        }
       }
       neighborSet = nextLevelNeighbors;
     } while (oldReachableSize != reachableSet.size());
@@ -111,11 +151,43 @@ public class Lattice<T> {
     return table.containsKey(o);
   }
 
+  public boolean isComparable(T a, T b) {
+
+    Set<T> neighborSet = get(a);
+
+    if (a.equals(b)) {
+      return true;
+    } else if (neighborSet == null) {
+      return false;
+    } else if (neighborSet.contains(b)) {
+      return true;
+    } else {
+      boolean reachable = false;
+      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
+        T neighbor = iterator.next();
+        reachable = reachable || isComparable(neighbor, b);
+      }
+      return reachable;
+    }
+
+  }
+
   public boolean isGreaterThan(T a, T b) {
 
+    Set<T> visited = new HashSet<T>();
+    return isGreaterThan(a, b, visited);
+
+  }
+
+  public boolean isGreaterThan(T a, T b, Set<T> visited) {
+
+    if (a.equals(b)) {
+      return false;
+    }
+
     if (a.equals(top)) {
       if (b.equals(top)) {
-       return false;
+        return false;
       }
       return true;
     }
@@ -137,9 +209,12 @@ public class Lattice<T> {
       return true;
     } else {
       boolean reachable = false;
-      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext(); ) {
-       T neighbor = iterator.next();
-       reachable = reachable || isGreaterThan(neighbor, b);
+      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
+        T neighbor = iterator.next();
+        if (!visited.contains(neighbor)) {
+          visited.add(neighbor);
+          reachable = reachable || isGreaterThan(neighbor, b, visited);
+        }
       }
       return reachable;
     }
@@ -150,7 +225,7 @@ public class Lattice<T> {
     Set<T> lowerSet = new HashSet<T>();
 
     // get lower set of input locations
-    for (Iterator<T> iterator = inputSet.iterator(); iterator.hasNext(); ) {
+    for (Iterator<T> iterator = inputSet.iterator(); iterator.hasNext();) {
       T element = iterator.next();
       lowerSet.addAll(getLowerSet(element, new HashSet<T>()));
       lowerSet.add(element);
@@ -158,36 +233,36 @@ public class Lattice<T> {
 
     // an element of lower bound should be lower than every input set
     Set<T> toberemoved = new HashSet<T>();
-    for (Iterator<T> inputIterator = inputSet.iterator(); inputIterator.hasNext(); ) {
+    for (Iterator<T> inputIterator = inputSet.iterator(); inputIterator.hasNext();) {
       T inputElement = inputIterator.next();
 
-      for (Iterator iterator = lowerSet.iterator(); iterator.hasNext(); ) {
-       T lowerElement = (T) iterator.next();
-       if (!inputElement.equals(lowerElement)) {
-         if (!isGreaterThan(inputElement, lowerElement)) {
-           toberemoved.add(lowerElement);
-         }
-       }
+      for (Iterator iterator = lowerSet.iterator(); iterator.hasNext();) {
+        T lowerElement = (T) iterator.next();
+        if (!inputElement.equals(lowerElement)) {
+          if (!isGreaterThan(inputElement, lowerElement)) {
+            toberemoved.add(lowerElement);
+          }
+        }
       }
     }
     lowerSet.removeAll(toberemoved);
 
     // calculate the greatest element of lower set
     // find an element A, where every lower bound B of lowerSet, B<A
-    for (Iterator<T> iterator = lowerSet.iterator(); iterator.hasNext(); ) {
+    for (Iterator<T> iterator = lowerSet.iterator(); iterator.hasNext();) {
       T lowerElement = iterator.next();
       boolean isGreaterThanAll = true;
-      for (Iterator<T> iterator2 = lowerSet.iterator(); iterator2.hasNext(); ) {
-       T e = iterator2.next();
-       if (!lowerElement.equals(e)) {
-         if (!isGreaterThan(lowerElement, e)) {
-           isGreaterThanAll = false;
-           break;
-         }
-       }
+      for (Iterator<T> iterator2 = lowerSet.iterator(); iterator2.hasNext();) {
+        T e = iterator2.next();
+        if (!lowerElement.equals(e)) {
+          if (!isGreaterThan(lowerElement, e)) {
+            isGreaterThanAll = false;
+            break;
+          }
+        }
       }
       if (isGreaterThanAll) {
-       return lowerElement;
+        return lowerElement;
       }
     }
     return null;
@@ -198,12 +273,39 @@ public class Lattice<T> {
     Set<T> neighborSet = get(element);
     if (neighborSet != null) {
       lowerSet.addAll(neighborSet);
-      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext(); ) {
-       T neighbor = iterator.next();
-       lowerSet = getLowerSet(neighbor, lowerSet);
+      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
+        T neighbor = iterator.next();
+        lowerSet = getLowerSet(neighbor, lowerSet);
       }
     }
     return lowerSet;
   }
 
+  public Set<Pair<T, T>> getOrderingPairSet() {
+    // return the set of pairs in the lattice
+
+    Set<Pair<T, T>> set = new HashSet<Pair<T, T>>();
+
+    Set<T> visited = new HashSet<T>();
+    Set<T> needtovisit = new HashSet<T>();
+    needtovisit.add(top);
+
+    while (!needtovisit.isEmpty()) {
+      T key = needtovisit.iterator().next();
+      Set<T> lowerSet = table.get(key);
+      if (lowerSet != null) {
+        for (Iterator iterator = lowerSet.iterator(); iterator.hasNext();) {
+          T lowerItem = (T) iterator.next();
+          set.add(new Pair(key, lowerItem));
+          if (!visited.contains(key)) {
+            needtovisit.add(lowerItem);
+          }
+        }
+      }
+      visited.add(key);
+      needtovisit.remove(key);
+    }
+    return set;
+  }
+
 }