intermediate checkpoint
[sbp.git] / src / edu / berkeley / sbp / GSS.java
index 2b8be3b..9ab6587 100644 (file)
@@ -230,17 +230,28 @@ class GSS {
             return true;
         }
 
+        public void uninhibit(int p, Sequence s) {
+            if (s.hated!=null)
+                for(Sequence s2 : s.hated)
+                    inhibited.remove(p, s2);
+        }
+
         public void inhibit(Reduction r, int p) {
             if (r.position.owner().hated == null) return;
             // remember that dead states are still allowed to shift -- just not allowed to reduce
+            boolean reset = false;
             for(Sequence seq : r.position.owner().hated) {
                 if (performed.contains(p,seq)) {
-                    inhibited.clear();
-                    inhibited.add(p, seq);
-                    resets++;
-                    throw new Reset();
+                    uninhibit(p, seq);
+                    //System.out.println("\nresetting due to " + r.position.owner() + " killing " + seq);
+                    if (!reset) inhibited.add(p, seq);
+                    reset = true;
                 }
-                inhibited.add(p, seq);
+                if (!reset) inhibited.add(p, seq);
+            }
+            if (reset) {
+                resets++;
+                throw new Reset();
             }
         }
         
@@ -321,7 +332,7 @@ class GSS {
                 this.reduction = reduction;
             }
             public void perform() {
-                System.out.println("performing: " + reduction.position);
+                //System.out.println("performing: " + reduction.position);
                 newNode(parent, pending, state, fromEmptyReduction, reduction);
             }
         }