Skip to content

Commit

Permalink
Merge ee18055 into 9645ba0
Browse files Browse the repository at this point in the history
  • Loading branch information
odow committed Feb 4, 2020
2 parents 9645ba0 + ee18055 commit 34456f9
Show file tree
Hide file tree
Showing 5 changed files with 135 additions and 63 deletions.
4 changes: 2 additions & 2 deletions docs/src/installation.md
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
5 changes: 3 additions & 2 deletions docs/src/solvers.md
Expand Up @@ -106,8 +106,9 @@ solver_name
bridge_constraints
set_parameter
set_parameters
get_optimizer_attribute
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
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
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
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

0 comments on commit 34456f9

Please sign in to comment.