Skip to content

Commit 70b33f4

Browse files
authored
More flexible Model with StructOfConstraints (jump-dev#1267)
* More flexible Model with StructOfConstraints * Update doctests * Update doctest output * Remove :x
1 parent 0aa09c1 commit 70b33f4

File tree

12 files changed

+558
-405
lines changed

12 files changed

+558
-405
lines changed

docs/src/submodules/Bridges/overview.md

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

9191
```jldoctest
9292
julia> inner_optimizer = MOI.Utilities.Model{Float64}()
93-
MOIU.Model{Float64}
93+
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
9494
9595
julia> optimizer = MOI.Bridges.full_bridge_optimizer(inner_optimizer, Float64)
96-
MOIB.LazyBridgeOptimizer{MOIU.Model{Float64}}
96+
MOIB.LazyBridgeOptimizer{MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
9797
with 0 variable bridges
9898
with 0 constraint bridges
9999
with 0 objective bridges
100-
with inner model MOIU.Model{Float64}
100+
with inner model MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
101101
```
102102

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

123123
```jldoctest
124124
julia> inner_optimizer = MOI.Utilities.Model{Float64}()
125-
MOIU.Model{Float64}
125+
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
126126
127127
julia> optimizer = MOI.Bridges.Constraint.SplitInterval{Float64}(inner_optimizer)
128-
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.Model{Float64}}
128+
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}}}
129129
with 0 constraint bridges
130-
with inner model MOIU.Model{Float64}
130+
with inner model MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
131131
132132
julia> x = MOI.add_variable(optimizer)
133133
MOI.VariableIndex(1)
@@ -154,14 +154,14 @@ manually construct a [`Bridges.LazyBridgeOptimizer`](@ref).
154154
First, wrap an inner optimizer:
155155
```jldoctest lazy_bridge_optimizer
156156
julia> inner_optimizer = MOI.Utilities.Model{Float64}()
157-
MOIU.Model{Float64}
157+
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
158158
159159
julia> optimizer = MOI.Bridges.LazyBridgeOptimizer(inner_optimizer)
160-
MOIB.LazyBridgeOptimizer{MOIU.Model{Float64}}
160+
MOIB.LazyBridgeOptimizer{MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
161161
with 0 variable bridges
162162
with 0 constraint bridges
163163
with 0 objective bridges
164-
with inner model MOIU.Model{Float64}
164+
with inner model MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
165165
```
166166

167167
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
@@ -58,7 +58,7 @@ To write a model `src` to a [MathOptFormat file](https://jump.dev/MathOptFormat/
5858
use:
5959
```jldoctest fileformats
6060
julia> src = MOI.Utilities.Model{Float64}()
61-
MOIU.Model{Float64}
61+
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
6262
6363
julia> MOI.add_variable(src)
6464
MathOptInterface.VariableIndex(1)
@@ -115,7 +115,7 @@ guess the format from the file extension. For example:
115115

116116
```jldoctest fileformats
117117
julia> src = MOI.Utilities.Model{Float64}()
118-
MOIU.Model{Float64}
118+
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
119119
120120
julia> dest = MOI.FileFormats.Model(filename = "file.cbf.gz")
121121
A Conic Benchmark Format (CBF) model
@@ -129,7 +129,7 @@ julia> src_2 = MOI.FileFormats.Model(filename = "file.cbf.gz")
129129
A Conic Benchmark Format (CBF) model
130130
131131
julia> src = MOI.Utilities.Model{Float64}()
132-
MOIU.Model{Float64}
132+
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
133133
134134
julia> dest = MOI.FileFormats.Model(filename = "file.cbf.gz")
135135
A Conic Benchmark Format (CBF) model
@@ -173,7 +173,7 @@ In addition to [`write_to_file`](@ref) and [`read_from_file`](@ref), you can
173173
read and write directly from `IO` streams using `Base.write` and `Base.read!`:
174174
```jldoctest
175175
julia> src = MOI.Utilities.Model{Float64}()
176-
MOIU.Model{Float64}
176+
MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
177177
178178
julia> dest = MOI.FileFormats.Model(format = MOI.FileFormats.FORMAT_MPS)
179179
A Mathematical Programming System (MPS) model

docs/src/submodules/Utilities/overview.md

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

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

4242
!!! warning
@@ -82,9 +82,10 @@ julia> MOI.Utilities.@model(
8282
(MOI.VectorAffineFunction,), # Typed vector functions
8383
true, # <:MOI.AbstractOptimizer?
8484
)
85+
MathOptInterface.Utilities.GenericOptimizer{T,MyNewModelFunctionConstraints{T}} where T
8586
8687
julia> model = MyNewModel{Float64}()
87-
MyNewModel{Float64}
88+
MOIU.GenericOptimizer{Float64,MyNewModelFunctionConstraints{Float64}}
8889
```
8990

9091
!!! warning
@@ -110,6 +111,7 @@ julia> MOI.Utilities.@model(
110111
(MOI.VectorAffineFunction,), # Typed vector functions
111112
true, # is_optimizer
112113
)
114+
MathOptInterface.Utilities.GenericOptimizer{T,MathOptInterface.Utilities.VectorOfConstraints{MathOptInterface.VectorAffineFunction{T},MathOptInterface.Complements}} where T
113115
```
114116
However, `PathOptimizer` does not support some `SingleVariable`-in-Set
115117
constraints, so we must explicitly define:
@@ -149,11 +151,11 @@ julia> model = MOI.Utilities.CachingOptimizer(
149151
MOI.Utilities.Model{Float64}(),
150152
PathOptimizer{Float64}(),
151153
)
152-
MOIU.CachingOptimizer{PathOptimizer{Float64},MOIU.Model{Float64}}
154+
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
153155
in state ATTACHED_OPTIMIZER
154156
in mode AUTOMATIC
155-
with model cache MOIU.Model{Float64}
156-
with optimizer PathOptimizer{Float64}
157+
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
158+
with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
157159
```
158160

159161
A [`Utilities.CachingOptimizer`](@ref) may be in one of three possible states:
@@ -173,11 +175,11 @@ Use [`Utilities.reset_optimizer`](@ref) to go from `ATTACHED_OPTIMIZER` to
173175
julia> MOI.Utilities.reset_optimizer(model)
174176
175177
julia> model
176-
MOIU.CachingOptimizer{PathOptimizer{Float64},MOIU.Model{Float64}}
178+
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
177179
in state EMPTY_OPTIMIZER
178180
in mode AUTOMATIC
179-
with model cache MOIU.Model{Float64}
180-
with optimizer PathOptimizer{Float64}
181+
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
182+
with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
181183
```
182184

183185
Use [`Utilities.attach_optimizer`](@ref) to go from `EMPTY_OPTIMIZER` to
@@ -186,11 +188,11 @@ Use [`Utilities.attach_optimizer`](@ref) to go from `EMPTY_OPTIMIZER` to
186188
julia> MOI.Utilities.attach_optimizer(model)
187189
188190
julia> model
189-
MOIU.CachingOptimizer{PathOptimizer{Float64},MOIU.Model{Float64}}
191+
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
190192
in state ATTACHED_OPTIMIZER
191193
in mode AUTOMATIC
192-
with model cache MOIU.Model{Float64}
193-
with optimizer PathOptimizer{Float64}
194+
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
195+
with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
194196
```
195197
!!! info
196198
You must be in `ATTACHED_OPTIMIZER` to use [`optimize!`](@ref).
@@ -200,10 +202,10 @@ Use [`Utilities.drop_optimizer`](@ref) to go from any state to `NO_OPTIMIZER`:
200202
julia> MOI.Utilities.drop_optimizer(model)
201203
202204
julia> model
203-
MOIU.CachingOptimizer{PathOptimizer{Float64},MOIU.Model{Float64}}
205+
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
204206
in state NO_OPTIMIZER
205207
in mode AUTOMATIC
206-
with model cache MOIU.Model{Float64}
208+
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
207209
with optimizer nothing
208210
```
209211

@@ -213,11 +215,11 @@ Pass an empty optimizer to [`Utilities.reset_optimizer`](@ref) to go from
213215
julia> MOI.Utilities.reset_optimizer(model, PathOptimizer{Float64}())
214216
215217
julia> model
216-
MOIU.CachingOptimizer{PathOptimizer{Float64},MOIU.Model{Float64}}
218+
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}},MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
217219
in state EMPTY_OPTIMIZER
218220
in mode AUTOMATIC
219-
with model cache MOIU.Model{Float64}
220-
with optimizer PathOptimizer{Float64}
221+
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
222+
with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
221223
```
222224

223225
Deciding when to attach and reset the optimizer is tedious, and you will often
@@ -247,20 +249,20 @@ julia> model = MOI.Utilities.CachingOptimizer(
247249
MOI.Utilities.Model{Float64}(),
248250
MOI.Utilities.MANUAL,
249251
)
250-
MOIU.CachingOptimizer{MOI.AbstractOptimizer,MOIU.Model{Float64}}
252+
MOIU.CachingOptimizer{MOI.AbstractOptimizer,MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
251253
in state NO_OPTIMIZER
252254
in mode MANUAL
253-
with model cache MOIU.Model{Float64}
255+
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
254256
with optimizer nothing
255257
256258
julia> MOI.Utilities.reset_optimizer(model, PathOptimizer{Float64}())
257259
258260
julia> model
259-
MOIU.CachingOptimizer{MOI.AbstractOptimizer,MOIU.Model{Float64}}
261+
MOIU.CachingOptimizer{MOI.AbstractOptimizer,MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}}
260262
in state EMPTY_OPTIMIZER
261263
in mode MANUAL
262-
with model cache MOIU.Model{Float64}
263-
with optimizer PathOptimizer{Float64}
264+
with model cache MOIU.GenericModel{Float64,MOIU.ModelFunctionConstraints{Float64}}
265+
with optimizer MOIU.GenericOptimizer{Float64,MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Complements}}
264266
```
265267

266268
## Copy utilities

docs/src/submodules/Utilities/reference.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ Utilities.UniversalFallback
3131

3232
```@docs
3333
Utilities.@model
34+
Utilities.GenericModel
35+
Utilities.GenericOptimizer
36+
Utilities.struct_of_constraint_code
3437
```
3538

3639
### Caching optimizer

src/Utilities/Utilities.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ include("results.jl")
5858
include("variables.jl")
5959

6060
include("vector_of_constraints.jl")
61+
include("struct_of_constraints.jl")
6162
include("model.jl")
6263
include("parser.jl")
6364
include("mockoptimizer.jl")

0 commit comments

Comments
 (0)