X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fedu%2Fberkeley%2Fsbp%2Futil%2FTopologicalBag.java;h=9a18eef7fa98eda82d0bc51d6b33b8732748403b;hb=3473141880127c6aa52d094d51739e5eb67f1703;hp=7812a516d27a20a8803968b5211d0c94251a0f7b;hpb=0a0227b9180534d2a431f3d6e08a398bde2244c4;p=sbp.git
diff --git a/src/edu/berkeley/sbp/util/TopologicalBag.java b/src/edu/berkeley/sbp/util/TopologicalBag.java
index 7812a51..9a18eef 100644
--- a/src/edu/berkeley/sbp/util/TopologicalBag.java
+++ b/src/edu/berkeley/sbp/util/TopologicalBag.java
@@ -12,7 +12,7 @@ import java.lang.ref.*;
//
/** a mapping from topologies over K to sets of values of type V */
-public class TopologicalBag implements MapBag,V> {
+public class TopologicalBag implements MapBag,V>, VisitableMap {
// CRUCIAL INVARIANT: keys in this hashmap MUST be disjoint or the universe will implode
private final HashMap,HashSet> h = new HashMap,HashSet>();
@@ -27,11 +27,11 @@ public class TopologicalBag implements MapBag,V> {
public void add(Topology t, V v) { put(t, v); }
public void addAll(Topology k, Iterable vi) { putAll(k, vi); }
- public void putAll(Topology k, Iterable vi) { for(V v : vi) put(k, v); }
+ public void putAll(Topology k, Iterable vi) { if (vi!=null) for(V v : vi) put(k, v); }
public void put(Topology t, V v) {
for(Topology ht : h.keySet()) {
if (t.disjoint(ht)) continue;
- if (t.equals(ht)) {
+ if (t.containsAll(ht) && ht.containsAll(t)) {
h.get(ht).add(v);
return;
}
@@ -59,7 +59,9 @@ public class TopologicalBag implements MapBag,V> {
TopologicalBag ret = new TopologicalBag();
for(Topology ht : h.keySet()) {
if (ht.disjoint(t)) continue;
- ret.putAll(ht.intersect(t), h.get(ht));
+ Iterable it = h.get(ht);
+ Topology tk = ht.intersect(t);
+ ret.putAll(tk, it);
}
return ret;
}
@@ -80,7 +82,7 @@ public class TopologicalBag implements MapBag,V> {
return true;
}
- public boolean contains(K k) { return get(k).iterator().hasNext(); }
+ public boolean contains(K k) { return has(k); }
public boolean contains(K k, V v) {
for(Topology t : h.keySet())
@@ -89,8 +91,23 @@ public class TopologicalBag implements MapBag,V> {
return false;
}
+ public boolean has(K k) {
+ for(Topology t : h.keySet())
+ if (t.contains(k) && !h.get(t).isEmpty())
+ return true;
+ return false;
+ }
+
private HashMap> cache = new HashMap>();
public Iterable getAll(Topology k) { return h.get(k); }
+
+ public void invoke(K k, Invokable ivbc, B b, C c) {
+ for(Topology t : h.keySet())
+ if (t.contains(k))
+ for(V v : h.get(t))
+ ivbc.invoke(v, b, c);
+ }
+
public Iterable get(K k) {
Iterable c = cache.get(k);
if (c != null) return c;
@@ -117,5 +134,49 @@ public class TopologicalBag implements MapBag,V> {
return ret;
}
}
+
+ public VisitableMap optimize() {
+ ArrayList min_ = new ArrayList();
+ ArrayList max_ = new ArrayList();
+ ArrayList