diff toolboxes/FullBNT-1.0.7/GraphViz/draw_hmm.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/draw_hmm.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,117 @@
+function draw_hmm(A, varargin)
+% DRAW_HMM Make a picture of the HMM using dotty
+% function draw_hmm(A, ...)
+%
+% For details on dotty, see http://www.research.att.com/sw/tools/graphviz
+%
+% If A(i,j) > thresh, we draw and arc from state i to state j.
+%
+% Optional arguments (name/value pairs) [default]
+%
+% thresh - [1e-1]
+% obsprob - If B(i,o) > 0, we include "o" in the name of state i.
+%     e.g., if state 5 emits 1,3,7, its label becomes "5: 1 3 7".
+% startprob - ifstartprob(i) > 0, the state name will be prefixed with "+".
+% endprob - if endprob(i) > 0, the state name will be appended with "-".
+% filename - if [], we write to 'tmp.dot', convert this to 'tmp.ps'
+%  using 'dot -Tps tmp.dot -o tmp.ps', and then call ghostview  to display the result.
+%  dot and gv must be on your system path.
+%  If filename ~= [], we just generate the dot file, and do not
+%  convert it to postscript or call ghostview.
+
+[thresh, B, startprob, endprob, filename] = ...
+    process_options(varargin, 'thresh', 1e-1, 'obsprob', [], 'startprob', [], 'endprob', [], ...
+		    'filename', []);
+
+Q = length(A);
+
+arclabel = cell(Q,Q);
+G = zeros(Q,Q);
+for i=1:Q
+  for j=1:Q
+    if A(i,j) < thresh
+      arclabel{i,j} = '';
+    else
+      G(i,j) = 1;
+      arclabel{i,j} = sprintf('%5.3f', A(i,j));
+    end
+  end
+end
+
+
+nodelabel = cell(1,Q);
+for i=1:Q
+  % annotate start/stop states
+  if ~isempty(startprob) & ~approxeq(startprob(i), 0)
+    start = '+';
+  else
+    start = '';
+  end
+  if ~isempty(endprob) & ~approxeq(hmm.endprob(i), 0)
+    stop = '-';
+  else
+    stop = '';
+  end
+  label = sprintf('%s%d%s :', start, i, stop);
+
+  if ~isempty(B)
+    output_label = mk_output_label(B);
+    label = strcat(label, output_label);
+  end
+  
+  nodelabel{i} = label;
+end
+
+
+if isempty(filename)
+  filename = 'tmp.dot';
+  %mkdot(G, filename, arclabel, nodelabel)  
+  graph_to_dot(G, 'filename', filename, 'arc_label', arclabel, 'node_label', nodelabel);
+  fprintf('converting from .ps to .dot\n')
+  !dot -Tps tmp.dot -o tmp.ps
+  !gv tmp.ps &
+else
+  graph_to_dot(G, 'filename', filename, 'arc_label', arclabel, 'node_label', nodelabel);
+  %mkdot(G, filename, arclabel, nodelabel)  
+end
+
+
+%%%%%%%%%
+
+function label = mk_output_label(B)
+
+[Q O] = size(B);
+label = '';
+
+if 0
+  % print most probable symbols
+  for i=1:Q
+    m = max(B(i,:));
+    ndx = find(abs(B(i,:) - repmat(m,1,O)) < 1e-2);
+    %ndx = find(B(i,:)==m);
+    %label = sprintf('%d,', ndx);
+  end
+end
+
+if 0
+  % print prob distrib over all symbols 
+  for o=1:O
+    if approxeq(B(i,o), 0)
+      %
+    else
+      label = strcat(label, sprintf('%d(%3.2f),', o, B(i,o)));
+    end
+  end
+end
+
+if 1
+  % print all non-zero symbols
+  chars = ['a' 'b' 'c'];
+  for o=1:O
+    if approxeq(B(i,o), 0)
+      %
+    else
+      label = strcat(label, sprintf('%s', chars(o)));
+    end
+  end
+end