3 import java.util.HashSet;
4 import java.util.Hashtable;
5 import java.util.Iterator;
8 public class Lattice<T> {
9 private Hashtable<T, Set<T>> table;
13 table = new Hashtable<T, Set<T>>();
16 public boolean put(T key, T value) {
18 if (table.containsKey(key)) {
24 if (value!=null && !s.contains(value)) {
32 public boolean isIntroducingCycle(T key) {
34 Set<T> reachableSet = new HashSet<T>();
35 Set<T> neighborSet = get(key);
37 if (neighborSet == null) {
40 reachableSet.addAll(neighborSet);
45 oldReachableSize = reachableSet.size();
46 Set<T> nextLevelNeighbors = new HashSet<T>();
47 for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
48 T element = iterator.next();
49 Set<T> neighbors = get(element);
50 if (neighbors != null) {
51 nextLevelNeighbors.addAll(neighbors);
52 reachableSet.addAll(neighbors);
55 if (reachableSet.contains(key)) {
60 neighborSet = nextLevelNeighbors;
61 } while (oldReachableSize != reachableSet.size());
66 public Set<T> get(T key) {
67 return table.get(key);
70 public boolean containsKey(T o) {
71 return table.containsKey(o);
74 public boolean isGreaterThan(T a, T b) {
76 Set<T> neighborSet = get(a);
78 if (neighborSet == null) {
80 } else if (neighborSet.contains(b)) {
83 boolean reachable = false;
84 for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
85 T neighbor = iterator.next();
86 reachable = reachable || isGreaterThan(neighbor, b);
92 public T getGLB(Set<T> inputSet) {
94 Set<T> lowerSet = new HashSet<T>();
96 // get lower set of input locations
97 for (Iterator<T> iterator = inputSet.iterator(); iterator.hasNext();) {
98 T element = iterator.next();
99 lowerSet.addAll(getLowerSet(element, new HashSet<T>()));
102 // calculate the greatest element of lower set
103 // find an element A, where every lower bound B of lowerSet, B<A
104 for (Iterator<T> iterator = lowerSet.iterator(); iterator.hasNext();) {
105 T lowerElement = iterator.next();
106 boolean isGreaterThanAll = true;
107 for (Iterator<T> iterator2 = lowerSet.iterator(); iterator2.hasNext();) {
108 T e = iterator2.next();
109 if (!lowerElement.equals(e)) {
110 if (!isGreaterThan(lowerElement, e)) {
111 isGreaterThanAll = false;
116 if (isGreaterThanAll) {
123 public Set<T> getLowerSet(T element, Set<T> lowerSet) {
125 Set<T> neighborSet = get(element);
126 if (neighborSet != null) {
127 lowerSet.addAll(neighborSet);
128 for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
129 T neighbor = iterator.next();
130 lowerSet = getLowerSet(neighbor, lowerSet);