| 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' } | 
| } |