X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Futil%2FGraphViz.java;h=07213e5831f670bde4626a9abf5ffd81607424bd;hp=d5f1bcf384dcc7806a1bee59011b48a0bb7c593b;hb=3ee451bce342d4bb61ad6235ba57bdf817bfdd1a;hpb=225993309e6183afa9a88fc13d39df56be54b992 diff --git a/src/edu/berkeley/sbp/util/GraphViz.java b/src/edu/berkeley/sbp/util/GraphViz.java index d5f1bcf..07213e5 100644 --- a/src/edu/berkeley/sbp/util/GraphViz.java +++ b/src/edu/berkeley/sbp/util/GraphViz.java @@ -1,3 +1,5 @@ +// Copyright 2006 all rights reserved; see LICENSE file for BSD-style license + package edu.berkeley.sbp.util; import edu.berkeley.sbp.util.*; import edu.berkeley.sbp.*; @@ -11,18 +13,39 @@ public class GraphViz { IdentityHashMap ihm = new IdentityHashMap(); HashMap groups = new HashMap(); - public class Group { + public class Group extends Node { + private final int idx = master_idx++; + public boolean cluster = false; + public boolean primary = true; public Group() { } public void add(Node n) { groups.put(n, this); } + public String name() { return cluster?("cluster_"+idx):("subgraph_"+idx); } + public boolean simple() { return false; } + public void dump(PrintWriter pw, IdentityHashMap done) { + Group g = this; + if (done.get(g)!=null) return; + done.put(g,g); + pw.println(" subgraph "+name()+" { rank=same;\n"); + pw.println(" label=\""+StringUtil.escapify(label.toString(), "\\\"\r\n")+"\";\n"); + pw.println(" color="+g.color+";\n"); + pw.println(" shape="+g.shape+";\n"); + for(Node n : groups.keySet()) + if (groups.get(n)==g) + n.dump(pw, done); + pw.println(" }\n"); + } } private static int master_idx=0; + public class Node { private final int idx = master_idx++; public String label; public String comment; public boolean directed = false; public String color="black"; + public String fill="white"; + public String shape="ellipse"; public ArrayList edges = new ArrayList(); public ArrayList labels = new ArrayList(); public ArrayList inbound = new ArrayList(); @@ -62,7 +85,9 @@ public class GraphViz { if (n.inbound.size() > 1) { simple = false; break; } return simple; } - public void dump(PrintWriter pw) { + public void dump(PrintWriter pw, IdentityHashMap done) { + if (done.get(this)!=null) return; + done.put(this, this); if (inbound.size() > 0) { boolean good = false; for(Node n : inbound) @@ -113,10 +138,18 @@ public class GraphViz { return n; } + public Group createGroup(ToGraphViz o) { + Group n = (Group)ihm.get(o); + if (n!=null) return n; + n = new Group(); + ihm.put(o, n); + return n; + } + public static interface ToGraphViz { - public Node toGraphViz(GraphViz gv); - public boolean isTransparent(); - public boolean isHidden(); + Node toGraphViz(GraphViz gv); + boolean isTransparent(); + boolean isHidden(); } public void show() throws IOException { @@ -126,19 +159,14 @@ public class GraphViz { public void dump(OutputStream os) { dump(new PrintWriter(new OutputStreamWriter(os))); } public void dump(PrintWriter pw) { IdentityHashMap done = new IdentityHashMap(); - pw.println("digraph G { rankdir=LR; ordering=out; \n"); - for(Group g : groups.values()) { - pw.println(" { rank=same;\n"); - for(Node n : groups.keySet()) - if (groups.get(n)==g) { - done.put(n,n); - n.dump(pw); - } - pw.println(" }\n"); - } + pw.println("digraph G { rankdir=LR; ordering=out; compound=true; \n"); + for(Group g : groups.values()) + if (g.primary) + g.dump(pw, done); for(Node n : ihm.values()) { if (done.get(n)!=null) continue; - n.dump(pw); + if (n instanceof Group) continue; + n.dump(pw, done); } for(Node n : ihm.values()) n.edges(pw); pw.println("}\n");