diff toolboxes/FullBNT-1.0.7/GraphViz/Old/pre_pesha_graph_to_dot.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/FullBNT-1.0.7/GraphViz/Old/pre_pesha_graph_to_dot.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,166 @@
+function graph_to_dot(G, varargin)
+% DAG_TO_DOT Make a file representing the directed graph in dotty format.
+% dag_to_dot(G, ...)
+%
+% Optional arguments should be passed as name/value pairs [default]
+%
+% 'filename' - if omitted, we write to 'tmp.dot', convert this to 'tmp.ps',
+%              and then call ghostview automatically 
+% 'arc_label' - arc_label{i,j} is a string attached to the i->j arc. [""]
+% 'node_label' - node_label{i} is a string attached to node i. ["i"]
+% 'width'      - width in inches [10]
+% 'height'     - height in inches [10]
+% 'leftright'  - 1 means layout left-to-right, 0 means top-to-bottom [0]
+% 'directed'  - 1 means use directed arcs, 0 means undirected [1]
+%
+% For details on dotty, See http://www.research.att.com/sw/tools/graphviz
+%
+% Example:
+% G = rand(5,5);
+% names = cell(5,5);
+% names{1,2} = 'arc 1-2';
+% graph_to_dot(G, 'arc_label', names)
+% or graph_to_dot(G, 'arc_label', 'numbers') % prints value of G(i,j) on i->j arc 
+
+% Kevin Murphy, 1998
+
+% set default args
+filename = [];
+node_label = [];
+arc_label = [];
+width = 10;
+height = 10;
+leftright = 0;
+directed = 1;
+% get optional args
+args = varargin;
+for i=1:2:length(args)
+  switch args{i}
+   case 'filename', filename = args{i+1};
+   case 'node_label', node_label = args{i+1};
+   case 'arc_label', arc_label = args{i+1};
+   case 'width', width = args{i+1};
+   case 'height', height = args{i+1};
+   case 'leftright', leftright = args{i+1};
+   case 'directed', directed = args{i+1};
+  end
+end
+
+if isstr(arc_label) & strcmp(arc_label, 'numbers')
+  N = length(G);
+  arc_label = cell(N,N);
+  for i=1:N
+    for j=1:N
+      arc_label{i,j} = sprintf('%4.2f', G(i,j));
+    end
+  end
+end
+
+if isempty(filename)
+  make_file(G, 'tmp.dot', node_label, arc_label, width, height, leftright, directed);
+  if isunix
+    !dot -Tps tmp.dot -o tmp.ps
+
+    !gs tmp.ps &
+  else
+    dos('dot -Tps tmp.dot -o tmp.ps');
+    dos('gsview32 tmp.ps &');
+  end
+else
+  
+  
+  make_file(G, filename, node_label, arc_label, width, height, leftright, directed);
+end
+
+
+%%%%%%
+
+function make_file(G, filename, node_label, arc_label, width, height, leftright, directed)
+
+n = length(G);
+fid = fopen(filename, 'w');
+if directed
+  fprintf(fid, 'digraph G {\n');
+else
+  fprintf(fid, 'graph G {\n');
+end
+fprintf(fid, 'center = 1;\n');
+fprintf(fid, 'size=\"%d,%d\";\n', width, height);
+if leftright
+  fprintf(fid, 'rankdir=LR;\n');
+end
+for i=1:n
+  if isempty(node_label)
+    fprintf(fid, '%d;\n', i);
+  else
+    fprintf(fid, '%d [ label = "%s" ];\n', i, node_label{i});
+  end
+end
+if directed
+  for i=1:n
+    cs = children(G,i);
+    for j=1:length(cs)
+      c = cs(j);
+      if isempty(arc_label)
+	fprintf(fid, '%d -> %d;\n', i, c);
+      else
+	fprintf(fid, '%d -> %d [label="%s"];\n', i, c, arc_label{i,c});
+      end
+    end
+  end
+else
+  for i=1:n
+    ns = intersect(neighbors(G,i), i+1:n); % remove duplicate arcs
+    for j=1:length(ns)
+      c = ns(j);
+      if isempty(arc_label)
+	fprintf(fid, '%d -- %d [dir=none];\n', i, c);
+      else
+	fprintf(fid, '%d -- %d [label="%s",dir=none];\n', i, c, arc_label{i,c});
+      end
+    end
+  end
+end
+fprintf(fid, '\n}');
+fclose(fid);
+
+
+
+%%%%%%%%%%%%%%%
+
+function cs = children(adj_mat, i, t)
+% CHILDREN Return the indices of a node's children in sorted order
+% c = children(adj_mat, i, t)
+%
+% t is an optional argument: if present, dag is assumed to be a 2-slice DBN
+
+if nargin < 3 
+  cs = find(adj_mat(i,:));
+else
+  if t==1
+    cs = find(adj_mat(i,:));
+  else
+    ss = length(adj_mat)/2;
+    j = i+ss;
+    cs = find(adj_mat(j,:)) + (t-2)*ss;
+  end
+end
+
+%%%%%%%%%%%%
+
+function ps = parents(adj_mat, i)
+% PARENTS Return the list of parents of node i
+% ps = parents(adj_mat, i)
+
+ps = find(adj_mat(:,i))';
+
+%%%%%%%%%%%%%
+
+function ns = neighbors(adj_mat, i)
+% NEIGHBORS Find the parents and children of a node in a graph.
+% ns = neighbors(adj_mat, i)
+
+ns = union(children(adj_mat, i), parents(adj_mat, i));
+
+
+