diff m-toolbox/classes/@matrix/linearize.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/@matrix/linearize.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,158 @@
+% LINEARIZE output the derivatives of the model relative to the parameters.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: LINEARIZE output the derivatives of the model relative to
+% the parameters. Output is a collection of models corresponding to the
+% derivative of input model for each parameter
+%
+% CALL:        dmod = linearize(imod)
+%
+% <a href="matlab:utils.helper.displayMethodInfo('matrix', 'linearize')">Parameters Description</a>
+%
+% VERSION:     $Id: linearize.m,v 1.14 2011/04/08 08:56:31 hewitson Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+function varargout = linearize(varargin)
+
+  % utils.helper.msg(msg.PROC3, 'running %s/%s', mfilename('class'), mfilename);
+
+  % 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 smodels and plists
+  [as, matrix_invars, rest] = utils.helper.collect_objects(varargin(:), 'matrix', in_names);
+  [pl, pl_invars, rest]     = utils.helper.collect_objects(rest(:), 'plist', in_names);
+
+  % Merge with default plist
+  pl = parse(pl, getDefaultPlist);
+
+  % get parameters and make sure we are working with a cell array
+  pnames = find(pl,'Params');
+  if isa(pnames, 'char')
+    pnames = {pnames};
+  end
+  
+  % decide if sorting
+  sorting = find(pl,'Sorting');
+  if sorting
+    pnames = sort(pnames);
+  end
+
+  % loop over input matrices
+  dmod(numel(as),1)=collection;
+  for ww=1:numel(as)
+    imod=as(ww);
+    if strcmpi(class(imod.objs(1)),'smodel')
+      % a matrix of smodels is assumed
+      % join params
+      
+      if isempty(pnames) % linearize with respect to all model parameters
+        % store a common set of parameters for mod, it is needed for
+        % the derivative
+        [rw,cl] = size(imod.objs);
+        % loop over dimensions
+        mpars = {};
+        mvals = {};
+        for aa = 1:rw
+          for bb = 1:cl
+            obj = imod.objs(aa,bb);
+            [mpars,id1,id2] = union(mpars,obj.params);
+            nom1 = mvals(id1);
+            nom2 = obj.values(id2);
+            mvals = [nom1 nom2];
+          end
+        end
+        for ff = 1:numel(imod.objs)
+          imod.objs(ff).setParams(mpars,mvals);
+        end
+
+        % it is assumed a common set of parameters for the matrix object
+        pnames = imod.objs(1).params;
+      end %isempty(pnames)
+
+      % get matrix dimension
+      [rw,cl] = size(imod.objs);
+
+      % start linearization
+      for ii = 1:numel(pnames)
+        tmod = copy(imod,1);
+        for jj = 1:rw
+          for kk = 1:cl
+            tmod.objs(jj,kk) = diff(imod.objs(jj,kk),pnames{ii}); % do symbolic derivative for smodel
+            tmod.objs(jj,kk).setName(sprintf('d{%s}/d{%s}',imod.objs(jj,kk).name,pnames{ii}));
+          end
+        end
+        % set the name of the parameter to the matrix, this is important to
+        % identify automatically to what derivatives we are referring
+        tmod.setName(pnames{ii});
+        %       dmod.addObjects(tmod);
+        dmod(ww).addObjects(tmod);
+      end
+      dmod(ww).setName(sprintf('linearize(%s)',imod.name));
+    else
+      error('Only matrix of smodels supported at the moment')
+    end %strcmpi(class(imod.objs(1)),'smodel')
+
+  end
+
+  if nargout == 1
+    varargout{1} = dmod;
+  elseif nargout == numel(as)
+    % List of outputs
+    for ii = 1:numel(as)
+      varargout{ii} = dmod.index(ii);
+    end
+  else
+    error('Set at least one output value')
+  end
+
+end
+
+%--------------------------------------------------------------------------
+% Get Info Object
+%--------------------------------------------------------------------------
+function ii = getInfo(varargin)
+
+  if nargin == 1 && strcmpi(varargin{1}, 'None')
+    sets = {};
+    pls  = [];
+  else
+    sets = {'Default'};
+    pls  = getDefaultPlist;
+  end
+  % Build info object
+  ii = minfo(mfilename, 'matrix', 'ltpda', utils.const.categories.op, '$Id: linearize.m,v 1.14 2011/04/08 08:56:31 hewitson Exp $', sets, pls);
+  ii.setModifier(false);
+end
+
+%--------------------------------------------------------------------------
+% 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();
+  
+  p = param({'Params', ['Cell array with parameters names with respect to linearize. <br>' ...
+    'Leave it empty to linearize with respect to all model parameters']}, paramValue.EMPTY_DOUBLE);
+  pl.append(p);
+  
+  p = param({'Sorting', ' Decide to sort the lits of input parameters'}, paramValue.TRUE_FALSE);
+  pl.append(p);
+
+end