Quintiq file version 2.0 
 | 
#parent: #root 
 | 
MethodOverride SetOptimizerInputSmartPlan ( 
 | 
  ProductInStockingPointInPeriodPlanningLeaf pispip, 
 | 
  Boolean isusingselectedunits, 
 | 
  Units units, 
 | 
  Number depth, 
 | 
  LibOpt_Scope scope, 
 | 
  RunContextForCapacityPlanning runcontext 
 | 
) as Boolean 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Recursive methods that selects all required instances for the upstream smart plan optimizer run 
 | 
    // If this pispip is already part of this optimizer run, then we do not need to consider it again 
 | 
     
 | 
    // unused argument: explorerecursive 
 | 
     
 | 
    hasbeenvisited := pispip.TransformerSmartPlanUpStreamWhenVisitedUp() = this;  
 | 
    this.Visit( pispip );  
 | 
    isinrun := scope.Contains(  pispip.PISPIPInOptimizerRun() );  
 | 
     
 | 
    if ( this.Debug() )  
 | 
    { 
 | 
      debuginfo( depth, ' ', pispip.ProductInStockingPoint_MP().StockingPointID(),  
 | 
                 pispip.ProductInStockingPoint_MP().ProductID(),  
 | 
                 pispip.Start(),  
 | 
                 'in run =', isinrun );  
 | 
    } 
 | 
     
 | 
    if( not hasbeenvisited ) 
 | 
    { 
 | 
      if ( not isinrun )  
 | 
      { 
 | 
        scope.Add( pispip ); 
 | 
      } 
 | 
     
 | 
      ptforrecursive := this.GetPeriodTasksToSearch( pispip, scope, runcontext, units, isusingselectedunits, depth );  
 | 
     
 | 
      traverse( ptforrecursive, Elements, pt )  
 | 
      { 
 | 
        newpispips := selectset(  pt, DependentDemand.ProductInStockingPointInPeriodPlanningLeaf, newpispip, true, true );  
 | 
        if ( not runcontext.IsMetaIteration() or forall( newpispips, Elements, newpispip, true, not newpispip.IsPeriodFrozen() ) ) 
 | 
        { 
 | 
          scope.Add( pt ); 
 | 
          if ( pt.NewSupply( relsize ) > 1 )  
 | 
          { 
 | 
            traverse( pt, NewSupply.ProductInStockingPointInPeriodPlanningLeaf, p ) 
 | 
            { 
 | 
              this.SidePISPIP( relinsert, p ); // we add these to scope after recursive procedure is done so that if whe happen to hit an output product during this we still explore it 
 | 
            } 
 | 
          } 
 | 
           
 | 
          traverse( newpispips, Elements, newpispip ) 
 | 
          { 
 | 
            if( runcontext.IsMetaIteration() or newpispip.GetProductIsIncludedInOptimizerRun( runcontext.IsPostProcessing() ) )  
 | 
            { 
 | 
              this.SetOptimizerInputSmartPlan( newpispip, isusingselectedunits, units, depth + 1, scope, runcontext ); 
 | 
            } 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
       
 | 
      // Recursively search trips /  product in trips  
 | 
      pit_to_search := this.GetProductInTripsToSearch( pispip, scope, runcontext, units, isusingselectedunits, depth );   
 | 
       
 | 
      traverse( pit_to_search, Elements, productintrip ) 
 | 
      {  
 | 
        newpispip := productintrip.DependentDemand().ProductInStockingPointInPeriodPlanningLeaf();  
 | 
        if ( not runcontext.IsMetaIteration() or not newpispip.IsPeriodFrozen() )  
 | 
        { 
 | 
          scope.Add( productintrip ); // note units, unitperiods, trip we add all the way at the end ( LibOpt_Scope.CompleteForPTO_PIT)  
 | 
          this.SetOptimizerInputSmartPlan( newpispip, isusingselectedunits, units, depth + 1, scope, runcontext ); 
 | 
        } 
 | 
      } 
 | 
    } // endif not in run 
 | 
     
 | 
    return true; 
 | 
  *] 
 | 
} 
 |