When an objective's optimum is an open (strict) bound, the arithmetic
relaxation returns a value carrying a non-zero infinitesimal (e.g.
minimizing a real x subject to x > 0, whose infimum is the unattained 0,
reported as "epsilon"). opt_solver::maximize_objective validates such a
hint with check_bound(), which asserts the objective is >= val via mk_ge
and searches for a model reaching it. mk_ge cannot faithfully encode the
infinitesimal (it drops a negative infinitesimal and turns a positive one
into a strict bound), so this validation always fails spuriously for an
open optimum. Since #10028 (fdc32d0e6) stopped committing the hint before
validation, this false negative now discards the true infinitesimal
optimum and reports an attainable - strictly worse - model value instead
(x = 1 rather than epsilon).
Treat a hint with a non-zero infinitesimal as valid in check_bound: for
such open bounds the relaxation value is exact. Hints without an
infinitesimal (such as the integer objective of #10028) are still
validated normally, so that fix is preserved.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>