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