diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index 0ac9e5a..c1957be 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -261,7 +261,20 @@ function load_objective_term!(optimizer::Optimizer, α, vi::MOI.VariableIndex) return addentry(optimizer.problem, 0, blk, i, j, coef, true) end +function _check_unsupported_constraints(dest, src) + for (F, S) in MOI.get(src, MOI.ListOfConstraintTypesPresent()) + constrained_variable = + F == MOI.VectorOfVariables && + MOI.supports_add_constrained_variables(dest, S) + if !(MOI.supports_constraint(dest, F, S) || constrained_variable) + throw(MOI.UnsupportedConstraint{F,S}()) + end + end + return +end + function MOI.copy_to(dest::Optimizer, src::MOI.ModelLike) + _check_unsupported_constraints(dest, src) MOI.empty!(dest) index_map = MOI.Utilities.IndexMap() diff --git a/test/MOI_wrapper.jl b/test/MOI_wrapper.jl index f3a025a..ae78b53 100644 --- a/test/MOI_wrapper.jl +++ b/test/MOI_wrapper.jl @@ -36,6 +36,18 @@ function test_options() ) end +function test_unsupported_constraint() + model = MOI.Utilities.Model{Float64}() + x = MOI.add_variable(model) + MOI.add_constraint(model, x, MOI.GreaterThan(0.0)) + MOI.add_constraint(model, 1.0 * x, MOI.EqualTo(0.0)) + @test_throws( + MOI.UnsupportedConstraint{MOI.VariableIndex,MOI.GreaterThan{Float64}}(), + MOI.copy_to(CSDP.Optimizer(), model), + ) + return +end + function test_runtests() model = MOI.Utilities.CachingOptimizer( MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()),