23 IReadOnlyDictionary<int, double> values,
24 double feasibilityTolerance,
25 double integralityTolerance)
27 ArgumentNullException.ThrowIfNull(model);
28 ArgumentNullException.ThrowIfNull(values);
30 if (!
double.IsFinite(feasibilityTolerance) ||
31 feasibilityTolerance <= 0.0)
33 throw new ArgumentOutOfRangeException(
34 nameof(feasibilityTolerance));
37 if (!
double.IsFinite(integralityTolerance) ||
38 integralityTolerance <= 0.0)
40 throw new ArgumentOutOfRangeException(
41 nameof(integralityTolerance));
47 double maxBoundViolation = 0.0;
48 double maxIntegralityViolation = 0.0;
49 double maxConstraintViolation = 0.0;
50 double maxConstraintNormalizedViolation = 0.0;
54 if (!values.TryGetValue(
57 !
double.IsFinite(value))
60 $
"Variable '{variable.Name}' has no finite returned value.");
63 double.PositiveInfinity;
68 double lowerViolation =
73 double upperViolation =
89 double integerViolation =
94 MidpointRounding.AwayFromZero));
96 maxIntegralityViolation =
98 maxIntegralityViolation,
111 constraint.Sense
switch
128 throw new NotSupportedException(
129 $
"Unsupported constraint sense '{constraint.Sense}'.")
133 EvaluateConstraintScale(
137 double normalizedViolation =
138 double.IsFinite(violation) &&
139 double.IsFinite(rowScale) &&
141 ? violation / rowScale
142 :
double.PositiveInfinity;
144 maxConstraintViolation =
146 maxConstraintViolation,
149 maxConstraintNormalizedViolation =
151 maxConstraintNormalizedViolation,
152 normalizedViolation);
156 model.Objective.Constant +
158 model.Objective.Terms,
162 double.IsFinite(objective) &&
163 maxBoundViolation <= feasibilityTolerance &&
164 maxConstraintNormalizedViolation <= feasibilityTolerance &&
165 maxIntegralityViolation <= integralityTolerance;
167 if (maxBoundViolation > feasibilityTolerance)
170 $
"Maximum bound violation is {maxBoundViolation:R}.");
173 if (maxConstraintNormalizedViolation > feasibilityTolerance)
176 $
"Maximum constraint violation is " +
177 $
"{maxConstraintViolation:R}; normalized violation is " +
178 $
"{maxConstraintNormalizedViolation:R}.");
181 if (maxIntegralityViolation > integralityTolerance)
184 $
"Maximum integrality violation is " +
185 $
"{maxIntegralityViolation:R}.");
188 if (!
double.IsFinite(objective))
191 "The independently reconstructed objective is not finite.");
198 maxIntegralityViolation,
199 maxConstraintViolation,