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
+