Kevin Kok Khah Whey
2023-11-07 5ae534ab606e6f2ba5ea60914224d665b0447d5a
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
49
Quintiq file version 2.0
#parent: #root
StaticMethod CheckConstraints (
  SnapshotMacroPlannerOptimizer snapshot,
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program
)
{
  TextBody:
  [*
    epsilon := 1e-4; 
    traverse( program, Constraints, c, c.Enabled() ) 
    {
      lhsvalue := 0.0; 
      traverse( c.Terms(), Elements, term ) 
      {
        lhsvalue := lhsvalue + term.Coefficient() * term.Variable().OptimalValue(); 
      }
      
      //debuginfo(  c.Name(), 'slack=', c.SlackValue(), 'LHS=', lhsvalue, 'RHS=', c.RHSValue() ); 
    
      violationupperbound := 0.0; 
      violationlowerbound := 0.0; 
      if ( c.Sense() = '<=' 
           or c.Sense() = '=' ) 
      {
        violationupperbound := maxvalue( lhsvalue - c.RHSValue(), 0.0 ); 
      }
      
      if ( c.Sense() = '>=' 
           or c.Sense() = '=' ) 
      {
        violationlowerbound := maxvalue(  c.RHSValue() - lhsvalue, 0.0 ); 
      }
      
      if ( violationlowerbound > epsilon or violationupperbound > epsilon ) 
      {
        entry := snapshot.OptimizerDebugCPLEXLogEntry( relnew, OptimizerDebugCPLEXLogEntryMPConstraint ); 
        entry.LHS( lhsvalue ); 
        entry.RHS( c.RHSValue() ); 
        entry.Sense( c.Sense() ); 
        entry.Name( c.Name() ); 
        entry.TypeName( typeofexpression( c ).ShortName() ); 
        entry.BoundViolation( maxvalue(  violationlowerbound, violationupperbound ) ); 
        entry.Slack( c.SlackValue() ); 
      }
    }
  *]
  InterfaceProperties { Accessibility: 'Module' }
}