Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method AddGoalToLevel ( 
 | 
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, 
 | 
  Number goallevel, 
 | 
  Real goalweight, 
 | 
  Real coefficient, 
 | 
  MPVariable goalvar, 
 | 
  Boolean useboundfromplan, 
 | 
  Real boundfromplan 
 | 
) const 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    if( goalweight > 0.0 ) 
 | 
    { 
 | 
      traverse( this, MacroPlan.StrategyMacroPlan.StrategyLevelMacroPlan, level )  
 | 
      { 
 | 
        if( goallevel = level.Level() ) 
 | 
        { 
 | 
          totalcoefficient := coefficient * goalweight * ifexpr( level.Level() = 0, 1.0, this.ScaleGoalTerm( typeofexpression( goalvar ), level ) ); // exception level 0 no need to scale all terms coeff 1 
 | 
          goalconstr := program.GoalConstraints().Get( level );   
 | 
          goalconstr.NewTerm( totalcoefficient, goalvar ); 
 | 
           
 | 
          // workaround for not being able to write to attribute  
 | 
          if ( not useboundfromplan ) // only set bound from plan if all added kpis have computable bounds (0 means false below, bounds are initialized at 1) 
 | 
          { 
 | 
            this.StoreValueInProgram( program, 'collect_values_model_SetCPLEXBoundFromPlan' + [String] level.Level(), 0.0 );  
 | 
          } 
 | 
          if ( not goalvar = program.TotalLotSizeVariables().Get()  // lot size bound is set separately on total lot size var 
 | 
               and not goalvar = program.TotalStockingPointCapacityVariables().Get() // spip cap we give a separate bound, because it aggregates a lot of noise (don't want it to spread to other KPIs) 
 | 
               and not goalvar = program.TotalBlendingVariables().Get() ) // for blending we give individual bound because of sensitive nature 
 | 
          { 
 | 
            // workaround for not being able to write to attribute 
 | 
            name := 'collect_values_model_TotalBoundFromPlan' + [String] level.Level();  
 | 
            value_collect_values_model_TotalBoundFromPlan := program.RetrieveReal( name );    
 | 
            newvalue := value_collect_values_model_TotalBoundFromPlan + totalcoefficient * boundfromplan;  
 | 
            this.StoreValueInProgram( program, name, newvalue );  
 | 
          } 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |