Mercurial > hg > ltpda
diff m-toolbox/classes/@ssm/reorganize.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/reorganize.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,281 @@ +% REOGANIZE rearranges a ssm object for fast input to BODE, SIMULATE, PSD. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: rearranges a ssm object for fast input to BODE, SIMULATE, PSD. +% +% CALL: sys = reshuffle(sys, plist) +% +% INPUTS: +% 'sys' - ssm object +% 'plist' - plist object +% +% The inputs/states/outputs can only be indexed using a cellstr containing +% block names or port names. +% Then the object can be passed to BODE, SIMULATE, PSD, CPSD, RESP with +% the option "rearrange" turned to "false". These functions will run +% significantly faster. +% +% OUTPUTS: +% +% 'sys' - a ssm object. +% +% <a href="matlab:utils.helper.displayMethodInfo('ssm', 'reorganize')">Parameters Description</a> +% +% VERSION : $Id: reorganize.m,v 1.19 2011/05/23 14:15:44 adrien Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = reorganize(varargin) + %% starting initial checks + + % Check if this is a call for parameters + if utils.helper.isinfocall(varargin{:}) + varargout{1} = getInfo(varargin{3}); + return + end + + utils.helper.msg(utils.const.msg.MNAME, ['running ', mfilename]); + + % Collect input variable names + in_names = cell(size(varargin)); + for ii = 1:nargin,in_names{ii} = inputname(ii);end + + % Collect all SSMs and plists + [sys, ssm_invars, rest] = utils.helper.collect_objects(varargin(:), 'ssm', in_names); + [pli, invars2, rest] = utils.helper.collect_objects(rest(:), 'plist'); + if ~isempty(rest) + pli = pli.combine(plist(rest{:})); + end + + if numel(sys)~=1 + error(['There should be only one input object to ' mfilename]) + end + + %%% Internal call: Only one object + don't look for a plist + internal = strcmp(varargin{end}, 'internal'); + + set = pli.find('set'); + + pli = pli.combine(getDefaultPlist(set)); + + sys = copy(sys, nargout); + + switch(lower(set)) + case 'none' + error('the options "set" HAS to be specified'); + case 'for bode' + inputnames = pli.find('inputs'); + statenames = pli.find('states'); + outputnames = pli.find('outputs'); + sys.reshuffle(inputnames, {}, {}, 'ALL', outputnames, statenames); + case 'for resp' + inputnames = pli.find('inputs'); + statenames = pli.find('states'); + outputnames = pli.find('outputs'); + sys.reshuffle( inputnames, {}, {}, 'ALL', outputnames, statenames); + case 'for simulate' + aos_varnames = find(pli, 'aos variable names'); + cov_varnames = find(pli, 'covariance variable names'); + cpsd_varnames = find(pli, 'CPSD variable names'); + constants_varnames = find(pli, 'constant variable names'); + return_states = find(pli, 'return states'); + return_outputs = find(pli, 'return outputs'); + sys.reshuffle( aos_varnames, [cov_varnames cpsd_varnames], constants_varnames, 'ALL', return_outputs, return_states ); + case 'for kalman' + aos_varnames = find(pli, 'aos variable names'); + cov_varnames = find(pli, 'covariance variable names'); + cpsd_varnames = find(pli, 'cpsd variable names'); + constants_varnames = find(pli, 'constant variable names'); + return_states = find(pli, 'return states'); + return_outputs = find(pli, 'return outputs'); + known_outputs = find(pli, 'known output variable names'); + sys_est = copy(sys,true); + sys_exp = copy(sys,true); + sys_est = reshuffle(sys_est, aos_varnames, [cov_varnames cpsd_varnames], constants_varnames, 'ALL', return_outputs, return_states ); + sys_exp = reshuffle(sys_exp, aos_varnames, [cov_varnames cpsd_varnames], constants_varnames, 'ALL', known_outputs, 'none' ); + sys = [sys_est sys_exp]; + case 'for cpsd' + aos_varnames = find(pli, 'aos variable names'); + cov_varnames = find(pli, 'covariance variable names'); + cpsd_varnames = find(pli, 'CPSD variable names'); + PZmodels_varnames = find(pli, 'PZmodel variable names'); + return_states = find(pli, 'return states'); + return_outputs = find(pli, 'return outputs'); + sys.reshuffle( aos_varnames, [cov_varnames cpsd_varnames], PZmodels_varnames, 'ALL', return_outputs, return_states ); + case 'for psd' + aos_varnames = find(pli, 'aos variable names'); + cov_varnames = find(pli, 'variance variable names'); + cpsd_varnames = find(pli, 'PSD variable names'); + PZmodels_varnames = find(pli, 'PZmodel variable names'); + return_states = find(pli, 'return states'); + return_outputs = find(pli, 'return outputs'); + sys.reshuffle( aos_varnames, [cov_varnames cpsd_varnames], PZmodels_varnames, 'ALL', return_outputs, return_states ); + case 'for cpsdforcorrelatedinputs' + aos_varnames = find(pli, 'aos variable names'); + cov_varnames = find(pli, 'covariance variable names'); + cpsd_varnames = find(pli, 'CPSD variable names'); + PZmodels_varnames = find(pli, 'PZmodel variable names'); + return_states = find(pli, 'return states'); + return_outputs = find(pli, 'return outputs'); + sys.reshuffle( aos_varnames, [cov_varnames cpsd_varnames], PZmodels_varnames, 'ALL', return_outputs, return_states ); + case 'for cpsdforindependentinputs' + aos_varnames = find(pli, 'aos variable names'); + cov_varnames = find(pli, 'variance variable names'); + cpsd_varnames = find(pli, 'PSD variable names'); + PZmodels_varnames = find(pli, 'PZmodel variable names'); + return_states = find(pli, 'return states'); + return_outputs = find(pli, 'return outputs'); + sys.reshuffle( aos_varnames, [cov_varnames cpsd_varnames], PZmodels_varnames, 'ALL', return_outputs, return_states ); + case 'none' + error('please set the parameter "set"') + otherwise + error('unknown parameter "set"') + end + + if ~internal + for i_sys = 1:numel(sys) + sys(i_sys).addHistory(getInfo('None'), pli, ssm_invars, sys(i_sys).hist ); + end + end + + sys.validate; + varargout = {sys}; +end + + +%-------------------------------------------------------------------------- +% Get Info Object +%-------------------------------------------------------------------------- +function ii = getInfo(varargin) + + if nargin == 1 && strcmpi(varargin{1}, 'None') + sets = {}; + pl = []; + elseif nargin == 1 && ~isempty(varargin{1}) && ischar(varargin{1}) + sets{1} = varargin{1}; + pl = getDefaultPlist(sets{1}); + else + sets = getSets; + pl = plist.initObjectWithSize(1,numel(sets)); + for i=1:numel(sets) + pl(i) = getDefaultPlist(sets{i}); + end + end + % Build info object + ii = minfo(mfilename, 'reorganize', 'ltpda', utils.const.categories.op, '$Id: reorganize.m,v 1.19 2011/05/23 14:15:44 adrien Exp $', sets, pl); +end + +function sets = getSets + sets = {'For bode', 'For simulate', 'For kalman', 'For cpsd', 'For resp', ... + 'For psd', 'for cpsdforindependentinputs', 'for cpsdforcorrelatedinputs', 'none'}; +end + +function pl = getDefaultPlist(set) + sets = lower(getSets); + if ~utils.helper.ismember(sets, lower(set)) + error('### Unknown set [%s]', set); + end + + pl = plist(); + + p = param({'set','Choose for which operation the ssm iois re-organized is done'},... + {7, getSets, paramValue.SINGLE}); + pl.append(p); + + switch lower(set) % Select parameter set + case 'for bode' + p = param({'inputs', 'A cell-array of input ports and blocks.'}, 'ALL' ); + pl.append(p); + p = param({'outputs', 'A cell-array of output ports and blocks.'}, 'ALL' ); + pl.append(p); + p = param({'states', 'A cell-array of states ports and blocks.'}, 'NONE' ); + pl.append(p); + case 'for simulate' + p = param({'covariance variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'CPSD variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'aos variable names', 'A cell-array of input port names corresponding to the different input AOs.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'constant variable names', 'A cell-array of strings of the desired input variable names.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return states', 'A cell-array of names of state ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return outputs', 'A cell-array of output ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + case 'for kalman' + p = param({'covariance variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'CPSD variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'aos variable names', 'A cell-array of input port names corresponding to the different input AOs.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'constant variable names', 'A cell-array of strings of the desired input variable names.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return states', 'A cell-array of names of state ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return outputs', 'A cell-array of output ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'known output variable names', 'A cell-array of strings of the known output variable names.'}, paramValue.EMPTY_CELL); + pl.append(p); + case 'for cpsd' + p = param({'covariance variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'CPSD variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'PZmodel variable names', 'A cell-array of strings of the desired input variable names.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'aos variable names', 'A cell-array of input defined with AOs spectrums.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return states', 'A cell-array of names of state ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return outputs', 'A cell-array of output ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + case 'for resp' + p = param({'inputs', 'A cell-array of input ports and blocks.'}, 'ALL' ); + pl.append(p); + p = param({'outputs', 'A cell-array of output ports and blocks.'}, 'ALL' ); + pl.append(p); + p = param({'states', 'A cell-array of states ports and blocks.'}, 'NONE' ); + pl.append(p); + case 'for psd' + p = param({'variance variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'PSD variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'PZmodel variable names', 'A cell-array of strings of the desired input variable names.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'aos variable names', 'A cell-array of input defined with AOs spectrums.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return states', 'A cell-array of names of state ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return outputs', 'A cell-array of output ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + case 'for cpsdforindependentinputs' + p = param({'variance variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'PSD variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'PZmodel variable names', 'A cell-array of strings of the desired input variable names.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'aos variable names', 'A cell-array of input defined with AOs spectrums.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return states', 'A cell-array of names of state ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return outputs', 'A cell-array of output ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + case 'for cpsdforcorrelatedinputs' + p = param({'covariance variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'CPSD variable names', 'A cell-array of strings specifying the desired input variable names.'}, paramValue.EMPTY_CELL ); + pl.append(p); + p = param({'PZmodel variable names', 'A cell-array of strings of the desired input variable names.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'aos variable names', 'A cell-array of input defined with AOs spectrums.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return states', 'A cell-array of names of state ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + p = param({'return outputs', 'A cell-array of output ports to return.'}, paramValue.EMPTY_CELL); + pl.append(p); + end +end