bool CGcdData::fixModelAndSubmodelOrder()

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 );
}