diff --git a/src/Bridges/Constraint/geomean.jl b/src/Bridges/Constraint/geomean.jl index 6dadea12d8..337a1c8531 100644 --- a/src/Bridges/Constraint/geomean.jl +++ b/src/Bridges/Constraint/geomean.jl @@ -249,9 +249,19 @@ function MOI.get( if 2j <= bridge.d func = MOI.get(model, attr, bridge.rsoc_constraints[offset+j]) func_scalars = MOIU.eachscalar(func) - f_scalars[2j] = func_scalars[1] + # Numerical issues can arise when a VectorOfVariables function + # is turned into a VectorAffineFunction, because the RSOC + # constraints might return something like `0.999999999x` instead + # of exactly `1.0x`. To counteract this, use `convert_approx`. + f_scalars[2j] = MOI.Utilities.convert_approx( + MOI.Utilities.scalar_type(H), + func_scalars[1], + ) if 2j + 1 <= bridge.d - f_scalars[2j+1] = func_scalars[2] + f_scalars[2j+1] = MOI.Utilities.convert_approx( + MOI.Utilities.scalar_type(H), + func_scalars[2], + ) end end end diff --git a/src/Test/test_basic_constraint.jl b/src/Test/test_basic_constraint.jl index 64f8d46c3f..3d0c97efb1 100644 --- a/src/Test/test_basic_constraint.jl +++ b/src/Test/test_basic_constraint.jl @@ -165,9 +165,14 @@ function _basic_constraint_test_helper( ### Test MOI.ConstraintFunction ### if _supports(config, MOI.ConstraintFunction) - @test MOI.get(model, MOI.ConstraintFunction(), c) ≈ constraint_function - @test MOI.get(model, MOI.CanonicalConstraintFunction(), c) ≈ - constraint_function + # Don't compare directly, because `f` might not be canonicalized. + f = MOI.get(model, MOI.ConstraintFunction(), c) + @test isapprox(MOI.Utilities.canonical(f), constraint_function, config) + @test isapprox( + MOI.get(model, MOI.CanonicalConstraintFunction(), c), + constraint_function, + config, + ) _test_attribute_value_type(model, MOI.ConstraintFunction(), c) _test_attribute_value_type(model, MOI.CanonicalConstraintFunction(), c) end