-
Notifications
You must be signed in to change notification settings - Fork 99
Expand file tree
/
Copy pathsingle_bridge_optimizer.jl
More file actions
110 lines (88 loc) · 3.08 KB
/
single_bridge_optimizer.jl
File metadata and controls
110 lines (88 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# Copyright (c) 2017: Miles Lubin and contributors
# Copyright (c) 2017: Google Inc.
#
# Use of this source code is governed by an MIT-style license that can be found
# in the LICENSE.md file or at https://opensource.org/licenses/MIT.
"""
SingleBridgeOptimizer{BT<:AbstractBridge}(model::MOI.ModelLike)
Return `AbstractBridgeOptimizer` that always bridges any objective function
supported by the bridge `BT`.
This is in contrast with the [`MOI.Bridges.LazyBridgeOptimizer`](@ref),
which only bridges the objective function if it is supported by the bridge `BT`
and unsupported by `model`.
## Example
```jldoctest obj_singlebridgeoptimizer
julia> struct MyNewBridge{T} <: MOI.Bridges.Objective.AbstractBridge end
julia> bridge = MOI.Bridges.Objective.SingleBridgeOptimizer{MyNewBridge{Float64}}(
MOI.Utilities.Model{Float64}(),
);
```
## Implementation notes
All bridges should simplify the creation of `SingleBridgeOptimizer`s by defining
a constant that wraps the bridge in a `SingleBridgeOptimizer`.
```jldoctest obj_singlebridgeoptimizer
julia> const MyNewBridgeModel{T,OT<:MOI.ModelLike} =
MOI.Bridges.Objective.SingleBridgeOptimizer{MyNewBridge{T},OT};
```
This enables users to create bridged models as follows:
```jldoctest obj_singlebridgeoptimizer
julia> MyNewBridgeModel{Float64}(MOI.Utilities.Model{Float64}());
```
"""
mutable struct SingleBridgeOptimizer{BT<:AbstractBridge,OT<:MOI.ModelLike} <:
MOI.Bridges.AbstractBridgeOptimizer
model::OT
map::Map # `MOI.ObjectiveFunction` -> objective bridge
function SingleBridgeOptimizer{BT}(model::OT) where {BT,OT<:MOI.ModelLike}
return new{BT,OT}(model, Map())
end
end
bridges(::MOI.Bridges.AbstractBridgeOptimizer) = EmptyMap()
bridges(bridge::SingleBridgeOptimizer) = bridge.map
MOI.Bridges.supports_constraint_bridges(::SingleBridgeOptimizer) = false
function MOI.Bridges.is_bridged(
::SingleBridgeOptimizer,
::Type{<:MOI.AbstractSet},
)
return false
end
function MOI.Bridges.is_bridged(
::SingleBridgeOptimizer,
::Type{<:MOI.AbstractFunction},
::Type{<:MOI.AbstractSet},
)
return false
end
MOI.Bridges.is_bridged(::SingleBridgeOptimizer, ::MOI.VariableIndex) = false
# We need the next two methods to remove method ambiguities.
function MOI.Bridges.is_bridged(
::SingleBridgeOptimizer,
::MOI.ConstraintIndex{MOI.VariableIndex},
)
return false
end
function MOI.Bridges.is_bridged(
::SingleBridgeOptimizer,
::MOI.ConstraintIndex{MOI.VectorOfVariables},
)
return false
end
function MOI.Bridges.supports_bridging_objective_function(
::SingleBridgeOptimizer{BT},
F::Type{<:MOI.AbstractFunction},
) where {BT}
return supports_objective_function(BT, F)
end
function MOI.Bridges.is_bridged(
bridge::SingleBridgeOptimizer,
F::Type{<:MOI.AbstractFunction},
)
return MOI.Bridges.supports_bridging_objective_function(bridge, F)
end
function MOI.Bridges.bridge_type(
::SingleBridgeOptimizer{BT},
::Type{<:MOI.AbstractFunction},
) where {BT}
return BT
end
MOI.Bridges.recursive_model(bridge::SingleBridgeOptimizer) = bridge.model