diff m-toolbox/classes/@smodel/subs.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/@smodel/subs.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,223 @@
+% SUBS substitutes symbolic parameters with the given values.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: SUBS substitutes symbolic parameters with the given values.
+%
+% CALL:        mdl = mdl.subs(pl)
+%              mdl = mdl.subs('all')       % Substitutes all parameters
+%              mdl = mdl.subs('a', 'b')    % Substitutes the parameters 'a' and
+%                                            'b' with their default values
+%              mdl = mdl.subs({'a', 'b'})  % Substitutes the parameters 'a' and
+%                                            'b' with their default values
+%              mdl = mdl.subs('a', 33)     % Substitutes the parameters 'a'
+%                                            with 33
+%              mdl = mdl.subs({'a'}, {33}) % Substitutes the parameters 'a'
+%                                            with 33
+%
+% Examples
+% --------
+%
+% 1)   m = subs(m, plist('Params', 'all')) % substitute all default values
+% 2)   m = subs(m, plist('Params', {'a', 'b'}, 'Values',{1, 1:10})) % substitute
+%                                                            values
+% 3)   m = subs(m, plist('Params', {'a', 'b'})) % substitute default values
+%
+% <a href="matlab:utils.helper.displayMethodInfo('smodel', 'subs')">Parameters Description</a>
+%
+% VERSION:     $Id: subs.m,v 1.11 2011/04/08 08:56:28 hewitson Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function varargout = subs(varargin)
+  
+  %%% Check if this is a call for parameters
+  if utils.helper.isinfocall(varargin{:})
+    varargout{1} = getInfo(varargin{3});
+    return
+  end
+  
+  % Collect input variable names
+  in_names = cell(size(varargin));
+  for ii = 1:nargin,in_names{ii} = inputname(ii);end
+  
+  % Collect all AOs and plists
+  [mdls, mdl_invars, rest] = utils.helper.collect_objects(varargin(:), 'smodel', in_names);
+  [pls,  pl_invars,  rest] = utils.helper.collect_objects(rest, 'plist', in_names);
+  
+  % combine plists
+  pl = combine(pls, getDefaultPlist());
+  
+  % Check if the user uses a plist or not
+  if isempty(pls) && ~isempty(rest)
+    % The user doesn't use a input plist
+    iparams     = {};
+    ivals       = {};
+    iexceptions = {};
+    % Collect each character or cellstr in 'rest' as a parameter
+    % Collect each integer of numeric cell 
+    for ii=1:numel(rest)
+      if ischar(rest{ii}) && strcmp(rest{ii}, 'all') && ii == 1
+        iparams = 'all';
+        break;
+      elseif ischar(rest{ii})
+        iparams = [iparams rest{ii}];
+      elseif iscellstr(rest{ii})
+        iparams = [iparams rest{ii}];
+      elseif isnumeric(rest{ii})
+        ivals = [ivals rest{ii}];
+      elseif iscell(rest{ii})
+        c = rest{ii};
+        for kk=1:numel(c)
+          if isnumeric(c{kk}), ivals = [ivals c{kk}]; end
+        end
+      end
+    end
+    pl.pset('params', iparams);
+    pl.pset('values', ivals);
+    
+  else
+    % The user uses a input plist
+    iparams     = find(pl, 'params');
+    ivals       = find(pl, 'values');
+    iexceptions = find(pl, 'exceptions');
+  end
+  
+  %
+  
+  % Loop over input models
+  bs = copy(mdls, nargout);
+  for j=1:numel(mdls)
+    
+    mdl = bs(j);
+    
+    if ischar(iparams)
+      if strcmpi(iparams, 'all')
+        iparams = mdl.params;
+        ivals   = mdl.values;
+      else
+        iparams = {iparams};
+      end
+    end
+    
+    if isempty(ivals)
+      ivals = {};
+      % get values from the model
+      for ll=1:numel(iparams)
+        idx = find(strcmp(iparams{ll}, mdl.params));
+        ivals = [ivals mdl.values(idx)];
+      end
+    end
+    
+    % remove the exceptions from the params list
+    if ~isempty(iexceptions)
+      idx = ismember(iparams, iexceptions);
+      iparams = iparams(~idx);
+      ivals   = ivals(~idx);
+    end
+    
+    if isempty(ivals) && ~strcmpi(iparams, 'all')
+      error('### Please specify one value per parameter to substitute.');
+    end
+    if ~ischar(iparams) && numel(iparams) ~= numel(ivals)
+      error('### Please specify one value per parameter to substitute.');
+    end
+    
+    if ~iscell(ivals)
+      ivals = {ivals};
+    end
+    
+    if numel(iparams) ~= numel(ivals)
+      error('### The number of parameters and values doesn''t match for model %s', mdl.name);
+    end
+    
+    % Get remaining parameters and values for the output model
+    oparams = {};
+    ovals   = {};
+    for kk=1:numel(mdl.params)
+      if ~utils.helper.ismember(mdl.params{kk}, iparams)
+        oparams = [oparams mdl.params(kk)];
+        if ~isempty(mdl.values)
+          ovals   = [ovals mdl.values(kk)];
+        end
+      end
+    end
+    
+    if ~isempty(iparams) && ~isnumeric(mdl.expr)
+      mdl.expr = subs(mdl.expr, iparams, ivals);
+      mdl.values = ovals;
+      mdl.params = oparams;
+      % add history
+      mdl.addHistory(getInfo('None'), pl, mdl_invars(j), mdls(j).hist);
+    end
+    
+  end
+  
+  % Set outputs
+  varargout{1} = bs;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                               Local Functions                               %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% FUNCTION:    getInfo
+%
+% DESCRIPTION: Get Info Object
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function ii = getInfo(varargin)
+  if nargin == 1 && strcmpi(varargin{1}, 'None')
+    sets = {};
+    pl   = [];
+  else
+    sets = {'Default'};
+    pl   = getDefaultPlist;
+  end
+  % Build info object
+  ii = minfo(mfilename, 'smodel', 'ltpda', utils.const.categories.helper, '$Id: subs.m,v 1.11 2011/04/08 08:56:28 hewitson Exp $', sets, pl);
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% FUNCTION:    getDefaultPlist
+%
+% DESCRIPTION: Get Default Plist
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function plout = getDefaultPlist()
+  persistent pl;  
+  if exist('pl', 'var')==0 || isempty(pl)
+    pl = buildplist();
+  end
+  plout = pl;  
+end
+
+function pl = buildplist()
+  
+  pl = plist();
+  
+  % Params
+  p = param({'Params', 'The parameters to substitute for.<br>Specify ''all'' to substitute all.'}, {1, {'all'}, paramValue.OPTIONAL});
+  pl.append(p);
+  
+  % Values
+  p = param({'values', 'A cell-array of values to set that overide the defaults.'}, {1, {{}}, paramValue.OPTIONAL});
+  pl.append(p);
+  
+  % Exceptions
+  p = param({'exceptions', 'A cell-array of parameters which will not be substitute.'}, paramValue.EMPTY_CELL);
+  pl.append(p);
+  
+end
+
+%
+% PARAMETERS:  'Params' - A cell array of the parameter names to
+%                         substitute. If you specify 'all' for this
+%                         parameter, then the current values of mdl.params
+%                         will be substituted.
+%              'Values' - The values to substitute.
+%