Quintiq file version 2.0
|
#parent: #root
|
Method SetCPLEXParametersNonHierarchicalGoal (
|
MathematicalProgram program,
|
const StrategyLevelMacroPlan runlevel,
|
const LibOpt_Scope scope
|
) const
|
{
|
Description: 'Set the parameters (time limit, gap, etc) of the optimizer, according to setting per iteration'
|
TextBody:
|
[*
|
// soh yee Jul-2-2013 (created)
|
// ResetParameters is removing all parameters that were set by AddBooleanParameter, AddNumberParameter, AddRealParameter, AddStringParameter.
|
// That includes the AbsoluteGap and RelativeGap that we set below with AddRealParameter
|
|
assert( not this.UseHierarchicalCPLEXGoals(), 'not expecting this code to be executed for multi-level cplex ' )
|
|
runcontext := this.GetRunContextConst();
|
rcm := this.GetRunContextMeta();
|
|
if ( runcontext.IsMetaIteration() )
|
{
|
if ( runcontext.GetIsMIP() )
|
{
|
program.AddRealParameter( 2010, rcm.OptionIntegralityTolerance() ); // use default for meta unless user sets it explicitly
|
if ( not runcontext.UseShiftOptimization() or this.IsHardShiftOptimizationLevel( runcontext, scope ) )
|
{
|
program.AddRealParameter( 2009, rcm.OptionRelativeMIPGap() ); // use default for meta unless user sets it explicitly
|
}
|
}
|
}
|
else
|
{
|
if( runlevel.UseAbsoluteGap() )
|
{
|
program.AddRealParameter( 2008, runlevel.AbsoluteGap() ); // absolute gap tolerance
|
program.AddRealParameter( 2009, 0.0 ); // explicitly must set rel gap to 0, otherwise solver can still terminate early based on that
|
}
|
else
|
{
|
program.AddRealParameter( 2009, runlevel.RelativeGap() ); // relative gap tolerance
|
program.AddRealParameter( 2008, 0.0 ); // explicitly must set abs gap to 0, otherwise solver can still terminate early based on that
|
}
|
}
|
|
this.ActivateSolverSettings( program, runlevel ); // activate the solver settings for the next level
|
|
timelimit := [Real]runlevel.TimeLimit();
|
if ( runcontext.IsMetaIteration() and not this.IsFullPlanMetaPriorFocus() )
|
{
|
factor := 4;
|
timelimit := factor * rcm.OptionMaxTimePerIterationSeconds(); // set time out to be 'factor' X the target time used for tuning
|
debuginfo( 'Time out cplex:', timelimit );
|
}
|
program.TimeLimit( timelimit ); // time limit
|
|
if( runcontext.IsForBenchmarking() ) // For total time limit of the benchmarking execution
|
{
|
if ( program.Threads() > runcontext.MaxNumberOfThreadsForBenchmarking() )
|
{
|
|
program.Threads( runcontext.MaxNumberOfThreadsForBenchmarking() );
|
}
|
}
|
|
maxthreadsglobal := ifexpr( this.MacroPlan().IsSizingParameterOn(), this.MacroPlan().ResourceManager_MP().MaxThreadForOptimization(), Number::MaxNumber() );
|
program.Threads( minvalue( program.Threads(), maxthreadsglobal ) ); // limit by sizing parameter setting
|
program.AddNumberParameter( 1067, program.Threads() ); // otherwise CPLEX log shows thread parameter is not used
|
|
debuginfo( 'program.Threads() = ', program.Threads() );
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|