From 620fa1c9d1a7d81f11517383f5e5e611128bb89f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 17 Dec 2024 12:58:00 +0100 Subject: [PATCH] Fix issue with multiple matrices in same constraint (#140) --- src/constraint.jl | 3 +++ test/runtests.jl | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/constraint.jl b/src/constraint.jl index ff74ad1..a986ef0 100644 --- a/src/constraint.jl +++ b/src/constraint.jl @@ -81,6 +81,9 @@ function split_scalar_matrix(m::Optimizer, terms::Vector{MOI.ScalarAffineTerm{Fl if current_matrix != mat.matrix add_sd() current_matrix = mat.matrix + empty!(sd_row) + empty!(sd_col) + empty!(sd_coef) end coef = mat.row == mat.column ? coefficient : coefficient / 2 push!(sd_row, mat.row) diff --git a/test/runtests.jl b/test/runtests.jl index 7ffa61c..16723d8 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -204,6 +204,43 @@ end ) end +# See https://github.com/jump-dev/MosekTools.jl/issues/139 +# TODO add to MOI +@testset "Multiple PSD matrix in same constraint" begin + model = MOI.Bridges.full_bridge_optimizer( + MosekOptimizerWithFallback(), + Float64, + ) + x, _ = MOI.add_constrained_variables(model, MOI.PositiveSemidefiniteConeTriangle(2)) + y, _ = MOI.add_constrained_variables(model, MOI.PositiveSemidefiniteConeTriangle(2)) + MOI.add_constraint(model, sum(1.0 .* x) - sum(1.0 .* y), MOI.EqualTo(0.0)) + MOI.add_constraint(model, 1.0 * y[1] + 1.0 * y[3], MOI.GreaterThan(1.0)) + obj = 1.0 * x[1] + 1.0 * x[3] + MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) + MOI.set(model, MOI.ObjectiveFunction{typeof(obj)}(), obj) + MOI.optimize!(model) + @test MOI.get(model, MOI.PrimalStatus()) == MOI.FEASIBLE_POINT + @test MOI.get.(model, MOI.VariablePrimal(), x) ≈ ones(3) ./ 6 rtol = 1e-6 + @test MOI.get.(model, MOI.VariablePrimal(), y) ≈ [1, -1, 1] ./ 2 rtol = 1e-6 +end + +@testset "More SDP tests by forced bridging" begin + model = MOI.Bridges.full_bridge_optimizer( + MOI.Bridges.Constraint.RSOCtoPSD{Float64}( # Forced bridging + MOI.Utilities.CachingOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + #Mosek.Optimizer(), + MosekOptimizerWithFallback(), + ) + ), + Float64, + ) + MOI.set(model, MOI.Silent(), true) + MOI.Test.runtests(model, config, + include=["conic_SecondOrderCone"], + ) +end + @testset "Number of variables and deletion" begin optimizer = MosekOptimizerWithFallback() x = MOI.add_variable(optimizer)