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
Quintiq file version 2.0
#parent: #root
Method InitConstraintsGoalsForSlacks (
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program,
  const RunContextForCapacityPlanning runcontext,
  const LibOpt_Scope scope,
  const constcontent ProductInStockingPointInPeriodPlannings pispipsinrun
) const
{
  Description: 'The constraint to compute the total slacks per category used in the algorithm.'
  TextBody:
  [*
    // The total user supply slack is equal to the sum of all user supply slacks
    if( runcontext.GetConsiderTotalUserSupply( scope ) )
    {
      totalslackuserconstrname := typeof( MPTotalSlackUserSupplyConstraint );
      
      scalefactor_totalslackusersupply_totalslackuserconstr := this.ScaleConstraintTerm( typeof( MPTotalSlackUserSupplyVariable ), totalslackuserconstrname );
      scalefactor_usertotalsupplyover_totalslackuserconstr := this.ScaleConstraintTerm( typeof( MPUserTotalSupplyOverVariable ), totalslackuserconstrname );
      scalefactor_usertotalsupplyunder_totalslackuserconstr := this.ScaleConstraintTerm( typeof( MPUserTotalSupplyUnderVariable ), totalslackuserconstrname );
      
      // totalslackuserconstr constraint UoM: Default
      totalslackuserconstr := program.TotalSlackUserSupplyConstraints().New();
      totalslackuserconstr.Sense( '=' );
      // RHS UoM: Default
      totalslackuserconstr.RHSValue( 0.0 );
    
      // Term UoM: Default
      totalslackuserconstr.NewTerm( -1.0 * scalefactor_totalslackusersupply_totalslackuserconstr, program.TotalSlackUserSupplyVariables().Get() );
    
      // Add regular UserTotalSupply slacks
      pispipstoadd := runcontext.GetPISPISPForUserSupplyConstraint( scope, pispipsinrun ) // only add slack variables for those pispips where we define user supply constraints
      traverse( pispipstoadd, Elements, pispip ) 
      {
        {
          uomconversion := pispip.ProductInStockingPoint_MP().DefaultUOMConversionFactor();
    
          // Term: uomconversion   * UserTotalSupply Slack variable
          // UoM:  [PISP to Default] *      [PISP]
          totalslackuserconstr.NewTerm( uomconversion * scalefactor_usertotalsupplyover_totalslackuserconstr, program.UserTotalSupplyOverVariables().Get( pispip ) );
          totalslackuserconstr.NewTerm( uomconversion * scalefactor_usertotalsupplyunder_totalslackuserconstr, program.UserTotalSupplyUnderVariables().Get( pispip ) );
        }
      }
      
    }
  *]
  InterfaceProperties { Accessibility: 'Module' }
}