From 7ed46b2c0fbf9c47d22ed734373ab88c21faae0c Mon Sep 17 00:00:00 2001 From: odow Date: Wed, 15 Nov 2023 13:43:44 +1300 Subject: [PATCH] Improve tests and error values of MOI.RawOptimizerAttribute --- src/MOI_wrapper.jl | 49 +++++++++++++++++++++++++++------------------ test/MOI_wrapper.jl | 14 +++++++++++++ 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index 2d116bb..2228543 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -196,14 +196,18 @@ function MOI.is_empty(model::Optimizer) !model.nlp_loaded end -number_variables(model::Optimizer) = length(model.variable_info) - number_constraints(model::Optimizer) = KN_get_number_cons(model.inner) +# MOI.SolverName + MOI.get(model::Optimizer, ::MOI.SolverName) = "Knitro" +# MOI.SolverVersion + MOI.get(::Optimizer, ::MOI.SolverVersion) = string(KNITRO_VERSION) +# MOI.Silent + MOI.supports(model::Optimizer, ::MOI.Silent) = true function MOI.get(model::Optimizer, ::MOI.Silent) @@ -221,6 +225,8 @@ function MOI.set(model::Optimizer, ::MOI.Silent, value) return end +# MOI.TimeLimitSec + MOI.supports(model::Optimizer, ::MOI.TimeLimitSec) = true function MOI.get(model::Optimizer, ::MOI.TimeLimitSec) @@ -234,36 +240,41 @@ function MOI.set(model::Optimizer, ::MOI.TimeLimitSec, value) return end -function MOI.supports(model::Optimizer, param::MOI.RawOptimizerAttribute) - if param.name == "free" +# MOI.RawOptimizerAttribute + +function MOI.supports(model::Optimizer, attr::MOI.RawOptimizerAttribute) + if attr.name == "free" return true end - return KN_get_param_id(model.inner, param.name) > 0 + return KN_get_param_id(model.inner, attr.name) > 0 end -function MOI.set(model::Optimizer, p::MOI.RawOptimizerAttribute, value) - if !MOI.supports(model, p) - throw(MOI.UnsupportedAttribute) +function MOI.get(model::Optimizer, attr::MOI.RawOptimizerAttribute) + if !MOI.supports(model, attr) + throw(MOI.UnsupportedAttribute(attr)) + elseif !haskey(model.options, attr.name) + throw(MOI.GetAttributeNotAllowed(attr)) end - model.options[p.name] = value - if p.name == "option_file" + return model.options[attr.name] +end + +function MOI.set(model::Optimizer, attr::MOI.RawOptimizerAttribute, value) + if attr.name == "option_file" KN_load_param_file(model.inner, value) - elseif p.name == "tuner_file" + elseif attr.name == "tuner_file" KN_load_tuner_file(model.inner, value) - elseif p.name == "free" + elseif attr.name == "free" free(model) + elseif !MOI.supports(model, attr) + throw(MOI.UnsupportedAttribute(attr)) else - KN_set_param(model.inner, p.name, value) + KN_set_param(model.inner, attr.name, value) end + model.options[attr.name] = value return end -function MOI.get(model::Optimizer, p::MOI.RawOptimizerAttribute) - if haskey(model.options, p.name) - return model.options[p.name] - end - return error("RawOptimizerAttribute with name $(p.name) is not set.") -end +# MOI.optimize! function _load_complementarity_constraint(model::Optimizer, cache::ComplementarityCache) return KN_set_compcons( diff --git a/test/MOI_wrapper.jl b/test/MOI_wrapper.jl index 3c7d55d..e079570 100644 --- a/test/MOI_wrapper.jl +++ b/test/MOI_wrapper.jl @@ -88,6 +88,20 @@ function test_zero_one_with_no_bounds() return end +function test_RawOptimizerAttribute() + model = MOI.instantiate(KNITRO.Optimizer) + attr = MOI.RawOptimizerAttribute("bad_attr") + @test !MOI.supports(model, attr) + @test_throws MOI.UnsupportedAttribute{typeof(attr)} MOI.get(model, attr) + @test_throws MOI.UnsupportedAttribute{typeof(attr)} MOI.set(model, attr, 0) + attr = MOI.RawOptimizerAttribute("MAXTIMECPU") + @test MOI.supports(model, attr) + @test_throws MOI.GetAttributeNotAllowed{typeof(attr)} MOI.get(model, attr) + MOI.set(model, attr, 10.0) + @test MOI.get(model, attr) == 10.0 + return +end + end TestMOIWrapper.runtests()