Home > classes > @ssm > validate.m

validate

PURPOSE ^

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

SYNOPSIS ^

function varargout = validate(varargin)

DESCRIPTION ^

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

 FUNCTION:    validate

 DESCRIPTION: Completes and checks content a ssm object

 CALL:        ssmout = ssmFromPlist(ssmin) 
               This function is private. To check and copy an object use 
              obj = ssm(old) isnstead


 HISTORY:     15-04-2008 Adrien
              Creation

 TODO:       possibly a mex file...?

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% starting initial checks

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0002 %
0003 % FUNCTION:    validate
0004 %
0005 % DESCRIPTION: Completes and checks content a ssm object
0006 %
0007 % CALL:        ssmout = ssmFromPlist(ssmin)
0008 %               This function is private. To check and copy an object use
0009 %              obj = ssm(old) isnstead
0010 %
0011 %
0012 % HISTORY:     15-04-2008 Adrien
0013 %              Creation
0014 %
0015 % TODO:       possibly a mex file...?
0016 %
0017 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0018 function varargout = validate(varargin)
0019 %% starting initial checks
0020 utils.helper.msg(utils.const.msg.MNAME, ['running ', mfilename]);
0021 
0022 sys = varargin{1};
0023 %% begin function body
0024 
0025 for i_sys = 1:length(sys) % going through the input
0026 
0027   %% =========== checking no compulsory field is missing ===========
0028 
0029   % calculating fields length for Ninputs, Inputsizes, sssize, outputsizes,
0030   % Nparams and checking compulsory fields are well defined
0031 
0032   %% =========== generating counter fields ===========
0033   sys(i_sys).Ninputs  = size(sys(i_sys).bmats, 2);
0034   sys(i_sys).Nss      = size(sys(i_sys).amats, 2);
0035   sys(i_sys).Noutputs = size(sys(i_sys).cmats, 1);
0036   sys(i_sys).Nparams  = length(sys(i_sys).paramnames);
0037   % generating inputsizes if it does not already exist
0038   if isempty(sys(i_sys).inputsizes)
0039     sys(i_sys).inputsizes = - ones(1,sys(i_sys).Ninputs);
0040     %  has to look in every b or d matrix to find a non-empty cell
0041     for i=1:sys(i_sys).Ninputs
0042       for j=1:sys(i_sys).Nss
0043         if ~isequal(sys(i_sys).bmats{j,i}, [])
0044           sys(i_sys).inputsizes(i) = size(sys(i_sys).bmats{j,i},2);
0045           break
0046         end
0047       end
0048       for j=1:sys(i_sys).Noutputs
0049         if ~isequal(sys(i_sys).dmats{j,i}, [])
0050           sys(i_sys).inputsizes(i) = size(sys(i_sys).dmats{j,i},2);
0051           break
0052         end
0053       end
0054     end
0055   end
0056   % generating sssize
0057   if isempty(sys(i_sys).sssizes)
0058     sys(i_sys).sssizes = - ones(1,sys(i_sys).Nss);
0059     %  has to look in every b or d matrix to find a non-empty cell
0060     for i=1:sys(i_sys).Nss
0061       sys(i_sys).sssizes(i) = size(sys(i_sys).amats{i,i},2); % to modify later on
0062     end
0063   end
0064   % generating outputsizes if it does not already exist
0065   if isempty(sys(i_sys).outputsizes)
0066     sys(i_sys).outputsizes = - ones(1,sys(i_sys).Noutputs);
0067     %  has to look in every b or d matrix to find a non-empty cell
0068     for i=1:sys(i_sys).Noutputs
0069       for j=1:sys(i_sys).Nss
0070         if ~isequal(sys(i_sys).cmats{i,j}, [])
0071           sys(i_sys).outputsizes(i) = size(sys(i_sys).cmats{i,j},1);
0072           break
0073         end
0074       end
0075       for j=1:sys(i_sys).Ninputs
0076         if ~isequal(sys(i_sys).dmats{i,j}, [])
0077           sys(i_sys).outputsizes(i) = size(sys(i_sys).dmats{i,j},1);
0078           break
0079         end
0080       end
0081     end
0082   end
0083 
0084   %% =========== generating missing user defined fields ===========
0085 
0086   % data with linear system matrices
0087   % generating mmats if it does not already exist
0088   if isempty(sys(i_sys).mmats)
0089     sys(i_sys).mmats = cell(sys(i_sys).Nss,sys(i_sys).Nss);
0090     for i=1:sys(i_sys).Nss
0091       sys(i_sys).mmats{i,i} = eye(sys(i_sys).sssizes(i));
0092     end
0093   end
0094   % generating isnumerical
0095   sys(i_sys).isnumerical = true;
0096   for i=1:length(sys(i_sys).amats)
0097     if ~isreal(sys(i_sys).amats{i})
0098       sys(i_sys).isnumerical = false;
0099     end
0100   end
0101   if sys(i_sys).isnumerical
0102     for i=1:length(sys(i_sys).bmats)
0103       if ~isreal(sys(i_sys).bmats{i})
0104         sys(i_sys).isnumerical = false;
0105       end
0106     end
0107   end
0108   if sys(i_sys).isnumerical
0109     for i=1:length(sys(i_sys).cmats)
0110       if ~isreal(sys(i_sys).cmats{i})
0111         sys(i_sys).isnumerical = false;
0112       end
0113     end
0114   end
0115   if sys(i_sys).isnumerical
0116     for i=1:length(sys(i_sys).dmats)
0117       if ~isreal(sys(i_sys).dmats{i})
0118         sys(i_sys).isnumerical = false;
0119       end
0120     end
0121   end
0122   if sys(i_sys).isnumerical
0123     for i=1:length(sys(i_sys).mmats)
0124       if ~isreal(sys(i_sys).mmats{i})
0125         sys(i_sys).isnumerical = false;
0126       end
0127     end
0128   end
0129 
0130   % nonlinear handle fields
0131   %generating amats_handles if it does not already exist
0132   if isempty(sys(i_sys).amats_handles)
0133     sys(i_sys).amats_handles = cell(sys(i_sys).Nss,sys(i_sys).Nss);
0134   end
0135   %generating bmats_handles if it does not already exist
0136   if isempty(sys(i_sys).bmats_handles)
0137     sys(i_sys).bmats_handles =cell(sys(i_sys).Nss,sys(i_sys).Ninputs);
0138   end
0139   %generating cmats_handles if it does not already exist
0140   if isempty(sys(i_sys).cmats_handles)
0141     sys(i_sys).cmats_handles = cell(sys(i_sys).Noutputs,sys(i_sys).Nss);
0142   end
0143   %generating dmats_handles if it does not already exist
0144   if isempty(sys(i_sys).dmats_handles)
0145     sys(i_sys).dmats_handles = cell(sys(i_sys).Noutputs,sys(i_sys).Ninputs);
0146   end
0147 
0148   % input variables array data
0149   % generating inputnames if it does not already exist
0150   if isempty(sys(i_sys).inputnames)
0151     sys(i_sys).inputnames = cell(1,sys(i_sys).Ninputs);
0152     for i=1:sys(i_sys).Ninputs
0153       sys(i_sys).inputnames{i} = ['input ',num2str(i)];
0154     end
0155   end
0156   % generating inputvarnames if it does not already exist
0157   if isempty(sys(i_sys).inputvarnames)
0158     sys(i_sys).inputvarnames = cell(1,sys(i_sys).Ninputs);
0159     for i=1:sys(i_sys).Ninputs
0160       sys(i_sys).inputvarnames{i} = cell(1,sys(i_sys).inputsizes(i));
0161       for j=1:sys(i_sys).inputsizes(i)
0162         sys(i_sys).inputvarnames{i}{j} = [sys(i_sys).inputnames{i},'>' num2str(j)];
0163       end
0164     end
0165   end
0166 
0167   % state space variables array data
0168   % generating ssnames if it does not already exist
0169   if isempty(sys(i_sys).ssnames)
0170     sys(i_sys).ssnames = cell(1,sys(i_sys).Nss);
0171     for i=1:sys(i_sys).Nss
0172       sys(i_sys).ssnames{i} = ['state ',num2str(i)];
0173     end
0174   end
0175   % generating ssvarnames if it does not already exist
0176   if isempty(sys(i_sys).ssvarnames)
0177     sys(i_sys).ssvarnames = cell(1,sys(i_sys).Nss);
0178     for i=1:sys(i_sys).Nss
0179       sys(i_sys).ssvarnames{i} = cell(1,sys(i_sys).sssizes(i));
0180       for j=1:sys(i_sys).sssizes(i)
0181         sys(i_sys).ssvarnames{i}{j} = [sys(i_sys).ssnames{i},'>' num2str(j)];
0182       end
0183     end
0184   end
0185   % generating ssini if it does not already exist
0186   if isempty(sys(i_sys).ssini)
0187     sys(i_sys).ssini = cell(sys(i_sys).Nss,1);
0188     for i=1:sys(i_sys).Nss
0189       sys(i_sys).ssini{i} = zeros(sys(i_sys).sssizes(i),1);
0190     end
0191   end
0192 
0193   %for outputs
0194   % generating outputnames if it does not already exist
0195   if isempty(sys(i_sys).outputnames)
0196     sys(i_sys).outputnames = cell(1,sys(i_sys).Noutputs);
0197     for i=1:sys(i_sys).Noutputs
0198       sys(i_sys).outputnames{i} = ['output ',num2str(i)];
0199     end
0200   end
0201   % generating outputvarnames if it does not already exist
0202   if isempty(sys(i_sys).outputvarnames)
0203     sys(i_sys).outputvarnames = cell(1,sys(i_sys).Noutputs);
0204     for i=1:sys(i_sys).Noutputs
0205       sys(i_sys).outputvarnames{i} = cell(1,sys(i_sys).outputsizes(i));
0206       for j=1:sys(i_sys).outputsizes(i)
0207         sys(i_sys).outputvarnames{i}{j} = [sys(i_sys).outputnames{i},'>' num2str(j)];
0208       end
0209     end
0210   end
0211 
0212   % parameter fields
0213   % generating paramsigmas if it does not already exist
0214   if isempty(sys(i_sys).paramsigmas)
0215     sys(i_sys).paramsigmas = zeros(1,sys(i_sys).Nparams);
0216   end
0217 
0218 
0219   %% =========== checking field sizes ===========
0220   % checking compatibility with Ninputs
0221   if ~(    sys(i_sys).Ninputs==size(sys(i_sys).bmats,2)  ...
0222       && sys(i_sys).Ninputs==size(sys(i_sys).dmats,2) ...
0223       && sys(i_sys).Ninputs==size(sys(i_sys).bmats_handles,2)  ...
0224       && sys(i_sys).Ninputs==size(sys(i_sys).dmats_handles,2) ...
0225       && sys(i_sys).Ninputs==length(sys(i_sys).inputnames) ...
0226       && sys(i_sys).Ninputs==length(sys(i_sys).inputvarnames) ...
0227       && sys(i_sys).Ninputs==length(sys(i_sys).inputsizes) )
0228     error(['error in ssm ',sys(i_sys).name,' because there are ',...
0229       num2str(size(sys(i_sys).bmats,2)),' columns in B , ',...
0230       num2str(size(sys(i_sys).dmats,2)),' columns in D , ',...
0231       num2str(size(sys(i_sys).bmats_handles,2)),' columns in bmats_handles , ',...
0232       num2str(size(sys(i_sys).dmats_handles,2)),' columns in dmats_handles , ',...
0233       num2str(length(sys(i_sys).inputnames)),' inputnames, ',...
0234       num2str(length(sys(i_sys).inputvarnames)),' blocks in inputvarnames and ',...
0235       num2str(length(sys(i_sys).inputsizes)),' inputsizes'] );
0236   end
0237 
0238   % checking compatibility with Nss
0239   if ~(    sys(i_sys).Nss==size(sys(i_sys).amats,2)  ...
0240       && sys(i_sys).Nss==size(sys(i_sys).amats,1)  ...
0241       && sys(i_sys).Nss==size(sys(i_sys).bmats,1)  ...
0242       && sys(i_sys).Nss==size(sys(i_sys).cmats,2)  ...
0243       && sys(i_sys).Nss==size(sys(i_sys).amats_handles,2)  ...
0244       && sys(i_sys).Nss==size(sys(i_sys).amats_handles,1)  ...
0245       && sys(i_sys).Nss==size(sys(i_sys).bmats_handles,1)  ...
0246       && sys(i_sys).Nss==size(sys(i_sys).cmats_handles,2)  ...
0247       && sys(i_sys).Nss==length(sys(i_sys).ssnames) ...
0248       && sys(i_sys).Nss==length(sys(i_sys).ssvarnames) ...
0249       && sys(i_sys).Nss==length(sys(i_sys).sssizes) )
0250     error(['error in ssm ',sys(i_sys).name,' because there are ',...
0251       num2str(size(sys(i_sys).amats,2)),' columns in A, ',...
0252       num2str(size(sys(i_sys).amats,1)),' lines in A, ',...
0253       num2str(size(sys(i_sys).bmats,1)),' lines in B, ',...
0254       num2str(size(sys(i_sys).cmats,2)),' columns in C, ',...
0255       num2str(size(sys(i_sys).amats_handles,2)),' columns in A_handles, ',...
0256       num2str(size(sys(i_sys).amats_handles,1)),' lines in A_handles, ',...
0257       num2str(size(sys(i_sys).bmats_handles,1)),' lines in B_handles, ',...
0258       num2str(size(sys(i_sys).cmats_handles,2)),' columns in C_handles, ',...
0259       num2str(length(sys(i_sys).ssnames)),' ssnames, ',...
0260       num2str(length(sys(i_sys).ssvarnames)),' blocks in ssvarnames and ',...
0261       num2str(length(sys(i_sys).sssizes)),' sssizes'] );
0262   end
0263 
0264   % checking compatibility with Noutputs
0265   if ~(      sys(i_sys).Noutputs==size(sys(i_sys).cmats,1) ...
0266       && sys(i_sys).Noutputs==size(sys(i_sys).dmats,1) ...
0267       && sys(i_sys).Noutputs==size(sys(i_sys).cmats_handles,1) ...
0268       && sys(i_sys).Noutputs==size(sys(i_sys).dmats_handles,1) ...
0269       && sys(i_sys).Noutputs==length(sys(i_sys).outputnames) ...
0270       && sys(i_sys).Noutputs==length(sys(i_sys).outputvarnames) ...
0271       && sys(i_sys).Noutputs==length(sys(i_sys).outputsizes) )
0272     error(['error in ssm ',sys(i_sys).name,' because there are ',...
0273       num2str(size(sys(i_sys).cmats,1)),' lines in C, ',...
0274       num2str(size(sys(i_sys).dmats,1)),' lines in D, ',...
0275       num2str(size(sys(i_sys).cmats_handles,1)),' lines in C_handles, ',...
0276       num2str(size(sys(i_sys).dmats_handles,1)),' lines in D_handles, ',...
0277       num2str(length(sys(i_sys).outputnames)),' outputnames, ',...
0278       num2str(length(sys(i_sys).outputvarnames)),' blocks in outputvarnames and ',...
0279       num2str(length(sys(i_sys).outputsizes)),' outputsizes'] );
0280   end
0281 
0282   % Checking compatibility with Inputsizes
0283   for i=1:sys(i_sys).Ninputs
0284     if ~isequal(sys(i_sys).inputsizes(i), -1)
0285       if ~(  sys(i_sys).inputsizes(i) == length(sys(i_sys).inputvarnames{i}) )
0286         error(['error in ssm ', sys(i_sys).name, ...
0287           ' because the input number ', num2str(i),...
0288           ' named ', sys(i_sys).inputnames{i},  ...
0289           ' and of size ', num2str(sys(i_sys).inputsizes(i)), ...
0290           ' has an inputvarnames vector of size ', num2str(length(sys(i_sys).inputvarnames{i})) ]);
0291       end
0292     else
0293       str=['warning, input named ',sys(i_sys).inputnames{i},...
0294         ' has all matrices empty, should be deleted'] ;
0295       utils.helper.msg(utils.const.msg.MNAME,str);
0296     end
0297     for j=1:sys(i_sys).Noutputs
0298       if ~isequal(sys(i_sys).dmats{j,i}, []) 
0299         if ~( sys(i_sys).inputsizes(i) == size(sys(i_sys).dmats{j,i},2) )
0300           error(['error in ssm ', sys(i_sys).name, ...
0301             ' because the input number ', num2str(i),...
0302             ' named ', sys(i_sys).inputnames{i},  ...
0303             ' and of size ', num2str(sys(i_sys).inputsizes(i)), ...
0304             ' has a D matrix of width ', num2str(size(sys(i_sys).dmats{j,i},2)) ]);
0305         end
0306       end
0307     end
0308     for j=1:sys(i_sys).Nss
0309       if ~isequal(sys(i_sys).bmats{j,i}, [])
0310         if ~( sys(i_sys).inputsizes(i) == size(sys(i_sys).bmats{j,i},2) )
0311           error(['error in ssm ', sys(i_sys).name, ...
0312             ' because the input number ', num2str(i),...
0313             ' named ', sys(i_sys).inputnames{i},  ...
0314             ' and of size ', num2str(sys(i_sys).inputsizes(i)), ...
0315             ' has a B matrix of width ', num2str(size(sys(i_sys).bmats{j,i},2)) ]);
0316         end
0317       end
0318     end
0319   end
0320 
0321   % Checking compatibility with Outputsizes
0322   for i=1:sys(i_sys).Noutputs
0323     if ~isequal(sys(i_sys).outputsizes(i), -1)
0324       if ~( sys(i_sys).outputsizes(i) == length(sys(i_sys).outputvarnames{i}) )
0325         error(['error in ssm ', sys(i_sys).name, ...
0326           ' because the output number ', num2str(i),...
0327           ' named ', sys(i_sys).outputnames{i},  ...
0328           ' and of size ', num2str(sys(i_sys).outputsizes(i)), ...
0329           ' has an outputvarnames vector of size ', num2str(length(sys(i_sys).outputvarnames{i})) ]);
0330       end
0331     else
0332       str = ['warning, output named ',sys(i_sys).outputnames{i},...
0333         ' has all matrices empty, should be deleted'];
0334       utils.helper.msg(utils.const.msg.MNAME, str);
0335     end
0336     for j=1:sys(i_sys).Ninputs
0337       if ~isequal(sys(i_sys).dmats{i,j}, [])
0338         if ~( sys(i_sys).outputsizes(i) == size(sys(i_sys).dmats{i,j},1) )
0339           error(['error in ssm ', sys(i_sys).name, ...
0340             ' because the output number ', num2str(i),...
0341             ' named ', sys(i_sys).outputnames{i},  ...
0342             ' and of size ', num2str(sys(i_sys).outputsizes(i)), ...
0343             ' has a D matrix of height ', num2str(size(sys(i_sys).dmats{i,j},1)) ]);
0344         end
0345       end
0346     end
0347     for j=1:sys(i_sys).Nss
0348       if ~isequal(sys(i_sys).cmats{i,j}, [])
0349         if ~( sys(i_sys).outputsizes(i) == size(sys(i_sys).cmats{i,j},1) )
0350           error(['error in ssm ', sys(i_sys).name, ...
0351             ' because the output number ', num2str(i),...
0352             ' named ', sys(i_sys).outputnames{i},  ...
0353             ' and of size ', num2str(sys(i_sys).outputsizes(i)), ...
0354             ' has a C matrix of height ', num2str(size(sys(i_sys).cmats{i,j},1)) ]);
0355         end
0356       end
0357     end
0358   end
0359 
0360   % Checking compatibility with sssizes
0361   for i=1:sys(i_sys).Nss
0362     if ~isequal(sys(i_sys).sssizes(i), -1)
0363       if ~( sys(i_sys).sssizes(i) == length(sys(i_sys).ssvarnames{i}) )
0364         error(['error in ssm ', sys(i_sys).name, ...
0365           ' because the state space number ', num2str(i),...
0366           ' named ', sys(i_sys).ssnames{i},  ...
0367           ' and of size ', num2str(sys(i_sys).sssizes(i)), ...
0368           ' has a ssvarnames vector of size ', num2str(length(sys(i_sys).ssvarnames{i})) ]);
0369       end
0370     else
0371       str = ['warning, output named ',sys(i_sys).outputnames{i},...
0372         ' has all matrices empty, should be deleted'];
0373       utils.helper.msg(utils.const.msg.MNAME, str);
0374     end
0375     for j=1:sys(i_sys).Ninputs
0376       if ~isequal(sys(i_sys).bmats{i,j}, [])
0377         if ~( sys(i_sys).sssizes(i) == size(sys(i_sys).bmats{i,j},1) )
0378           error(['error in ssm ', sys(i_sys).name, ...
0379             ' because the state space number ', num2str(i),...
0380             ' named ', sys(i_sys).ssnames{i},  ...
0381             ' and of size ', num2str(sys(i_sys).sssizes(i)), ...
0382             ' has a B matrix of height ', num2str(size(sys(i_sys).bmats{i,j},1)) ]);
0383         end
0384       end
0385     end
0386     for j=1:sys(i_sys).Nss
0387       if ~isequal(sys(i_sys).mmats{i,j}, [])
0388         if ~(  sys(i_sys).sssizes(i) == size(sys(i_sys).mmats{i,j},1) ...
0389             && sys(i_sys).sssizes(j) == size(sys(i_sys).mmats{i,j},2) )
0390           error(['error in ssm ', sys(i_sys).name, ...
0391             ' because the state space position ', num2str(i), ' ' , num2str(j),...
0392             ' named ', sys(i_sys).ssnames{i}, 'and ', sys(i_sys).ssnames{j},  ...
0393             ' and of size ', num2str([sys(i_sys).sssizes(i),sys(i_sys).sssizes(j)] ), ...
0394             ' has a A matrix of size ', num2str(size(sys(i_sys).amats{i,j})) ]);
0395         end
0396       end
0397     end
0398     for j=1:sys(i_sys).Nss
0399         if ~(   sys(i_sys).sssizes(j) == size(sys(i_sys).ssini{j},1) )
0400           error(['error in ssm ', sys(i_sys).name, ...
0401             ' because the state space position ', num2str(i), ...
0402             ' named ', sys(i_sys).ssnames{i},  ...
0403             ' and of size ', num2str(sys(i_sys).sssizes(i) ), ...
0404             ' has a ssini vector of height ', num2str(size(sys(i_sys).ssini{j},1)) ]);
0405         end
0406     end
0407     for j=1:sys(i_sys).Noutputs
0408       if ~isequal(sys(i_sys).cmats{j,i}, []) 
0409         if ~( sys(i_sys).sssizes(i) == size(sys(i_sys).cmats{j,i},2) )
0410           error(['error in ssm ', sys(i_sys).name, ...
0411             ' because the state space number ', num2str(i),...
0412             ' named ', sys(i_sys).ssnames{i},  ...
0413             ' and of size ', num2str(sys(i_sys).sssizes(i)), ...
0414             ' has a C matrix of width ', num2str(size(sys(i_sys).cmats{j,i},2)) ]);
0415         end
0416       end
0417     end
0418 
0419   end
0420 
0421   % checking compatibility with Nparams
0422   if ~(    sys(i_sys).Nparams == length(sys(i_sys).paramvalues) ...
0423       && sys(i_sys).Nparams == length(sys(i_sys).paramsigmas))
0424     error(['error in ssm ',sys(i_sys).name,' because there are ',...
0425       num2str(sys(i_sys).Nparams),' parameter names but ',...
0426       num2str(length(sys(i_sys).paramvalues)),' parameter values, and ',...
0427       num2str(length(sys(i_sys).paramsigmas)),' parametersigmas.']);
0428   end
0429 
0430   %% =========== checking redundancies ===========
0431   for i_input=1:sys(i_sys).Ninputs
0432     [pos, sum] = ssm.cellstrfind(sys(i_sys).inputnames,sys(i_sys).inputnames{i_input},'all');
0433     if sum>1
0434       error(['error because system ',sys(i_sys).name,' has ',num2str(sum),' inputs named ',sys(i_sys).inputnames{i_input}]);
0435     end
0436   end
0437   for i_output=1:sys(i_sys).Noutputs
0438     [pos, sum] = ssm.cellstrfind(sys(i_sys).outputnames,sys(i_sys).outputnames{i_output},'all');
0439     if sum>1
0440       error(['error because system ',sys(i_sys).name,' has ',num2str(sum),' outputs named ',sys(i_sys).outputnames{i_output}]);
0441     end
0442   end
0443   for i_ss=1:sys(i_sys).Nss
0444     [pos, sum] = ssm.cellstrfind(sys(i_sys).ssnames,sys(i_sys).ssnames{i_ss},'all');
0445     if sum>1
0446       error(['error because system ',sys(i_sys).name,' has ',num2str(sum),' state space named ',sys(i_sys).ssnames{i_ss}]);
0447     end
0448   end
0449   for i_input=1:sys(i_sys).Nparams
0450     if i_input <= sys(i_sys).Nparams
0451       [pos, sum] = ssm.cellstrfind(sys(i_sys).paramnames,sys(i_sys).paramnames{i_input},'all');
0452       if sum>1
0453         if sys(i_sys).paramvalues(pos(1))==sys(i_sys).paramvalues(pos(1))
0454           if sys(i_sys).paramsigmas(pos(1))==sys(i_sys).paramsigmas(pos(1))
0455             sys(i_sys).paramsigmas = [sys(i_sys).paramsigmas(1:pos(1)-1) sys(i_sys).paramsigmas(pos(1)+1 : sys(i_sys).Nparams)];
0456             sys(i_sys).paramvalues = [sys(i_sys).paramvalues(1:pos(1)-1) sys(i_sys).paramvalues(pos(1)+1 : sys(i_sys).Nparams)];
0457             sys(i_sys).paramnames = [sys(i_sys).paramnames(1:pos(1)-1) sys(i_sys).paramnames(pos(1)+1 : sys(i_sys).Nparams)];
0458             sys(i_sys).Nparams = sys(i_sys).Nparams-1;
0459             str = ['warning because parameter ', sys(i_sys).paramnames{pos(2)-1}, ' was found ', num2str(sum), ' times in ', sys(i_sys).name];
0460             utils.helper.msg(utils.const.msg.MNAME, str);
0461           else
0462             str = ['error because system ',sys(i_sys).name,' has ',num2str(sum),' parameters named ',sys(i_sys).paramnames{i_input}, ' with different sigmas'];
0463             utils.helper.msg(utils.const.msg.MNAME, str);
0464           end
0465         else
0466           str = ['error because system ',sys(i_sys).name,' has ',num2str(sum),' parameters named ',sys(i_sys).paramnames{i_input}, ' with different values'];
0467           utils.helper.msg(utils.const.msg.MNAME, str);
0468         end
0469       end
0470     end
0471   end
0472 
0473   %% =========== checking field types ===========
0474   
0475   Fields = {...
0476     'amats' 'bmats' 'cmats' 'dmats' 'mmats' 'isnumerical' 'timestep'...
0477     'amats_handles' 'bmats_handles' 'cmats_handles' 'dmats_handles' ...
0478     'inputnames' 'inputvarnames' 'inputsizes'  'Ninputs' ...
0479     'ssnames' 'ssvarnames' 'sssizes' 'Nss' 'ssini' ...
0480     'outputnames' 'outputvarnames' 'outputsizes'  'Noutputs'...
0481     'paramnames' , 'paramvalues'  'paramsigmas' 'Nparams' };
0482   Classes = {...
0483     'doublesym' 'doublesym' 'doublesym' 'doublesym' 'doublesym' 'logical' 'double'...
0484     'cell' 'cell' 'cell' 'cell'...
0485     'cellstr' 'cellcellstr' 'double' 'double' ...
0486     'cellstr' 'cellcellstr' 'double' 'double' 'cell' ...
0487     'cellstr' 'cellcellstr' 'double' 'double' ...
0488     'cellstr' 'double' 'double' 'double' ...
0489     };
0490 
0491   for f = [Fields ; Classes]
0492     if isequal(f{2},'doublesym') % case where both double and symbolic classes are allowed
0493       for i_input = 1:length(sys(i_sys).(f{1}))
0494         if ~( isa(sys(i_sys).(f{1}){i_input},'double') || isa(sys(i_sys).(f{1}){i_input},'sym') )
0495           error(['error because in ssm ',sys(i_sys).name,' because element ',num2str(i_input),...
0496             ' of field ', f{1},' is of type ',class(sys(i_sys).(f{1})),...
0497             ' instead of '' double'' or ''sym'' ']);
0498         end
0499       end
0500     elseif isequal(f{2},'cellstr')
0501       if ~( iscellstr(sys(i_sys).(f{1})) )
0502         error(['error because in ssm ',sys(i_sys).name,...
0503           ' because  field ', f{1},' is of type ',class(sys(i_sys).(f{1})),...
0504           ' instead of ''cellstr'' ']);
0505       end
0506     elseif isequal(f{2},'cellcellstr')
0507       if ~( iscell(sys(i_sys).(f{1})) )
0508         error(['error because in ssm ',sys(i_sys).name,...
0509           ' because  field ', f{1},' is of type ',class(sys(i_sys).(f{1})),...
0510           ' instead of ''cellcellstr'' ']);
0511       end
0512       for i=1:length(sys(i_sys).(f{1}))
0513         if ~( iscellstr(sys(i_sys).(f{1}){i}) )
0514           error(['error because in ssm ',sys(i_sys).name,...
0515             ' because  field ', f{1},' is of type ',class(sys(i_sys).(f{1})),...
0516             ' instead of ''cellcellstr'' ']);
0517         end
0518       end
0519     else
0520       if ~isa(sys(i_sys).(f{1}),f{2})
0521         error(['error because in ssm ',sys(i_sys).name,' because field ',...
0522           f{1},' is of type ',class(sys(i_sys).(f{1})),' instead of ', f{2}]);
0523       end
0524     end
0525   end
0526 end
0527 varargout = {sys};
0528 end

Generated on Mon 25-Aug-2008 22:39:29 by m2html © 2003