Quintiq file version 2.0 
 | 
#parent: #root 
 | 
StaticMethod Create ( 
 | 
  LibOpt_Run run, 
 | 
  RunContextForCapacityPlanning runcontext 
 | 
) as RunContextMeta 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    rcm := run.RunContext( relnew, RunContextMeta );  
 | 
    rcm.IsSelectorBeyondFirstIteration( false );  
 | 
    rcm.OptionBaseForTried( 2 ); // estimated improve score is reduced by base^(nr tries anchor)  
 | 
    rcm.OptionBaseForTriedAsFried( 4/3 ); // estimated improve score is reduced by base^(nr tried as friend)  
 | 
    rcm.OptionStartBaseForPeriodDecay( 1.0 ); // initially estimated improvement scores are decay by this factor per period ( 1.0 means feature is unused , as we slowly move it to 1.0) 
 | 
    rcm.OptionStartBaseForPeriodDecayDecayFactor( 0.95 );  // guides the speed by which the decay factor moves to 1 per iteration ( the gap to 1 is decrease by this factor ) 
 | 
    rcm.OptionBaseForDecayNrTimeInScope( 0.99 ); // decay estimated improvement score by factor 0.99^{nr times in scope} on pispip 
 | 
    rcm.OptionMaxTriesForConstraintPISPIP( 10 );  
 | 
    rcm.OptionMaxTriesForAnchor( 10 );  
 | 
    rcm.OptionMaxTriedForAnchorConstruction( 1 );  
 | 
    rcm.OptionMaxTriedForTargetInventory( 5 );  
 | 
    rcm.OptionUseAdditonalMaxInventoryConstraint( true );  
 | 
     
 | 
    rcm.MaxFanExploreUpstreamLanes( Number::MaxNumber() );   
 | 
    rcm.MaxFanExploreDownStreamLanes( 2 );  
 | 
    rcm.MaxOperationExploreDownStream( 1 ); // for downstream select 1 random operation at pispip (when limiting to planning period tasks not applied) 
 | 
    rcm.OptionCheckSizeLimitDownStreamForAnchor( runcontext.GetIsStrongMIP() );  
 | 
    rcm.OptionAdditionalUpstreamClosure( true );  
 | 
    rcm.OptionCheckSizeLimitDebottleneckNeighborhood( runcontext.GetIsStrongMIP() );  
 | 
     
 | 
    rcm.OptionAddFriends( true );  
 | 
    rcm.OptionCheckSizeLimitDownStreamForFriends( true );  
 | 
    rcm.OptionAddDownStreamForFriends( true );  
 | 
     
 | 
    rcm.OptionPreNeighborhoodSizeInPeriods( 0 );  
 | 
    rcm.OptionNumberOfSmartPlanPeriods( 1 );  
 | 
     
 | 
    rcm.OptionFixDecisionVariablesPriorToFocusLevel( false );  
 | 
    rcm.OptionRunPastFocusLevel( false );  
 | 
     
 | 
    rcm.OptionMinimizePTQty( false ); // minimize total ptqty after focus level if focus level is not yet = last level strategy 
 | 
    rcm.OptionMinimizePTQtyDoInventoryBased( false ); // when set to true then in conjecution with previous 2 settings the extra cplex levels works on InvEnd variables instead 
 | 
    rcm.OptionMinimizePTQTYLevelRelativeGoalSlack( 0.0 ); // relative goal slack for focus level when we execute the extra level ( how much allowed to get worse. Purpose: avoid numerical infeasible) 
 | 
     
 | 
    rcm.OptionCopyDataSetAfterFocusLevel( false );  
 | 
     
 | 
    rcm.OptionFixDemandSlackVar( true ); // beyond focus level 0 we fix the demand slack to the dependentdemandunfullfiled qty of the model 
 | 
     
 | 
    rcm.OptionUseRollBack( true );  
 | 
    rcm.OptionRollbackAlwaysAccept( false );  
 | 
     
 | 
    fulltime := 160 * 3600;  
 | 
    rcm.OptionMaxNumberOfSecondsRun( fulltime );  
 | 
     
 | 
    rcm.OptionMaxNumberOfSecondsLevel0( fulltime );  
 | 
    rcm.OptionMaxNumberOfSecondsLevel1( fulltime ); //ceil( fulltime * 0.01 ) );  
 | 
    rcm.OptionMaxNumberOfSecondsLevel2( fulltime ); //ceil ( fulltime * 0.1 ) );  
 | 
    rcm.OptionMaxNumberOfSecondsLevel3( fulltime ); //ceil( fulltime * 0.2 ) );  
 | 
    rcm.OptionMaxNumberOfSecondsLevel4( fulltime ); //ceil( fulltime * 0.375 ) );  
 | 
    rcm.OptionMaxNumberOfSecondsLevel5( fulltime );  
 | 
    rcm.OptionMaxNumberOfSecondsLevel6( fulltime );  
 | 
    rcm.OptionMaxNumberOfSecondsLevel7( fulltime );  
 | 
    rcm.OptionMaxNumberOfSecondsLevel8( fulltime );  
 | 
    rcm.OptionMaxNumberOfSecondsLevel9( fulltime );  
 | 
    rcm.OptionMaxNumberOfSecondsLevel10( fulltime );  
 | 
     
 | 
    rcm.OptionPrecisionForRollback( -1 ); // no rounding  
 | 
    rcm.OptionToleranceRollback( 0.001 ); // relative factor (or absolute in case close to 0 ) 
 | 
    rcm.OptionCutOffProcessMinQtyKPI( 1e-6 * run.Optimization().astype( Optimization ).MacroPlan().StrategyMacroPlan().MassScalingFactor() ); // relative factor, to ignore period tasks for process min qty KPI 
 | 
     
 | 
    rcm.OptionCollectKappaStats( false ); 
 | 
    rcm.OptionMaximumError( 100 ); // shut off run beyond 100 error snapshots 
 | 
     
 | 
    rcm.OptionConvergenceWindowSize( 20 );    
 | 
     
 | 
    rcm.OptionConvergenceThreshold( 0.0001 ); // if you set this to 0 it will never be considered converged on a level. Setting it smaller than   
 | 
                                                 // OptionToleranceRollback may also causes non-convergence due to fluctuation 
 | 
                                                 
 | 
    rcm.OptionCutOffForOptimal( 0.0001 ); // within optimal (in case known) by this much absolute means done 
 | 
    rcm.OptionCutOffForOptimalLevelZero( 0.001 ); // for scores > - 0.001 we fix decision variables on level 0 
 | 
     
 | 
    rcm.OptionMinimumMetaLevel( 0 );  
 | 
    rcm.OptionCPLEXSkipLevelPriorToFocus( true ); // skip level prior to focus level by setting value from model as lower bound to kpi 
 | 
    rcm.OptionCPLEXFixModelBoundsForGoals( true ); // whether we set a bound on the goal value. If setting this to false, then not a good idea to still use the skipping (line above).  
 | 
     
 | 
     
 | 
    //>> keep together 
 | 
    rcm.OptionMaxNumberOfPISPIPSForNeighborhood( ifexpr(  runcontext.UseCampaignSequenceOptimizer(), 500, 5000 ) );  
 | 
    rcm.OptionMaxNumberOfPISPIPSForNeighborhoodOriginal( rcm.OptionMaxNumberOfPISPIPSForNeighborhood() ); // when entering new level snap to this max value 
 | 
    // << 
 | 
     
 | 
    rcm.OptionAutoTuneNeighborhoodSize ( true );  
 | 
    rcm.OptionMaxTimePerIterationSeconds( 15 );  
 | 
    rcm.OptionMaxTimePerIterationSecondsOriginal( rcm.OptionMaxTimePerIterationSeconds() );  
 | 
    rcm.OptionIntegralityTolerance( 0.0 ); // integrality tolerance is recommended to be set to 0 for iterative optimizer, to suppress rollbacks (but if user explicitlty sets a value that will be used instead) 
 | 
    rcm.OptionRelativeMIPGap( 0.001 ); // relative mip gap default for meta. Avoid long runs to time out because of needed to prove optimality (if user explicity sets a value that will be used) 
 | 
     
 | 
    rcm.OptionDebugUsePresetAnchor( false );  
 | 
     
 | 
    rcm.OptionShiftPatternMaxActive( 2 ); // when doing shift optimization limit choices of other shift patterns to consider 
 | 
    rcm.OptionShiftPatternMaxUnits( 10 );  // when doing shift optimization limit how many unit are optimized at once  
 | 
    rcm.OptionShiftPatternMaxActiveOriginal( rcm.OptionShiftPatternMaxActive() );  
 | 
    rcm.OptionShiftPatternMaxUnitsOriginal( rcm.OptionShiftPatternMaxUnits() );  
 | 
     
 | 
    rcm.OptionDebugCPLEXVariablesConstraints( false );  
 | 
    rcm.OptionDebugCopyDataSetForSaveRollback( false );  
 | 
    rcm.OptionStopOnRollback( false );  
 | 
    rcm.OptionStopOnInfeasible( false );  
 | 
    run.Optimization().astype( Optimization ).MacroPlan().GlobalParameters_MP().DurationLotsizeHorizon( Duration::MaxDuration() ); // for now 
 | 
     
 | 
    rcm.OptionMaxNrCampaignTypeActivePerUnit( 2 );  // max nr of new campaign type to consider (within window, see below line), per unit 
 | 
    rcm.OptionActiveWindowSizeCampaignOptimization( 12 ); // a random window of periods is selected of this size each iteration. Inside the window new combi options are considered 
 | 
    rcm.OptionUseHierarchicalCPLEXGoals( false );  
 | 
     
 | 
    overrridesettingsfromstrategy := false;  
 | 
    if ( not overrridesettingsfromstrategy )  
 | 
    { 
 | 
      str := run.Optimization().astype( Optimization ).MacroPlan().StrategyMacroPlan();  
 | 
      rcm.OptionMinimumMetaLevel( maxvalue( 0, str.MetaOptimizerFirstLevel() ) ); 
 | 
      rcm.OptionMinimumMetaLevelRunFullPuzzlePrior( str.MetaOptimizerRunFullPlanPriorToFocus() );  
 | 
      fulltime := str.MetaOptimizerMaxNumberOfSecondsAllIterations();  
 | 
      rcm.OptionMaxNumberOfSecondsRun( fulltime );  
 | 
      rcm.OptionMaxNumberOfSecondsLevel0( fulltime );  
 | 
      rcm.OptionMaxNumberOfSecondsLevel1( fulltime );   
 | 
      rcm.OptionMaxNumberOfSecondsLevel2( fulltime );  
 | 
      rcm.OptionMaxNumberOfSecondsLevel3( fulltime );  
 | 
      rcm.OptionMaxNumberOfSecondsLevel4( fulltime );  
 | 
      rcm.OptionMaxNumberOfSecondsLevel5( fulltime );  
 | 
      rcm.OptionMaxNumberOfSecondsLevel6( fulltime );  
 | 
      rcm.OptionMaxNumberOfSecondsLevel7( fulltime );  
 | 
      rcm.OptionMaxNumberOfSecondsLevel8( fulltime );  
 | 
      rcm.OptionMaxNumberOfSecondsLevel9( fulltime );  
 | 
      rcm.OptionMaxNumberOfSecondsLevel10( fulltime ); 
 | 
      rcm.OptionUseHierarchicalCPLEXGoals( str.UseHierarchicalSolver() );  
 | 
      rcm.OptionCollapseLevels( str.MetaOptimizerIsCollapseLevel() );  
 | 
      rcm.OptionCollapseLevelWeight( str.MetaOptimizerCollapseLevelWeight() );  
 | 
    } 
 | 
     
 | 
    rcm.OptionBenchmarkStopThreshold( 0.999 ); // for benchmark stop at 98% of target score, set to maxreal to not use this stop criterium 
 | 
    rcm.OptionAllowScalingRecompute( true );  
 | 
     
 | 
    rcm.OptionRestrictSPcapacityWeight( 0.001 ); // weight factor for putting extra restricted SP capacity into the goal 
 | 
    rcm.OptionRestrictedSPCapacityEpsilon( 1e-6 ); // reduce SP capacity by (1-epsilon) for computing extra terms added to goal 
 | 
     
 | 
    run.Optimization().astype( Optimization ).DebugMode( false );  
 | 
    rcm.OptionCleanUpUnusedTripsPeriodTasksAfterwards( true ); // set to false during development to improve set up time 
 | 
    return rcm; 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |