Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method InitConstraintsForGoalsForLevelGoal ( 
 | 
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, 
 | 
  const RunContextForCapacityPlanning runcontext, 
 | 
  const LibOpt_Scope scope 
 | 
) const 
 | 
{ 
 | 
  Description: 'Initialize constraints for calculating goal value for each level' 
 | 
  TextBody: 
 | 
  [* 
 | 
    traverse( this, MacroPlan.StrategyMacroPlan.StrategyLevelMacroPlan, level )  
 | 
    {  
 | 
      // below we define the single variable that is goal to consider during level 'level' by adding goal terms to the defining constraint 'const' 
 | 
      levelgoalvar := program.GoalForLevelVariables().Get( level );   
 | 
     
 | 
      const := program.GoalConstraints().New(  level );   
 | 
      const.NewTerm( -1.0, levelgoalvar );  
 | 
      const.Sense( '=' );     
 | 
       
 | 
      // workaround because cannot write to attribute on level - 1.0 means true 
 | 
      this.StoreValueInProgram( program, 'collect_values_model_SetCPLEXBoundFromPlan' + [String] level.Level(), 1.0 );  
 | 
      this.StoreValueInProgram( program, 'collect_values_model_TotalBoundFromPlan' + [String] level.Level(), 0.0 );  
 | 
       
 | 
      if ( runcontext.IsMetaIteration()  
 | 
           and level.Level() >= runcontext.WeightLevelNonFinancial().StockingPointCapacityLevel()  
 | 
           and runcontext.WeightLevelNonFinancial().StockingPointCapacityWeight() > 0  
 | 
           and runcontext.WeightLevelNonFinancial().StockingPointCapacityLevel() > 0 )  
 | 
      { 
 | 
        weight := this.GetRunContextMeta().OptionRestrictSPcapacityWeight();  
 | 
        const.NewTerm( -1.0 * weight, program.TotalStockingPointCapacityMetaVariables().Get() ); // use (1-epsilon) max capacity limits. Keep supressing SP inventory 
 | 
      } 
 | 
    } 
 | 
     
 | 
    weightlevels := this.GetRunContextConst().WeightLevelNonFinancial();   
 | 
       
 | 
      // non-financial kpi 
 | 
    // Goal term for maximization = 1.0 * weight * variable scale factor for kpi / goal scaling factor 
 | 
     
 | 
    // workaround because we cannot write to attribute   
 | 
    //>> 
 | 
    value_collect_values_model_TotalBlendingViolation := 0.0;  
 | 
    value_collect_values_model_MPTotalFulfillmentVariables := 0.0; 
 | 
    value_collect_values_model_MPTotalSalesDemandPriorityVariable := 0.0; 
 | 
    value_collect_values_model_MPTotalPostponentPenaltyVariable := 0.0;  
 | 
    value_collect_values_model_MPTotalMaximumInventoryLevelVariable := 0.0; 
 | 
    value_collect_values_model_MPTotalMinimumInventoryLevelVariable := 0.0; 
 | 
    value_collect_values_model_MPTotalTargetInventoryLevelVariable := 0.0;  
 | 
    value_collect_values_model_MPTotalFulfillmentTargetVariable := 0.0;  
 | 
    value_collect_values_model_MPTotalUnitCapacityVariable := 0.0;  
 | 
    value_collect_values_model_MPTotalUnitSecondaryCapacityVariable := 0.0;  
 | 
    value_collect_values_models_MPTotalMinimumUnitCapacityVariable := 0.0;  
 | 
    value_collect_values_models_MPTotalMinimumUnitSecondaryCapacityVariable := 0.0;  
 | 
    value_collect_values_model_TotalLotSizeVariables := 0.0;  
 | 
    value_collect_values_model_TotalProcessMaximumQuantityVariables := 0.0;  
 | 
    value_collect_values_model_TotalStockingPointCapacityVariables := 0.0;  
 | 
    value_collect_values_model_TotalMaximumSupplyVariables := 0.0;  
 | 
    value_collect_values_model_TotalMinimumSupplyVariables := 0.0;  
 | 
    value_collect_values_model_TotalTargetSupplyVariables := 0.0;  
 | 
    value_collect_values_model_MPTotalCO2EmissionVariables := 0.0; 
 | 
    value_collect_values_model_TotalShiftPatternChangesPenaltyVariable := 0.0; 
 | 
     
 | 
    if ( runcontext.IsMetaIteration() )  
 | 
    { 
 | 
      if( runcontext.UseBlending() ) 
 | 
      { 
 | 
        value_collect_values_model_TotalBlendingViolation := program.RetrieveReal( 'collectvalues_model_TotalBlendingViolation' );  
 | 
      } 
 | 
      value_collect_values_model_MPTotalFulfillmentVariables := program.RetrieveReal( 'collect_values_model_MPTotalFulfillmentVariables' );  
 | 
      value_collect_values_model_MPTotalSalesDemandPriorityVariable := program.RetrieveReal( 'collect_values_model_MPTotalSalesDemandPriorityVariable' );  
 | 
      value_collect_values_model_MPTotalPostponentPenaltyVariable := program.RetrieveReal( 'collect_values_model_MPTotalPostponementPenaltyVariables' );  
 | 
      value_collect_values_model_MPTotalMaximumInventoryLevelVariable := program.RetrieveReal( 'collect_values_model_MPTotalMaximumInventoryLevelVariable' );  
 | 
      value_collect_values_model_MPTotalMinimumInventoryLevelVariable := program.RetrieveReal( 'collect_values_model_MPTotalMinimumInventoryLevelVariable' );  
 | 
      value_collect_values_model_MPTotalTargetInventoryLevelVariable := program.RetrieveReal( 'collect_values_model_MPTotalTargetInventoryLevelVariable' );  
 | 
      value_collect_values_model_MPTotalFulfillmentTargetVariable := program.RetrieveReal( 'collect_values_model_MPTotalFulfillmentTargetVariable' );  
 | 
       
 | 
      value_collect_values_model_MPTotalUnitCapacityVariable := program.RetrieveReal( 'collect_values_model_MPTotalUnitCapacityVariable' );  
 | 
      value_collect_values_model_MPTotalUnitSecondaryCapacityVariable := program.RetrieveReal( 'collect_values_model_MPTotalUnitSecondaryCapacityVariable' );  
 | 
      value_collect_values_models_MPTotalMinimumUnitCapacityVariable := program.RetrieveReal( 'collect_values_models_MPTotalMinimumUnitCapacityVariable' );  
 | 
      value_collect_values_models_MPTotalMinimumUnitSecondaryCapacityVariable := program.RetrieveReal( 'collect_values_models_MPTotalMinimumUnitSecondaryCapacityVariable'); 
 | 
       
 | 
      value_collect_values_model_TotalLotSizeVariables := program.RetrieveReal( 'collect_values_model_TotalLotSizeVariables' );  
 | 
      value_collect_values_model_TotalProcessMaximumQuantityVariables := program.RetrieveReal( 'collect_values_model_TotalProcessMaximumQuantityVariables' ); 
 | 
       
 | 
      value_collect_values_model_TotalStockingPointCapacityVariables := program.RetrieveReal( 'collect_values_model_TotalStockingPointCapacityVariables');  
 | 
       
 | 
      value_collect_values_model_TotalMaximumSupplyVariables := program.RetrieveReal( 'collect_values_model_TotalMaximumSupplyVariables' );  
 | 
      value_collect_values_model_TotalMinimumSupplyVariables := program.RetrieveReal( 'collect_values_model_TotalMinimumSupplyVariables' );  
 | 
      value_collect_values_model_TotalTargetSupplyVariables := program.RetrieveReal( 'collect_values_model_TotalTargetSupplyVariables' );  
 | 
      value_collect_values_model_MPTotalCO2EmissionVariables := program.RetrieveReal( 'collect_values_model_MPTotalCO2EmissionVariable' ); 
 | 
       
 | 
      if( runcontext.UseShiftOptimization() ) 
 | 
      { 
 | 
        value_collect_values_model_TotalShiftPatternChangesPenaltyVariable := program.RetrieveReal( 'collect_values_model_MPTotalShiftPatternChangesPenaltyVariables' ); 
 | 
      } 
 | 
    } 
 | 
    //<< 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.BlendingLevel(), weightlevels.BlendingWeight(), 
 | 
                           -1.0, program.TotalBlendingVariables().Get(), true, value_collect_values_model_TotalBlendingViolation ); 
 | 
                            
 | 
    this.AddGoalToLevel( program, weightlevels.CampaignLevel(), weightlevels.CampaignWeight(), 
 | 
                       -1.0, program.TotalCampaignVariables().Get(), false, 0.0 ); 
 | 
     
 | 
     
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.FulfillmentLevel(), weightlevels.FulfillmentWeight(), 
 | 
                       1.0, program.TotalFulfillmentVariables().Get(), true, value_collect_values_model_MPTotalFulfillmentVariables ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.FulfillmentTargetLevel(), weightlevels.FulfillmentTargetWeight(), 
 | 
                       1.0, program.TotalFulfillmentTargetVariables().Get(), true, value_collect_values_model_MPTotalFulfillmentTargetVariable ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.LotSizeLevel(), weightlevels.LotSizeWeight(), 
 | 
                       -1.0, program.TotalLotSizeVariables().Get(), true, value_collect_values_model_TotalLotSizeVariables ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.InventoryMixBalancingLevel(), weightlevels.InventoryMixBalancingWeight(), 
 | 
                       -1.0, program.TotalInventoryMixBalancingVariables().Get(), false, 0.0 ); 
 | 
                  
 | 
    this.AddGoalToLevel( program, weightlevels.MaximumInventoryLevel(), weightlevels.MaximumInventoryLevelWeight(), 
 | 
                       -1.0, program.TotalMaximumInventoryLevelVariables().Get(), true, value_collect_values_model_MPTotalMaximumInventoryLevelVariable ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.MinimumInventoryLevel(), weightlevels.MinimumInventoryLevelWeight(), 
 | 
                       -1.0, program.TotalMinimumInventoryLevelVariables().Get(), true, value_collect_values_model_MPTotalMinimumInventoryLevelVariable ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.MaximumSupplyLevel(), weightlevels.MaximumSupplyWeight(), 
 | 
                       -1.0, program.TotalMaximumSupplyVariables().Get(), true, value_collect_values_model_TotalMaximumSupplyVariables ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.MinimumSupplyLevel(), weightlevels.MinimumSupplyWeight(), 
 | 
                       -1.0, program.TotalMinimumSupplyVariables().Get(), true, value_collect_values_model_TotalMinimumSupplyVariables ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.MinimumUnitCapacityLevel(), weightlevels.MinimumUnitCapacityWeight(), 
 | 
                       -1.0, program.TotalMinimumUnitCapacityVariables().Get(), true, value_collect_values_models_MPTotalMinimumUnitCapacityVariable ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.MinimumUnitCapacityLevel(), weightlevels.MinimumUnitCapacityWeight(), 
 | 
                       -1.0, program.TotalMinimumUnitSecondaryCapacityVariables().Get(), true, value_collect_values_models_MPTotalMinimumUnitSecondaryCapacityVariable ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.PostponementPenaltyLevel(), weightlevels.PostponementPenaltyWeight(), 
 | 
                       -1.0, program.TotalPostponementPenaltyVariables().Get(), true, value_collect_values_model_MPTotalPostponentPenaltyVariable ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.ProcessMaximumQuantityLevel(), weightlevels.ProcessMaximumQuantityWeight(), 
 | 
                       -1.0, program.TotalProcessMaximumQuantityVariables().Get(), true, value_collect_values_model_TotalProcessMaximumQuantityVariables ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.SalesDemandPriorityLevel(), weightlevels.SalesDemandPriorityWeight(), 
 | 
                       1.0, program.TotalSalesDemandPriorityVariables().Get(), true, value_collect_values_model_MPTotalSalesDemandPriorityVariable ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.ServiceLevelLevel(), weightlevels.ServiceLevelWeight(), 
 | 
                       1.0, program.TotalServiceLevelVariables().Get(), false, 0.0 ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.SlackLevel(), weightlevels.SlackWeight(), 
 | 
                       -1.0, program.TotalSlackVariables().Get(), false, 0.0 ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.StockingPointCapacityLevel(), weightlevels.StockingPointCapacityWeight(), 
 | 
                       -1.0, program.TotalStockingPointCapacityVariables().Get(), true, value_collect_values_model_TotalStockingPointCapacityVariables ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.SupplyTargetLevel(), weightlevels.SupplyTargetWeight(), 
 | 
                       -1.0, program.TotalSupplyTargetVariables().Get(), true, value_collect_values_model_TotalTargetSupplyVariables ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.TargetInventoryLevel(), weightlevels.TargetInventoryLevelWeight(), 
 | 
                       -1.0, program.TotalTargetInvLevelVariables().Get(), true, value_collect_values_model_MPTotalTargetInventoryLevelVariable ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.UnitCapacityLevel(), weightlevels.UnitCapacityWeight(), 
 | 
                       -1.0, program.TotalUnitCapacityVariables().Get(), true, value_collect_values_model_MPTotalUnitCapacityVariable ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.UnitCapacityLevel(), weightlevels.UnitCapacityWeight(), 
 | 
                       -1.0, program.TotalUnitSecondaryCapacityVariables().Get(), true, value_collect_values_model_MPTotalUnitSecondaryCapacityVariable ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.CapacitySmoothingLevel(), weightlevels.CapacitySmoothingWeight(), 
 | 
                       -1.0, program.TotalCapacitySmoothingSlackVariables().Get(), false, 0.0 ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.ExpiredQtyLevel(), weightlevels.ExpiredQtyWeight(), 
 | 
                       -1.0, program.TotalExpiredQtyVariables().Get(), false, 0.0 ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.CO2EmissionLevel(), weightlevels.CO2EmissionWeight(), 
 | 
                       -1.0, program.TotalCO2EmissionVariables().Get(), true, value_collect_values_model_MPTotalCO2EmissionVariables ); 
 | 
     
 | 
    this.AddGoalToLevel( program, weightlevels.ShiftPatternChangesPenaltyLevel(), weightlevels.ShiftPatternChangesPenaltyWeight(), 
 | 
                         -1.0, program.TotalShiftPatternChangesPenaltyVariables().Get(), true, value_collect_values_model_TotalShiftPatternChangesPenaltyVariable ); 
 | 
     
 | 
    // Accounts kpi 
 | 
    traverse( scope.GetAccountsInOptimizerRunConst(), Elements, account )  
 | 
    { 
 | 
      factor := ifexpr( account.IsMaximize(), 1.0, -1.0 ); 
 | 
     
 | 
      traverse( account, AccountAssignment.AccountCostDriver, driver ) 
 | 
      { 
 | 
        var := null( MPVariable ); 
 | 
                              
 | 
        if( driver.Name() = Translations::MP_AccountAssignmentCostDriverFixed() )                 // fixed 
 | 
        { 
 | 
          // we don't need fixed cost in the optimizer. 
 | 
        } 
 | 
        else if ( driver.Name() = Translations::MP_AccountAssignmentCostDriverInventorySupply() )  
 | 
        { 
 | 
          // cost driver inventory supply not applicable in optimizer                             // inventory supply 
 | 
        } 
 | 
        else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverStaffing() )         // staffing 
 | 
        { 
 | 
          var := program.DriverStaffingVariables().Get( account, driver ); 
 | 
        } 
 | 
        else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverInventoryValue() )   // inventory value 
 | 
        { 
 | 
          var := program.DriverInventoryValueVariables().Get( account, driver ); 
 | 
        } 
 | 
        else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverInventoryHolding() ) // inventory holding 
 | 
        { 
 | 
          var := program.DriverInventoryHoldingVariables().Get( account, driver ); 
 | 
        } 
 | 
        else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverNrOfUnits() )        // nr of units 
 | 
        { 
 | 
          var := program.DriverNrOfUnitsVariables().Get( account, driver ); 
 | 
        } 
 | 
        else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverSales() )            // sales 
 | 
        { 
 | 
          var := program.DriverSalesVariables().Get( account, driver ); 
 | 
        } 
 | 
        else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverTime() )             // time 
 | 
        { 
 | 
          var := program.DriverTimeVariables().Get( account, driver ); 
 | 
        } 
 | 
        else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverVolume() )           // volume 
 | 
        { 
 | 
          var := program.DriverVolumeVariables().Get( account, driver ); 
 | 
        } 
 | 
        else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverLot() )              // Lot 
 | 
        { 
 | 
          var := program.DriverLotVariables().Get( account, driver ); 
 | 
        } 
 | 
        else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverChangeover() )        // Changeover 
 | 
        { 
 | 
          var := program.DriverChangeoverVariables().Get( account, driver ); 
 | 
        } 
 | 
        else if ( driver.Name() = Translations::MP_AccountAssignmentCostDriverOneTime() )         // One-time 
 | 
        { 
 | 
          var := program.DriverOneTimeVariables().Get( account, driver );  
 | 
        } 
 | 
        else 
 | 
        { 
 | 
          info( '>>> Missing goal value assignment for account ', account.Name(), ' driver name:', driver.Name() );   
 | 
        } 
 | 
        if( not isnull( var ) ) 
 | 
        { 
 | 
          this.AddGoalToLevel( program, 
 | 
                               account.Level(), 
 | 
                               account.Weight(), 
 | 
                               factor, 
 | 
                               var,  
 | 
                               false,  
 | 
                               0.0 );   
 | 
        } 
 | 
      }    
 | 
    } 
 | 
     
 | 
    this.SetKPILowerBounds( program, runcontext, scope.IsGeneratedByPreProductionSelector() ); 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |