陈清红
2025-04-14 880f3c0257eeb8c37761d484258fdd102a369a19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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' }
}