view m-toolbox/sltpda/sltpda_execute_loops.m @ 33:5e7477b94d94
database-connection-manager
Add known repositories list to LTPDAPreferences
author
Daniele Nicolodi <nicolodi@science.unitn.it>
date
Mon, 05 Dec 2011 16:20:06 +0100 (2011-12-05)
parents
f0afece42f48
children
line source
+ − 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);