Mercurial > hg > ltpda
diff m-toolbox/classes/@smodel/double.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/double.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,158 @@ +% DOUBLE Returns the numeric result of the model. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: Returns the numeric result of the model. +% +% CALL: num = obj.double +% +% <a href="matlab:utils.helper.displayMethodInfo('smodel', 'double')">Parameters Description</a> +% +% VERSION: $Id: double.m,v 1.21 2011/05/28 05:42:02 mauro Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function d = double(varargin) + + % Check if the method was called by another method + callerIsMethod = utils.helper.callerIsMethod; + + if callerIsMethod + else + % Check if this is a call for parameters + if utils.helper.isinfocall(varargin{:}) + d = getInfo(varargin{3}); + return + end + end + + mdl = varargin{1}; + + % check the model is valid + fld = check_model_fields(mdl); + if ~isempty(fld) + error(['### The field ' fld ' cannot be empty!']); + end + + % Check 'params' and 'values' have the same length + if numel(mdl.params) ~= numel(mdl.values) + error('### The number of parameter names and parameter values must match'); + end + + % Check 'aliasNames' and 'aliasValues' have the same length + if numel(mdl.aliasNames) ~= numel(mdl.aliasValues) + error('### The number of aliase names and alias values must match'); + end + + % Assign locally values for any remaining parameters + getVariables(mdl.params, mdl.values); + + % Assign locally alias names to alias values + getVariables(mdl.aliasNames, mdl.aliasValues); + + % Recover the mapping factor from xvals and xvar + trans = mdl.trans; + + if ~isempty(trans) + warning('The usage of the ''trans'' option is deprecated and will be removed soon. Please use an alias instead!'); + end + + % I need to shape it as the xvar field + oo = ones(size(mdl.xvar)); + if isempty(trans) + scale = 1.0 * oo; + else + for kk = 1:numel(trans) + scale(kk) = eval(trans{kk}); + end + scale = scale .* oo; + end + + % Set local values for the X vector + for kk = 1:numel(mdl.xvar) + if ~isempty(mdl.xvals) + eval(sprintf('%s = scale(%d).*mdl.xvals{%d};', mdl.xvar{kk}, kk, kk)); + else + eval(sprintf('%s = [];', mdl.xvar{kk})); + end + end + + % The actual evaluation + d = eval(mdl.expr.s); + + % Support the case of a constant model + if numel(d) == 1 + % Multiple X variables, choose the first + d = d .* ones(size(mdl.xvals{1})); + end + + if any(isnan(d)) + warning('!!! Data contain y values equal to NaN'); + end + if any(isinf(d)) + warning('!!! Data contain y values equal to Inf'); + end + +end + +%-------------------------------------------------------------------------- +% Check Model Fields are correct +%-------------------------------------------------------------------------- +function fld = check_model_fields(mdl) + + fld = []; + + % Check 'expr' + if isempty(mdl.expr) || isempty(mdl.expr.s) + fld = 'expr'; + return + end + + % Check 'xvar' + if isempty(mdl.xvar) + fld = 'xvar'; + return + end + +end + +%-------------------------------------------------------------------------- +% Assign Variables Values +%-------------------------------------------------------------------------- +function getVariables(nms, vals) + for kk = 1:numel(nms) + assignin('caller', nms{kk}, vals{kk}); + end +end + +%-------------------------------------------------------------------------- +% 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: double.m,v 1.21 2011/05/28 05:42:02 mauro Exp $', sets, pl); +end + +%-------------------------------------------------------------------------- +% Get Default Plist +%-------------------------------------------------------------------------- + +function plout = getDefaultPlist() + persistent pl; + if ~exist('pl', 'var') || isempty(pl) + pl = buildplist(); + end + plout = pl; +end + +function pl = buildplist() + pl = plist.EMPTY_PLIST; +end +