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' } 
 | 
} 
 |