Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions docs/src/reference/models.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ AbstractOptimizer
OptimizerWithAttributes
optimize!
instantiate
default_cache
```

## Optimizer attributes
Expand Down
1 change: 1 addition & 0 deletions src/Utilities/cachingoptimizer.jl
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ errors can be thrown.
"""
function attach_optimizer(model::CachingOptimizer)
@assert model.state == EMPTY_OPTIMIZER
final_touch(model, nothing)
indexmap = MOI.copy_to(model.optimizer, model.model_cache)::IndexMap
model.state = ATTACHED_OPTIMIZER
model.model_to_optimizer_map = indexmap
Expand Down
19 changes: 16 additions & 3 deletions src/instantiate.jl
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,22 @@ function instantiate(
return optimizer
end
if !supports_incremental_interface(optimizer)
universal_fallback =
Utilities.UniversalFallback(Utilities.Model{with_bridge_type}())
optimizer = Utilities.CachingOptimizer(universal_fallback, optimizer)
cache = default_cache(optimizer, with_bridge_type)
optimizer = Utilities.CachingOptimizer(cache, optimizer)
end
return Bridges.full_bridge_optimizer(optimizer, with_bridge_type)
end

"""
default_cache(optimizer::ModelLike, ::Type{T}) where {T}

Return a new instance of the default model type to be used as cache for
`optimizer` in a [`Utilities.CachingOptimizer`](@ref) for holding constraints
of coefficient type `T`. By default, this returns
`Utilities.UniversalFallback(Utilities.Model{T}())`. If copying from a instance
of a given model type is faster for `optimizer` then a new method returning
an instance of this model type should be defined.
"""
function default_cache(::ModelLike, ::Type{T}) where {T}
return Utilities.UniversalFallback(Utilities.Model{T}())
end
9 changes: 4 additions & 5 deletions test/instantiate.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ const MOI = MathOptInterface

struct DummyOptimizer <: MOI.AbstractOptimizer end
MOI.is_empty(::DummyOptimizer) = true
function MOI.default_cache(::DummyOptimizer, ::Type{T}) where {T}
return MOI.Utilities.Model{T}()
end

function _test_instantiate(T)
function f()
Expand Down Expand Up @@ -37,12 +40,8 @@ function _test_instantiate(T)
@test optimizer isa DummyOptimizer
optimizer = MOI.instantiate(optimizer_constructor, with_bridge_type = T)
@test optimizer isa MOI.Bridges.LazyBridgeOptimizer{
MOI.Utilities.CachingOptimizer{
DummyOptimizer,
MOI.Utilities.UniversalFallback{MOI.Utilities.Model{T}},
},
MOI.Utilities.CachingOptimizer{DummyOptimizer,MOI.Utilities.Model{T}},
}

err = ErrorException(
"The provided `optimizer_constructor` returned a non-empty optimizer.",
)
Expand Down