| Quintiq file version 2.0 | 
| #parent: #root | 
| Method CreateSubOptimizerLevels ( | 
|   const RunContextForCapacityPlanning runcontext, | 
|   LibOpt_Task task | 
| ) | 
| { | 
|   TextBody: | 
|   [* | 
|     // this method creates the levels for cplex re-execution control flow | 
|      | 
|     this.SubOptimizerLevel( relflush );  | 
|      | 
|     maxlevel := this.GetMaxLevel( runcontext ); // need to create level 0, 1, ..., maxlevel, and potentially maxlevel+1 in case we add a ptqty minimization at the end | 
|      | 
|     // meta optimizer can skip levels by means of fixing bounds | 
|      | 
|     currentlevelnumber := 0; // level 0 we always do. this is where we start creating levels | 
|     while( currentlevelnumber <= maxlevel )  | 
|     { | 
|       this.SubOptimizerLevel( relnew, LevelNumber :=  currentlevelnumber, IsExtraPTQTYLevelMetaOptimizer := false );  | 
|       currentlevelnumber := currentlevelnumber + 1; // advance to next level | 
|       skippedaheadlevel := false;  | 
|       if ( runcontext.IsMetaIteration() and not this.IsFullPlanMetaPriorFocus() ) // look for skipping ahead, if possible   | 
|       { | 
|         oldcurrentlevelnumber := currentlevelnumber;  | 
|         searchstart := currentlevelnumber;  | 
|         currentlevelnumber := this.GetNextOptimizationLevel( runcontext, task.Scope().IsGeneratedByPreProductionSelector(), searchstart );  | 
|         skippedaheadlevel := oldcurrentlevelnumber < currentlevelnumber;  | 
|         if ( skippedaheadlevel )  | 
|         { | 
|           debuginfo(  'Meta optimizer skipping ahead to ', currentlevelnumber, ' instead of ', oldcurrentlevelnumber, 'pre production sel. scope =', task.Scope().IsGeneratedByPreProductionSelector() );  | 
|         } | 
|       } | 
|     } | 
|      | 
|     if ( runcontext.IsMetaIteration() )  | 
|     { | 
|       if ( this.GetDoExecutePTQtyLevel( task.Scope().IsGeneratedByPreProductionSelector() ) )  | 
|       { | 
|         this.SubOptimizerLevel( relnew, LevelNumber := maxlevel + 1, IsExtraPTQTYLevelMetaOptimizer := true );    | 
|       } | 
|     } | 
|      | 
|     if ( this.DoLevelCollapse( runcontext ) ) | 
|     { | 
|       this.FirstSubOptimizerLevel().Delete(); // remove level 0 | 
|     }   | 
|      | 
|     this.CurrentSubOptimizerLevel( relset, this.FirstSubOptimizerLevel() ); | 
|     debuginfo(  'Created nr of level = ', this.SubOptimizerLevel( relsize ), 'first = ', this.FirstSubOptimizerLevel().LevelNumber() ); | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |