Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method UpdateParameters (ProductInStockingPointInPeriodPlannings smartplanpispips, StrategyMacroPlan strategymacroplan, Period_MP periodstart,  
 | 
  Period_MP periodend, LibOBT_RunTaskSetting benchmarksetting) as AlgorithmRun 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Martijn Apr-6-2016 (created) 
 | 
    // The automatic scaling algorithm should not be run on the autotuning copy 
 | 
    // Set the optimizer settings and parameters 
 | 
    param := this.Algorithm_Parameter(); 
 | 
    issmartplan := param.IsSmartPlan(); 
 | 
    tempalgorithmrun := this.Optimization().SetWeightsAndParams( issmartplan, strategymacroplan, benchmarksetting );  
 | 
     
 | 
    // Update planning horizon of optimizer 
 | 
    tempalgorithmrun.UpdatePlanningTime( periodstart, periodend ); 
 | 
     
 | 
    // Martijn: We need this Transaction.Propagate to make sure we select the latest algorithm run that was just created in SetWeightsAndParams. 
 | 
    Transaction::Transaction().Propagate(); 
 | 
     
 | 
    // The next algorithmrun is created in SetWeightsAndParams, so we need to call that method before we can set parameters of the lastrun 
 | 
    lastrun := tempalgorithmrun;  
 | 
     
 | 
    lastrun.UpdateParameters( periodstart,  
 | 
                              periodend, 
 | 
                              this.ResourceManager_MP().MaxThreadForOptimization() 
 | 
                            ); 
 | 
     
 | 
    if( param.IsInventoryOptimizationRun() ) 
 | 
    { 
 | 
    // If this is an inventory optimization run and the last iteration has reached the specified number of simulations 
 | 
    // then create a new iteration  
 | 
      algorithm := this.DEPRECATED_InventoryOptimization();  
 | 
      if( guard( algorithm.LastIteration().LastSimulation().SimulationNumber() >= algorithm.NumberOfSimulations(), false ) ) 
 | 
      { 
 | 
        // Create a new iteration 
 | 
        iteration := Iteration::Create( algorithm, guard( tempalgorithmrun.LastLevel().Level(), 5 ) );  
 | 
        // We need to update the move estimates and quantities before we can select the best move 
 | 
        Transaction::Transaction().Propagate( attribute( Move, Estimate ) ); 
 | 
        Transaction::Transaction().Propagate( attribute( Move, Quantity ) ); 
 | 
        currentmove := algorithm.SelectMoveForInventoryOptimization(); 
 | 
         
 | 
        // If all moves have been tried, reset their status and select the most promising move 
 | 
        if( isnull( currentmove ) ) 
 | 
        { 
 | 
          traverse( algorithm, Move, move ) 
 | 
          { 
 | 
            move.HasBeenTried( false ); 
 | 
          }   
 | 
          currentmove := algorithm.SelectMoveForInventoryOptimization(); 
 | 
        } 
 | 
        // If the current move is still null, there is no available move to execute 
 | 
        if( not isnull( currentmove ) ) 
 | 
        { 
 | 
          currentmove.Iteration( relset, iteration ); 
 | 
          currentmove.QuantityForUndo( currentmove.Quantity() ); 
 | 
          isundo := false; 
 | 
          currentmove.ExecuteMove( isundo ); 
 | 
        }   
 | 
      } 
 | 
    } 
 | 
     
 | 
    return tempalgorithmrun; 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |