Mercurial > hg > ltpda
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. +%