Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method InitConstraintsForSupplySpecifications ( 
 | 
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, 
 | 
  const RunContextForCapacityPlanning runcontext, 
 | 
  const LibOpt_Scope scope 
 | 
) const 
 | 
{ 
 | 
  Description: 'The constraint to calculate deviation of supply specification' 
 | 
  TextBody: 
 | 
  [* 
 | 
    if( runcontext.UseSupplySpecification() ) 
 | 
    { 
 | 
      targetconstname := typeof( MPSupplyTargetConstraint ); 
 | 
      minconstname := typeof( MPMinSupplyConstraint ); 
 | 
      maxconstname := typeof( MPMaxSupplyConstraint ); 
 | 
     
 | 
      scalefactor_supplytargetqtyunder_targetconst := this.ScaleConstraintTerm( typeof( MPSupplyTargetQtyUnderVariable ), targetconstname ); 
 | 
      scalefactor_minsupplyqtyunder_minconst := this.ScaleConstraintTerm( typeof( MPMinSupplyQtyUnderVariable ), minconstname ); 
 | 
      scalefactor_maxsupplyqtyover_maxconst := this.ScaleConstraintTerm( typeof( MPMaxSupplyQtyOverVariable ), maxconstname ); 
 | 
      scalefactor_tripnewsupply_targetconst := this.ScaleConstraintTerm( typeof( MPTripNewSupplyVariable ), targetconstname ); 
 | 
      scalefactor_tripnewsupply_minconst := this.ScaleConstraintTerm( typeof( MPTripNewSupplyVariable ), minconstname ); 
 | 
      scalefactor_tripnewsupply_maxconst := this.ScaleConstraintTerm( typeof( MPTripNewSupplyVariable ), maxconstname ); 
 | 
      scalefactor_periodtaskqty_targetconst := this.ScaleConstraintTerm( typeof( MPPTQtyVariable ), targetconstname ); 
 | 
      scalefactor_periodtaskqty_minconst := this.ScaleConstraintTerm( typeof( MPPTQtyVariable ), minconstname ); 
 | 
      scalefactor_periodtaskqty_maxconst := this.ScaleConstraintTerm( typeof( MPPTQtyVariable ), maxconstname ); 
 | 
       
 | 
      scalefactor_rhs_targetconst := this.ScaleConstraintRHS( targetconstname, 1.0 ); 
 | 
      scalefactor_rhs_minconst := this.ScaleConstraintRHS( minconstname, 1.0 ); 
 | 
      scalefactor_rhs_maxconst := this.ScaleConstraintRHS( maxconstname, 1.0 ); 
 | 
       
 | 
      // The supply specification should only be considered if at least one unit in this optimizer runs influences this supply specification 
 | 
      traverse( this.MacroPlan().GetUnitsConst(), Elements.SupplySpecification, supplyspec, 
 | 
                exists( supplyspec, Unit.AllChildren.AsChildren, unit, 
 | 
                        scope.Contains( unit.UnitInOptimizerRun()) ) ) 
 | 
      { 
 | 
        //penalty of not reaching the target quantity of the supply specification 
 | 
        // targetconst constraint UoM: Unit 
 | 
        targetconst := program.SupplyTargetConstraints().New( supplyspec ); 
 | 
        targetconst.Sense( ">=" ); 
 | 
        // RHS UoM: Unit 
 | 
        targetconst.RHSValue( supplyspec.TargetQuantity() * scalefactor_rhs_targetconst ); 
 | 
        // Term UoM: Unit 
 | 
        targetconst.NewTerm( scalefactor_supplytargetqtyunder_targetconst, 
 | 
                             program.SupplyTargetQtyUnderVariables().Get( supplyspec ) ); 
 | 
     
 | 
        //penalty of not reaching the minimum quantity of the supply specification 
 | 
        // minconst constraint UoM: Unit 
 | 
        minconst := program.MinSupplyConstraints().New( supplyspec ); 
 | 
        minconst.Sense( ">=" ); 
 | 
        // RHS UoM: Unit 
 | 
        minconst.RHSValue( supplyspec.MinQuantity() * scalefactor_rhs_minconst ); 
 | 
        // Term UoM: Unit 
 | 
        minconst.NewTerm( scalefactor_minsupplyqtyunder_minconst, 
 | 
                          program.MinSupplyQtyUnderVariables().Get( supplyspec ) ); 
 | 
     
 | 
        //penalty of exceeding the maximum quantity of the supply specification 
 | 
        // maxconst constraint UoM: Unit 
 | 
        maxconst := program.MaxSupplyConstraints().New( supplyspec ); 
 | 
        maxconst.Sense( "<=" ); 
 | 
        // RHS UoM: Unit 
 | 
        maxconst.RHSValue( supplyspec.MaxQuantity() * scalefactor_rhs_maxconst ); 
 | 
        // Term UoM: Unit 
 | 
        maxconst.NewTerm( -1.0 * scalefactor_maxsupplyqtyover_maxconst, 
 | 
                          program.MaxSupplyQtyOverVariables().Get( supplyspec ) ); 
 | 
     
 | 
        if ( supplyspec.HasRegularProductForOptimizer() or supplyspec.Product_MP().GetIsInOptimizerRun( runcontext.IsPostProcessing() ) )  
 | 
        { 
 | 
          traverse( supplyspec.GetProductInStockingPointInPeriodsConst(), Elements.astype( ProductInStockingPointInPeriodPlanning ), pispip,   
 | 
                    scope.Contains( pispip.PISPIPInOptimizerRun() ) )  
 | 
          { 
 | 
            // Operations 
 | 
            traverse( pispip, ProductInStockingPoint_MP.OperationOutputAvailableForOptimization, output, 
 | 
                      output.Operation().Unit().IsIncludedInSupplySpecification()       // unit is included in the supply specification 
 | 
                      and supplyspec.Unit().IsParent( output.Operation().Unit() ) )     // unit is the descendant of target unit 
 | 
            { 
 | 
              uomconversion := output.UnitConversionFactor(); 
 | 
              // Term:   uomconversion    *       factor        * PTQty variable 
 | 
              // UoM: [Output PISP to Unit] * [Unit to Output PISP] *     [Unit]  
 | 
              this.AddConstraintForOperationNewSupplies( output, pispip.Period_MP(), null( Period_MP ), program, uomconversion, targetconst, scalefactor_periodtaskqty_targetconst, scope ); 
 | 
              this.AddConstraintForOperationNewSupplies( output, pispip.Period_MP(), null( Period_MP ), program, uomconversion, minconst, scalefactor_periodtaskqty_minconst, scope ); 
 | 
       
 | 
              if( supplyspec.HasMaxQuantity() ) 
 | 
              { 
 | 
                // Term:   uomconversion    *       factor        * PTQty variable 
 | 
                // UoM: [Output PISP to Unit] * [Unit to Output PISP] *     [Unit] 
 | 
                this.AddConstraintForOperationNewSupplies( output, pispip.Period_MP(), null( Period_MP ), program, uomconversion, maxconst, scalefactor_periodtaskqty_maxconst, scope ); 
 | 
              } 
 | 
            } 
 | 
       
 | 
            // Trips 
 | 
            traverse( pispip, astype( ProductInStockingPointInPeriodPlanningLeaf ).NewSupply.ProductInTrip, productintrip,  
 | 
                      scope.Contains( productintrip.ProductInTripInOptimizerRun() )  
 | 
                      and productintrip.Trip().LaneLeg().Lane().Unit().IsIncludedInSupplySpecification() 
 | 
                      and supplyspec.Unit().IsParent( productintrip.Trip().LaneLeg().Lane().Unit() ) ) 
 | 
            { 
 | 
               
 | 
              uomconversion := productintrip.UnitConversionFactor(); 
 | 
              // Term:   uomconversion    *  TripNewSupply variable 
 | 
              // UoM: [Output PISP to Unit] *       [Output PISP] 
 | 
              targetconst.NewTerm( uomconversion * scalefactor_tripnewsupply_targetconst, program.TripNewSupplyVariables().Get( productintrip ) ); 
 | 
              minconst.NewTerm( uomconversion * scalefactor_tripnewsupply_minconst, program.TripNewSupplyVariables().Get( productintrip ) ); 
 | 
       
 | 
              if( supplyspec.HasMaxQuantity() ) 
 | 
              { 
 | 
                // Term:   uomconversion    *  TripNewSupply variable 
 | 
                // UoM: [Output PISP to Unit] *       [Output PISP] 
 | 
                maxconst.NewTerm( uomconversion * scalefactor_tripnewsupply_maxconst, program.TripNewSupplyVariables().Get(  productintrip ) ); 
 | 
              } 
 | 
            } 
 | 
          } 
 | 
        } 
 | 
         
 | 
         
 | 
        // Update the RHS based on those Period Tasks that cannot be influenced by the optimizer 
 | 
        // These Period Tasks either do not have a PTQty variable or their trip is not part of the optimizer run 
 | 
        periodtaskcorrections := construct( PeriodTask_MPs, constcontent );  
 | 
        traverse( supplyspec.GetProductInStockingPointInPeriodsConst(),  
 | 
                  Elements.astype( ProductInStockingPointInPeriodPlanningLeaf ).NewSupply,  
 | 
                  ns,  
 | 
                  ns.PeriodTask_MP().Process_MP().AsProcess_MP().IsIncludedInSupplySpecification()  
 | 
                  and supplyspec.Unit().IsParent( ns.PeriodTask_MP().UnitPeriod().Unit() ) 
 | 
                  )  
 | 
        { 
 | 
          uomconversion := 1.0;  
 | 
          pt_inscope := true;  
 | 
          if ( ns.IsNewSupplyOfOperation() 
 | 
               and not scope.Contains( ns.PeriodTaskOperation().PeriodTaskOperationInOptimizerRun() ) ) 
 | 
          { 
 | 
            periodtaskcorrections.Add(  ns.PeriodTask_MP() );  
 | 
            operationoutput := ns.ProcessOutput().astype(  OperationOutput );  
 | 
            uomconversion := operationoutput.UnitConversionFactor();       
 | 
            pt_inscope := false;                                       
 | 
                                         
 | 
          } 
 | 
          if ( ns.PeriodTask_MP().istype( PeriodTaskLaneLeg )  
 | 
               and not scope.Contains( ns.PeriodTask_MP().astype( PeriodTaskLaneLeg ).Trip().TripInOptimizerRun() ) ) 
 | 
          { 
 | 
            periodtaskcorrections.Add( ns.PeriodTask_MP() );   
 | 
            uomconversion := ns.ProductInTrip().UnitConversionFactor();   
 | 
            pt_inscope := false;  
 | 
          } 
 | 
           
 | 
          if ( not pt_inscope )  
 | 
          { 
 | 
            nsqty := ns.Quantity();  
 | 
             
 | 
            // RHS UoM: Unit 
 | 
            targetrhs := this.GetConstraintRHS( targetconst, scalefactor_rhs_targetconst ) - nsqty * uomconversion; 
 | 
            targetconst.RHSValue( targetrhs * scalefactor_rhs_targetconst ); 
 | 
       
 | 
            minrhs := this.GetConstraintRHS( minconst, scalefactor_rhs_minconst ) - nsqty * uomconversion; 
 | 
            minconst.RHSValue( minrhs * scalefactor_rhs_minconst ); 
 | 
       
 | 
            if( supplyspec.HasMaxQuantity() ) 
 | 
            { 
 | 
              maxrhs := this.GetConstraintRHS( maxconst, scalefactor_rhs_maxconst ) - nsqty * uomconversion; 
 | 
              maxconst.RHSValue( maxrhs * scalefactor_rhs_maxconst ); 
 | 
            } 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |