Home > m > timetools > statespacefunctions > ltpda_ss_assemble_arrange.m

ltpda_ss_assemble_arrange

PURPOSE ^

makes meta-system representing assembled embedded subsytems with cells

SYNOPSIS ^

function varargout = ltpda_ss_assemble_arrange(varargin)

DESCRIPTION ^

 makes meta-system representing assembled embedded subsytems with cells

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 DESCRIPTION: ltpda_ss_assemble_arrange assembles enbedded subsystems 

 CALL: listMeta = ltpda_ss_assemble_arrange(listSubsystems)

 INPUTS: Subsys - parameter list (of parameter lists with subsystem format)
 
 OUTPUTS: listMeta - parameter list (meta-system format)

 plist('A_META', A_meta, 'B_META', B_meta,  'C_META', C_meta, 'D_META', D_meta, 'BEXT_META', Bext_meta, 'DEXT_META', Dext_meta, ...
     'OY_META', Oy_meta, 'OX_META', Ox_meta,...
     'TIMESTEP', SubsystemTimestep(1), 'XINI_META', SubsystemXini, 'NAMES_META', SubsystemNames,...
     'PARAMNAMES_META', ParamNames_meta ,'PARAMVALUES_META', ParamValues_meta ,'PARAMSIGMAS_META', ParamSigmas_meta ,...
     'NBINPUTS_META', NbInputs_meta ,'INPUTNAMES_META', InputNames_meta ,'INPUTSIZES_META', InputSizes_meta , 'INPUTISUSED_META', IsUsed_meta);
 where all meta fileds are a cell array of matrices that have matiching
 dimensions or are empty.

 See ltpda_ss_check function for information on subsystem plist format
 

 VERSION: $Id: ltpda_ss_assemble_arrange.m,v 1.5 2008/03/11 16:52:56 adrien Exp $

 HISTORY: 23-01-2008 A Grynagier

 ***** There are no default parameter values *****
 TO DO : nothing here
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function varargout = ltpda_ss_assemble_arrange(varargin)
0002 % makes meta-system representing assembled embedded subsytems with cells
0003 %
0004 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0005 %
0006 % DESCRIPTION: ltpda_ss_assemble_arrange assembles enbedded subsystems
0007 %
0008 % CALL: listMeta = ltpda_ss_assemble_arrange(listSubsystems)
0009 %
0010 % INPUTS: Subsys - parameter list (of parameter lists with subsystem format)
0011 %
0012 % OUTPUTS: listMeta - parameter list (meta-system format)
0013 %
0014 % plist('A_META', A_meta, 'B_META', B_meta,  'C_META', C_meta, 'D_META', D_meta, 'BEXT_META', Bext_meta, 'DEXT_META', Dext_meta, ...
0015 %     'OY_META', Oy_meta, 'OX_META', Ox_meta,...
0016 %     'TIMESTEP', SubsystemTimestep(1), 'XINI_META', SubsystemXini, 'NAMES_META', SubsystemNames,...
0017 %     'PARAMNAMES_META', ParamNames_meta ,'PARAMVALUES_META', ParamValues_meta ,'PARAMSIGMAS_META', ParamSigmas_meta ,...
0018 %     'NBINPUTS_META', NbInputs_meta ,'INPUTNAMES_META', InputNames_meta ,'INPUTSIZES_META', InputSizes_meta , 'INPUTISUSED_META', IsUsed_meta);
0019 % where all meta fileds are a cell array of matrices that have matiching
0020 % dimensions or are empty.
0021 %
0022 % See ltpda_ss_check function for information on subsystem plist format
0023 %
0024 %
0025 % VERSION: $Id: ltpda_ss_assemble_arrange.m,v 1.5 2008/03/11 16:52:56 adrien Exp $
0026 %
0027 % HISTORY: 23-01-2008 A Grynagier
0028 %
0029 % ***** There are no default parameter values *****
0030 % TO DO : nothing here
0031 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0032 
0033 %% standard calls for LTPDA function data
0034 VERSION = '$Id: ltpda_ss_assemble_arrange.m,v 1.5 2008/03/11 16:52:56 adrien Exp $';
0035 ALGONAME = mfilename;
0036 CATEGORY = 'STATESPACE';
0037 display(['starting ' ALGONAME]);
0038 
0039 if length(varargin) >0
0040     if isequal( varargin{1}, 'Version')
0041         varargout = VERSION;
0042         return;
0043     elseif isequal(varargin{1}, 'Params')
0044         varargout = plist();
0045         return;
0046     elseif isequal(varargin{1}, 'Category')
0047         varargout = CATEGORY;
0048         return;
0049     end
0050 end
0051 listSubsystems = varargin{1};
0052 
0053 %% building arrays, collecting data for ease of use
0054 % global data
0055 NSubsystems = length(listSubsystems.params); %number of subsystems
0056 % subsystem data
0057 SubsystemNames = cell(NSubsystems,1);
0058 SubsystemTimestep = zeros(NSubsystems,1);
0059 SubsystemXini = cell(NSubsystems,1); 
0060 SubsystemAMat = cell(NSubsystems,1);
0061 SubsystemBMats = cell(NSubsystems,1);
0062 SubsystemCMat = cell(NSubsystems,1);
0063 SubsystemDMats = cell(NSubsystems,1);
0064 % parametric data
0065 SubsystemNbParam = zeros(NSubsystems,1);
0066 SubsystemParamNames = cell(NSubsystems,1);
0067 SubsystemParamValue = cell(NSubsystems,1);
0068 SubsystemParamSigma = cell(NSubsystems,1);
0069 % input data
0070 SubsystemIsUsed = cell(NSubsystems,1);
0071 SubsystemInputNames = cell(NSubsystems,1);
0072 SubsystemInputSizes = cell(NSubsystems,1);
0073 SubsystemNbInputs = zeros(NSubsystems,1);
0074 % output data
0075 XIsOutput = cell(NSubsystems,1);
0076 YIsOutput = cell(NSubsystems,1);
0077 XOutputNames = {};
0078 YOutputNames = {};
0079 for i=1:NSubsystems
0080     % subsystem data
0081     SubsystemNames{i} = find(listSubsystems.params(i).val,'NAME');
0082     SubsystemTimestep(i) = find(listSubsystems.params(i).val,'TIMESTEP');
0083     SubsystemXini{i} = find(listSubsystems.params(i).val,'XINI');
0084     SubsystemAMat{i} = find(listSubsystems.params(i).val,'AMAT');
0085     SubsystemBMats{i} = find(listSubsystems.params(i).val,'BMATS');
0086     SubsystemCMat{i} = find(listSubsystems.params(i).val,'CMAT');
0087     SubsystemDMats{i} = find(listSubsystems.params(i).val,'DMATS');
0088     % parametric data
0089     SubsystemParamNames{i} = find(listSubsystems.params(i).val,'PARAMNAMES');
0090     SubsystemParamValue{i} = find(listSubsystems.params(i).val,'PARAMVALUES');
0091     SubsystemParamSigma{i} = find(listSubsystems.params(i).val,'PARAMSIGMAS');
0092     SubsystemNbParam(i) = length(SubsystemParamNames{i});
0093     % input data
0094     SubsystemInputNames{i} = find(listSubsystems.params(i).val,'INPUTNAMES');
0095     SubsystemInputSizes{i} = find(listSubsystems.params(i).val,'INPUTSIZES');
0096     SubsystemIsUsed{i} = find(listSubsystems.params(i).val,'INPUTISUSED');
0097     SubsystemNbInputs(i) = length(SubsystemInputNames{i});
0098     % output data
0099     XIsOutput{i} = find(listSubsystems.params(i).val,'XISOUTPUT'); 
0100     YIsOutput{i} = find(listSubsystems.params(i).val,'YISOUTPUT'); 
0101     if XIsOutput{i}==1
0102         XOutputNames{length(XOutputNames)+1} = SubsystemNames{i}; %#ok<AGROW> %incrementing the SystemOutput list
0103     end
0104     if YIsOutput{i}==1
0105         YOutputNames{length(YOutputNames)+1} = SubsystemNames{i}; %#ok<AGROW> %incrementing the SystemOutput list
0106     end
0107 end
0108 NOutputX = length(XOutputNames); % number of state spaces in global output
0109 NOutputY = length(YOutputNames); % number of outputs as global output
0110 
0111 %% Building meta fields for parameters
0112 ParamNames_meta = {};
0113 ParamValues_meta = [];
0114 ParamSigmas_meta = [];
0115 for i=1:NSubsystems %for each subsystem
0116     for j=1:SubsystemNbParam(i) %for each parameter of a subsystem
0117         found = 0;
0118         for k=1:length(ParamNames_meta) %screening through the exsiting array
0119             if isequal( ParamNames_meta{k}, SubsystemParamNames{i}{j} )
0120                 found = 1;
0121                 % if found, checking values are compatible with redundant parameter
0122                 if not( ParamValues_meta(k)==SubsystemParamValue{i}(j) && ParamSigmas_meta(k)==SubsystemParamSigma{i}(j) )
0123                     msg = 'error because two parameters used at the same time have the same name but not the same values';
0124                     error(msg);
0125                 end
0126                 break;
0127             end
0128         end
0129         if not(found) % if not found, array is incremented
0130             ParamNames_meta = [ParamNames_meta SubsystemParamNames{i}{j}]; %#ok<AGROW>
0131             ParamValues_meta = [ParamValues_meta SubsystemParamValue{i}(j)]; %#ok<AGROW>
0132             ParamSigmas_meta = [ParamSigmas_meta SubsystemParamSigma{i}(j)]; %#ok<AGROW>
0133         end
0134     end
0135 end
0136 
0137 %% Building fields for meta-inputs
0138 % meta input list
0139 InputNames_meta = {};
0140 InputSizes_meta = [];
0141 IsUsed_meta = []; % to check that subsystems are taken in account individually when assembled
0142 for i=1:NSubsystems %for each subsystem
0143     for j=1:SubsystemNbInputs(i) % screeing through all the inputs of the subsystem
0144         isExternal = 1;
0145         for k1=1:NSubsystems
0146             if isequal(SubsystemNames{k1}, SubsystemInputNames{i}{j})
0147                 isExternal = 0; %if it is internal
0148                 break;
0149             end
0150         end
0151         if isExternal
0152             isListed = 0;
0153             for k2=1:length(InputNames_meta); % screening through the existing list of inputs
0154                 if isequal( InputNames_meta{k2}, SubsystemInputNames{i}{j} ) %if names match
0155                     isListed = 1;
0156                     break;
0157                 end
0158             end
0159             if isListed
0160                 if not(InputSizes_meta(k2)==SubsystemInputSizes{i}(j) )
0161                     msg = 'error because two inputs used at the same time have the same name but not the same size';
0162                     error(msg);
0163                 end
0164                 IsUsed_meta(k2) = max( SubsystemIsUsed{i}(j), IsUsed_meta(k2) );
0165             else
0166                 InputNames_meta = [InputNames_meta SubsystemInputNames{i}{j}]; %#ok<AGROW>
0167                 InputSizes_meta = [InputSizes_meta SubsystemInputSizes{i}(j)]; %#ok<AGROW>
0168                 IsUsed_meta = [IsUsed_meta SubsystemIsUsed{i}(j)];        %#ok<AGROW>
0169             end
0170         else
0171             C = SubsystemCMat{k1}{1};
0172             if not( size(C,1) == SubsystemInputSizes{i}(j) )
0173                 msg = ['error in Subsystem ', SubsystemNames{i} , ', conflicting size of inner input number ', num2str(j) ,' named ', SubsystemInputNames{i}{j} ];
0174                 error(msg);
0175             end
0176         end
0177     end
0178 end
0179 NbInputs_meta = length(InputNames_meta);
0180 
0181 %% Building fields for meta-time model
0182 for i=1:NSubsystems %for each subsystem
0183     if not( SubsystemTimestep(i)==SubsystemTimestep(1) )
0184         msg = ['Problem because subsystems have different timestep representation : ', mat2str(SubsystemTimestep)];
0185         error(msg);
0186     end
0187 end
0188 
0189 %% Building meta-matices
0190 % Declaring meta matrices
0191 A_meta = cell(NSubsystems, NSubsystems);
0192 B_meta = cell(NSubsystems, NSubsystems);
0193 C_meta = cell(NSubsystems, NSubsystems);
0194 D_meta = cell(NSubsystems, NSubsystems);
0195 Bext_meta = cell(NSubsystems,NbInputs_meta);
0196 Dext_meta = cell(NSubsystems,NbInputs_meta);
0197 Ox_meta = cell(NOutputX+NOutputY , NSubsystems);
0198 Oy_meta = cell(NOutputY+NOutputX , NSubsystems);
0199 
0200 %fill A and C
0201 for i=1:NSubsystems
0202     AMAT = find(listSubsystems.params(i).val,'AMAT');
0203     CMAT = find(listSubsystems.params(i).val,'CMAT');
0204     A_meta{i,i} = AMAT{1};
0205     C_meta{i,i} = CMAT{1};
0206 end
0207     
0208 %fill B D Bext Dext
0209 for i=1:NSubsystems %going through the subsystems
0210     for j=1:SubsystemNbInputs(i) %going through the inputs
0211         for k = 1:NSubsystems %going through the subsystems that might be an input
0212             if isequal( SubsystemNames{k}, SubsystemInputNames{i}{j} )
0213                 B_meta{i,k} = SubsystemBMats{i}{j};
0214                 D_meta{i,k} = SubsystemDMats{i}{j};
0215             end
0216         end
0217         for k = 1:NbInputs_meta %going through all the exogenous inputs
0218             if isequal( InputNames_meta{k}, SubsystemInputNames{i}{j} )
0219                 Bext_meta{i,k} = SubsystemBMats{i}{j};
0220                 Dext_meta{i,k} = SubsystemDMats{i}{j};
0221             end 
0222         end
0223     end
0224 end
0225 
0226 % fill Ox, Oy
0227 for i=1:NSubsystems % going through the subsystems
0228     for j=1:NOutputX % screening the State Space
0229         if isequal(  SubsystemNames{i} , XOutputNames{j} )
0230             Ox_meta{j,i} = eye( size(SubsystemAMat{i}{1},1) );
0231         end
0232     end
0233     for j=1:NOutputY % screening the local outputs
0234         if isequal(  SubsystemNames{i} , YOutputNames{j} )
0235             Oy_meta{j+NOutputX,i} = eye( size(SubsystemCMat{i}{1},1) );
0236         end
0237     end
0238 end
0239 
0240 %% parsing the meta matrices into a list
0241 varargout = {plist('A_META', A_meta, 'B_META', B_meta,  'C_META', C_meta, 'D_META', D_meta, 'BEXT_META', Bext_meta, 'DEXT_META', Dext_meta, ...
0242     'OY_META', Oy_meta, 'OX_META', Ox_meta,...
0243     'TIMESTEP', SubsystemTimestep(1), 'XINI_META', SubsystemXini, 'NAMES_META', SubsystemNames,...
0244     'PARAMNAMES_META', ParamNames_meta ,'PARAMVALUES_META', ParamValues_meta ,'PARAMSIGMAS_META', ParamSigmas_meta ,...
0245     'NBINPUTS_META', NbInputs_meta ,'INPUTNAMES_META', InputNames_meta ,'INPUTSIZES_META', InputSizes_meta , 'INPUTISUSED_META', IsUsed_meta)};
0246 end
0247

Generated on Mon 31-Mar-2008 13:54:54 by m2html © 2003