Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method SetWeightsAndParams ( 
 | 
  Boolean issmartplan, 
 | 
  StrategyMacroPlan strategymacroplan, 
 | 
  LibOBT_RunTaskSetting setting 
 | 
) as AlgorithmRun 
 | 
{ 
 | 
  Description: 'Set active weights and optimizer parameters' 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Set the strategy 
 | 
    algorithmrun := this.SynchronizeAlgorithmRun( issmartplan ); 
 | 
    algorithmrun.UpdateOptimizerSetting( strategymacroplan ); 
 | 
     
 | 
    // Set active value for non financial kpi 
 | 
    traverse( strategymacroplan, KPIWeightMacroPlan, kpiweight, not kpiweight.KPIIsAccount() ) 
 | 
    {   
 | 
      name := kpiweight.KPIName(); 
 | 
       
 | 
      if( name = Translations::MP_GlobalParameters_KPIBlendingName() ) 
 | 
      { 
 | 
        algorithmrun.BlendingWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.BlendingLevel( kpiweight.Level() ); 
 | 
      }  
 | 
      else if( name = Translations::MP_GlobalParameters_KPICampaignName() ) 
 | 
      { 
 | 
        algorithmrun.CampaignWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.CampaignLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIFulfillmentName() ) 
 | 
      { 
 | 
        algorithmrun.FulfillmentWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.FulfillmentLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPILotSizeName() ) 
 | 
      { 
 | 
        algorithmrun.LotSizeWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.LotSizeLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIInventoryMixBalancing() ) 
 | 
      { 
 | 
        algorithmrun.InventoryMixBalancingWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.InventoryMixBalancingLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIMaximumInventoryLevelName() ) 
 | 
      { 
 | 
        algorithmrun.MaximumInventoryLevelWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.MaximumInventoryLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIMinimumInventoryLevelName() ) 
 | 
      { 
 | 
        algorithmrun.MinimumInventoryLevelWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.MinimumInventoryLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIMaximumSupplyName() ) 
 | 
      { 
 | 
        algorithmrun.MaximumSupplyWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.MaximumSupplyLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIMinimumSupplyName() ) 
 | 
      { 
 | 
        algorithmrun.MinimumSupplyWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.MinimumSupplyLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIMinimumUnitCapacityName() ) 
 | 
      { 
 | 
        algorithmrun.MinimumUnitCapacityWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.MinimumUnitCapacityLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIPostponementPenaltyName() ) 
 | 
      { 
 | 
        algorithmrun.PostponementPenaltyWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.PostponementPenaltyLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIProcessMaximumQuantity() ) 
 | 
      { 
 | 
        algorithmrun.ProcessMaximumQuantityWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.ProcessMaximumQuantityLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIProcessMinimumQuantity() ) 
 | 
      { 
 | 
        algorithmrun.ProcessMinimumQuantityWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.ProcessMinimumQuantityLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPISalesDemandPriorityName() ) 
 | 
      { 
 | 
        algorithmrun.SalesDemandPriorityWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.SalesDemandPriorityLevel( kpiweight.Level() ); 
 | 
      } 
 | 
        else if( name = Translations::MP_GlobalParameters_KPIFulfillmentTargetName() ) 
 | 
      { 
 | 
        algorithmrun.FulfillmentTargetWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.FulfillmentTargetLevel( kpiweight.Level() );  
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIServiceLevelName() ) 
 | 
      { 
 | 
        algorithmrun.ServiceLevelWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.ServiceLevelLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIStockingPointCapacityName() ) 
 | 
      { 
 | 
        algorithmrun.StockingPointCapacityWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.StockingPointCapacityLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPISupplyTargetName() ) 
 | 
      { 
 | 
        algorithmrun.SupplyTargetWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.SupplyTargetLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPISafetyStock() ) 
 | 
      { 
 | 
        algorithmrun.TargetInventoryLevelWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.TargetInventoryLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIUnitCapacityName() ) 
 | 
      { 
 | 
        algorithmrun.UnitCapacityWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.UnitCapacityLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPICapacitySmoothing() )  
 | 
      { 
 | 
        algorithmrun.CapacitySmoothingWeight( kpiweight.Weight() );  
 | 
        algorithmrun.CapacitySmoothingLevel( kpiweight.Level() );  
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPITotalExpiredQuantity() )  
 | 
      { 
 | 
        algorithmrun.ExpiredQtyWeight( kpiweight.Weight() );  
 | 
        algorithmrun.ExpiredQtyLevel( kpiweight.Level() );  
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPICO2Emission() ) 
 | 
      { 
 | 
        algorithmrun.CO2EmissionWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.CO2EmissionLevel( kpiweight.Level() ); 
 | 
      } 
 | 
      else if( name = Translations::MP_GlobalParameters_KPIShiftPatternChangesPenalty() ) 
 | 
      { 
 | 
        algorithmrun.ShiftPatternChangesPenaltyWeight( kpiweight.Weight() ); 
 | 
        algorithmrun.ShiftPatternChangesPenaltyLevel( kpiweight.Level() ); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    // Scaling factors used for the run 
 | 
    algorithmrun.MassScalingFactor( strategymacroplan.MassScalingFactor() ); 
 | 
    algorithmrun.MonetaryScalingFactor( strategymacroplan.MonetaryScalingFactor() ); 
 | 
    algorithmrun.TimeScalingFactor( strategymacroplan.TimeScalingFactor() ); 
 | 
    algorithmrun.TimeAccountScalingFactor( strategymacroplan.TimeAccountScalingFactor() ); 
 | 
    algorithmrun.InventoryHoldingScalingFactor( strategymacroplan.InventoryHoldingScalingFactor() ); 
 | 
     
 | 
    hascostdriverlotactiveaccount := false; 
 | 
    hasonetimecostdriveractive := false;  
 | 
    // Account kpis 
 | 
    traverse( strategymacroplan, KPIWeightMacroPlan, kpiweight, kpiweight.KPIIsAccount() ) 
 | 
    { 
 | 
      account := select( this, MacroPlan.Account_MP, a, a.Name() = kpiweight.KPIName() ); 
 | 
       
 | 
      if( not isnull( account ) ) 
 | 
      { 
 | 
        account.UpdateOptimizerStrategy( kpiweight.Level(), kpiweight.Weight() ); 
 | 
     
 | 
        hascostdriverlotactiveaccount := hascostdriverlotactiveaccount  
 | 
                                         or ( account.IsCostDriverLot()  
 | 
                                              and account.Weight() > 0  
 | 
                                              and account.Level() > 0  
 | 
                                              and account.IsUsedByOptimizer() ); 
 | 
        hasonetimecostdriveractive := hasonetimecostdriveractive  
 | 
                                      or ( account.IsCostDriverOneTimeCost()  
 | 
                                           and account.Weight() > 0  
 | 
                                           and account.Level() > 0   
 | 
                                           and account.IsUsedByOptimizer() );  
 | 
      } 
 | 
    } 
 | 
     
 | 
    algorithmrun.UseLotCost( hascostdriverlotactiveaccount ); 
 | 
    algorithmrun.UseOneTimeCost( hasonetimecostdriveractive );  
 | 
     
 | 
    if ( not strategymacroplan.UseMetaOptimizer() ) // for the meta optimizer the update will happen at the start of each focus level  
 | 
    { 
 | 
      this.UpdateGoalScaling( strategymacroplan, null(  StrategyLevelMacroPlan ) ); // not providing strategy level macroplan, so non level specific factors are used ( also for hidden level of meta) 
 | 
    } 
 | 
     
 | 
    AlgorithmRunLevel::CreateAlgorithmRunLevelsAndKPIResults( algorithmrun, strategymacroplan, setting ); 
 | 
                
 | 
    // Set the time and status 
 | 
    this.MacroPlan().LastOptimizerRun( DateTime::ActualTime() ); 
 | 
     
 | 
    return algorithmrun; 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |