From 1ccc08cdad1e54fd8de11a76618f7b3059b93f13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Wed, 2 Sep 2020 10:47:50 +0200 Subject: [PATCH] Fix convert_approx with multiple nonzero terms --- src/Utilities/functions.jl | 2 +- test/Utilities/functions.jl | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Utilities/functions.jl b/src/Utilities/functions.jl index 636a0c0c6b..31e36d1fb6 100644 --- a/src/Utilities/functions.jl +++ b/src/Utilities/functions.jl @@ -1975,7 +1975,7 @@ function convert_approx(::Type{MOI.SingleVariable}, func::MOI.ScalarAffineFuncti f = canonical(func) i = findfirst(t -> isapprox(t.coefficient, one(T), atol=tol), f.terms) if abs(f.constant) > tol || i === nothing || - any(j -> j != i && abs(f.terms[i]) > tol, eachindex(f.terms)) + any(j -> j != i && abs(f.terms[j].coefficient) > tol, eachindex(f.terms)) throw(InexactError(:convert_approx, MOI.SingleVariable, func)) end return MOI.SingleVariable(f.terms[i].variable_index) diff --git a/test/Utilities/functions.jl b/test/Utilities/functions.jl index b3d9754762..327b225835 100644 --- a/test/Utilities/functions.jl +++ b/test/Utilities/functions.jl @@ -308,16 +308,18 @@ end @test f.terms == MOI.ScalarAffineTerm.([2, 4], [x, y]) @test f.constant == 5 end - f = MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.([2, 4], [x, y]), - 5) + f = MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.([1.0, 0.5], [x, y]), 0.5) @testset "convert" begin @test_throws InexactError convert(MOI.SingleVariable, f) + @test_throws InexactError MOIU.convert_approx(MOI.SingleVariable, f) + @test MOIU.convert_approx(MOI.SingleVariable, f, tol = 0.5) == MOI.SingleVariable(x) quad_f = MOI.ScalarQuadraticFunction(f.terms, - MOI.ScalarQuadraticTerm{Int}[], + MOI.ScalarQuadraticTerm{Float64}[], f.constant) - @test convert(MOI.ScalarQuadraticFunction{Int}, f) ≈ quad_f + @test convert(MOI.ScalarQuadraticFunction{Float64}, f) ≈ quad_f g = convert(MOI.ScalarAffineFunction{Float64}, MOI.SingleVariable(x)) @test convert(MOI.SingleVariable, g) == MOI.SingleVariable(x) + @test MOIU.convert_approx(MOI.SingleVariable, g) == MOI.SingleVariable(x) end @testset "operate with Float64 coefficient type" begin f = MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.([1.0, 4.0],