diff --git a/ext/KNITROMathOptInterfaceExt.jl b/ext/KNITROMathOptInterfaceExt.jl index 3fef5e0..ce933e4 100644 --- a/ext/KNITROMathOptInterfaceExt.jl +++ b/ext/KNITROMathOptInterfaceExt.jl @@ -185,15 +185,24 @@ function MOI.empty!(model::Optimizer) return end +function _num_cons(model) + p = Ref{Cint}(0) + KNITRO.KN_get_number_cons(model, p) + return p[] +end + function MOI.is_empty(model::Optimizer) return isempty(model.variable_info) && + model.number_solved == 0 && + !model.nlp_loaded && model.nlp_data === nothing && MOI.is_empty(model.nlp_model) && + isempty(model.nlp_index_cons) && model.sense == MOI.FEASIBILITY_SENSE && - model.number_solved == 0 && model.objective === nothing && + isempty(model.constraint_mapping) && isempty(model.vector_nonlinear_oracle_constraints) && - !model.nlp_loaded + _num_cons(model) == 0 end function _throw_if_solved(model::Optimizer, attr::MOI.AbstractModelAttribute) diff --git a/test/MOI_wrapper.jl b/test/MOI_wrapper.jl index 9e14c3b..2886d38 100644 --- a/test/MOI_wrapper.jl +++ b/test/MOI_wrapper.jl @@ -405,6 +405,22 @@ function test_vector_nonlinear_oracle() return end +function test_issue_370() + model = KNITRO.Optimizer() + MOI.empty!(model) + f = MOI.VectorAffineFunction(MOI.VectorAffineTerm{Float64}[], [1.0, 2.0]) + try + MOI.add_constraint(model, f, MOI.SecondOrderCone(2)) + catch + end + @test !MOI.is_empty(model) + MOI.empty!(model) + @test MOI.is_empty(model) + x = MOI.add_variable(model) + @test MOI.get(model, MOI.NumberOfVariables()) == 1 + return +end + end TestMOIWrapper.runtests()