Skip to content

Commit

Permalink
Add proper error for badly typed option (#449)
Browse files Browse the repository at this point in the history
  • Loading branch information
odow authored Nov 25, 2024
1 parent d716cc2 commit 52a3b19
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
9 changes: 7 additions & 2 deletions src/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1074,9 +1074,14 @@ function MOI.optimize!(model::Optimizer)
AddIpoptStrOption(inner, name, value)
elseif value isa Integer
AddIpoptIntOption(inner, name, value)
else
@assert value isa Float64
elseif value isa Float64
AddIpoptNumOption(inner, name, value)
else
error(
"Unable to add option `\"$name\"` with the value " *
"`$value::$(typeof(value))`. The value must be a `::String`, " *
"`::Integer`, or `::Float64`.",
)
end
end
# Initialize the starting point, projecting variables from 0 onto their
Expand Down
20 changes: 20 additions & 0 deletions test/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,7 @@ function test_callback()
f = MOI.ScalarAffineFunction([MOI.ScalarAffineTerm(1.0, x)], 0.5)
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
x_vals = Float64[]
mu_vals = Float64[]
function my_callback(
alg_mod::Cint,
iter_count::Cint,
Expand All @@ -263,15 +264,18 @@ function test_callback()
alpha_pr::Float64,
ls_trials::Cint,
)
push!(mu_vals, mu)
push!(x_vals, MOI.get(model, MOI.CallbackVariablePrimal(model), x))
@test isapprox(obj_value, 1.0 * x_vals[end] + 0.5, atol = 1e-1)
return iter_count < 1
end
MOI.set(model, Ipopt.CallbackFunction(), my_callback)
MOI.set(model, MOI.RawOptimizerAttribute("mu_init"), 0.5)
MOI.optimize!(model)
@test MOI.get(model, MOI.TerminationStatus()) == MOI.INTERRUPTED
@test length(x_vals) == 2
@test x_vals[1] !== x_vals[2]
@test first(mu_vals) == 0.5
return
end

Expand Down Expand Up @@ -791,6 +795,22 @@ function test_function_type_to_func()
return
end

function test_error_adding_option()
model = Ipopt.Optimizer()
x = MOI.add_variable(model)
name, value = "print_level", :zero
MOI.set(model, MOI.RawOptimizerAttribute(name), value)
@test_throws(
ErrorException(
"Unable to add option `\"$name\"` with the value " *
"`$value::$(typeof(value))`. The value must be a `::String`, " *
"`::Integer`, or `::Float64`.",
),
MOI.optimize!(model),
)
return
end

end # module TestMOIWrapper

TestMOIWrapper.runtests()

0 comments on commit 52a3b19

Please sign in to comment.