Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method ActivateHierarchicalGoals ( 
 | 
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, 
 | 
  const RunContextForCapacityPlanning runcontext, 
 | 
  const LibOpt_Scope scope 
 | 
) const 
 | 
{ 
 | 
  Description: 'Activate goal of current level, deactivate previous level goal, and freeze total goal value of previous goal' 
 | 
  TextBody: 
 | 
  [* 
 | 
    assert( this.CurrentSubOptimizerLevel().IsFirst(), ' hierarchical goals are expected to be created for all goals for all levels prior to the very first cplex invocation ' );  
 | 
     
 | 
    nrlevel := this.SubOptimizerLevel( relsize );  
 | 
     
 | 
    // workaround for hierarhical goals - need a binary 
 | 
    program.NewBinaryVariable(  'Dummy');  
 | 
     
 | 
    if ( runcontext.IsMetaIteration() )  
 | 
    { 
 | 
      program.TimeLimit( this.GetRunContextMeta().OptionMaxTimePerIterationSeconds() * 2 * nrlevel );  
 | 
    } 
 | 
    else 
 | 
    { 
 | 
      mp := this.Run().OptimizationConst().astype( Optimization ).MacroPlan();  
 | 
      timelimit := sum(  mp, StrategyMacroPlan.StrategyLevelMacroPlan, slm, true, slm.TimeLimit() );  
 | 
      program.TimeLimit( timelimit );  
 | 
    } 
 | 
    debuginfo(  'Set program.TimeLimit = ', program.TimeLimit() );  
 | 
           
 | 
    priority := this.SubOptimizerLevel( relsize ); // higher priority means solved first hierarchically 
 | 
    traverse( this, SubOptimizerLevel, suboptlevel ) // sorted relation traversing in order of level number 0, 1, 2, ... 
 | 
    { 
 | 
        debuginfo( 'Create level goal', suboptlevel.LevelNumber() );   
 | 
     
 | 
        newgoal := program.NewGoal( CapacityPlanningSuboptimizer::HierarchicalGoalLevelName( suboptlevel.LevelNumber() ) );  
 | 
        newgoal.Sense( 'Maximize' );   
 | 
        newgoal.Priority( priority );  
 | 
        newgoal.Weight( 1.0 );  
 | 
         
 | 
        if ( suboptlevel.IsExtraPTQTYLevelMetaOptimizer() )  
 | 
        { 
 | 
          this.AddPTQtyGoal( scope, program, newgoal );    
 | 
        } 
 | 
        else 
 | 
        { 
 | 
          nextgoalvar := program.GoalForLevelVariables().Get( suboptlevel.GetStrategyLevelMacroPlan() );  
 | 
          newgoal.NewTerm( 1.0, nextgoalvar ); 
 | 
          this.SetCPLEXParametersHierarchicalGoal( program, suboptlevel.GetStrategyLevelMacroPlan(), newgoal );    
 | 
        } 
 | 
         
 | 
        priority--;  
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |