Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method GetWindowCampaignSequenceOptimizer ( 
 | 
  output Date earlieststart, 
 | 
  output Date lateststart, 
 | 
  Number windowsizenrperiods, 
 | 
  OptCampaignUnit ocunit, 
 | 
  LibOpt_Scope scope 
 | 
) 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    periods := selectsortedset( ocunit,  
 | 
                                Unit.UnitPeriod,  
 | 
                                up,  
 | 
                                not up.IsPeriodFrozen()  
 | 
                                and up.IsPlanning()  
 | 
                                and not up.Period_MP().IsHistorical() 
 | 
                                and up.Start() <= up.Unit().CampaignTypeRequirementHorizon() 
 | 
                                and scope.Contains( up.UnitPeriodInOptimizerRun() ),  
 | 
                                up.StartDate() );  
 | 
     
 | 
    if ( periods.Size() > 0 )  
 | 
    { 
 | 
      debuginfo(  periods.Element( 0 ).StartDate(), periods.Element( periods.Size() - 1 ).StartDate(), periods.Size() );  
 | 
      if ( not earlieststart >= periods.Element( 0 ).StartDate()                  // check if we can re-use the shared window, if not then pick new one 
 | 
           or not lateststart <= periods.Element( periods.Size() - 1 ).StartDate() )  
 | 
      {      
 | 
        start := maxvalue(  Number::Random( -windowsizenrperiods, periods.Size() - 1 ), 0 ); // give equal probability to first period by picking negative numbers also  
 | 
        end := minvalue(  start + windowsizenrperiods, periods.Size() - 1 );  
 | 
        earlieststart := periods.Element( start ).StartDate();  
 | 
        lateststart := periods.Element( end ).StartDate();  
 | 
      } 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |