}
}
}
- 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;
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();
}
}
this.reduction = reduction;
}
public void perform() {
- System.out.println("performing: " + reduction.position);
+ //System.out.println("performing: " + reduction.position);
newNode(parent, pending, state, fromEmptyReduction, reduction);
}
}