diff m-toolbox/sltpda/sltpda_execute_loops.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/sltpda/sltpda_execute_loops.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,221 @@
+function sltpda_execute_loops(model)
+% SLTPDA_EXECUTE_LOOPS runs all the loops in the input data-analysis pipeline.
+% If not loops are present, then the pipeline is executed once.
+% 
+% Usage: sltpda_execute_loops(model)
+% 
+% M Hewitson 12-06-07
+% 
+% $Id: sltpda_execute_loops.m,v 1.2 2007/06/13 08:47:28 hewitson Exp $
+% 
+
+% Make sure the model is open
+open_system(model);
+
+if sltpda_verify_model(model)
+  
+  global sltpda_loop_plotTitle;
+  
+  % parse model file
+  cmds  = sltpda_parse_model(model);
+  save 'cmds.mat' cmds
+  ncmds = length(cmds);
+  
+  % get loops 
+  loops = sltpda_buildloops(model)
+  save 'loops.mat' loops
+  nloops = length(loops);
+  % how many loops switched on
+  non = 0;
+  for j=1:nloops
+    if strcmp(loops(j).on, 'on')
+      non = non + 1;
+    end
+  end
+  % go through each loop
+  if nloops > 0 && non > 0
+    
+    % convert the loops to a set of substitution commands
+    subs = loops2subs(loops);
+    
+    % Now run levels
+    l1idx = find([subs.level] == 1);
+    l2idx = find([subs.level] == 2);
+    l3idx = find([subs.level] == 3);
+
+    for l1=l1idx
+      if isempty(l2idx)
+        ll = [l1];
+        % command substitution
+        runLoop2(cmds, subs(ll))        
+      else
+        for l2=l2idx
+          if isempty(l3idx)
+            ll = [l1 l2];
+            % command substitution
+            runLoop2(cmds, subs(ll))            
+          else
+            for l3=l3idx
+              ll = [l1 l2 l3];
+              
+              
+
+              
+              % command substitution
+              runLoop2(cmds, subs(ll))
+            end
+          end
+        end
+      end
+    end
+
+%     for l=1:nloops
+%       % - for each loop we need to adjust the parameters of the model
+%       % - look for the command to modify then set the parameter
+%       loop = loops(l);
+%       if strcmp(loop.on, 'on')
+%         values = str2num(loop.values);
+%         if isempty(values)
+%           values = loop.values;
+%         end
+%         nvals = length(values);
+%         for v=1:nvals
+%           % set sltpda_loop_plotTitle
+%           if isnumeric(values(v))
+%             sltpda_loop_plotTitle = ['loop_' loop.key '_' num2str(values(v))];
+%           else
+%             sltpda_loop_plotTitle = ['loop_' loop.key '_' values(v)];
+%           end
+%           runLoop(cmds, str2num(loop.handle), loop.key, values(v));
+%         end
+%       end
+%     end
+  else
+    runLoop2(cmds, []);
+%     runLoop(cmds, [], [], []);
+  end
+end
+
+
+%--------------------------------------------------------------------------
+% Run a loop around a set of commands
+% 
+function runLoop2(cmds, subs)
+
+
+global sltpda_loop_plotTitle;
+
+% evaluate each command
+% - here we can set the waitbar caption to display the current
+% - parameter name and value
+disp('-----------------------------------------------------------')
+sltpda_loop_plotTitle = [];
+h  = waitbar(0,'Executing pipeline...');
+nc = length(cmds);
+for j=1:nc
+  cmd = cmds(j);
+  if isempty(subs)
+    sidx = [];
+  else
+    sidx = find(cmd.handle == [subs.handle]);
+  end
+  for k=1:length(sidx)
+%     cmd
+    key = subs(sidx(k)).key;
+    val = subs(sidx(k)).value;
+    if isnumeric(val)
+      valstr = mat2str(val);
+    else
+      valstr = char(val);
+    end
+    sltpda_loop_plotTitle = [sltpda_loop_plotTitle ' / ' key ':' valstr];
+    if iscell(val)
+      val = char(val);
+    end
+    disp('^^^ performing parameter substitution.');
+    pl = cmd.plist;
+    pl = set(pl, key, val);
+    params = string(pl);
+    newcmd = sltpda_buildCmd(cmd.ins, cmd.outs, params, cmd.fcn);
+    cmd.cmd = newcmd;
+  end
+  disp(['== executing: ' cmd.cmd]);
+  eval(cmd.cmd);
+  waitbar(j/nc,h)
+end
+delete(h);
+
+disp('-----------------------------------------------------------')
+
+%--------------------------------------------------------------------------
+% convert loops to substitutions
+function subs = loops2subs(loops)
+
+% make empty substitutions; one for each allowed level
+subs = [];
+% subs(1).handle = [];
+% subs(1).level  = 1;
+% subs(1).key    = '';
+% subs(1).value  = [];
+% subs(2).handle = [];
+% subs(2).level  = 2;
+% subs(2).key    = '';
+% subs(2).value  = [];
+% subs(3).handle = [];
+% subs(3).level  = 3;
+% subs(3).key    = '';
+% subs(3).value  = [];
+
+
+k = length(subs)+1;
+for j=1:length(loops)
+  
+  loop = loops(j);
+  ll   = loop.level;
+  
+  % go through each value for this loop
+  vals = loop.values;
+  if ~isempty(str2num(vals))
+    vals = str2num(vals);
+  else
+    vals = str2cells(vals);
+  end
+
+  for v=1:length(vals)
+    eval(sprintf('subs(%d).handle = str2double(loop.handle);', k));
+    eval(sprintf('subs(%d).level  = str2num(loop.level);', k));
+    eval(sprintf('subs(%d).key    = loop.key;', k));
+    eval(sprintf('subs(%d).value  = vals(v);', k));
+
+    k = k + 1;
+  end
+end
+
+%--------------------------------------------------------------------------
+% Run a loop around a set of commands
+% 
+function runLoop(cmds, handle, key, val)
+
+% evaluate each command
+% - here we can set the waitbar caption to display the current
+% - parameter name and value
+h  = waitbar(0,'Executing pipeline...');
+nc = length(cmds);
+for j=1:nc
+  cmd = cmds(j);
+  hval = (1-handle/cmd.handle);
+%   if hval  < 1e-10
+  if handle == cmd.handle
+    cmd
+    disp('^^^ performing parameter substitution.');
+    pl = cmd.plist;
+    pl = set(pl, key, val);
+    params = string(pl);
+    newcmd = sltpda_buildCmd(cmd.ins, cmd.outs, params, cmd.fcn);
+    cmd.cmd = newcmd;
+  end
+  disp(['== executing: ' cmd.cmd]);
+  eval(cmd.cmd);
+  waitbar(j/nc,h)
+end
+delete(h);