| Quintiq file version 2.0 | 
| #parent: #root | 
| Method DelayedInitialization ( | 
|   CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, | 
|   LibOpt_Task task, | 
|   const RunContextForCapacityPlanning runcontext, | 
|   Boolean isfeasible | 
| ) | 
| { | 
|   TextBody: | 
|   [* | 
|     if ( isfeasible ) // we omit not needed processing in the handle infeasible for performance | 
|     { | 
|       this.RestoreSetCPLEXBoundFlags( program, runcontext ); // need flags on objects (for const-ness written to program) | 
|       this.StorePITVarProperties( program, task.Scope() ); | 
|       this.StoreSalesVarProperties( program, task.Scope() ); | 
|        | 
|       this.ResetManualQuanties(  this.GetRunContext(), task.Scope() ); // resetting manual plan if user has selected override manual quantities | 
|     } | 
|      | 
|     // logged values for snapshots  | 
|     this.LoggedNrPTQtyCampaignSlackVar( [Number] guard( program.RetrieveReal( CapacityPlanningSuboptimizer::LoggedNrPTQtyCampaignSlackVarName() ), 0 ) );  | 
|      | 
|     this.MacroPlan().GetLastAlgorithmRun().NumberOfThreads( program.Threads() ); // record what is used | 
|      | 
|     // workaround. Was stored on program because init needs to be const | 
|     nextlevel := this.CurrentSubOptimizerLevel().LevelNumber();  | 
|     algorithmrunlevel := this.MacroPlan().GetLastAlgorithmRun().GetAlgorithmRunLevel( nextlevel );  | 
|     if ( not isnull( algorithmrunlevel ) )  | 
|     { | 
|       actualtime := DateTime::ConstructMinutes( this.BaseForActualTime(), program.RetrieveReal( 'ActivateGoals_actualtime' ) );  | 
|       algorithmrunlevel.Update( actualtime, algorithmrunlevel.End(), false, 0.0, 0.0, 0.0, program.Optimal() ); | 
|     } | 
|     if ( this.IsAutoScalingEnabled() ) // need to do init in the handle feasible or handle infeasible because init is const. We do it at the very first return to a handle method | 
|     { | 
|       this.InitForScaling( program );  | 
|     } | 
|      | 
|     if ( not this.InOneTransaction() )  | 
|     { | 
|       task.Log( 'Duration init var+goal = ' + [String] program.RetrieveReal( 'duration_init_vargoals' ) );  | 
|       start_init_reactive := program.RetrieveReal( 'start_init_reactive' );  | 
|       end_init_reactive := program.RetrieveReal( 'end_init_reactive' );  | 
|       duration_init_reactive := (end_init_reactive - start_init_reactive )/OS::PrecisionCounterFrequency();  | 
|        | 
|       timetoclonemsg := program.RetrieveString(  'timetoclone_msg' ); | 
|       task.Log( timetoclonemsg );  | 
|       timeforA := program.RetrieveReal( 'type_A_constraints' );  | 
|       timeforB := program.RetrieveReal( 'type_B_constraints' );  | 
|       timeforC := program.RetrieveReal( 'type_C_constraints' );  | 
|       this.InitTimeThreadA( timeforA ); // written to snapshot later | 
|       this.InitTimeThreadB( timeforB );  | 
|       this.InitTimeThreadC( timeforC );  | 
|        | 
|       cumultimeA := timeforA;  | 
|       cumultimeB := timeforB;  | 
|       cumultimeC := timeforC;  | 
|       snapshot := task.Run().LastSnapshot();  | 
|       collected := 0;  | 
|       snapshots := construct(  SnapshotMacroPlannerOptimizers );  | 
|       while ( not isnull( snapshot ) and collected < 5 )  | 
|       { | 
|         if ( snapshot.istype( SnapshotMacroPlannerOptimizer ) )  | 
|         { | 
|           snapshots.Add( snapshot.astype( SnapshotMacroPlannerOptimizer ) );  | 
|           collected++;  | 
|         }   | 
|         snapshot := snapshot.PreviousOnRun();  | 
|       } | 
|      | 
|       cumultimeA := cumultimeA + sum ( snapshots, Elements, s, true, s.InitTimeThreadA() );  | 
|       cumultimeB := cumultimeB + sum ( snapshots, Elements, s, true, s.InitTimeThreadB() );  | 
|       cumultimeC := cumultimeC + sum ( snapshots, Elements, s, true, s.InitTimeThreadC() );  | 
|       | 
|       task.Log( 'Duration type A init constraints = ' + [String] timeforA + ' = cumul -> ' + [String] cumultimeA );  | 
|       task.Log( 'Duration type B init constraints = ' + [String] timeforB + ' = cumul -> ' + [String] cumultimeB );  | 
|       task.Log( 'Duration type C init constraints = ' + [String] timeforC + ' = cumul -> ' + [String] cumultimeC );  | 
|       task.Log( program.RetrieveString( 'MergeDuration' ) );  | 
|       task.Log( 'Duration init reactive = ' + [String] duration_init_reactive );  | 
|       this.AdjustWorkLoad( task, cumultimeA, cumultimeB, cumultimeC );  | 
|       msg := 'Adjusting thread parameters to'  | 
|               + [String] this.ThreadAParameter()  | 
|               + ', '  | 
|               + [String] this.ThreadBParameter()  | 
|               + 'ratios:'  | 
|               + [String] (this.ThreadAParameter() / 1000)  | 
|               + ', '  | 
|               + [String] ((this.ThreadBParameter() - this.ThreadAParameter()) / 1000 ) | 
|               + ', ' | 
|               + [String] ((1000 - this.ThreadBParameter()) / 1000);  | 
|       task.Log( msg );  | 
|      | 
|     } | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |