Skip to content

Commit

Permalink
Improve tests and error values of MOI.RawOptimizerAttribute
Browse files Browse the repository at this point in the history
  • Loading branch information
odow committed Nov 15, 2023
1 parent 8542949 commit 7ed46b2
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 19 deletions.
49 changes: 30 additions & 19 deletions src/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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(
Expand Down
14 changes: 14 additions & 0 deletions test/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit 7ed46b2

Please sign in to comment.