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 VERSION = '$Id: ltpda_ss_assemble_arrange.html,v 1.4 2008/03/31 10:27:36 hewitson 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
0054
0055 NSubsystems = length(listSubsystems.params);
0056
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
0065 SubsystemNbParam = zeros(NSubsystems,1);
0066 SubsystemParamNames = cell(NSubsystems,1);
0067 SubsystemParamValue = cell(NSubsystems,1);
0068 SubsystemParamSigma = cell(NSubsystems,1);
0069
0070 SubsystemIsUsed = cell(NSubsystems,1);
0071 SubsystemInputNames = cell(NSubsystems,1);
0072 SubsystemInputSizes = cell(NSubsystems,1);
0073 SubsystemNbInputs = zeros(NSubsystems,1);
0074
0075 XIsOutput = cell(NSubsystems,1);
0076 YIsOutput = cell(NSubsystems,1);
0077 XOutputNames = {};
0078 YOutputNames = {};
0079 for i=1:NSubsystems
0080
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
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
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
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};
0103 end
0104 if YIsOutput{i}==1
0105 YOutputNames{length(YOutputNames)+1} = SubsystemNames{i};
0106 end
0107 end
0108 NOutputX = length(XOutputNames);
0109 NOutputY = length(YOutputNames);
0110
0111
0112 ParamNames_meta = {};
0113 ParamValues_meta = [];
0114 ParamSigmas_meta = [];
0115 for i=1:NSubsystems
0116 for j=1:SubsystemNbParam(i)
0117 found = 0;
0118 for k=1:length(ParamNames_meta)
0119 if isequal( ParamNames_meta{k}, SubsystemParamNames{i}{j} )
0120 found = 1;
0121
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)
0130 ParamNames_meta = [ParamNames_meta SubsystemParamNames{i}{j}];
0131 ParamValues_meta = [ParamValues_meta SubsystemParamValue{i}(j)];
0132 ParamSigmas_meta = [ParamSigmas_meta SubsystemParamSigma{i}(j)];
0133 end
0134 end
0135 end
0136
0137
0138
0139 InputNames_meta = {};
0140 InputSizes_meta = [];
0141 IsUsed_meta = [];
0142 for i=1:NSubsystems
0143 for j=1:SubsystemNbInputs(i)
0144 isExternal = 1;
0145 for k1=1:NSubsystems
0146 if isequal(SubsystemNames{k1}, SubsystemInputNames{i}{j})
0147 isExternal = 0;
0148 break;
0149 end
0150 end
0151 if isExternal
0152 isListed = 0;
0153 for k2=1:length(InputNames_meta);
0154 if isequal( InputNames_meta{k2}, SubsystemInputNames{i}{j} )
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}];
0167 InputSizes_meta = [InputSizes_meta SubsystemInputSizes{i}(j)];
0168 IsUsed_meta = [IsUsed_meta SubsystemIsUsed{i}(j)];
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
0182 for i=1:NSubsystems
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
0190
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
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
0209 for i=1:NSubsystems
0210 for j=1:SubsystemNbInputs(i)
0211 for k = 1:NSubsystems
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
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
0227 for i=1:NSubsystems
0228 for j=1:NOutputX
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
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
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