Quintiq file version 2.0
|
#parent: #root
|
MethodOverride HandleFeasible (
|
MathematicalProgram program,
|
LibOpt_Task task
|
) as LibOpt_Scope
|
{
|
TextBody:
|
[*
|
start := OS::PrecisionCounter();
|
runcontext := this.GetRunContextConst();
|
|
isfirsthandlefeasiblecall := this.CurrentSubOptimizerLevel().IsFirst();
|
isfirstnotlasthandlefeasiblecallatlevelzero := isfirsthandlefeasiblecall and not this.CurrentSubOptimizerLevel().IsLast() and this.CurrentSubOptimizerLevel().LevelNumber() = 0;
|
if ( isfirsthandlefeasiblecall ) // initialize of cplex needs to be const for paralellization. Any non-const processing is moved into the delayed initialization called on return of first handle feasible/infeasible.
|
{
|
this.DelayedInitialization( program.astype( CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm ), task, runcontext, true );
|
}
|
|
this.LogDetailsCPLEX( program, '', task.Scope() );
|
|
qualityok := this.CanRescueSolution( program, task )
|
passlevelzeroformeta := this.GetRunContextConst().IsMetaIteration()
|
and isfirstnotlasthandlefeasiblecallatlevelzero // for meta we are willing to accept lower quality for the fixed level 0.
|
and not this.GetRunContextMeta().OptionUseHierarchicalCPLEXGoals() //
|
if( qualityok or passlevelzeroformeta )
|
{
|
this.CapacityPlanningAlgorithmHandleFeasiblePreProcessing( program.astype( CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm ), runcontext, task );
|
}
|
else
|
{
|
msg := 'Handle feasible aborted because quality insufficient';
|
debuginfo( msg );
|
this.DetailsCPLEX( this.DetailsCPLEX() + msg );
|
this.HandleInfeasible( program, task );
|
}
|
end := OS::PrecisionCounter();
|
durationtotal := (end- start) / OS::PrecisionCounterFrequency();
|
task.Log( 'Duration h-feasible total = ' +[String] durationtotal );
|
return task.Scope();
|
*]
|
}
|