Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method InitConstraintsForOperationDependentDemands_Add ( 
 | 
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, 
 | 
  const RunContextForCapacityPlanning runcontext, 
 | 
  const LibOpt_Scope scope, 
 | 
  const OperationInput input, 
 | 
  const Period_MP period, 
 | 
  constcontent Period_MPs pispipperiods, 
 | 
  Boolean usingproportialleadtimelogic, 
 | 
  Real scalefactor_partialoperationdemandqty_constddpartial, 
 | 
  Real scaling, 
 | 
  Real coef_relduration_partialcase 
 | 
) const 
 | 
{ 
 | 
  Description: 'Initialize constraints for dependent demands for operations which does not have an input group' 
 | 
  TextBody: 
 | 
  [* 
 | 
    // dependent demand quantity of input products = pt quantity * factor * relative duration. 
 | 
    // relative duration = 1 if there is no pre-processing. 
 | 
    // 0 < relative duration <= 1 if there is pre-processing. 
 | 
     
 | 
    //input: operation  
 | 
    // period = pt period  
 | 
     
 | 
    operation := input.Operation();  
 | 
     
 | 
    // The dependent demand has to takes relative duration of the pispip period (the bucket it belongs) and the pt period into account. 
 | 
     
 | 
    // To get the period of period tasks from dependent demands, it can be treated as "new supplies" of dependent demands. 
 | 
    // Please read the optimizer solution design for more information. 
 | 
    endofpt := period.End();      // dummy value - not used if not proportional 
 | 
    startofpt := period.Start();  // dummy value - not used if not proportional 
 | 
    if ( usingproportialleadtimelogic ) 
 | 
    {  
 | 
      endofpt := Process_MP::GetDependentDemandEndOperationLeadTime( period, operation.LeadTime() );  
 | 
      startofpt := Process_MP::GetOperationStart( period, endofpt ); 
 | 
    } 
 | 
     
 | 
    traverse( pispipperiods, Elements, ptperiod ) 
 | 
    { 
 | 
      // constddpartial constraint UoM: input PISP 
 | 
      constddpartial := program.PartialOperationDependentDemandQtyConstraints().New( input, ptperiod, period ); 
 | 
      constddpartial.Sense( '=' ); 
 | 
      // using default 0.0 RHS for constddpartial  
 | 
      // Term UoM: input PISP 
 | 
      constddpartial.NewTerm( -1.0 * scalefactor_partialoperationdemandqty_constddpartial * scaling, program.PartialOperationDemandQtyVariables().Get( input, ptperiod, period ) ); 
 | 
     
 | 
      // If the leadtime logic is not proportional, then the relative duration is 1 
 | 
      // Otherwise, calculate the relative duration 
 | 
      relativeduration := 1.0; 
 | 
      if( usingproportialleadtimelogic ) 
 | 
      { 
 | 
        start := Process_MP::GetNewSupplyStart( startofpt, ptperiod ); 
 | 
        end := Process_MP::GetNewSupplyEnd( endofpt, ptperiod ); 
 | 
        relativeduration := Process_MP::GetRelativeDuration( start, end, period); 
 | 
      } 
 | 
     
 | 
      // Term: dependentdemandqty * PTQty variable 
 | 
      // UoM:  [Unit to input PISP] *   [Unit] 
 | 
      constddpartial.NewTerm( coef_relduration_partialcase * relativeduration,  // relative duration applied multiplicatively in order to equal PeriodTaskOperation::GetDependentDemandQuantity( 1.0, input, relativeduration ). 
 | 
                              program.PTQtyVariables().Get( operation, period ) ); 
 | 
    } //end traverse 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |