X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FResultNode.java;fp=src%2Fedu%2Fberkeley%2Fsbp%2FResultNode.java;h=671940ae2d01bc1cabcfb36e56df8373dc1f7943;hp=0000000000000000000000000000000000000000;hb=c53fc2952c7885d727500ce404887d552c5dec5f;hpb=24219bdf084b45273e869cd19382d1640b396566 diff --git a/src/edu/berkeley/sbp/ResultNode.java b/src/edu/berkeley/sbp/ResultNode.java new file mode 100644 index 0000000..671940a --- /dev/null +++ b/src/edu/berkeley/sbp/ResultNode.java @@ -0,0 +1,124 @@ +// Copyright 2006-2007 all rights reserved; see LICENSE file for BSD-style license + +package edu.berkeley.sbp; +import edu.berkeley.sbp.util.*; +import edu.berkeley.sbp.Sequence.Pos; +import edu.berkeley.sbp.Sequence.Pos; +import java.util.*; + +final class ResultNode + implements GraphViz.ToGraphViz { + + 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; + + public boolean predecessorsContains(StateNode n) { + return predecessors.contains(n); + } + 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 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 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; + } + + public void removePred(StateNode pred) { + if (!predecessors.contains(pred)) return; + predecessors.remove(pred); + check(); + } + + 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(); + } + + public ResultNode() { + this(null, null, null); + this.primordeal = true; + } + public ResultNode(Forest f, Pos reduction, StateNode pred) { + 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