Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method Initialize ( 
 | 
  GraphProgram program 
 | 
) 
 | 
{ 
 | 
  Description: 'Creates a graph of the product specific supply chain' 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Create new graph, create needed edge value sets, add artificial root node of graph 
 | 
    graph := program.NewDirectedGraph( MEIO_Treeify::GetGraphName(this.MEIO_Engine().Product_MP().Name()), this ); 
 | 
    leadtimes := program.NewEdgeValueSet( MEIO_Treeify::GetEdgeValueSetLeadtimes(), 0.0 ); 
 | 
    program.NewEdgeValueSet( MEIO_Treeify::GetEdgeValueSetWeights(), 1.0 ); 
 | 
    program.NewEdgeValueSet( MEIO_Treeify::GetEdgeValueSetUtilized(), 0.0 ); 
 | 
    root := graph.NewNode( MEIO_Treeify::GetArtificialRootName() ); 
 | 
     
 | 
    debuginfo( 'INITIALIZING GRAPH', 
 | 
               'Graph:', MEIO_Treeify::GetGraphName(this.MEIO_Engine().Product_MP().Name()) ) 
 | 
     
 | 
    // Period specification duration used to bucketize leadtime 
 | 
    ps_duration := this.MEIO_Engine().MacroPlan().StartOfPlanningPeriod().DurationInDays(); 
 | 
     
 | 
    // Traverse all PISPs  
 | 
    leadtimelogicfrommiddle := this.MEIO_Engine().Product_MP().MacroPlan().GlobalParameters_MP().OperationLeadTimeLogic() = Translations::MP_GlobalParameter_LeadTimeLogic_From_Middle_Period();  
 | 
    laneleadtimelogicfrommiddle := this.MEIO_Engine().Product_MP().MacroPlan().GlobalParameters_MP().LaneLeadTimeLogic() = Translations::MP_GlobalParameter_LeadTimeLogic_From_Middle_Period()  
 | 
    traverse( this, MEIO_Engine.Product_MP.ProductInStockingPoint_MP, pisp ) 
 | 
    { 
 | 
      // If PISP has an enabled incoming routing, bucketize the max enabled routing leadtime.  
 | 
      // Leadtime is translated depending on which leadtime logic is used 
 | 
      if( exists( pisp, OperationOutput.Routing, r, r.IsEnabled()) ) 
 | 
      { 
 | 
        leadtime := 0.0; 
 | 
         
 | 
        maxsummedleadtime := max( pisp, OperationOutput,  
 | 
                                        oo,  
 | 
                                        sum( oo, Routing.RoutingStep.Operation,  
 | 
                                                 o,  
 | 
                                                 o.IsEnabled(),  
 | 
                                                 o.LeadTime().Days() ) ) 
 | 
                                                  
 | 
        unroundedleadtime := maxvalue( 0.0, ( this.GetLeadTimeInDays( leadtimelogicfrommiddle, maxsummedleadtime, ps_duration ) ) / ps_duration );  
 | 
        leadtime := [Real] ifexpr( leadtimelogicfrommiddle, ceil( unroundedleadtime ), floor( unroundedleadtime ) );  
 | 
      
 | 
        // Find or create edge from artificial root to PISP node ( since it is supplied from a routing ) 
 | 
        edge := this.GetEdge( graph, root, pisp );  
 | 
        leadtimes.Set( edge, leadtime ); 
 | 
      } 
 | 
       
 | 
      // Continue to add nodes and edges by traversing all enabled lanelegs incoming to the PISP 
 | 
      traverse( pisp, LaneLegOutput.LaneLeg, ll, ll.IsEnabled() ) 
 | 
      { 
 | 
        // Bucketize leadtime depending on which leadtime logic is used 
 | 
        leadtime := 0.0; 
 | 
        unroundedleadtime := this.GetLeadTimeInDays( leadtimelogicfrommiddle, ll.LeadTime().Days(), ps_duration ) / ps_duration;  
 | 
        leadtime := [Real] ifexpr( laneleadtimelogicfrommiddle, ceil( unroundedleadtime ), floor( unroundedleadtime ) );  
 | 
         
 | 
        // Go through all upstream PISPs ( parents ), created corresponding nodes and edges between child and parent 
 | 
        traverse( ll, LaneLegInput.ProductInStockingPoint_MP, parent_pisp, parent_pisp.Product_MP() = pisp.Product_MP() ) 
 | 
        { 
 | 
          parent := graph.FindNode( parent_pisp.Name(), parent_pisp ); 
 | 
          if( isnull( parent ) ) 
 | 
          { 
 | 
            parent := graph.NewNode( parent_pisp.Name(), parent_pisp ); 
 | 
          } 
 | 
          edge := this.GetEdge( graph, parent, pisp );  
 | 
          leadtimes.Set( edge, leadtime ); 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
     
 | 
     
 | 
    // Set max number of trees allowed to be run for this program 
 | 
    this.SetMaxNrOfTrees( program ); 
 | 
  *] 
 | 
} 
 |