in cli/gcdmodel.cpp [407:493]
bool CGcdData::fixModelAndSubmodelOrder()
{
if( _modelData.Order < 1 )
{
PrintMessage( InputDataError, L"Order cannot be smaller than 1" );
return( false );
}
Model* rootModel = _task.GetRootModel();
// If the order given as arg to the program has not been explicitely defined it defaults to 2
// If there's only one parameter or submodel in the model, the order of 2 will fail to execute
// To aviod this, must switch to lower order behind the scenes
size_t inputParamCount = _modelData.TotalParameterCount() - _modelData.ResultParameterCount();
if( _modelData.ProvidedArguments.find( SWITCH_ORDER ) == _modelData.ProvidedArguments.end() )
{
// if submidels were defined, don't need any params, otherwise order = params without submodels
if( _modelData.Submodels.size() > 0 )
{
if( _modelData.Order > static_cast<int>( rootModel->GetSubmodelCount() ) )
{
_modelData.Order = rootModel->GetSubmodelCount();
}
}
else
{
if( inputParamCount > 0 && _modelData.Order > static_cast<int>( inputParamCount ) )
{
_modelData.Order = static_cast<int>( inputParamCount );
}
}
rootModel->SetOrder( _modelData.Order );
}
// now perform standard check on the order
if( _modelData.Submodels.size() > 0 )
{
// order of combinations provided to the tool cannot be bigger than number of submodels
if( _modelData.Order > static_cast<int>( rootModel->GetSubmodelCount() ) )
{
PrintMessage( InputDataError, L"Order cannot be larger than total number of submodels and oustanding parameters" );
return( false );
}
}
else
{
// check that the order is at most the number of params
if( _modelData.Order > (int) inputParamCount )
{
PrintMessage( InputDataError, L"Order cannot be larger than number of parameters" );
return( false );
}
}
// now that we have the model order calculated, fix all submodels in which order is still UNDEFINED
for( auto & model : Models )
{
if( model != rootModel && UNDEFINED_ORDER == model->GetOrder() )
{
model->SetOrder( min( (int) model->GetParameters().size(), _modelData.Order ) );
}
}
// perform checks on the submodels
for( auto & model : Models )
{
if( model->GetOrder() < 1 )
{
PrintMessage( InputDataError, L"Order of a submodel should be at least 1" );
return( false );
}
// only for models that do not contain other models
if( 0 == model->GetSubmodelCount() )
{
if( model->GetOrder() > (int) ( model->GetParameters().size() ) )
{
PrintMessage( InputDataError, L"Order of a submodel cannot be larger than number of involved parameters" );
return( false );
}
}
}
return( true );
}