| Quintiq file version 2.0 | 
| #parent: #root | 
| MethodOverride GetAnchorPISPIPs ( | 
|   LibOpt_Scope scope, | 
|   RunContextForCapacityPlanning runcontext, | 
|   RunContextMeta runcontextmeta | 
| ) as owning ProductInStockingPointInPeriodPlannings | 
| { | 
|   TextBody: | 
|   [* | 
|     anchor := construct( ProductInStockingPointInPeriodPlannings );  | 
|     anchorleafs := construct( ProductInStockingPointInPeriodPlannings );  | 
|     mp := runcontext.FirstPeriod_MP().MacroPlan();  | 
|      | 
|     candidates := this.GetCandidates( scope );  | 
|      | 
|     candidatesvector := selectvalues( candidates, Elements, c, true, this.GetScore( c ) );  | 
|     maxindex := candidatesvector.Size() - 1;  | 
|     i := SelectorMeta::GetRandomIndex( candidatesvector );  | 
|     comment := '';  | 
|     if ( i <= maxindex  ) // if we exit within limits of candidates, then know i is the index where for the 1st time cumulative sum >= Real::Random( epsilon, totalEIS) | 
|     {                      | 
|       anchor.Add( candidates.Element(  i ) );  | 
|     }  | 
|     else | 
|     { | 
|       anchor.Add( this.GetRandomPISPIP( mp, scope ) );  | 
|       comment := 'picked random pispip';  | 
|     } | 
|      | 
|     traverse( anchor, Elements, anc )  | 
|     {  | 
|       debuginfo(  'anchor=', anc.NameForOptimizer() );  | 
|     } | 
|     traverse( anchor, Elements, anc )  | 
|     { | 
|       anchorleafs.Add( anc );  | 
|        | 
|       if ( not anc.istype( ProductInStockingPointInPeriodPlanningLeaf ) )  | 
|       { | 
|         randomleafs := selectsortedset(  anc.GetLeafPISPIPs(), Elements, p, true, Real::Random() ); | 
|          | 
|         traverse( randomleafs, Elements.astype( ProductInStockingPointInPeriodPlanningLeaf ), productchild )  | 
|         { | 
|           anchorleafs.Add(  productchild );  | 
|         } | 
|       } | 
|     } | 
|      | 
|     this.SetDescriptionAnchors( anchor, anchorleafs, comment );  | 
|      | 
|     return &anchorleafs; | 
|   *] | 
| } |