Mercurial > hg > ltpda
view m-toolbox/classes/@smodel/subs.m @ 31:a26669b59d7e database-connection-manager
Update LTPDAworkbench
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Mon, 05 Dec 2011 16:20:06 +0100 |
parents | f0afece42f48 |
children |
line wrap: on
line source
% 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. %