3 import java.util.HashSet;
4 import java.util.Hashtable;
5 import java.util.Iterator;
8 public class Lattice<T> {
10 private Hashtable<T, Set<T>> table;
16 public Lattice(T top, T bottom) {
17 table = new Hashtable<T, Set<T>>();
21 table.put(top, new HashSet<T>());
25 public T getTopItem() {
29 public T getBottomItem() {
33 public Set<T> getKeySet() {
34 return table.keySet();
37 public boolean put(T key) {
38 if (table.containsKey(key)) {
41 // new key, need to be connected with top/bottom
43 table.get(top).add(key);
44 Set<T> neightborSet = new HashSet<T>();
45 neightborSet.add(bottom);
46 table.put(key, neightborSet);
51 public boolean put(T key, T value) {
54 Set<T> topNeighbor = table.get(top);
56 if (table.containsKey(key)) {
59 // new key, need to be connected with top
65 if (value != null && !s.contains(value)) {
69 if (!table.containsKey(value)) {
70 Set<T> lowerNeighbor = new HashSet<T>();
71 lowerNeighbor.add(bottom);
72 table.put(value, lowerNeighbor);
75 // if value is already connected with top, it is no longer to be
76 topNeighbor.remove(value);
78 // if key is already connected with bottom,, it is no longer to be
79 if (!value.equals(getBottomItem())) {
80 table.get(key).remove(getBottomItem());
88 public boolean isIntroducingCycle(T key) {
90 Set<T> reachableSet = new HashSet<T>();
91 Set<T> neighborSet = get(key);
93 if (neighborSet == null) {
96 reachableSet.addAll(neighborSet);
101 oldReachableSize = reachableSet.size();
102 Set<T> nextLevelNeighbors = new HashSet<T>();
103 for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
104 T element = iterator.next();
105 Set<T> neighbors = get(element);
106 if (neighbors != null) {
107 nextLevelNeighbors.addAll(neighbors);
108 reachableSet.addAll(neighbors);
111 if (reachableSet.contains(key)) {
116 neighborSet = nextLevelNeighbors;
117 } while (oldReachableSize != reachableSet.size());
122 public Set<T> get(T key) {
123 return table.get(key);
126 public boolean containsKey(T o) {
127 return table.containsKey(o);
130 public boolean isComparable(T a, T b) {
132 Set<T> neighborSet = get(a);
136 } else if (neighborSet == null) {
138 } else if (neighborSet.contains(b)) {
141 boolean reachable = false;
142 for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
143 T neighbor = iterator.next();
144 reachable = reachable || isComparable(neighbor, b);
151 public boolean isGreaterThan(T a, T b) {
166 if (a.equals(bottom)) {
169 if (b.equals(bottom)) {
173 Set<T> neighborSet = get(a);
175 if (neighborSet == null) {
177 } else if (neighborSet.contains(b)) {
180 boolean reachable = false;
181 for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
182 T neighbor = iterator.next();
183 reachable = reachable || isGreaterThan(neighbor, b);
189 public T getGLB(Set<T> inputSet) {
191 Set<T> lowerSet = new HashSet<T>();
193 // get lower set of input locations
194 for (Iterator<T> iterator = inputSet.iterator(); iterator.hasNext();) {
195 T element = iterator.next();
196 lowerSet.addAll(getLowerSet(element, new HashSet<T>()));
197 lowerSet.add(element);
200 // an element of lower bound should be lower than every input set
201 Set<T> toberemoved = new HashSet<T>();
202 for (Iterator<T> inputIterator = inputSet.iterator(); inputIterator.hasNext();) {
203 T inputElement = inputIterator.next();
205 for (Iterator iterator = lowerSet.iterator(); iterator.hasNext();) {
206 T lowerElement = (T) iterator.next();
207 if (!inputElement.equals(lowerElement)) {
208 if (!isGreaterThan(inputElement, lowerElement)) {
209 toberemoved.add(lowerElement);
214 lowerSet.removeAll(toberemoved);
216 // calculate the greatest element of lower set
217 // find an element A, where every lower bound B of lowerSet, B<A
218 for (Iterator<T> iterator = lowerSet.iterator(); iterator.hasNext();) {
219 T lowerElement = iterator.next();
220 boolean isGreaterThanAll = true;
221 for (Iterator<T> iterator2 = lowerSet.iterator(); iterator2.hasNext();) {
222 T e = iterator2.next();
223 if (!lowerElement.equals(e)) {
224 if (!isGreaterThan(lowerElement, e)) {
225 isGreaterThanAll = false;
230 if (isGreaterThanAll) {
237 public Set<T> getLowerSet(T element, Set<T> lowerSet) {
239 Set<T> neighborSet = get(element);
240 if (neighborSet != null) {
241 lowerSet.addAll(neighborSet);
242 for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
243 T neighbor = iterator.next();
244 lowerSet = getLowerSet(neighbor, lowerSet);
250 public Set<Pair<T, T>> getOrderingPairSet() {
251 // return the set of pairs in the lattice
253 Set<Pair<T, T>> set = new HashSet<Pair<T, T>>();
255 Set<T> visited = new HashSet<T>();
256 Set<T> needtovisit = new HashSet<T>();
257 needtovisit.add(top);
259 while (!needtovisit.isEmpty()) {
260 T key = needtovisit.iterator().next();
261 Set<T> lowerSet = table.get(key);
262 if (lowerSet != null) {
263 for (Iterator iterator = lowerSet.iterator(); iterator.hasNext();) {
264 T lowerItem = (T) iterator.next();
265 set.add(new Pair(key, lowerItem));
266 if (!visited.contains(key)) {
267 needtovisit.add(lowerItem);
272 needtovisit.remove(key);