Skip to content

Commit 1e30cfe

Browse files
authored
Merge pull request #390 from JuliaOpt/bl/cachingoptOT
Add type parameter for CachingOptimizer
2 parents dc47126 + 3f4db45 commit 1e30cfe

File tree

3 files changed

+17
-8
lines changed

3 files changed

+17
-8
lines changed

perf/cachingoptimizer.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
# See https://github.com/JuliaOpt/MathOptInterface.jl/issues/321 and https://github.com/JuliaOpt/MathOptInterface.jl/pull/323
1+
# See https://github.com/JuliaOpt/MathOptInterface.jl/issues/321,
2+
# https://github.com/JuliaOpt/MathOptInterface.jl/pull/323 and
3+
# https://github.com/JuliaOpt/MathOptInterface.jl/pull/390
24

35
using BenchmarkTools
46
using MathOptInterface
@@ -10,7 +12,7 @@ optimizer = MOIU.MockOptimizer(Model{Float64}())
1012
caching_optimizer = MOIU.CachingOptimizer(Model{Float64}(), optimizer)
1113
MOIU.resetoptimizer!(caching_optimizer) # detach optimizer
1214
v = MOI.addvariables!(caching_optimizer, 2)
13-
cf = MOI.ScalarAffineFunction(v, [0.0, 0.0], 0.0)
15+
cf = MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.([0.0, 0.0], v), 0.0)
1416
c = MOI.addconstraint!(caching_optimizer, cf, MOI.Interval(-Inf, 1.0))
1517
@btime MOI.modifyconstraint!($caching_optimizer, $c, $(MOI.Interval(0.0, 2.0)))
1618
MOIU.attachoptimizer!(caching_optimizer)

src/Utilities/cachingoptimizer.jl

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ A `CachingOptimizer` has two modes of operation (`CachingOptimizerMode`):
2222
- `Manual`: The only methods that change the state of the `CachingOptimizer` are [`resetoptimizer!`](@ref), [`dropoptimizer!`](@ref), and [`attachoptimizer!`](@ref). Attempting to perform an operation in the incorrect state results in an error.
2323
- `Automatic`: The `CachingOptimizer` changes its state when necessary. For example, `optimize!` will automatically call `attachoptimizer!` (an optimizer must have been previously set). Attempting to add a constraint or perform a modification not supported by the optimizer results in a drop to `EmptyOptimizer` mode.
2424
"""
25-
mutable struct CachingOptimizer{MT<:MOI.ModelLike} <: MOI.AbstractOptimizer
26-
model_cache::MT
27-
optimizer::Union{Nothing,MOI.AbstractOptimizer}
25+
mutable struct CachingOptimizer{OptimizerType, ModelType<:MOI.ModelLike} <: MOI.AbstractOptimizer
26+
optimizer::Union{Nothing, OptimizerType}
27+
model_cache::ModelType
2828
state::CachingOptimizerState
2929
mode::CachingOptimizerMode
3030
model_to_optimizer_map::IndexMap
@@ -34,19 +34,25 @@ mutable struct CachingOptimizer{MT<:MOI.ModelLike} <: MOI.AbstractOptimizer
3434
# optimizer indices.
3535
end
3636

37-
CachingOptimizer(model_cache::MOI.ModelLike, mode::CachingOptimizerMode) = CachingOptimizer(model_cache, nothing, NoOptimizer, mode, IndexMap(), IndexMap())
37+
function CachingOptimizer(model_cache::MOI.ModelLike, mode::CachingOptimizerMode)
38+
CachingOptimizer{MOI.AbstractOptimizer, typeof(model_cache)}(nothing, model_cache, NoOptimizer, mode, IndexMap(), IndexMap())
39+
end
3840

3941
"""
4042
CachingOptimizer(model_cache::MOI.ModelLike, optimizer::AbstractOptimizer)
4143
4244
Creates an `CachingOptimizer` in `Automatic` mode, with the optimizer `optimizer`.
4345
The model_cache manager returned behaves like an `AbstractOptimizer` as long as no
44-
`CachingOptimizer`-specific functions (e.g. `dropoptimizer!`) are called on it.
46+
`CachingOptimizer`-specific functions (e.g. `resetoptimizer!`) are called on it.
47+
The type of the optimizer returned is `CachingOptimizer{typeof(optimizer),
48+
typeof(model_cache)}` so it does not support the function
49+
`resetoptimizer!(::CachingOptimizer, new_optimizer)` if the type of
50+
`new_optimizer` is different from the type of `optimizer`.
4551
"""
4652
function CachingOptimizer(model_cache::MOI.ModelLike, optimizer::MOI.AbstractOptimizer)
4753
@assert MOI.isempty(model_cache)
4854
@assert MOI.isempty(optimizer)
49-
CachingOptimizer(model_cache, optimizer, AttachedOptimizer, Automatic, IndexMap(), IndexMap())
55+
CachingOptimizer{typeof(optimizer), typeof(model_cache)}(optimizer, model_cache, AttachedOptimizer, Automatic, IndexMap(), IndexMap())
5056
end
5157

5258
## Methods for managing the state of CachingOptimizer.

test/cachingoptimizer.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ end
167167
s = MOIU.MockOptimizer(ModelForMock{Float64}())
168168
model = ModelForCachingOptimizer{Float64}()
169169
m = MOIU.CachingOptimizer(model, s)
170+
@test m isa MOIU.CachingOptimizer{typeof(s), typeof(model)}
170171
@test MOI.isempty(m)
171172
@test MOIU.state(m) == MOIU.AttachedOptimizer
172173
@test MOIU.mode(m) == MOIU.Automatic

0 commit comments

Comments
 (0)