| 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' } | 
| } |