Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method CreateComponentTreeForLevel ( 
 | 
  LibOpt_Run run, 
 | 
  LibOpt_Component continuecomponent, 
 | 
  Number focuslevel 
 | 
) as LibOpt_Component 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    // get probabilities  
 | 
    probrandom := 0.001;  
 | 
     
 | 
    // construct components 
 | 
    selectorPISPIP := SelectorMetaPISPIP::Create( run, 'SelectorPSIPIPLevel'+ [String]focuslevel, focuslevel);   
 | 
    selectorPISPIP_PP := SelectorMetaPISPIPPreProduction::Create( run, 'SelectorPSIPIPPreProdLevel'+ [String]focuslevel, focuslevel);   
 | 
    selectorTrip := SelectorMetaTrip::Create( run, 'SelectorTripLevel'+ [String]focuslevel, focuslevel);   
 | 
    selectorSPIP := SelectorMetaSPIP::Create( run, 'SelectorSPIPLevel' + [String] focuslevel, focuslevel );  
 | 
    selectorPTO := SelectorMetaPeriodTaskOperation::Create( run, 'SelectorPTOLevel'+ [String]focuslevel, focuslevel);   
 | 
    selectorUP := SelectorMetaUnitPeriod::Create( run, 'SelectorUPLevel'+ [String]focuslevel, focuslevel);   
 | 
    selectorrandom := SelectorMetaRandomPISPIP::Create( run, 'SelectorRandomPSIPIPLevel'+ [String]focuslevel, focuslevel);   
 | 
    switchchooseproblemtypeavailable := this.SwitchProbability( run, 'ChooseProblemType' + [String]focuslevel ); 
 | 
    switchpispip_problem := this.SwitchProbability( run, 'ChoosePISPIPProblem' + [String] focuslevel );  
 | 
     
 | 
    probswitchrandom_or_problem := this.SwitchProbability( run, 'probswitchchooserandom' + [String]focuslevel );  
 | 
     
 | 
    probability_pispip := LinkProbabilityPISPIP::Create();  
 | 
    probability_pispip_preprod := LinkProbabilityPISPIPPreProduction::Create();  
 | 
    probability_trip := LinkProbabilityTrip::Create( focuslevel );  
 | 
    probability_spip := LinkProbabilityStockingPointInPeriod::Create( focuslevel );  
 | 
    probability_unitperiod := LinkProbabilityUnitPeriod::Create( focuslevel );  
 | 
    probability_pto := LinkProbabilityPeriodTaskOperation::Create( focuslevel ); 
 | 
    probability_fallback := LinkProbabilityFallBackRandom::Create();    
 | 
     
 | 
    //>> 1st we select whether we will address a problem, or whether we do a random selection  
 | 
    startcomp := probswitchrandom_or_problem;  
 | 
    probswitchrandom_or_problem.Branch( 1 - probrandom, switchchooseproblemtypeavailable );  
 | 
    probswitchrandom_or_problem.Branch( probrandom, selectorrandom );  
 | 
    //<< 
 | 
     
 | 
    weightbase := 1.0;  
 | 
    // >> in case of problem select an available selector. We select from a random available from.  
 | 
    switchchooseproblemtypeavailable.Branch( weightbase, switchpispip_problem, &probability_pispip ); // select pispip problem (see below) 
 | 
    switchchooseproblemtypeavailable.Branch( weightbase, selectorTrip, &probability_trip );  
 | 
    switchchooseproblemtypeavailable.Branch( weightbase, selectorPTO, &probability_pto );  
 | 
    switchchooseproblemtypeavailable.Branch( weightbase, selectorUP, &probability_unitperiod );  
 | 
    switchchooseproblemtypeavailable.Branch( weightbase, selectorSPIP, &probability_spip );  
 | 
    switchchooseproblemtypeavailable.Branch( weightbase, selectorrandom, &probability_fallback ); // last one added will be default in case no others are available 
 | 
    // add additional problem types here  
 | 
    // << 
 | 
     
 | 
    // >> pispip problem choice: regular or target pre production 
 | 
    switchpispip_problem.Branch( OptimizerMeta::ProbilityPISPIPRegularProblem(), selectorPISPIP );  
 | 
    switchpispip_problem.Branch( weightbase, selectorPISPIP_PP, &probability_pispip_preprod ); // uses probability 1-OptimizerMeta::ProbilityPISPIPRegularProblem() if available, 0 otherwise 
 | 
     
 | 
    // link to continuation  
 | 
    selectorPISPIP.To( continuecomponent );  
 | 
    selectorPISPIP_PP.To( continuecomponent );  
 | 
    selectorTrip.To(  continuecomponent );  
 | 
    selectorPTO.To(  continuecomponent );  
 | 
    selectorUP.To(  continuecomponent );  
 | 
    selectorSPIP.To( continuecomponent );  
 | 
    selectorrandom.To( continuecomponent );  
 | 
     
 | 
    // add additional problem types here  
 | 
    //<< 
 | 
     
 | 
    return startcomp; 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |