sharedLocSet = new HashSet<T>();
}
+ public void setSharedLocSet(Set<T> in) {
+ sharedLocSet.addAll(in);
+ }
+
public Set<T> getSharedLocSet() {
return sharedLocSet;
}
}
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) {
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);
+ }
+ }
+ }
}