yanweiyuan3
2023-08-09 588bc7829387dfc761cc25f06f77d4c81818bd10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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;
  *]
}