tentative checkpoint
[sbp.git] / src / edu / berkeley / sbp / GSS.java
index 65af62e..9b091a7 100644 (file)
@@ -146,13 +146,15 @@ class GSS {
                 }
             }
         }
                 }
             }
         }
+
         private boolean newNode2(Node p, Node parent, Forest pending, State state, boolean fromEmptyReduction) {
             //if (p.parents().contains(parent)) return true;
         private boolean newNode2(Node p, Node parent, Forest pending, State state, boolean fromEmptyReduction) {
             //if (p.parents().contains(parent)) return true;
-            p.merge(parent, pending);
+            if (p.merge(parent, pending)) return true;
             p.parents().add(parent, true);
             if (p!=parent && !fromEmptyReduction && reducing) p.performReductions(parent);
             return true;
         }
             p.parents().add(parent, true);
             if (p!=parent && !fromEmptyReduction && reducing) p.performReductions(parent);
             return true;
         }
+
         private boolean newNode3(Node parent, Forest pending, State state, boolean fromEmptyReduction) {
             do {
                 if (token != null && state.canShift(token)) break;
         private boolean newNode3(Node parent, Forest pending, State state, boolean fromEmptyReduction) {
             do {
                 if (token != null && state.canShift(token)) break;
@@ -287,8 +289,6 @@ class GSS {
         public boolean isTransparent() { return false; }
         public boolean isHidden() { return false; }
 
         public boolean isTransparent() { return false; }
         public boolean isHidden() { return false; }
 
-
-            //private Forest.Ref holder = new Forest.Ref();
             private boolean allqueued = false;
 
             /** what state this node is in */
             private boolean allqueued = false;
 
             /** what state this node is in */
@@ -296,14 +296,15 @@ class GSS {
 
             /** which Phase this Node belongs to (node that Node is also a non-static inner class of Phase) */
             public  Phase phase() { return Phase.this; }
 
             /** which Phase this Node belongs to (node that Node is also a non-static inner class of Phase) */
             public  Phase phase() { return Phase.this; }
-            //private HashMap<Node,Forest> resultMap = new HashMap<Node,Forest>();
 
             private HashSet<Forest.Ref> resultMap = new HashSet<Forest.Ref>();
 
             private HashSet<Forest.Ref> resultMap = new HashSet<Forest.Ref>();
-            public void merge(Node parent, Forest result) {
+            public Iterable<Forest.Ref> results() { return resultMap; }
+            public FastSet<Node> parents() { return set; }
+            public boolean merge(Node parent, Forest result) {
                 for(Forest.Ref f : results()) {
                 for(Forest.Ref f : results()) {
-                    if (f.parents.contains(parent) && f.parents.size()==1) {
+                    if (f.parents.contains(parent) /* UGLY: */ && f.parents.size()==1) {
                         f.merge(result);
                         f.merge(result);
-                        return;
+                        return true;
                     }
                 }
                 Forest.Ref f = new Forest.Ref();
                     }
                 }
                 Forest.Ref f = new Forest.Ref();
@@ -311,27 +312,8 @@ class GSS {
                 f.merge(result);
                 resultMap.add(f);
                 set.add(parent, true);
                 f.merge(result);
                 resultMap.add(f);
                 set.add(parent, true);
-                /*
-                Forest.Ref f = (Forest.Ref)resultMap.get(parent);
-                if (f==null) { f = new Forest.Ref(); resultMap.put(parent, f); }
-                f.merge(result);
-                set.add(parent, true);
-                */
-            }
-            public Iterable<Forest.Ref> results() { return resultMap; }
-            //private Forest pending(Node n) {
-                //return !Phase.this.closed ? holder : holder.resolve();
-                /*
-                for(Forest f : resultMap)
-                    if (resultMap.contains(f, n))
-                        return f;
-                return null;
-                */
-            /*
-                return resultMap.get(n);
+                return false;
             }
             }
-            */
-            public  FastSet<Node> parents() { return set; }
 
             public void performReductions() {
                 if (allqueued) return;
 
             public void performReductions() {
                 if (allqueued) return;
@@ -346,7 +328,6 @@ class GSS {
 
             public void performEmptyReductions() { state.invokeReductions(token, this, null, null); }
             public final void invoke(Position r, Node n, Node n2) {
 
             public void performEmptyReductions() { state.invokeReductions(token, this, null, null); }
             public final void invoke(Position r, Node n, Node n2) {
-                //if (r.owner().lame) return;
                 if (n==null || n2==null || r.pos==0) {
                     if (r.pos==0) {
                         if (n==null) n = this;
                 if (n==null || n2==null || r.pos==0) {
                     if (r.pos==0) {
                         if (n==null) n = this;
@@ -367,11 +348,6 @@ class GSS {
             public void reduce(Position r, int pos, Phase target, Forest[] holder, Node only) {
                 Forest old = holder[pos];
 
             public void reduce(Position r, int pos, Phase target, Forest[] holder, Node only) {
                 Forest old = holder[pos];
 
-                // FIXME: I'm unsure about this -- basically we want to deal with the case where
-                //        there are two nodes, each of whose Ref points to the same Forest instance.
-                //        Some node in the next phase has both of these as parents.  This might happen
-                //        since the same reduction can appear in more than one state.
-                
                 for(Forest result : results())
                     for(Node child : ((Forest.Ref<?>)result).parents) {
                         if (only != null && child!=only) continue;
                 for(Forest result : results())
                     for(Node child : ((Forest.Ref<?>)result).parents) {
                         if (only != null && child!=only) continue;