Mercurial > hg > ltpda
diff m-toolbox/classes/@smodel/smodel.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children | a71a40911c27 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@smodel/smodel.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,509 @@ +% SMODEL constructor for smodel class. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: SMODEL constructor for smodel class. +% +% CONSTRUCTOR: +% +% mdl = smodel() - creates an empty smodel object +% mdl = smodel('foo.mu') - construct from MuPAD file +% mdl = smodel('expression') - construct from a expression +% description +% +% <a href="matlab:utils.helper.displayMethodInfo('smodel', 'smodel')">Parameters Description</a> +% +% VERSION: $Id: smodel.m,v 1.42 2011/08/15 13:02:26 hewitson Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +classdef smodel < ltpda_uoh + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Property definition % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %---------- Public (read/write) Properties ---------- + properties + end + + %---------- Protected read-only Properties ---------- + properties (SetAccess = protected) + expr = msym(''); % Expression of the model + params = {}; % Parameters which are used in the model + values = {}; % Default values for the parameters + trans = {}; % Transformation strings mapping xvals in terms of xvar to X in the model + aliasNames = {}; % {'v', 'H'}; + aliasValues = {}; % {'a*b', [1:20]}; + xvar = {}; % Cell-array with x-variable(s) + xvals = {}; % Cell-array of double-values for the different x-variable(s) + xunits = unit; % vector of units of the different x-axis + yunits = unit; % units of the y-axis + end + + %---------- Private Properties ---------- + properties (GetAccess = protected, SetAccess = protected) + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Check property setting % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + methods + %--- trans + function set.trans(obj, val) + if isempty(val) + if ~isempty(obj.trans) + % Get the default value of the property from the meta data + m = metaclass(obj); + p = [m.Properties{:}]; + dv = p(strcmp({p(:).Name}, 'trans')).DefaultValue; + obj.trans = dv; + end + elseif iscell(val) + obj.trans = val; + elseif ischar(val) + obj.trans = {val}; + elseif isnumeric(val) + obj.trans = {num2str(val)}; + else + error('### The value for the property ''trans'' must be a cell-array. But it is from class [%s]', class(val)); + end + end + %--- expr + function set.expr(obj, val) + if ischar(val) + obj.expr = msym(val); + elseif isa(val, 'msym') + obj.expr = val; + else + error('### The value for the property ''expr'' must be a MSYM object. But it is from class [%s]', class(val)); + end + end + %--- params + function set.params(obj, val) + if isempty(val) + if ~isempty(obj.params) + % Get the default value of the property from the meta data + m = metaclass(obj); + p = [m.Properties{:}]; + dv = p(strcmp({p(:).Name}, 'params')).DefaultValue; + obj.params = dv; + end + elseif iscellstr(val) + obj.params = val; + elseif ischar(val) + obj.params = cellstr(val); + else + error('### The value for the property ''params'' must be a cell of strings. But it is from class [%s]', class(val)); + end + end + %--- values + function set.values(obj, val) + if iscell(val) + obj.values = val; + elseif isnumeric(val) + obj.values = num2cell(reshape(val, 1, [])); + else + error('### The value for the property ''values'' must be a cell of numbers. But it is from class [%s]', class(val)); + end + end + %--- aliasNames + function set.aliasNames(obj, val) + if isempty(val) + if ~isempty(obj.aliasNames) + % Get the default value of the property from the meta data + m = metaclass(obj); + p = [m.Properties{:}]; + dv = p(strcmp({p(:).Name}, 'aliasNames')).DefaultValue; + obj.aliasNames = dv; + end + elseif ischar(val) + obj.aliasNames = cellstr(val); + elseif iscell(val) + obj.aliasNames = val; + else + error('### The value for the property ''aliasNames'' must be a cell of strings. But it is from class [%s]', class(val)); + end + end + %--- aliasValues + function set.aliasValues(obj, val) + if isempty(val) + if ~isempty(obj.aliasValues) + % Get the default value of the property from the meta data + m = metaclass(obj); + p = [m.Properties{:}]; + dv = p(strcmp({p(:).Name}, 'aliasValues')).DefaultValue; + obj.aliasValues = dv; + end + elseif isnumeric(val) + obj.aliasValues = num2cell(reshape(val, 1, [])); + elseif ischar(val) + obj.aliasValues = cellstr(val); + elseif isa(val,'smodel') + obj.aliasValues = cell(val); + elseif iscell(val) + obj.aliasValues = val; + else + error('### The value for the property ''values'' must be a cell of numbers, strings or smodels. But it is from class [%s]', class(val)); + end + end + %--- xvar + function set.xvar(obj, val) + % Convert a string into a cell-array. This is necessary for backwards compatibility + if isempty(val) + if ~isempty(obj.xvar) + % Get the default value of the property from the meta data + m = metaclass(obj); + p = [m.Properties{:}]; + dv = p(strcmp({p(:).Name}, 'xvar')).DefaultValue; + obj.xvar = dv; + end + elseif iscell(val) + obj.xvar = val; + elseif ischar(val) + obj.xvar = cellstr(val); + else + error('### The value for the property ''xvar'' must be a string or a cell array of strings. But it is from class [%s]', class(val)); + end + end + %--- xvals + function set.xvals(obj, val) + % Convert the value into a cell-array. This is necessary for backwards compatibility + if isempty(val) + if ~isempty(obj.xvals) + % Get the default value of the property from the meta data + m = metaclass(obj); + p = [m.Properties{:}]; + dv = p(strcmp({p(:).Name}, 'xvals')).DefaultValue; + obj.xvals = dv; + end + elseif iscell(val) + obj.xvals = val; + elseif isnumeric(val) + obj.xvals = {val}; + elseif isa(val, 'ao') + obj.xvals = {val.data.y}; + else + error('### The value for the property ''xvals'' must be a cell-array. But it is from class [%s]', class(val)); + end + end + %--- xunits + function set.xunits(obj, val) + switch class(val) + case 'char' + obj.xunits = unit(val); + case 'unit' + obj.xunits = val; + case 'cell' + obj.xunits = unit(val{:}); + otherwise + error('### The value for the property ''xunits'' must be a array of unit-object(s)'); + end + end + %--- yunits + function set.yunits(obj, val) + if ischar(val) + obj.yunits = unit(val); + elseif isa(val, 'unit') + obj.yunits = val; + else + error('### The value for the property ''yunits'' must be a unit-object or a string'); + end + end + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Constructor % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + methods + function obj = smodel(varargin) + + import utils.const.* + utils.helper.msg(msg.OMNAME, 'running %s/%s', mfilename('class'), mfilename); + + % Collect all smodel objects + [mdls, invars, rest] = utils.helper.collect_objects(varargin(:), 'smodel'); + + if isempty(rest) && ~isempty(mdls) + % Do copy constructor and return + utils.helper.msg(msg.OPROC1, 'copy constructor'); + obj = copy(mdls, 1); + for kk=1:numel(obj) + obj(kk).addHistory(smodel.getInfo('smodel', 'None'), [], [], obj(kk).hist); + end + return + end + + switch nargin + case 0 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%% no input %%%%%%%%%%%%%%%%%%%%%%%%%%%* + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + utils.helper.msg(msg.OPROC1, 'empty constructor'); + obj.addHistory(smodel.getInfo('smodel', 'None'), plist(), [], []); + + case 1 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%% One input %%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if ischar(varargin{1}) + %%%%%%%%%% mdl = smodel('foo.mat') %%%%%%%%%% + %%%%%%%%%% mdl = smodel('foo.xml') %%%%%%%%%% + %%%%%%%%%% mdl = smodel('foo.mu') %%%%%%%%%% + + % Is this a file? + [path, name, ext] = fileparts(varargin{1}); + + if ismember(ext, {'.xml', '.mat', '.txt', '.dat', '.fil'}) + utils.helper.msg(msg.OPROC1, 'constructing from file %s', varargin{1}); + obj = obj.fromFile(varargin{1}); + else + obj = obj.fromExpression(plist('expression', varargin{1})); + end + + elseif isnumeric(varargin{1}) + %%%%%%%%%% mdl = smodel(123) %%%%%%%%%% + obj = obj.fromExpression(plist('expression', varargin{1})); + + elseif isstruct(varargin{1}) + %%%%%%%%%% mdl = smodel(struct) %%%%%%%%%% + utils.helper.msg(msg.OPROC1, 'constructing from struct'); + obj = obj.fromStruct(varargin{1}); + + elseif isa(varargin{1}, 'sym') + %%%%%%%%%% mdl = smodel(symbolic-object) %%%%%%%%%% + utils.helper.msg(msg.OPROC1, 'constructing from symbol'); + obj = obj.fromSymbol(plist('symbol', varargin{1})); + + elseif isa(varargin{1}, 'plist') + %%%%%%%%%% mdl = smodel(plist-object) %%%%%%%%%% + + pl = varargin{1}; + + if pl.isparam('expression') + utils.helper.msg(msg.OPROC1, 'constructing from expression'); + obj = obj.fromExpression(pl); + + elseif pl.isparam('filename') + utils.helper.msg(msg.OPROC1, 'constructing from filename [%s]', pl.find('filename')); + obj = obj.fromFile(pl); + + elseif pl.isparam('hostname') || pl.isparam('conn') + utils.helper.msg(msg.OPROC1, 'constructing from repository %s', pl.find('hostname')); + obj = obj.fromRepository(pl); + + elseif pl.isparam('built-in') + utils.helper.msg(msg.OPROC1, 'constructing from built-in model'); + obj = fromModel(obj, pl); + + else + obj.setObjectProperties(pl); + obj.addHistory(smodel.getInfo('smodel', 'None'), pl, [], []); + end + + else + error('### Unknown single argument constructor.'); + end + + case 2 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%% two input %%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (isa(varargin{1}, 'database') || isa(varargin{1}, 'mpipeline.repository.RepositoryConnection')) && isnumeric(varargin{2}) + %%%%%%%%%% mdl = smodel(<database-object>, [IDs]) %%%%%%%%%% + obj = obj.fromRepository(plist('conn', varargin{1}, 'id', varargin{2})); + + elseif isa(varargin{1}, 'smodel') && isa(varargin{2}, 'plist') && isempty(varargin{2}.params) + %%%%%%%%%% f = smodel(smodel, <empty-plist>) %%%%%%%%%% + obj = smodel(varargin{1}); + + elseif isa(varargin{1}, 'org.apache.xerces.dom.DeferredElementImpl') && ... + isa(varargin{2}, 'history') + %%%%%%%%%% obj = smodel(DOM node, history-objects) %%%%%%%%%% + obj = fromDom(obj, varargin{1}, varargin{2}); + + elseif isa(varargin{1}, 'ltpda_uoh') && isa(varargin{2}, 'plist') + %%%%%%%%%%% smodel(<ltpda_uoh>-object, plist-object) %%%%%%%%%% + % always recreate from plist + + % If we are trying to load from file, and the file exists, do + % that. Otherwise, copy the input object. + if varargin{2}.isparam('filename') + if exist(fullfile('.', find(varargin{2}, 'filename')), 'file')==2 + obj = smodel(varargin{2}); + else + obj = smodel(varargin{1}); + end + else + obj = smodel(varargin{2}); + end + else + error('### Unknown 2 argument constructor.'); + end + + otherwise + [mdls, invars, rest] = utils.helper.collect_objects(varargin, 'smodel'); + + %%% Do we have a list of smodels as input + if ~isempty(mdls) && isempty(rest) + obj = smodel(mdls); + else + error('### Unknown number of arguments.'); + end + end + + end % End constructor + end % End public methods + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (Public, hidden) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + methods (Hidden = true) + varargout = attachToDom(varargin) + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (protected) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + methods (Access = protected) + varargout = fromDatafile(varargin) + varargout = fromStruct(varargin) + varargout = fromDom(varargin) + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (private) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + methods (Access = private) + % Constructors + varargout = fromExpression(varargin) + + % Others + varargout = sop(varargin) + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (static) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + methods (Static) + + function mdls = getBuiltInModels(varargin) + mdls = ltpda_uo.getBuiltInModels('smodel'); + end + + function out = VEROUT() + out = '$Id: smodel.m,v 1.42 2011/08/15 13:02:26 hewitson Exp $'; + end + + function ii = getInfo(varargin) + ii = utils.helper.generic_getInfo(varargin{:}, 'smodel'); + end + + function out = SETS() + out = [SETS@ltpda_uoh, ... + {'From Expression'}, ... + {'From ASCII File'}]; + end + + + function plout = getDefaultPlist(set) + persistent pl; + persistent lastset; + if ~exist('pl', 'var') || isempty(pl) || ~strcmp(lastset, set) + pl = smodel.buildplist(set); + lastset = set; + end + plout = pl; + end + + function out = buildplist(set) + + if ~utils.helper.ismember(lower(smodel.SETS), lower(set)) + error('### Unknown set [%s]', set); + end + + out = plist(); + out = smodel.addGlobalKeys(out); + out = buildplist@ltpda_uoh(out, set); + + switch lower(set) + case 'from expression' + + % Expression + p = param({'expression','Expression of the model.'}, paramValue.EMPTY_STRING); + out.append(p); + + % Params + p = param({'params','Parameters which are used in the model.'}, {1, {{}}, paramValue.OPTIONAL}); + out.append(p); + + % Values + p = param({'values','Default values for the parameters.'}, {1, {{}}, paramValue.OPTIONAL}); + out.append(p); + + % Xvar + p = param({'xvar','The X-dependent variable.'}, paramValue.EMPTY_STRING); + out.append(p); + + % Xvals + p = param({'xvals','Values for the x-variable.'}, paramValue.EMPTY_CELL); + out.append(p); + + % Yunits + p = param({'yunits','Units of the y output.'}, paramValue.EMPTY_STRING); + out.append(p); + + % Xunits + p = param({'xunits','Units of the x output.'}, paramValue.EMPTY_STRING); + out.append(p); + + case 'from ascii file' + + % Filename + p = param({'filename','ASCII filename.'}, paramValue.EMPTY_STRING); + out.append(p); + + % Xvals + p = param({'xvals','Values for the x-variable.'}, paramValue.EMPTY_CELL); + out.append(p); + + % Yunits + p = param({'yunits','Units of the y output.'}, paramValue.EMPTY_STRING); + out.append(p); + + % Xunits + p = param({'xunits','Units of the x output.'}, paramValue.EMPTY_STRING); + out.append(p); + + end + end % function out = getDefaultPlist(varargin) + + function obj = initObjectWithSize(n,m) + obj = smodel.newarray([n m]); + end + + end % End static methods + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (static, private) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + methods (Static, Access = private) + varargout = elementOp(varargin) + varargout = mergeFields(varargin) + end % End static, private methods + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (static, hidden) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + methods (Static = true, Hidden = true) + varargout = loadobj(varargin) + varargout = update_struct(varargin); + end + +end % End classdef +