]> granicus.if.org Git - graphviz/commitdiff
Add gvpr script to create a derived cluster graph.
authorEmden Gansner <emdenrg@MacBook-Pro.local>
Tue, 4 Apr 2017 19:20:02 +0000 (15:20 -0400)
committerEmden Gansner <emdenrg@MacBook-Pro.local>
Tue, 4 Apr 2017 19:20:02 +0000 (15:20 -0400)
cmd/gvpr/lib/clustg [new file with mode: 0644]

diff --git a/cmd/gvpr/lib/clustg b/cmd/gvpr/lib/clustg
new file mode 100644 (file)
index 0000000..0ff8b24
--- /dev/null
@@ -0,0 +1,54 @@
+/* Create derived graph whose nodes are top-level clusters (any nodes not in top-level clusters are trivial top-level clusters),
+ * and there is an edge between two nodes in the derived graph if there is an edge between the clusters in the original graph.
+ * The new graph is directed if the original one is; it is strict. Edges within clusters are ignored.
+ * Nodes and edges have a _cnt attribute indicating the number of node in a cluster and the number of equivalent edges, respectively.
+ */
+BEGIN {
+  graph_t dg;
+  graph_t c[node_t];
+  node_t nmap[node_t];
+  node_t n, n0, dn, dn0;
+  edge_t e;
+
+  void proc (graph_t h, graph_t g)
+  {
+    if (h.name == "cluster*") {
+      dn = node(dg, h.name);
+      dn._cnt = (string)(h.n_nodes);
+      for (n = fstnode(h); n; n = nxtnode_sg(h,n)) {
+               n0 = nmap[n];
+               if (n0) {
+          printf(2,"node %s in %s and %s\n", n.name, h.name, n0.name);
+                 exit(1);
+        }
+        nmap[n] = dn;
+      }
+      return;
+    }
+    for (g = fstsubg(h); g; g = nxtsubg(g)) {
+      proc(g,NULL);
+    }
+  }
+}
+BEG_G{
+  dg = graph("clust"+name, isDirect($)?"DS":"US");
+  setDflt(dg,"E","_cnt","0");
+  setDflt(dg,"N","_cnt","0");
+  proc($,NULL);
+  $tv_type = TV_ne;
+}
+N[!nmap[$]]{
+  dn = node(dg, name);
+  nmap[$] = dn;
+}
+E{
+  dn0 = nmap[$.tail];
+  dn = nmap[$.head];
+  if (dn != dn0) {
+    e = edge(dn0,dn,"");
+    e._cnt = (string)(1+(int)e._cnt);
+  }
+}
+END_G {
+  write(dg);
+}