Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

set_parameter -> set_optimizer_attribute #2150

Merged
merged 6 commits into from
Feb 4, 2020
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/src/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,10 @@ Most packages follow the `ModuleName.Optimizer` naming convention, but
exceptions may exist. See the corresponding Julia package README for more
details on how to use the solver.

Use [`set_parameters`](@ref) to set solver-specific options. Continuing the
Use [`set_optimizer_attributes`](@ref) to set solver-specific options. Continuing the
example from above,
```julia
set_parameters(model, "Presolve" => 0, "Heuristics" => 0.01)
set_optimizer_attributes(model, "Presolve" => 0, "Heuristics" => 0.01)
```
sets Gurobi's
[`Presolve`](https://www.gurobi.com/documentation/8.1/refman/presolve.html#parameter:Presolve)
Expand Down
4 changes: 2 additions & 2 deletions docs/src/solvers.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,8 @@ solver_name

bridge_constraints

set_parameter
set_parameters
set_optimizer_attribute
set_optimizer_attributes
set_silent
unset_silent
set_time_limit_sec
Expand Down
172 changes: 118 additions & 54 deletions src/JuMP.jl
Original file line number Diff line number Diff line change
Expand Up @@ -54,56 +54,38 @@ const _MOIVAR = MOI.VariableIndex
const _MOICON{F,S} = MOI.ConstraintIndex{F,S}

"""
optimizer_with_attributes(optimizer_constructor, params::Pair...)
optimizer_with_attributes(optimizer_constructor, attrs::Pair...)

Groups an optimizer constructor with the list of parameters `params`. Note that
Groups an optimizer constructor with the list of attributes `attrs`. Note that
it is equivalent to `MOI.OptimizerWithAttributes`.

## Examples

The call `optimizer_with_attributes(Gurobi.Optimizer, "Presolve" => 0, "OutputFlag" => 0)`
groups a Gurobi optimizer with the parameters `Presolve` with value `0` and
`OutputFlag` with value `0`. When provided to the `Model` constructor or to
[`set_optimizer`](@ref), it creates a Gurobi optimizer and then set the
`Presolve` parameter to value `0` and the `OutputFlag` parameter to value `0`:
```julia
julia> model = Model(optimizer_with_attributes(Gurobi.Optimizer, "Presolve" => 0, "OutputFlag" => 0));
When provided to the `Model` constructor or to [`set_optimizer`](@ref), it
creates an optimizer by calling `optimizer_constructor()`, and then sets the
attributes using [`set_optimizer_attribute`](@ref).

julia> MOI.get(model, MOI.RawParameter("Presolve"))
0
## Example

julia> MOI.get(model, MOI.RawParameter("OutputFlag"))
0
```
Alternatively, the parameter can be provided separately with either
[`set_parameter`](@ref):
```julia
julia> model = Model(Gurobi.Optimizer);

julia> set_parameter(model, "Presolve", 0)
0

julia> MOI.get(model, MOI.RawParameter("Presolve"))
0

julia> set_parameter(model, "OutputFlag", 0)
0

julia> MOI.get(model, MOI.RawParameter("OutputFlag"))
0
```
or [`set_parameters`](@ref):
model = Model(
optimizer_with_attributes(
Gurobi.Optimizer, "Presolve" => 0, "OutputFlag" => 1
)
)
````
is equivalent to:
```julia
julia> model = Model(Gurobi.Optimizer);
model = Model(Gurobi.Optimizer)
set_optimizer_attribute(model, "Presolve", 0)
set_optimizer_attribute(model, "OutputFlag", 1)
````

julia> set_parameters(model, "Presolve" => 0, "OutputFlag" => 0)
## Note

julia> MOI.get(model, MOI.RawParameter("Presolve"))
0
The string names of the attributes are specific to each solver. One should
consult the solver's documentation to find the attributes of interest.

julia> MOI.get(model, MOI.RawParameter("OutputFlag"))
0
```
See also: [`set_optimizer_attribute`](@ref), [`set_optimizer_attributes`](@ref),
[`get_optimizer_attribute`](@ref).
"""
function optimizer_with_attributes(optimizer_constructor, args::Pair...)
return MOI.OptimizerWithAttributes(optimizer_constructor, args...)
Expand Down Expand Up @@ -491,36 +473,118 @@ function solve_time(model::Model)
end

"""
set_parameter(model::Model, name, value)
set_optimizer_attribute(model::Model, name::String, value)

Sets solver-specific attribute identified by `name` to `value`.

Note that this is equivalent to
`set_optimizer_attribute(model, MOI.RawParameter(name), value)`.

## Example

Sets solver-specific parameter identified by `name` to `value`.
```julia
set_optimizer_attribute(model, "SolverSpecificAttributeName", true)
```

See also: [`set_optimizer_attributes`](@ref), [`get_optimizer_attribute`](@ref).
"""
function set_parameter(model::Model, name, value)
return MOI.set(model, MOI.RawParameter(name), value)
function set_optimizer_attribute(model::Model, name::String, value)
return set_optimizer_attribute(model, MOI.RawParameter(name), value)
end

"""
set_parameters(model::Model, pairs::Pair...)
set_optimizer_attribute(
model::Model, attr::MOI.AbstractOptimizerAttribute, value
)

Given a list of `parameter_name => value` pairs, calls
`set_parameter(model, parameter_name, value)` for each pair. See
[`set_parameter`](@ref).
Set the solver-specific attribute `attr` in `model` to `value`.

## Example

```julia
set_optimizer_attribute(model, MOI.Silent(), true)
```

See also: [`set_optimizer_attributes`](@ref), [`get_optimizer_attribute`](@ref).
"""
function set_optimizer_attribute(
model::Model, attr::MOI.AbstractOptimizerAttribute, value
)
return MOI.set(model, attr, value)
end

@deprecate set_parameter set_optimizer_attribute

"""
set_optimizer_attributes(model::Model, pairs::Pair...)

Given a list of `attribute => value` pairs, calls
`set_optimizer_attribute(model, attribute, value)` for each pair.

## Example

```julia
model = Model(Ipopt.Optimizer)
set_parameters(model, "tol" => 1e-4, "max_iter" => 100)
# The above call is equivalent to:
set_parameter(model, "tol", 1e-4)
set_parameter(model, "max_iter", 100)
set_optimizer_attributes(model, "tol" => 1e-4, "max_iter" => 100)
```
is equivalent to:
```julia
model = Model(Ipopt.Optimizer)
set_optimizer_attribute(model, "tol", 1e-4)
set_optimizer_attribute(model, "max_iter", 100)
```

See also: [`set_optimizer_attribute`](@ref), [`get_optimizer_attribute`](@ref).
"""
function set_parameters(model::Model, pairs::Pair...)
function set_optimizer_attributes(model::Model, pairs::Pair...)
for (name, value) in pairs
set_parameter(model, name, value)
set_optimizer_attribute(model, name, value)
end
end

@deprecate set_parameters set_optimizer_attributes

"""
get_optimizer_attribute(model, name::String)

Return the value associated with the solver-specific attribute named `name`.

Note that this is equivalent to
`get_optimizer_attribute(model, MOI.RawParameter(name))`.

## Example

```julia
get_optimizer_attribute(model, "SolverSpecificAttributeName")
````

See also: [`set_optimizer_attribute`](@ref), [`set_optimizer_attributes`](@ref).
"""
function get_optimizer_attribute(model::Model, name::String)
return get_optimizer_attribute(model, MOI.RawParameter(name))
end

"""
get_optimizer_attribute(
model::Model, attr::MOI.AbstractOptimizerAttribute
)

Return the value of the solver-specific attribute `attr` in `model`.

## Example

```julia
get_optimizer_attribute(model, MOI.Silent())
````

See also: [`set_optimizer_attribute`](@ref), [`set_optimizer_attributes`](@ref).
"""
function get_optimizer_attribute(
model::Model, attr::MOI.AbstractOptimizerAttribute
)
return MOI.get(model, attr)
end

"""
set_silent(model::Model)

Expand Down
2 changes: 1 addition & 1 deletion src/optimizer_interface.jl
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ optimizer are automatically bridged to equivalent supported constraints when
an appropriate transformation is defined in the `MathOptInterface.Bridges`
module or is defined in another module and is explicitly added.

See [`set_parameters`](@ref) and [`set_parameter`](@ref) for setting
See [`set_optimizer_attributes`](@ref) and [`set_optimizer_attribute`](@ref) for setting
solver-specific parameters of the optimizer.

## Examples
Expand Down
15 changes: 11 additions & 4 deletions test/model.jl
Original file line number Diff line number Diff line change
Expand Up @@ -346,22 +346,29 @@ function test_model()
@test !MOI.get(model, MOI.Silent())
end

@testset "set_parameter" begin
@testset "set_optimizer_attribute" begin
mock = MOIU.UniversalFallback(MOIU.Model{Float64}())
model = Model(() -> MOIU.MockOptimizer(mock))
@test JuMP.set_parameter(model, "aaa", "bbb") == "bbb"
@test JuMP.set_optimizer_attribute(model, "aaa", "bbb") == "bbb"
@test MOI.get(backend(model), MOI.RawParameter("aaa")) == "bbb"
@test MOI.get(model, MOI.RawParameter("aaa")) == "bbb"
end

@testset "set_parameters" begin
@testset "set_optimizer_attributes" begin
mock = MOIU.UniversalFallback(MOIU.Model{Float64}())
model = Model(() -> MOIU.MockOptimizer(mock))
JuMP.set_parameters(model, "aaa" => "bbb", "abc" => 10)
JuMP.set_optimizer_attributes(model, "aaa" => "bbb", "abc" => 10)
@test MOI.get(model, MOI.RawParameter("aaa")) == "bbb"
@test MOI.get(model, MOI.RawParameter("abc")) == 10
end

@testset "get_optimizer_attribute" begin
mock = MOIU.UniversalFallback(MOIU.Model{Float64}())
model = Model(() -> MOIU.MockOptimizer(mock))
@test JuMP.set_optimizer_attribute(model, "aaa", "bbb") == "bbb"
@test JuMP.get_optimizer_attribute(model, "aaa") == "bbb"
end

@testset "set and retrieve time limit" begin
mock = MOIU.UniversalFallback(MOIU.Model{Float64}())
model = Model(() -> MOIU.MockOptimizer(mock))
Expand Down