Skip to content

Commit 9e79136

Browse files
authored
Parametrize GenericModel with objective/variable sub-model (#1521)
1 parent b391731 commit 9e79136

File tree

7 files changed

+107
-69
lines changed

7 files changed

+107
-69
lines changed

docs/src/submodules/Bridges/overview.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,14 @@ in a [`Bridges.full_bridge_optimizer`](@ref).
104104

105105
```jldoctest
106106
julia> inner_optimizer = MOI.Utilities.Model{Float64}()
107-
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
107+
MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
108108
109109
julia> optimizer = MOI.Bridges.full_bridge_optimizer(inner_optimizer, Float64)
110-
MOIB.LazyBridgeOptimizer{MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
110+
MOIB.LazyBridgeOptimizer{MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}}
111111
with 0 variable bridges
112112
with 0 constraint bridges
113113
with 0 objective bridges
114-
with inner model MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
114+
with inner model MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
115115
```
116116

117117
That's all you have to do! Use `optimizer` as normal, and bridging will happen
@@ -136,12 +136,12 @@ However, this will force the constraint to be bridged, even if the
136136

137137
```jldoctest
138138
julia> inner_optimizer = MOI.Utilities.Model{Float64}()
139-
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
139+
MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
140140
141141
julia> optimizer = MOI.Bridges.Constraint.SplitInterval{Float64}(inner_optimizer)
142-
MOIB.Constraint.SingleBridgeOptimizer{MOIB.Constraint.SplitIntervalBridge{Float64,F,S,LS,US} where US<:MOI.AbstractSet where LS<:MOI.AbstractSet where S<:MOI.AbstractSet where F<:MOI.AbstractFunction,MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
142+
MOIB.Constraint.SingleBridgeOptimizer{MOIB.Constraint.SplitIntervalBridge{Float64,F,S,LS,US} where US<:MOI.AbstractSet where LS<:MOI.AbstractSet where S<:MOI.AbstractSet where F<:MOI.AbstractFunction,MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}}
143143
with 0 constraint bridges
144-
with inner model MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
144+
with inner model MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
145145
146146
julia> x = MOI.add_variable(optimizer)
147147
MOI.VariableIndex(1)
@@ -168,14 +168,14 @@ manually construct a [`Bridges.LazyBridgeOptimizer`](@ref).
168168
First, wrap an inner optimizer:
169169
```jldoctest lazy_bridge_optimizer
170170
julia> inner_optimizer = MOI.Utilities.Model{Float64}()
171-
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
171+
MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
172172
173173
julia> optimizer = MOI.Bridges.LazyBridgeOptimizer(inner_optimizer)
174-
MOIB.LazyBridgeOptimizer{MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
174+
MOIB.LazyBridgeOptimizer{MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}}
175175
with 0 variable bridges
176176
with 0 constraint bridges
177177
with 0 objective bridges
178-
with inner model MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
178+
with inner model MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
179179
```
180180

181181
Then use [`Bridges.add_bridge`](@ref) to add individual bridges:

docs/src/submodules/FileFormats/overview.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ To write a model `src` to a [MathOptFormat file](https://jump.dev/MathOptFormat/
6565
use:
6666
```jldoctest fileformats
6767
julia> src = MOI.Utilities.Model{Float64}()
68-
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
68+
MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
6969
7070
julia> MOI.add_variable(src)
7171
MathOptInterface.VariableIndex(1)
@@ -122,7 +122,7 @@ guess the format from the file extension. For example:
122122

123123
```jldoctest fileformats
124124
julia> src = MOI.Utilities.Model{Float64}()
125-
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
125+
MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
126126
127127
julia> dest = MOI.FileFormats.Model(filename = "file.cbf.gz")
128128
A Conic Benchmark Format (CBF) model
@@ -136,7 +136,7 @@ julia> src_2 = MOI.FileFormats.Model(filename = "file.cbf.gz")
136136
A Conic Benchmark Format (CBF) model
137137
138138
julia> src = MOI.Utilities.Model{Float64}()
139-
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
139+
MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
140140
141141
julia> dest = MOI.FileFormats.Model(filename = "file.cbf.gz")
142142
A Conic Benchmark Format (CBF) model
@@ -180,7 +180,7 @@ In addition to [`write_to_file`](@ref) and [`read_from_file`](@ref), you can
180180
read and write directly from `IO` streams using `Base.write` and `Base.read!`:
181181
```jldoctest
182182
julia> src = MOI.Utilities.Model{Float64}()
183-
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
183+
MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
184184
185185
julia> dest = MOI.FileFormats.Model(format = MOI.FileFormats.FORMAT_MPS)
186186
A Mathematical Programming System (MPS) model

docs/src/submodules/Utilities/overview.md

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ given the extensibility of MOI, this might not cover all use cases.
2121
Create a model as follows:
2222
```jldoctest
2323
julia> model = MOI.Utilities.Model{Float64}()
24-
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
24+
MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
2525
```
2626

2727
## Utilities.UniversalFallback
@@ -36,8 +36,8 @@ like [`VariablePrimalStart`](@ref), so JuMP uses a combination of Universal
3636
fallback and [`Utilities.Model`](@ref) as a generic problem cache:
3737
```jldoctest
3838
julia> model = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
39-
MOIU.UniversalFallback{MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
40-
fallback for MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
39+
MOIU.UniversalFallback{MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}}
40+
fallback for MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
4141
```
4242

4343
!!! warning
@@ -83,10 +83,10 @@ julia> MOI.Utilities.@model(
8383
(MOI.VectorAffineFunction,), # Typed vector functions
8484
true, # <:MOI.AbstractOptimizer?
8585
)
86-
MathOptInterface.Utilities.GenericOptimizer{T,MyNewModelFunctionConstraints{T}} where T
86+
MathOptInterface.Utilities.GenericOptimizer{T,MathOptInterface.Utilities.ObjectiveFunctionContainer{T},MathOptInterface.Utilities.SingleVariableConstraints{T},MyNewModelFunctionConstraints{T}} where T
8787
8888
julia> model = MyNewModel{Float64}()
89-
MOIU.GenericOptimizer{Float64,MyNewModelFunctionConstraints{Float64}}
89+
MOIU.GenericOptimizer{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MyNewModelFunctionConstraints{Float64}}
9090
```
9191

9292
!!! warning
@@ -112,7 +112,7 @@ julia> MOI.Utilities.@model(
112112
(MOI.VectorAffineFunction,), # Typed vector functions
113113
true, # is_optimizer
114114
)
115-
MathOptInterface.Utilities.GenericOptimizer{T,MathOptInterface.Utilities.VectorOfConstraints{MathOptInterface.VectorAffineFunction{T},MathOptInterface.Complements}} where T
115+
MathOptInterface.Utilities.GenericOptimizer{T,MathOptInterface.Utilities.ObjectiveFunctionContainer{T},MathOptInterface.Utilities.SingleVariableConstraints{T},MathOptInterface.Utilities.VectorOfConstraints{MathOptInterface.VectorAffineFunction{T},MathOptInterface.Complements}} where T
116116
```
117117
However, `PathOptimizer` does not support some `SingleVariable`-in-Set
118118
constraints, so we must explicitly define:
@@ -152,11 +152,11 @@ julia> model = MOI.Utilities.CachingOptimizer(
152152
MOI.Utilities.Model{Float64}(),
153153
PathOptimizer{Float64}(),
154154
)
155-
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
155+
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}}
156156
in state EMPTY_OPTIMIZER
157157
in mode AUTOMATIC
158-
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
159-
with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
158+
with model cache MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
159+
with optimizer MOIU.GenericOptimizer{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
160160
```
161161

162162
A [`Utilities.CachingOptimizer`](@ref) may be in one of three possible states:
@@ -176,11 +176,11 @@ Use [`Utilities.attach_optimizer`](@ref) to go from `EMPTY_OPTIMIZER` to
176176
julia> MOI.Utilities.attach_optimizer(model)
177177
178178
julia> model
179-
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
179+
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}}
180180
in state ATTACHED_OPTIMIZER
181181
in mode AUTOMATIC
182-
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
183-
with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
182+
with model cache MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
183+
with optimizer MOIU.GenericOptimizer{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
184184
```
185185

186186
!!! info
@@ -192,11 +192,11 @@ Use [`Utilities.reset_optimizer`](@ref) to go from `ATTACHED_OPTIMIZER` to
192192
julia> MOI.Utilities.reset_optimizer(model)
193193
194194
julia> model
195-
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
195+
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}}
196196
in state EMPTY_OPTIMIZER
197197
in mode AUTOMATIC
198-
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
199-
with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
198+
with model cache MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
199+
with optimizer MOIU.GenericOptimizer{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
200200
```
201201

202202
!!! info
@@ -209,10 +209,10 @@ Use [`Utilities.drop_optimizer`](@ref) to go from any state to `NO_OPTIMIZER`:
209209
julia> MOI.Utilities.drop_optimizer(model)
210210
211211
julia> model
212-
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
212+
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}}
213213
in state NO_OPTIMIZER
214214
in mode AUTOMATIC
215-
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
215+
with model cache MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
216216
with optimizer nothing
217217
```
218218

@@ -222,11 +222,11 @@ Pass an empty optimizer to [`Utilities.reset_optimizer`](@ref) to go from
222222
julia> MOI.Utilities.reset_optimizer(model, PathOptimizer{Float64}())
223223
224224
julia> model
225-
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
225+
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}}
226226
in state EMPTY_OPTIMIZER
227227
in mode AUTOMATIC
228-
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
229-
with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
228+
with model cache MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
229+
with optimizer MOIU.GenericOptimizer{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
230230
```
231231

232232
Deciding when to attach and reset the optimizer is tedious, and you will often
@@ -256,20 +256,20 @@ julia> model = MOI.Utilities.CachingOptimizer(
256256
MOI.Utilities.Model{Float64}(),
257257
MOI.Utilities.MANUAL,
258258
)
259-
MOIU.CachingOptimizer{MOI.AbstractOptimizer,MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
259+
MOIU.CachingOptimizer{MOI.AbstractOptimizer,MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}}
260260
in state NO_OPTIMIZER
261261
in mode MANUAL
262-
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
262+
with model cache MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
263263
with optimizer nothing
264264
265265
julia> MOI.Utilities.reset_optimizer(model, PathOptimizer{Float64}())
266266
267267
julia> model
268-
MOIU.CachingOptimizer{MOI.AbstractOptimizer,MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
268+
MOIU.CachingOptimizer{MOI.AbstractOptimizer,MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}}
269269
in state EMPTY_OPTIMIZER
270270
in mode MANUAL
271-
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
272-
with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
271+
with model cache MOIU.GenericModel{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.ModelFunctionConstraints{Float64}}
272+
with optimizer MOIU.GenericOptimizer{Float64,MOIU.ObjectiveFunctionContainer{Float64},MOIU.SingleVariableConstraints{Float64},MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
273273
```
274274

275275
## Printing

0 commit comments

Comments
 (0)