Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method UpdateGoalScaling ( 
 | 
  StrategyMacroPlan strategy, 
 | 
  StrategyLevelMacroPlan slm 
 | 
) 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    // provide slm in order to use level specific scaling factor ( used for meta optimizer )  
 | 
     
 | 
    // Set goal scaling factors to be equal to the maximum value of the relevant variable scaling types 
 | 
    this.CreateScaleFactors( slm );  
 | 
     
 | 
    algorithmscaling := this.AlgorithmScaling(); 
 | 
     
 | 
    minscalingfactor := algorithmscaling.MinScalingFactor(); 
 | 
    maxscalingfactor := algorithmscaling.MaxScalingFactor(); 
 | 
     
 | 
    traverse( strategy, StrategyLevelMacroPlan, strategylevel ) 
 | 
    { 
 | 
      newgoalscalingfactor := minscalingfactor; 
 | 
      if ( strategylevel.Level() = 0 )  
 | 
      { 
 | 
        // set mass scaling for balance slack level 
 | 
         newgoalscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalSlackVariable ) );  
 | 
      } 
 | 
      else 
 | 
      { 
 | 
        traverse( strategy, KPIWeightMacroPlan, kpiweight, kpiweight.Level() = strategylevel.Level() ) 
 | 
        { 
 | 
          varscalingfactor := 0.0; 
 | 
          weightedvarscalingfactor := minscalingfactor; 
 | 
           
 | 
          if( not kpiweight.KPIIsAccount() ) 
 | 
          { 
 | 
            name := kpiweight.KPIName(); 
 | 
           
 | 
            if( name = Translations::MP_GlobalParameters_KPIBlendingName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalBlendingVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            }  
 | 
            else if( name = Translations::MP_GlobalParameters_KPICampaignName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalCampaignVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIFulfillmentName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalFulfillmentVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPILotSizeName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalLotSizeVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIInventoryMixBalancing() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalInventoryMixBalancingVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIMaximumInventoryLevelName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalMaximumInventoryLevelVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIMinimumInventoryLevelName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalMinimumInventoryLevelVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIMaximumSupplyName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalMaximumSupplyVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIMinimumSupplyName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalMinimumSupplyVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIMinimumUnitCapacityName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalMinimumUnitCapacityVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIPostponementPenaltyName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalPostponementPenaltyVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIProcessMaximumQuantity() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalProcessMaximumQuantityVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIProcessMinimumQuantity() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalProcessMinimumQuantityVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPISalesDemandPriorityName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalSalesDemandPriorityVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIFulfillmentTargetName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalFulfillmentTargetVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIServiceLevelName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalServiceLevelVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIStockingPointCapacityName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalStockingPointCapacityVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPISupplyTargetName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalSupplyTargetVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPISafetyStock() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalTargetInvLevelVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIUnitCapacityName() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalUnitCapacityVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPICapacitySmoothing() )  
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPCapacitySmoothingSlackVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPICO2Emission() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalCO2EmissionVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
            else if( name = Translations::MP_GlobalParameters_KPIShiftPatternChangesPenalty() ) 
 | 
            { 
 | 
              varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPTotalShiftPatternChangesPenaltyVariable ) ); 
 | 
              weightedvarscalingfactor := varscalingfactor * kpiweight.Weight(); 
 | 
            } 
 | 
             
 | 
            newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ); 
 | 
          } 
 | 
          else  
 | 
          { 
 | 
            account := select( this, MacroPlan.Account_MP, a, guard( a.Name() = kpiweight.KPIName(), false ) ); 
 | 
         
 | 
            if( not isnull( account ) ) 
 | 
            { 
 | 
              traverse( account, AccountAssignment.AccountCostDriver, driver ) 
 | 
              { 
 | 
                         
 | 
                if( driver.Name() = Translations::MP_AccountAssignmentCostDriverFixed() )                 // fixed 
 | 
                { 
 | 
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverFixedVariable ) ); 
 | 
                  weightedvarscalingfactor := varscalingfactor * account.Weight(); 
 | 
                 
 | 
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ); 
 | 
                } 
 | 
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverStaffing() )         // staffing 
 | 
                { 
 | 
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverStaffingVariable ) ); 
 | 
                  weightedvarscalingfactor := varscalingfactor * account.Weight(); 
 | 
                 
 | 
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ) 
 | 
                } 
 | 
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverInventoryValue() )   // inventory value 
 | 
                { 
 | 
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverInventoryValueVariable ) ); 
 | 
                  weightedvarscalingfactor := varscalingfactor * account.Weight(); 
 | 
                 
 | 
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ); 
 | 
                } 
 | 
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverInventoryHolding() ) // inventory holding 
 | 
                { 
 | 
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverInventory_HoldingVariable ) ); 
 | 
                  weightedvarscalingfactor := varscalingfactor * account.Weight(); 
 | 
                 
 | 
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ); 
 | 
                } 
 | 
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverNrOfUnits() )        // nr of units 
 | 
                { 
 | 
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverNrOfUnitsVariable ) ); 
 | 
                  weightedvarscalingfactor := varscalingfactor * account.Weight(); 
 | 
                 
 | 
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ); 
 | 
                } 
 | 
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverSales() )            // sales 
 | 
                { 
 | 
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverSalesVariable ) ); 
 | 
                  weightedvarscalingfactor := varscalingfactor * account.Weight(); 
 | 
                 
 | 
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ); 
 | 
                } 
 | 
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverTime() )             // time 
 | 
                { 
 | 
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverTimeVariable ) ); 
 | 
                  weightedvarscalingfactor := varscalingfactor * account.Weight(); 
 | 
                 
 | 
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ); 
 | 
                } 
 | 
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverVolume() )           // volume 
 | 
                { 
 | 
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverVolumeVariable ) ); 
 | 
                  weightedvarscalingfactor := varscalingfactor * account.Weight(); 
 | 
                 
 | 
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ); 
 | 
                } 
 | 
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverLot() )              // Lot 
 | 
                { 
 | 
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverLotVariable ) ); 
 | 
                  weightedvarscalingfactor := varscalingfactor * account.Weight(); 
 | 
                 
 | 
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ); 
 | 
                } 
 | 
                else if( driver.Name() = Translations::MP_AccountAssignmentCostDriverChangeover() )        // Changeover 
 | 
                { 
 | 
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverChangeoverVariable ) ); 
 | 
                  weightedvarscalingfactor := varscalingfactor * account.Weight(); 
 | 
                 
 | 
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ); 
 | 
                } 
 | 
                else if ( driver.Name() = Translations::MP_AccountAssignmentCostDriverOneTime() )         // One time  
 | 
                { 
 | 
                  varscalingfactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeof( MPDriverOneTimeVariable ) ); 
 | 
                  weightedvarscalingfactor := varscalingfactor * account.Weight();   
 | 
                   
 | 
                  newgoalscalingfactor := maxvalue( newgoalscalingfactor, weightedvarscalingfactor ); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                  info( '>>> Driver variable does not exist and excluded from goal scaling update calculations which is for account ', account.Name(), ' driver name:', driver.Name() );   
 | 
                } 
 | 
              } 
 | 
            } 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
       
 | 
      newgoalscalingfactor := maxvalue( newgoalscalingfactor, minscalingfactor ); 
 | 
      newgoalscalingfactor := minvalue( newgoalscalingfactor, maxscalingfactor ); 
 | 
       
 | 
      oldvalue := strategylevel.GoalScaling();  
 | 
      strategylevel.GoalScaling( newgoalscalingfactor ); 
 | 
      debuginfo(  'Updated goal scaling for level ', strategylevel.Level(), ' to ', strategylevel.GoalScaling(), 'from ', oldvalue );  
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |