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

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

Generated on Mon 08-Sep-2008 13:18:47 by m2html © 2003