1 package edu.berkeley.sbp.util;
2 import edu.berkeley.sbp.util.*;
3 import edu.berkeley.sbp.*;
6 import java.lang.reflect.*;
7 import java.lang.ref.*;
9 public class GraphViz {
11 IdentityHashMap<ToGraphViz,Node> ihm = new IdentityHashMap<ToGraphViz,Node>();
12 HashMap<Node,Group> groups = new HashMap<Node,Group>();
16 public void add(Node n) { groups.put(n, this); }
19 private static int master_idx=0;
21 private final int idx = master_idx++;
23 public boolean directed = false;
24 public String color="black";
25 public ArrayList<Node> edges = new ArrayList<Node>();
26 public ArrayList<Object> labels = new ArrayList<Object>();
27 public ArrayList<Node> inbound = new ArrayList<Node>();
28 public void edge(ToGraphViz o, Object label) {
29 Node n = o.toGraphViz(GraphViz.this);
35 public String name() {
36 if (inbound.size()==1 && inbound.get(0).simple())
37 return inbound.get(0).name()+":node_"+idx;
40 public void edges(PrintWriter pw) {
42 for(int i=0; i<edges.size(); i++) {
43 Node n = edges.get(i);
44 Object label = labels.get(i);
45 pw.println(" "+name()+" -> " + n.name() + " [color="+color+" " +(label==null?"":("label=\""+label+"\""))+ "];\n");
48 public int numEdges() { return edges.size(); }
49 public boolean simple() {
50 boolean simple = true;
51 if (label!=null && !label.equals("")) simple = false;
54 //if (n.numEdges()>0) { simple = false; break; }
55 if (n.inbound.size() > 1) { simple = false; break; }
58 public void dump(PrintWriter pw) {
59 if (inbound.size() > 0) {
63 { good = true; break; }
68 if (directed) pw.print("ordering=out");
70 pw.print(" shape=record ");
71 pw.print(" label=\"");
72 boolean complex = false;
76 if (!complex) pw.print("{");
79 if (!first) pw.print("|");
81 pw.print("<node_"+n.idx+">");
82 pw.print(StringUtil.escapify(n.label,"\\\""));
84 if (!complex) pw.print("}");
87 pw.print(" label=\"");
88 pw.print(StringUtil.escapify(label,"\\\""));
91 pw.print("color="+color);
96 public boolean hasNode(ToGraphViz o) {
97 return ihm.get(o)!=null;
100 public Node createNode(ToGraphViz o) {
102 if (n!=null) return n;
108 public static interface ToGraphViz {
109 public Node toGraphViz(GraphViz gv);
110 public boolean isTransparent();
111 public boolean isHidden();
114 public void dump(PrintWriter pw) {
115 IdentityHashMap<Node,Node> done = new IdentityHashMap<Node,Node>();
116 pw.println("digraph G { rankdir=LR; \n");
117 for(Group g : groups.values()) {
118 pw.println(" { rank=same;\n");
119 for(Node n : groups.keySet())
120 if (groups.get(n)==g) {
126 for(Node n : ihm.values()) {
127 if (done.get(n)!=null) continue;
130 for(Node n : ihm.values()) n.edges(pw);