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