checkpoint
authoradam <adam@megacz.com>
Sun, 15 Jan 2006 08:17:34 +0000 (03:17 -0500)
committeradam <adam@megacz.com>
Sun, 15 Jan 2006 08:17:34 +0000 (03:17 -0500)
darcs-hash:20060115081734-5007d-e7bd04061d146867bae11768a3bc6d23b8f40830.gz

src/edu/berkeley/sbp/GSS.java
src/edu/berkeley/sbp/util/HashMapBag.java

index 7408eba..d25593f 100644 (file)
@@ -16,9 +16,10 @@ class GSS {
     public int resets = 0;
     public int waits = 0;
 
-    HashMapBag<Integer,Sequence>       inhibited = new HashMapBag<Integer,Sequence>();
-    HashMapBag<Sequence,Phase.Waiting> waiting   = new HashMapBag<Sequence,Phase.Waiting>();
-    HashMapBag<Integer,Sequence>       performed = new HashMapBag<Integer,Sequence>();
+    HashMapBag<Integer,Sequence>       inhibited       = new HashMapBag<Integer,Sequence>();
+    HashMapBag<Integer,Sequence>       expectedInhibit = new HashMapBag<Integer,Sequence>();
+    HashMapBag<Sequence,Phase.Waiting> waiting         = new HashMapBag<Sequence,Phase.Waiting>();
+    HashMapBag<Integer,Sequence>       performed       = new HashMapBag<Integer,Sequence>();
     
     /** FIXME */
     public  Forest.Ref finalResult;
@@ -63,6 +64,8 @@ class GSS {
             performed.clear();
             hash = new IntPairMap<Phase.Node>();
             singularReductions = new IntPairMap<Forest>();
+            expectedInhibit.clear();
+            expectedInhibit.addAll(inhibited);
             good = false;
             closed = false;
             reducing = false;
@@ -175,6 +178,7 @@ class GSS {
                     throw new Reset();
                 }
                 inhibited.add(p, seq);
+                expectedInhibit.remove(p, seq);
             }
         }
         
@@ -196,6 +200,11 @@ class GSS {
                     reducing_list[i] = null;
                     n.performReductions();
                 }
+                if (expectedInhibit.size() > 0) {
+                    inhibited.removeAll(expectedInhibit);
+                    System.out.println("\n!!!!\n");
+                    throw new Reset();
+                }
             } catch (Reset r) {
                 reset();
                 reduce();
index 6f5585d..73e2cce 100644 (file)
@@ -9,7 +9,9 @@ public final class HashMapBag<K,V> implements MapBag<K,V> {
     public void add(K k, V v) {
         HashSet<V> hs = hm.get(k);
         if (hs==null) hm.put(k, hs = new HashSet<V>());
+        size -= hs.size();
         hs.add(v);
+        size += hs.size();
     }
 
     public void addAll(K k, Iterable<V> iv) {
@@ -24,7 +26,15 @@ public final class HashMapBag<K,V> implements MapBag<K,V> {
 
     public void remove(K k, V v) {
         if (hm.get(k)==null) return;
-        hm.get(k).remove(v);
+        HashSet<V> hs = hm.get(k);
+        if (hs==null) return;
+        size -= hs.size();
+        hs.remove(v);
+        size += hs.size();
+    }
+
+    public void removeAll(K k, Iterable<V> iv) {
+        for(V v : iv) remove(k, v);
     }
 
     public void clear() { hm.clear(); }
@@ -33,5 +43,14 @@ public final class HashMapBag<K,V> implements MapBag<K,V> {
         return hm.get(k)!=null && hm.get(k).contains(v);
     }
 
+    public void addAll(HashMapBag<K,V> hmb) {
+        for(K k : hmb) addAll(k, hmb.getAll(k));
+    }
+    public void removeAll(HashMapBag<K,V> hmb) {
+        for(K k : hmb) removeAll(k, hmb.getAll(k));
+    }
+
     public Iterator<K> iterator() { return hm.keySet().iterator(); }
+    public int size() { return size; }
+    private int size = 0;
 }