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

Generated on Tue 26-Feb-2008 10:52:52 by m2html © 2003