Quintiq file version 2.0
|
#parent: #root
|
MethodOverride InitializeReactive (
|
const LibOpt_Task task,
|
MathematicalProgram program
|
) const as stream[Object]
|
{
|
TextBody:
|
[*
|
debuginfo( 'Asynchronous start = ', DateTime::ActualTime() );
|
start_init_reactive := OS::PrecisionCounter();
|
scope := task.Scope();
|
runcontext := this.GetRunContextConst();
|
pispipssmartplan := scope.GetSmartPlanPISPIPsInOptimizerRunConst();
|
|
userperiodtasks := runcontext.GetUserPeriodTaskOperationsConst();
|
userproductintrips :=runcontext.GetUserProductInTrips();
|
|
start_init_varsgoals := OS::PrecisionCounter();
|
|
programcast := program.astype( CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm );
|
|
pispipsinrun := scope.GetPISPIPInOptimizerRunConst();
|
pispsinrun := scope.GetProductInStockingPointInOptimizerRunConst();
|
leafpispipsinrun := selectset( pispipsinrun, Elements.astype( ProductInStockingPointInPeriodPlanningLeaf ), pispip, true, true );
|
pitinrun := scope.GetProductInTripInOptimizerRunConst();
|
|
programcast.StoreReal( 'start_init_reactive', start_init_reactive );
|
this.CapacityPlanningAlgorithmInitInstance( programcast, runcontext, scope );
|
|
// initialize variables
|
start_init_varsgoals := OS::PrecisionCounter();
|
|
this.CapacityPlanningAlgorithmInitVariables( programcast, runcontext, userperiodtasks, userproductintrips, pispipssmartplan, scope, pispipsinrun, leafpispipsinrun, pispsinrun, pitinrun );
|
|
this.SetStartSolutionForPTLotSizes( programcast, runcontext, scope );
|
|
this.SetStartSolutionForCampaignSequencing( programcast, runcontext, scope );
|
|
if ( this.UseHierarchicalCPLEXGoals() )
|
{
|
this.CapacityPlanningAlgorithmInitGoals( programcast, runcontext, scope );// workaround we should add the goal after cloning because otherwise the goal term constant become = nr of threads.
|
// but for hierarchical goals this currently produces a core bug
|
}
|
|
end_init_varsgoals := OS::PrecisionCounter();
|
duration_unit_vargoals := ((end_init_varsgoals - start_init_varsgoals) / OS::PrecisionCounterFrequency());
|
programcast.StoreReal( 'duration_init_vargoals', duration_unit_vargoals );
|
|
startclone := OS::PrecisionCounter();
|
clone1 := program.Clone().astype( CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm );
|
clone2 := program.Clone().astype( CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm );
|
endclone := OS::PrecisionCounter();
|
durationclone := (endclone - startclone )/ OS::PrecisionCounterFrequency();
|
|
msgclone := '#time to clone (ms) =' + [String] durationclone +
|
'#vars clone1=' + [String] clone1.Variables( relsize );
|
programcast.StoreString( 'timetoclone_msg', msgclone );
|
|
if ( not this.UseHierarchicalCPLEXGoals() )
|
{
|
this.CapacityPlanningAlgorithmInitGoals( programcast, runcontext, scope );// workaround we should add the goal after cloning because otherwise the goal term constant become = nr of threads.
|
}
|
|
stream1 := this->CapacityPlanningAlgorithmInitConstraints_ParallelTypeA( programcast, pispipssmartplan, userperiodtasks, task, pispipsinrun, leafpispipsinrun, pispsinrun, pitinrun );
|
stream2 := this->CapacityPlanningAlgorithmInitConstraints_ParallelTypeB( clone1, pispipssmartplan, task, pispipsinrun, leafpispipsinrun, pispsinrun, pitinrun );
|
stream3 := this->CapacityPlanningAlgorithmInitConstraints_ParallelTypeC( clone2, pispipssmartplan, task, pispipsinrun, leafpispipsinrun, pispsinrun, pitinrun );
|
|
// note we run this.FilterCPLEXNoiseInitialization( program, runcontext ) in above parallel threads (filters RHS of constraints)
|
// meaning this filtering is excluded from any constraints added below.
|
|
return stream1->Merge( stream2, stream3 )
|
->| programcast->CapacityPlanningSuboptimizer::InitReactiveFinalize( clone1, clone2, runcontext, scope, this, leafpispipsinrun )
|
->| emit( this )
|
*]
|
}
|