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