X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=743cfd381622afc430958b743fe5ac622ccb203a;hp=87bcf04b2f286203604a92494e3ba7e34945e843;hb=225993309e6183afa9a88fc13d39df56be54b992;hpb=eda544585c2304faa82d249c4744fd5cecbf9211 diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 87bcf04..743cfd3 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -17,11 +17,10 @@ class GSS { public int resets = 0; public int waits = 0; - HashMapBag inhibited = new HashMapBag(); - HashMapBag expectedInhibit = new HashMapBag(); HashMapBag waiting = new HashMapBag(); HashMapBag performed = new HashMapBag(); HashMapBag lastperformed = new HashMapBag(); + HashMapBag expected = new HashMapBag(); /** FIXME */ public Forest.Ref finalResult; @@ -57,19 +56,18 @@ class GSS { this.pos = previous==null ? 0 : previous.pos+1; this.token = token; this.location = location; - inhibited.clear(); + performed.clear(); reset(); } public void reset() throws ParseFailed { waiting.clear(); + expected.clear(); lastperformed.clear(); lastperformed.addAll(performed); performed.clear(); hash = new IntPairMap(); singularReductions = new IntPairMap(); - expectedInhibit.clear(); - expectedInhibit.addAll(inhibited); reset = false; good = false; closed = false; @@ -105,28 +103,32 @@ class GSS { 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; + for (Sequence s : lastperformed.getAll(pos)) + if (owner.hates.contains(s)) { + //System.out.println("now expecting ["+pos+"] => " + s); + expected.add(pos, s); + return; + } } - if (inhibited.contains(pos, owner)) return; if (owner.needs != null) for(Sequence s : owner.needs) if (!performed.contains(pos, s)) { 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)) + if (!performed.contains(pos, owner)) { performed.add(pos, owner); - */ + if (owner.hated != null) + for(Sequence seq : owner.hated) + if (performed.contains(pos, seq)) { + performed.remove(pos, seq); + reset = true; + } + } } - if (reduction!=null) uninhibit(reduction, parent==null?0:parent.phase().pos); if (!owner.lame) newNode(parent, pending, state, fromEmptyReduction); if (reduction != null) { @@ -171,30 +173,6 @@ class GSS { return true; } - public void inhibit(int p, Sequence 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)) - throw new Reset(); - if (performed.contains(p, s)) throw new Reset(); - } - - 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); - } - /** perform all reduction operations */ public void reduce() throws ParseFailed { try { @@ -213,22 +191,18 @@ class GSS { reducing_list[i] = null; n.performReductions(); } - /* - 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); - throw new Reset(); - } - */ if (reset) { reset = false; resets++; throw new Reset(); } + for(int i : expected) + for(Sequence s : expected.getAll(i)) + if (!performed.contains(i, s)) { + //System.out.println("resetting due to pos="+i+": " + s + " " + System.identityHashCode(s)); + resets++; + throw new Reset(); + } } catch (Reset r) { reset(); reduce();