admin
2025-01-22 7e31442f0e9b07764e9c6a9680d3d4aeba5fe1de
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
Quintiq file version 2.0
#parent: #root
Method UpdateRHSForPeriodTasksNotInScope (
  MPConstraint minconst,
  MPConstraint maxconst,
  const RunContextForCapacityPlanning runcontext,
  const LibOpt_Scope scope,
  const CapacityPlanningSuboptimizer subopt,
  Real scalefactor_rhs_minconst,
  Real scalefactor_rhs_maxconst
) const
{
  Description: 'Update the RHS based on operations outisde the optimizer horizon'
  TextBody:
  [*
    // note for UnitPeriodTransportTime, UnitPeriodTransportQuantity we rely on overloads so we only treat PeriodTaskOperation here. 
    traverse( this, 
              PeriodTaskOperation, 
              periodtask, 
              isnull( periodtask.UnitPeriodWhenInScope() ) )
    {
      //Changed the guard default value to periodtask.QuantityToProcess() as periodtask.RequiredQuantity mainly used when its Time based capacity.
      //For other capacity type, normally RequiredCapacity will be set as zero and that will resulted in fixedquantity = 0.
      fixedquantity := guard( periodtask.QuantityToProcess() / periodtask.RequiredCapacity(), periodtask.QuantityToProcess() );
      newrhsminconst := subopt.GetConstraintRHS( minconst, scalefactor_rhs_minconst ) - fixedquantity;
      minconst.RHSValue( newrhsminconst * scalefactor_rhs_minconst );
    
      newrhsmaxconst := subopt.GetConstraintRHS( maxconst, scalefactor_rhs_maxconst ) - fixedquantity;
      maxconst.RHSValue( newrhsmaxconst * scalefactor_rhs_maxconst );
    }
    
    traverse( this, ChildOfUnitDimension, childunitperiod )
    {
      childunitperiod.UpdateRHSForPeriodTasksNotInScope( minconst, maxconst, runcontext, scope, subopt, scalefactor_rhs_minconst, scalefactor_rhs_maxconst );
    }
  *]
  InterfaceProperties { Accessibility: 'Module' }
}