Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method RunSmartPlanForBenchmarking ( 
 | 
  LibOBT_RunTask runtask, 
 | 
  Strategy strategy, 
 | 
  LibOBT_RunTaskSetting setting 
 | 
) 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Update the optimizer status to running 
 | 
    sm := Util::GetScenarioManagerStream();  
 | 
    sm->UpdateScenarioOptimizerStatus( this.MDSID(), Translations::MP_GlobalParameters_GetOptimizerRunningStatus(), "", "" ); 
 | 
     
 | 
    // Run smartplan for benchmarking 
 | 
    // We will call the method directly instead of via MacroPlan::JobRunSmartPlan( company, strategy, runtask, setting ); 
 | 
    // So that the job will queue before reporting ReportRunTaskFinish  
 | 
    // Initialize variables 
 | 
    hastotalsupplyuser := false; 
 | 
    totalsupplyuser := 0.0; 
 | 
    isupstreamsmartplan := false; 
 | 
    ismiddleoutsmartplan := false; 
 | 
    isonlyplanonestepupstream := false; 
 | 
    isoverridemanualplanning := true; 
 | 
    isusingselectedunits := false; 
 | 
    periodstart := this.FirstPlanningPeriod(); 
 | 
    periodend := this.LastPlanningPeriod(); 
 | 
    units := selectset( this, Unit, units, true ); //all units 
 | 
     
 | 
    smartplanpispips := construct( ProductInStockingPointInPeriodPlannings ); 
 | 
     
 | 
    // pispip: Quibi in DC - 3 pispips 
 | 
    pispip_quibidc := selectset( this, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, pispip.ProductInStockingPoint_MP().ProductID() = Product_MP::QuibiProductID() and pispip.ProductInStockingPoint_MP().StockingPointID() = StockingPoint_MP::DCID() ); 
 | 
    // pispip: Quibi in DC in January 
 | 
    pispip_quibidcjanuary := minobject( this, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, pispip.ProductInStockingPoint_MP().ProductID() = Product_MP::QuibiProductID() and pispip.ProductInStockingPoint_MP().StockingPointID() = StockingPoint_MP::DCID(), pispip.Start() ); 
 | 
    // pispip: Quibi in DC in  March 
 | 
    pispip_quibidcmarch := maxobject( this, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, pispip.ProductInStockingPoint_MP().ProductID() = Product_MP::QuibiProductID() and pispip.ProductInStockingPoint_MP().StockingPointID() = StockingPoint_MP::DCID(), pispip.Start() ); 
 | 
    // pispip: Quibi in Warehouse in January 
 | 
    pispip_quibiwarehousejanuary := minobject( this, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, pispip.ProductInStockingPoint_MP().ProductID() = Product_MP::QuibiProductID() and pispip.ProductInStockingPoint_MP().StockingPointID() = StockingPoint_MP::WarehouseID(), pispip.Start() ); 
 | 
    // pispip: Pulp in Warehouse in January 
 | 
    pispip_pulpwarehousejanuary := minobject( this, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, pispip.ProductInStockingPoint_MP().ProductID() = Product_MP::PulpProductID() and pispip.ProductInStockingPoint_MP().StockingPointID() = StockingPoint_MP::WarehouseID(), pispip.Start() ); 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 1 ), 0 ) > -1 ) 
 | 
    { 
 | 
      isupstreamsmartplan := true;   // Direction: Upstream 
 | 
      smartplanpispips.Add( pispip_quibidcjanuary );   // Quibi in DC in January is the selected pispip 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 2 ), 0 ) > -1 ) 
 | 
    { 
 | 
      hastotalsupplyuser := true; 
 | 
      totalsupplyuser := 2500; 
 | 
      isupstreamsmartplan := true;   // Direction: Upstream 
 | 
      smartplanpispips.Add( pispip_quibidcjanuary );   // Quibi in DC in January is the selected pispip 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 3 ), 0 ) > -1 ) 
 | 
    { 
 | 
      // Direction: Downstream. Default values are false, meaning that direction is downstream 
 | 
      smartplanpispips.Add( pispip_pulpwarehousejanuary ); // Pulp in Warehouse in January is the selected pispip 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 4 ), 0 ) > -1 ) 
 | 
    { 
 | 
      hastotalsupplyuser := true; 
 | 
      totalsupplyuser := 5000; 
 | 
      // Direction: Downstream. Default values are false, meaning that direction is downstream 
 | 
      smartplanpispips.Add( pispip_pulpwarehousejanuary ); // Pulp in Warehouse in January is the selected pispip 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 5 ), 0 ) > -1 ) 
 | 
    { 
 | 
      ismiddleoutsmartplan := true;   // Direction: Middle-Out 
 | 
      smartplanpispips.Add( pispip_quibidcjanuary );   // Quibi in DC in January is the selected pispip 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 6 ), 0 ) > -1 ) 
 | 
    { 
 | 
      hastotalsupplyuser := true; 
 | 
      totalsupplyuser := 5000; 
 | 
      ismiddleoutsmartplan := true;   // Direction: Middle-Out 
 | 
      smartplanpispips.Add( pispip_quibidcjanuary );   // Quibi in DC in January is the selected pispip 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 7 ), 0 ) > -1 ) 
 | 
    { 
 | 
      isupstreamsmartplan := true;   // Direction: Upstream 
 | 
      smartplanpispips.Add( pispip_quibidcjanuary ); // Quibi in DC in January is the selected pispip 
 | 
       
 | 
      // have manual plan, planner created a trip from warehouse to DC carry 500 Quibi. 
 | 
      laneleg := select(  this, Unit.Lane.LaneLeg, laneleg, laneleg.LaneID()= LaneLeg::TransportTransportLaneID() and laneleg.Name() = LaneLeg::WarehouseToDCName() ); 
 | 
      product := select(  this, Product_MP, product, product.Name() = Product_MP::QuibiProductID() ); 
 | 
      trip := Trip::Create( laneleg, periodstart ); 
 | 
      trip.AddProduct( product, 250.0 , true ); // 3rd parameter has to be true which represents user input 
 | 
      Transaction::Transaction().PropagateAll( typeof( Trip ) ); 
 | 
      Transaction::Transaction().PropagateAll( typeof( ProductInTrip ) ); 
 | 
      Transaction::Transaction().Propagate( attribute( Trip, HasUserQuantity ) ); 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 8 ), 0 ) > -1 ) 
 | 
    { 
 | 
      isoverridemanualplanning := false; 
 | 
      isupstreamsmartplan := true;   // Direction: Upstream 
 | 
      smartplanpispips.Add( pispip_quibidcjanuary ); // Quibi in DC in January is the selected pispip 
 | 
       
 | 
      // first delete all trips so test is repeatable  
 | 
      traverse(  this, Unit.Lane.LaneLeg.Trip, t )  
 | 
      { 
 | 
        t.Delete();  
 | 
      } 
 | 
      // have manual plan, planner created a trip from warehouse to DC carry 500 Quibi. 
 | 
      laneleg := select(  this, Unit.Lane.LaneLeg, laneleg, laneleg.LaneID()= LaneLeg::TransportTransportLaneID() and laneleg.Name() = LaneLeg::WarehouseToDCName() ); 
 | 
      product := select(  this, Product_MP, product, product.Name() = Product_MP::QuibiProductID()  ); 
 | 
      trip := Trip::Create( laneleg, periodstart ); 
 | 
      trip.AddProduct( product, 250.0 , true ); // 3rd parameter has to be true which represents user input 
 | 
      Transaction::Transaction().PropagateAll( typeof( Trip ) ); 
 | 
      Transaction::Transaction().PropagateAll( typeof( ProductInTrip ) ); 
 | 
      Transaction::Transaction().Propagate( attribute( Trip, HasUserQuantity ) );                                     
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 9 ), 0 ) > -1 ) 
 | 
    { 
 | 
      hastotalsupplyuser := true; 
 | 
      totalsupplyuser := 500; 
 | 
      isupstreamsmartplan := true;   // Direction: Upstream 
 | 
      isonlyplanonestepupstream := true; 
 | 
      smartplanpispips.Add( pispip_quibiwarehousejanuary );   // Quibi in Warehouse in January is the selected pispip 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 10 ), 0 ) > -1 ) 
 | 
    { 
 | 
      hastotalsupplyuser := true; 
 | 
      totalsupplyuser := 2500; 
 | 
      isupstreamsmartplan := true;   // Direction: Upstream 
 | 
      isusingselectedunits := true; 
 | 
      units := selectset( this, Unit, unit, unit.Name() <> Unit::Supplier2UnitName() ); // Supplier 2 excluded 
 | 
      smartplanpispips.Add( pispip_quibidcjanuary );   // Quibi in DC in January is the selected pispip 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 11 ), 0 ) > -1 ) 
 | 
    { 
 | 
      hastotalsupplyuser := true; 
 | 
      totalsupplyuser := 2500; 
 | 
      isupstreamsmartplan := true;   // Direction: Upstream 
 | 
      isusingselectedunits := true;  // All units are selected at the beginning. 
 | 
      smartplanpispips.Add( pispip_quibidcjanuary );   // Quibi in DC in January is the selected pispip 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 12 ), 0 ) > -1 ) 
 | 
    { 
 | 
      hastotalsupplyuser := true; 
 | 
      totalsupplyuser := 15000; 
 | 
      isupstreamsmartplan := true;    // Direction: Upstream 
 | 
      smartplanpispips.Add( pispip_quibidcmarch );   // Quibi DC in March is selected 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 13 ), 0 ) > -1 ) 
 | 
    { 
 | 
      isupstreamsmartplan := true;    // Direction: Upstream 
 | 
      traverse( pispip_quibidc, Elements, pispip ) // pispip_quibidc contains 3 pispips 
 | 
      { 
 | 
          smartplanpispips.Add( pispip ); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    if( this.ScenarioName().FindString( Scenario::ScenarioNameSmartPlan( 14 ), 0 ) > -1 ) 
 | 
    { 
 | 
      isupstreamsmartplan := true;   // Direction: Upstream 
 | 
      smartplanpispips.Add( pispip_quibidcmarch );   // Quibi in DC in March is the selected pispip 
 | 
    } 
 | 
     
 | 
    this.RunSmartPlan( true , // issmartplan 
 | 
                       false, // issmartplanforperiodtask 
 | 
                       smartplanpispips, 
 | 
                       hastotalsupplyuser, 
 | 
                       totalsupplyuser, 
 | 
                       isupstreamsmartplan, 
 | 
                       ismiddleoutsmartplan, 
 | 
                       isonlyplanonestepupstream, 
 | 
                       strategy, 
 | 
                       isoverridemanualplanning, 
 | 
                       periodstart, 
 | 
                       periodend, 
 | 
                       isusingselectedunits, 
 | 
                       units, 
 | 
                       null( Process_MP),  
 | 
                       false ); /* re-use strategymacroplan */ 
 | 
     
 | 
    algorithmrun := this.GetLastAlgorithmRun(); 
 | 
     
 | 
    if ( not isnull( algorithmrun ) )  
 | 
    { 
 | 
      algorithmrun.UpdateForBenchmarking( runtask.ID(), 
 | 
                                          runtask.TestInstanceID(), 
 | 
                                          runtask.LibOBT_Benchmarker().LibOBT_BenchmarkerParameter().TotalThreadsAllowed(), 
 | 
                                          setting.Description(), 
 | 
                                          runtask.LibOBT_Benchmarker().LibOBT_BenchmarkerParameter().IsBenchmarkingRun() ); 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |