| Quintiq file version 2.0 | 
| #parent: #root | 
| Method GetWeightedKPIOnLevel ( | 
|   Number levelofkpi | 
| ) declarative as Real | 
| { | 
|   Description: 'returns the weighted KPI corresponding to the given level' | 
|   TextBody: | 
|   [* | 
|     // lauri Jun-18-2014 (created) | 
|      | 
|     //new implementation: info from current solution but weights from given level | 
|      | 
|     algorithmrun := this; | 
|      | 
|     //nonfinancial part of KPI, filtering by level done below | 
|     nonfinancialresult := this.LastLevel().OptimizerNonFinancialKPIResult(); | 
|     nonfinancialkpi := nonfinancialresult.WeightedValueBlending() * ( ifexpr( levelofkpi = algorithmrun.BlendingLevel(), 1, 0 ) )  | 
|                        + nonfinancialresult.WeightedValueCampaign() * ( ifexpr( levelofkpi = algorithmrun.CampaignLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueFulfillment() * ( ifexpr( levelofkpi = algorithmrun.FulfillmentLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueInventoryMixBalancing() * ( ifexpr( levelofkpi = algorithmrun.InventoryMixBalancingLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueLotSize() * ( ifexpr( levelofkpi = algorithmrun.LotSizeLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueMaximumInventoryLevel() * ( ifexpr( levelofkpi = algorithmrun.MaximumInventoryLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueMaximumSupply() * ( ifexpr( levelofkpi = algorithmrun.MaximumSupplyLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueMinimumUnitCapacity() * ( ifexpr( levelofkpi = algorithmrun.MinimumUnitCapacityLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueMinimumUnitSecondaryCapacity() * ( ifexpr( levelofkpi = algorithmrun.MinimumUnitCapacityLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueMinimumInventoryLevel() * ( ifexpr( levelofkpi = algorithmrun.MinimumInventoryLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValuePostponementPenalty() * ( ifexpr( levelofkpi = algorithmrun.PostponementPenaltyLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueProcessMaximumQuantity() * ( ifexpr( levelofkpi = algorithmrun.ProcessMaximumQuantityLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueProcessMinimumQuantity() * ( ifexpr( levelofkpi = algorithmrun.ProcessMinimumQuantityLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueSalesDemandPriority() * ( ifexpr( levelofkpi = algorithmrun.SalesDemandPriorityLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueShiftPatternChangesPenalty() * ( ifexpr( levelofkpi = algorithmrun.ShiftPatternChangesPenaltyLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueFulfillmentTarget() * ( ifexpr( levelofkpi = algorithmrun.FulfillmentTargetLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueServiceLevel() * ( ifexpr( levelofkpi = algorithmrun.ServiceLevelLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueSlack() * ( ifexpr( levelofkpi = algorithmrun.SlackLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueStockingPointCapacity() * ( ifexpr( levelofkpi = algorithmrun.StockingPointCapacityLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueMinimumSupply() * ( ifexpr( levelofkpi = algorithmrun.MinimumSupplyLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueSupplyTarget() * ( ifexpr( levelofkpi = algorithmrun.SupplyTargetLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueTargetInventoryLevel() * ( ifexpr( levelofkpi = algorithmrun.TargetInventoryLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueUnitCapacity() * ( ifexpr( levelofkpi = algorithmrun.UnitCapacityLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueUnitSecondaryCapacity() * ( ifexpr( levelofkpi = algorithmrun.UnitCapacityLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueTotalExpiredQty() * ( ifexpr( levelofkpi = algorithmrun.ExpiredQtyLevel(), 1, 0 ) ) | 
|                        + nonfinancialresult.WeightedValueCO2Emission() * ( ifexpr( levelofkpi = algorithmrun.CO2EmissionLevel(), 1, 0 ) ) | 
|                         | 
|      | 
|     //accounts - filtering by levels is very convenient here | 
|     accountkpi := sum( this.LastLevel(), OptimizerAccountKPIResult, accountkpiresult, | 
|                        accountkpiresult.Level() = levelofkpi, | 
|                        accountkpiresult.TotalGoalValue() * accountkpiresult.Weight() ); | 
|      | 
|     return nonfinancialkpi + accountkpi; | 
|   *] | 
| } |