X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=9ab65870f9ef7ff883887e2bfa18dcc7a1ba6696;hp=404dee9721fd262192abf934dedde98d6f2d36aa;hb=ceca07b4020b5dd051e0d01767a35842dec2ca74;hpb=842f3c9b981b35721bb50d49e85c11085b2040a3 diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 404dee9..9ab6587 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -177,7 +177,10 @@ class GSS { } } } - performed.add(pos, reduction.position.owner()); + if ((reduction.position.owner().needed != null && reduction.position.owner().needed.size()>0) || + (reduction.position.owner().hated != null && reduction.position.owner().hated.size()>0) || + (reduction.position.owner().hates != null && reduction.position.owner().hates.size()>0)) + performed.add(pos, reduction.position.owner()); } Node p = hash.get(code(state, parent==null?null:parent.phase())); boolean ret; @@ -227,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(); } } @@ -318,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); } }