From d69d6c173ffdae1c192a228f022d169e923a3814 Mon Sep 17 00:00:00 2001 From: odow Date: Wed, 15 Sep 2021 16:41:21 +1200 Subject: [PATCH 1/2] [Test] more misc fixes from SCS --- src/Bridges/Constraint/geomean.jl | 14 ++++++++++++-- src/Test/test_basic_constraint.jl | 15 ++++++++++++--- 2 files changed, 24 insertions(+), 5 deletions(-) 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..46ab5478fe 100644 --- a/src/Test/test_basic_constraint.jl +++ b/src/Test/test_basic_constraint.jl @@ -165,9 +165,18 @@ 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 From 47c932ccfa6c5952bffd5feb58af8079cfabe93b Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 15 Sep 2021 17:02:35 +1200 Subject: [PATCH 2/2] Update test_basic_constraint.jl --- src/Test/test_basic_constraint.jl | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Test/test_basic_constraint.jl b/src/Test/test_basic_constraint.jl index 46ab5478fe..3d0c97efb1 100644 --- a/src/Test/test_basic_constraint.jl +++ b/src/Test/test_basic_constraint.jl @@ -167,11 +167,7 @@ function _basic_constraint_test_helper( if _supports(config, MOI.ConstraintFunction) # 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.Utilities.canonical(f), constraint_function, config) @test isapprox( MOI.get(model, MOI.CanonicalConstraintFunction(), c), constraint_function,