X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=87bcf04b2f286203604a92494e3ba7e34945e843;hb=eda544585c2304faa82d249c4744fd5cecbf9211;hp=02f521e67cbf071f79e200e494d52572ece64eb0;hpb=a0443929fbf2251ca64cd44287a800915386d1f8;p=sbp.git diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 02f521e..87bcf04 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -21,6 +21,7 @@ class GSS { HashMapBag expectedInhibit = new HashMapBag(); HashMapBag waiting = new HashMapBag(); HashMapBag performed = new HashMapBag(); + HashMapBag lastperformed = new HashMapBag(); /** FIXME */ public Forest.Ref finalResult; @@ -62,6 +63,8 @@ class GSS { public void reset() throws ParseFailed { waiting.clear(); + lastperformed.clear(); + lastperformed.addAll(performed); performed.clear(); hash = new IntPairMap(); singularReductions = new IntPairMap(); @@ -101,6 +104,14 @@ class GSS { int pos = parent==null?0:parent.phase()==null?0:parent.phase().pos; Sequence owner = reduction==null ? null : reduction.owner(); if (reduction!=null) { + if (owner.hates!=null) { + for (Sequence s : lastperformed.getAll(pos)) + if (owner.hates.contains(s)) + return; + for (Sequence s : performed.getAll(pos)) + if (owner.hates.contains(s)) + return; + } if (inhibited.contains(pos, owner)) return; if (owner.needs != null) for(Sequence s : owner.needs) @@ -108,14 +119,16 @@ class GSS { waiting.add(s, new Waiting(parent, pending, state, fromEmptyReduction, reduction)); return; } + /* if ((owner.needed != null && owner.needed.size()>0) || (owner.hated != null && owner.hated.size()>0) || (owner.hates != null && owner.hates.size()>0)) performed.add(pos, owner); + */ } + if (reduction!=null) uninhibit(reduction, parent==null?0:parent.phase().pos); if (!owner.lame) newNode(parent, pending, state, fromEmptyReduction); - if (reduction!=null) uninhibit(reduction, parent==null?0:parent.phase().pos); if (reduction != null) { boolean redo = true; while(redo) { @@ -159,11 +172,13 @@ class GSS { } public void inhibit(int p, Sequence s) { - if (inhibited.contains(p, s)) return; - inhibited.add(p, s); + //if (inhibited.contains(p, s)) return; + if (performed.contains(p, s)) throw new Reset(); + /* if (s.hated!=null) for(Sequence s2 : s.hated) uninhibit(p, s2); + */ if (s.needed!=null) for(Sequence s2 : s.needed) if (performed.contains(p, s2)) @@ -173,6 +188,8 @@ class GSS { public void uninhibit(Position r, int p) { uninhibit(p, r.owner()); } public void uninhibit(int p, Sequence s) { + if (performed.contains(p, s)) return; + performed.add(p, s); if (s.hated != null) for(Sequence seq : s.hated) inhibit(p, seq); @@ -198,8 +215,12 @@ class GSS { } /* if (expectedInhibit.size() > 0) { + System.out.println("\n!!!!"); + for(int i : expectedInhibit) + for(Sequence es : expectedInhibit.getAll(i)) + System.out.println(" " + i + ": " + es); + System.out.println(""); inhibited.removeAll(expectedInhibit); - System.out.println("\n!!!!\n"); throw new Reset(); } */