diff m-toolbox/classes/@ssm/doSimplify.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/@ssm/doSimplify.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,88 @@
+% DOSIMPLIFY enables to do model simplification. It is a private function
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+% DESCRIPTION: DOSIMPLIFY allows to eliminate input/state/output variables.
+%
+% CALL:        [ssm] = DOSIMPLIFY(ssm, options); (private)
+%
+% INPUTS :
+%             ssm     - a ssm object
+%             options - an options plist
+%
+% OPTIONS :
+% plist with parameters 'inputs', 'states' and 'outputs' to indicate which
+% inputs, states and outputs variables are taken in account. This requires
+% proper variable naming. If a variable called appears more that once it
+% will be used once only.
+% The field may be :
+%              - a cellstr containing the resp. input/state/output *variable* names
+%              - a logical indexing the resp. input/state/output
+%                *variables*. Index is stored in a cell array, each cell
+%                correponding to one input/state/output block.
+%              - a double indexing the resp. input/state/output
+%                *variables*. Index is stored in a cell array, each cell
+%                correponding to one input/state/output block.
+%              - 'ALL', this string indicates all i/o variables will be
+%                given
+%
+% OUTPUTS:
+%           The output array are of size Nsys*Noptions
+% sys_out -  (array of) ssm objects without the specified information
+%
+%
+function varargout = doSimplify(varargin)
+  
+  % Collect all SSMs and plists
+  [sys, ssm_invars, rest] = utils.helper.collect_objects(varargin(:), 'ssm');
+  [pl, invars2, rest]  = utils.helper.collect_objects(rest(:), 'plist');
+  if ~isempty(rest)
+    pl = combine(pl, plist(rest{:}));
+  end
+  pl = combine(pl, getDefaultPlist());
+  
+  if numel(sys) ~= 1
+    error('### Please input (only) one SSM model');
+  end
+  
+  % Decide on a deep copy or a modify, depending on the output
+  sys = copy(sys, nargout);
+  
+  %% retrieving indexes
+  indexInputs  = makePortLogicalIndex( sys.inputs,  find(pl,'inputs') );
+  indexStates  = makePortLogicalIndex( sys.states,  find(pl,'states') );
+  indexOutputs = makePortLogicalIndex( sys.outputs, find(pl,'outputs') );
+  
+  %% pruning the object fields and assigning fields
+  %                                cell_mat   lines wanted    cols wanted
+  sys.amats    = ssm.blockMatPrune(sys.amats, indexStates,    indexStates);
+  sys.bmats    = ssm.blockMatPrune(sys.bmats, indexStates,    indexInputs);
+  sys.cmats    = ssm.blockMatPrune(sys.cmats, indexOutputs,   indexStates);
+  sys.dmats    = ssm.blockMatPrune(sys.dmats, indexOutputs,   indexInputs);
+  
+  sys.inputs   = applyPortLogicalIndex(sys.inputs,  indexInputs );
+  sys.states   = applyPortLogicalIndex(sys.states,  indexStates );
+  sys.outputs  = applyPortLogicalIndex(sys.outputs, indexOutputs );
+  
+  %% output
+  varargout{1} = sys;
+  
+end
+
+
+%--------------------------------------------------------------------------
+% Get Default Plist
+%--------------------------------------------------------------------------
+function pl = getDefaultPlist()
+  pl = plist();
+  
+  p = param({'inputs', 'input index'}, 'ALL');
+  pl.append(p);
+  
+  p = param({'states', 'states index'}, 'ALL');
+  pl.append(p);
+  
+  p = param({'outputs', 'output index'}, 'ALL');
+  pl.append(p);
+  
+end