0001 function varargout = ltpda_ss_assemble_arrange(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
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
0050
0051 NSubsystems = length(listSubsystems.params);
0052
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
0061 SubsystemNbParam = zeros(NSubsystems,1);
0062 SubsystemParamNames = cell(NSubsystems,1);
0063 SubsystemParamValue = cell(NSubsystems,1);
0064 SubsystemParamSigma = cell(NSubsystems,1);
0065
0066 SubsystemIsUsed = cell(NSubsystems,1);
0067 SubsystemInputNames = cell(NSubsystems,1);
0068 SubsystemInputSizes = cell(NSubsystems,1);
0069 SubsystemNbInputs = zeros(NSubsystems,1);
0070
0071 XIsOutput = cell(NSubsystems,1);
0072 YIsOutput = cell(NSubsystems,1);
0073 XOutputNames = {};
0074 YOutputNames = {};
0075 for i=1:NSubsystems
0076
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
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
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
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};
0099 end
0100 if YIsOutput{i}==1
0101 YOutputNames{length(YOutputNames)+1} = SubsystemNames{i};
0102 end
0103 end
0104 NOutputX = length(XOutputNames);
0105 NOutputY = length(YOutputNames);
0106
0107
0108 ParamNames_meta = {};
0109 ParamValues_meta = [];
0110 ParamSigmas_meta = [];
0111 for i=1:NSubsystems
0112 for j=1:SubsystemNbParam(i)
0113 found = 0;
0114 for k=1:length(ParamNames_meta)
0115 if isequal( ParamNames_meta{k}, SubsystemParamNames{i}{j} )
0116 found = 1;
0117
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)
0126 ParamNames_meta = [ParamNames_meta SubsystemParamNames{i}{j}];
0127 ParamValues_meta = [ParamValues_meta SubsystemParamValue{i}(j)];
0128 ParamSigmas_meta = [ParamSigmas_meta SubsystemParamSigma{i}(j)];
0129 end
0130 end
0131 end
0132
0133
0134
0135 InputNames_meta = {};
0136 InputSizes_meta = [];
0137 IsUsed_meta = [];
0138 for i=1:NSubsystems
0139 for j=1:SubsystemNbInputs(i)
0140 isExternal = 1;
0141 for k1=1:NSubsystems
0142 if isequal(SubsystemNames{k1}, SubsystemInputNames{i}{j})
0143 isExternal = 0;
0144 break;
0145 end
0146 end
0147 if isExternal
0148 isListed = 0;
0149 for k2=1:length(InputNames_meta);
0150 if isequal( InputNames_meta{k2}, SubsystemInputNames{i}{j} )
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}];
0163 InputSizes_meta = [InputSizes_meta SubsystemInputSizes{i}(j)];
0164 IsUsed_meta = [IsUsed_meta SubsystemIsUsed{i}(j)];
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
0178 for i=1:NSubsystems
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
0186
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
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
0205 for i=1:NSubsystems
0206 for j=1:SubsystemNbInputs(i)
0207 for k = 1:NSubsystems
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
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
0223 for i=1:NSubsystems
0224 for j=1:NOutputX
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
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
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