diff m-toolbox/classes/@history/hist2m.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/hist2m.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,134 @@
+% HIST2M writes a new m-file that reproduces the analysis described in the history object.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: HIST2M writes a new m-file that reproduces the analysis described
+%              in the history object.
+%
+% CALL:        cmds = hist2m(h);
+%
+% INPUT:       h    - history object
+%
+% OUTPUT:      cmds - cell array with the commands to reproduce the data
+%
+% VERSION:     $Id: hist2m.m,v 1.49 2011/03/29 13:40:16 hewitson Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function cmds = hist2m(varargin)
+  
+  import utils.const.*
+  utils.helper.msg(msg.PROC3, 'running %s/%s', mfilename('class'), mfilename);
+  
+  % Get history objects
+  hists = varargin{1};
+  
+  if nargin >= 2
+    pl = combine(varargin{2}, getDefaultPlist());
+  else
+    pl  = getDefaultPlist();
+  end
+  
+  % Created contains the epochtime in millisecounds and CREATED2INT define
+  % the number of the last digits
+  CREATED2INT = 1e7;
+  
+  % get a node list
+  utils.helper.msg(msg.PROC1, 'extracting node list from history');
+  [n,a, nodes] = getNodes(hists, pl.find('stop_option'));
+  utils.helper.msg(msg.PROC1, 'converting history nodes to commands');
+  % loop over nodes and convert to commands
+  i = 1;
+  cmds = {};
+  while i <= length(nodes)
+    v      = nodes(i).n;
+    idx    = find([nodes(:).pn] == i);
+    pl     = nodes(i).pl;
+    aoName = mod(nodes(i).h.proctime,CREATED2INT);
+    hi     = [nodes(idx).h];
+    iNames = zeros(size(hi));
+    for j=1:length(hi)
+      created = hi(j).proctime; %get(hi(j), 'created');
+      iNames(j) =  mod(created,CREATED2INT);
+    end
+    cmd = writeCmd(char(nodes(i).names), pl, aoName, iNames, nodes(i).h.methodInfo.mclass);
+    if ~iscell(cmd), cmd = {cmd}; end
+    utils.helper.msg(msg.PROC2, 'wrote command for node %d [%s]', i, char(nodes(i).names));
+    for kk=1:numel(cmd)
+      utils.helper.msg(msg.PROC3, 'command: %s', cmd{kk});
+    end
+    cmds = {cmds{:} cmd{:}};
+    i = i + 1;
+  end
+  
+  % now find commands that are duplicated after the '=' and remap those
+  utils.helper.msg(msg.PROC1, 'fixing duplicate commands');
+  ncmds = length(cmds);
+  for j = 1:ncmds
+    cmdj = cmds{j};
+    % now inspect all other commands prior to this one
+    for k = j+1:ncmds
+      cmdk = cmds{k};
+      if strcmp(cmdj, cmdk)
+        cmds{j} = '';
+      end
+    end
+  end
+  % remove empty commands
+  cmds = cmds(~strcmp('', cmds));
+  
+  utils.helper.msg(msg.PROC1, 'writing output line');
+  % add the final command to produce a_out
+  alast = deblank(strtok(cmds{1}, '='));
+  cmds  = [cellstr(sprintf('a_out = %s;', alast)) cmds];
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                               Local Functions                               %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+% FUNCTION:    writeCmd                                                       %
+%                                                                             %
+% DESCRIPTION: write a command-line                                           %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function cmd = writeCmd(name, pl, aon, ains,methodclass)
+  
+  ainsStr = '';
+  % for i=length(ains):-1:1
+  ni = length(ains);
+  for i=1:ni
+    ainsStr = [ainsStr sprintf('a%d, ', ains(i))];
+  end
+  
+  name = strrep(name, '\_', '_');
+  
+  if ~isempty(pl)
+    % convert plist to commands
+    cmd = plist2cmds(pl);
+    % the last command will go as input to the method command
+    [s,plstr] = strtok(cmd{1});
+    plstr = strtrim(plstr);
+    cmd = [ sprintf('a%d = %s(%s%s); %% %s', ...
+      aon, name, ainsStr, strtrim(plstr(2:end-1)),methodclass) cmd(2:end)];
+  else
+    ainsStr = ainsStr(1:end-2);
+    cmd = sprintf('a%d = %s(%s);', aon, name, ainsStr);
+  end
+  
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% FUNCTION:    getDefaultPlist
+%
+% DESCRIPTION: Get Default Plist
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function plo = getDefaultPlist()
+  plo = plist('stop_option', 'full');
+end
+