X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FResultNode.java;h=655b85a01e9740a4c8076522ecadd977c152999b;hp=e8e3b57dc356471baa43feeac0c5825ccc08e7e8;hb=HEAD;hpb=5d881ff49c40eacd47314a400dc69cc88edc9156 diff --git a/src/edu/berkeley/sbp/ResultNode.java b/src/edu/berkeley/sbp/ResultNode.java index e8e3b57..655b85a 100644 --- a/src/edu/berkeley/sbp/ResultNode.java +++ b/src/edu/berkeley/sbp/ResultNode.java @@ -7,119 +7,43 @@ import edu.berkeley.sbp.Sequence.Pos; import java.util.*; final class ResultNode - extends Node - implements GraphViz.ToGraphViz { + extends Node { - private Forest.Many f = new Forest.Many(); - //private HashSet predecessors = new HashSet(); - //private HashSet successors = new HashSet(); - private FastSet predecessors = new FastSet(); - private FastSet successors = new FastSet(); - private boolean destroyed = false; - private boolean primordeal; - private int usedByNonDoomedNode = 0; private Pos reduction; - private GSS.Phase predPhase; + private Forest.Many f = new Forest.Many(); - public boolean predecessorsContains(StateNode n) { - return predecessors.contains(n); - } + public void merge(Forest newf) { this.f.merge(newf); } public Pos reduction() { return reduction; } - public void merge(Forest newf) { - this.f.merge(newf); - /* - if (predecessors.contains(pred)) return; - addPred(pred); - if (fromEmptyReduction) return; - n.state().invokeReductions(n.phase().getToken(), n, this); - */ - } - - public boolean noSuccessors() { return successors.size()==0; } - - public GSS.Phase phase() { return predPhase; } + public boolean isDoomedState() { /* this is irrelevant */ return false; } public Forest getForest() { return f; } - public Iterable getPreds() { return predecessors; } - public void addSucc(StateNode succ) { - if (successors.contains(succ)) return; - successors.add(succ); - usedByNonDoomedNode += succ.state().doomed ? 0 : 1; - if (predecessors.size() > 1) throw new Error(); - } - public void removeSucc(StateNode succ) { - if (!successors.contains(succ)) return; - successors.remove(succ); - usedByNonDoomedNode -= succ.state().doomed ? 0 : 1; - check(); + public String toString() { return super.toString()+"->"+phase(); } + public boolean hasPathToRoot() { + if (predecessorPhase()==null) return true; + return super.hasPathToRoot(); } - public boolean usedByAnyNode() { return successors.size() > 0; } - public boolean usedByNonDoomedNode() { return usedByNonDoomedNode > 0; } - - public String toString() { return super.toString()+"->"+predPhase; } - public void check() { - if (successors.size()==0) destroy(); - else if (predecessors.size()==0) destroy(); - } - public void destroy() { if (destroyed) return; - if (primordeal) return; // never destroy the "primordeal" result - destroyed = true; - while(predecessors.size() > 0) - for(StateNode pred : predecessors) { - removePred(pred); - pred.removeSucc(this); - break; - } - predecessors = null; - while(successors.size() > 0) - for(StateNode succ : successors) { - removeSucc(succ); - succ.removeResult(this); - break; - } - successors = null; + if (!hasSuccessors() || !hasPredecessors()) destroy(); } - - public void removePred(StateNode pred) { - if (!predecessors.contains(pred)) return; - predecessors.remove(pred); - check(); + protected void destroy() { + if (destroyed) return; + if (predecessorPhase()==null) return; // never destroy the "primordeal" result + super.destroy(); } - public void addPred(StateNode pred) { - if (predPhase==null) predPhase = pred.phase(); - if (predPhase != pred.phase()) throw new Error(); - predecessors.add(pred); - pred.addSucc(this); - if (predecessors.size() > 1) throw new Error(); + protected void addPred(StateNode pred) { + super.addPred(pred); + // results should have at most one predecessor + //if (predecessors.size() > 1) throw new Error(); } - public ResultNode() { - this(null, null, null); - this.primordeal = true; - } + public ResultNode() { this(null, null, null); } public ResultNode(Forest f, Pos reduction, StateNode pred) { + super(pred==null ? null : pred.phase(), + pred==null ? null : pred.phase()); this.f.merge(f); this.reduction = reduction; if (pred != null) addPred(pred); } - - // GraphViz ////////////////////////////////////////////////////////////////////////////// - - public GraphViz.StateNode toGraphViz(GraphViz gv) { - if (gv.hasNode(this)) return gv.createNode(this); - GraphViz.StateNode n = gv.createNode(this); - n.label = ""+f; - n.shape = "rectangle"; - //if (pred()!=null) n.edge(pred, ""); - n.color = "blue"; - if (phase() != null) - ((GraphViz.Group)phase().toGraphViz(gv)).add(n); - return n; - } - public boolean isTransparent() { return false; } - public boolean isHidden() { return false; } - } \ No newline at end of file