Mercurial > hg > ltpda
diff m-toolbox/classes/@history/hist2dot.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@history/hist2dot.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,255 @@ +% HIST2DOT converts a history object to a 'DOT' file suitable for processing with graphviz +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: HIST2DOT converts a history object to a 'DOT' file suitable for +% processing with graphviz (www.graphviz.org). +% +% CALL: hist2dot(h, 'foo.dot'); +% +% INPUT: h - history object +% foo.dot - file name to view the graphic with the programm +% graphviz +% +% VERSION: $Id: hist2dot.m,v 1.16 2011/02/18 16:48:52 ingo Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = hist2dot(varargin) + + %%% Set inputs + h = varargin{1}; + filename = varargin{2}; + pl = []; + if nargin > 2 + if isa(varargin{3}, 'plist') + pl = varargin{3}; + end + end + pl = combine(pl, getDefaultPlist); + stop_option = find(pl, 'stop_option'); + + %%% Write .dot file + + fd = fopen(filename, 'w+'); + + %%% write header + fprintf(fd, 'digraph G \n{\n'); + + old = 0; + + if old + + [n,a, nodes] = getNodes(h, stop_option); + nodesWritten = {}; + %%% Write block set + fprintf(fd, 'end [label="END"];\n'); + for j=1:length(nodes) + node = nodes(j); + + % tag = + + if ~containsNodeArray(nodesWritten, node) + + % wrap label + % Do some command substitution + fcn = node.names; + shape = 'rectangle'; + fsize = 12; + extras = ''; + + wstr = utils.prog.wrapstring([fcn char(node.params)], 25); + ss = ''; + for s=wstr + ss = [ss '\n' char(s)]; + end + ss = ss(3:end); + fprintf(fd, '%s [%s fontsize=%d shape=%s label="%s"];\n', nodeName(node), extras, fsize, shape, ss); + nodesWritten = [nodesWritten {node.h.UUID}]; + end + end + + %%% Write node list + fprintf(fd, '\n'); + fprintf(fd, '\n'); + + nodesConnected = []; + for j=length(nodes):-1:1 + % disp('----------------') + node = nodes(j); + % node.h + % if ~arrayContainsElement(nodesConnected, node.pn) + if node.pn > 0 + dst = nodes(node.pn); + fprintf(fd, '%s -> %s; # %d\n', nodeName(node), nodeName(dst), dst.pn); + % nodesConnected = [nodesConnected {node.h.UUID}]; + else + fprintf(fd, '%s -> end;\n', nodeName(node)); + end + nodesConnected = [nodesConnected node.pn]; + % end + % disp('----------------') + end + else + + % Get unique history nodes + [hists, links] = getHists(h, [], []); + + % Now write history blocks + fprintf(fd, 'end [label="END"];\n'); + for ll=1:numel(hists) + hist = hists(ll); + + % wrap label + % Do some command substitution + fcn = hist.methodInfo.mname; + shape = 'rectangle'; + fsize = 12; + extras = ''; + + wstr = utils.prog.wrapstring([fcn char(hist.plistUsed)], 25); + ss = ''; + for s=wstr + ss = [ss '\n' char(s)]; + end + ss = ss(3:end); + fprintf(fd, '%s [%s fontsize=%d shape=%s label="%s"];\n', ... + nodeName(hist), ... + extras, fsize, shape, ss); + + end + + fprintf(fd, '\n'); + fprintf(fd, '\n'); + + % Now write links + for kk=1:numel(links) + fprintf(fd, '%s', links{kk}); + end + + fprintf(fd, '%s -> end;\n', nodeName(h)); + end + + %%% close + fprintf(fd, '}\n'); + + %%% Close + fclose(fd); + +end + + +function [hists, links] = getHists(obj, links, hists) + + if isa(obj, 'history') && ~arrayContainsObjects(hists, obj) + pl = obj.plistUsed; + + for kk=1:pl.nparams + + val = pl.params(kk).getVal(); + if isa(val, 'history') + + for jj=1:numel(val) + if ~arrayContainsObjects(hists, val(jj)) + [hists, links] = getHists(val(jj), links, hists); + end + + % write link + l = sprintf('%s -> %s;\n', nodeName(val(jj)), nodeName(obj)); + links = [links {l}]; + end + + + + end + + end + + hists = [hists obj]; + end + + + if isprop(obj, 'hist') + if ~arrayContainsObjects(hists, obj.hist) + [hists, links] = getHists(obj.hist, links, hists); + end + end + + if isprop(obj, 'inhists') + for kk=1:numel(obj.inhists) + if ~arrayContainsObjects(hists, obj.inhists(kk)) + [hists, links] = getHists(obj.inhists(kk), links, hists); + end + + % write link + l = sprintf('%s -> %s;\n', nodeName(obj.inhists(kk)), nodeName(obj)); + links = [links {l}]; + end + end + + +end + +function res = arrayContainsObjects(array, obj) + res = false; + for kk=1:numel(array) + if strcmp(array(kk).UUID, obj.UUID) + res = true; + break; + end + end +end + +function nn = nodeName(node) + + nn = ['node_' strrep(node.UUID, '-', '_')]; + + + +end + +function res = arrayContainsElement(array, element) + + res = any(array == element); + +% res = false; +% for kk=1:numel(array) +% if strcmp(array(kk).UUID, element.UUID) +% res = true; +% break; +% end +% end + +end + +function res = containsNodeArray(nodes, node) + + x = @(c)(strcmp(c, node.h.UUID)); + res = any(cellfun(x, nodes)); + +% res = cellfun('strcmp', nodes, node); + +% res = false; +% for kk=1:numel(nodes) +% if strcmp(nodes{kk}, node.h.UUID) +% res = true; +% break; +% end +% end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Local Functions % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FUNCTION: getDefaultPlist +% +% DESCRIPTION: Get Default Plist +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function plo = getDefaultPlist() + plo = plist('stop_option', 'full'); +end +