Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method InitConstraintsForShiftPatternMinDurationOutsideScope ( 
 | 
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, 
 | 
  const LibOpt_Scope scope, 
 | 
  const UnitPeriodTime up, 
 | 
  Real scalefactor_spisused_const, 
 | 
  Real scalefactor_spisfirst_const, 
 | 
  Real scalefactor_mindurationslack_const, 
 | 
  Real scalefactor_rhs_minimumdurationconstr 
 | 
) const 
 | 
{ 
 | 
  Description: 'Finds the first unit period prior to the optimizer scope (going backwards) where the shift pattern changes, and creates minimum duration constraints for it.' 
 | 
  TextBody: 
 | 
  [* 
 | 
    previous := up.PreviousPlanningUnitPeriod(); 
 | 
    if( not isnull( previous ) ) 
 | 
    { 
 | 
      startingperiod := previous.astype( UnitPeriodTime ); 
 | 
      previousperiod := guard( startingperiod.PreviousPlanningUnitPeriod().astype( UnitPeriodTime ), null( UnitPeriodTime ) ); 
 | 
       
 | 
      // Search the earliest unit period prior to the optimizer scope (going backwards) where the shift pattern changes. 
 | 
      while( not isnull( previousperiod ) 
 | 
             and previousperiod.ShiftPattern() = startingperiod.ShiftPattern() 
 | 
             and previousperiod.Start() > (up.Start() - previousperiod.ShiftPattern().MinimumDuration()) 
 | 
             and not previousperiod.IsInScopeForShiftOptimization( scope ) ) 
 | 
      { 
 | 
        startingperiod := previousperiod; 
 | 
        previousperiod := previousperiod.PreviousPlanningUnitPeriod().astype( UnitPeriodTime ); 
 | 
      } 
 | 
       
 | 
      // If the period found above has a change of shift pattern and is preceded by a unit period not in scope, 
 | 
      // then create the minimum duration constraints for it. 
 | 
      if( guard( not previousperiod.IsInScopeForShiftOptimization( scope ), true )  
 | 
          and guard( startingperiod.ShiftPattern() <> previousperiod.ShiftPattern(), true ) ) 
 | 
      { 
 | 
        traverse( startingperiod, Unit.UnitShiftPatternAllowed.ShiftPattern, sp )                
 | 
        { 
 | 
          this.InitConstraintsForShiftPatternMinDuration( program,  
 | 
                                                          scope,  
 | 
                                                          startingperiod,  
 | 
                                                          sp,  
 | 
                                                          scalefactor_spisused_const,  
 | 
                                                          scalefactor_spisfirst_const,  
 | 
                                                          scalefactor_mindurationslack_const,  
 | 
                                                          scalefactor_rhs_minimumdurationconstr );  
 | 
        } 
 | 
      } 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |