Skip to content

Commit 902064f

Browse files
authored
Add default printing for show(io, ::ModelLike) (#2505)
1 parent 6d9378a commit 902064f

27 files changed

+332
-320
lines changed

docs/src/submodules/Bridges/overview.md

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,21 @@ in a [`Bridges.full_bridge_optimizer`](@ref).
104104
```jldoctest
105105
julia> inner_optimizer = MOI.Utilities.Model{Float64}()
106106
MOIU.Model{Float64}
107+
├ ObjectiveSense: FEASIBILITY_SENSE
108+
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
109+
├ NumberOfVariables: 0
110+
└ NumberOfConstraints: 0
107111
108112
julia> optimizer = MOI.Bridges.full_bridge_optimizer(inner_optimizer, Float64)
109113
MOIB.LazyBridgeOptimizer{MOIU.Model{Float64}}
110-
with 0 variable bridges
111-
with 0 constraint bridges
112-
with 0 objective bridges
113-
with inner model MOIU.Model{Float64}
114+
├ Variable bridges: none
115+
├ Constraint bridges: none
116+
├ Objective bridges: none
117+
└ model: MOIU.Model{Float64}
118+
├ ObjectiveSense: FEASIBILITY_SENSE
119+
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
120+
├ NumberOfVariables: 0
121+
└ NumberOfConstraints: 0
114122
```
115123

116124
Now, use `optimizer` as normal, and bridging will happen lazily behind the
@@ -134,13 +142,9 @@ However, this will force the constraint to be bridged, even if the
134142
`inner_optimizer` supports it.
135143

136144
```jldoctest
137-
julia> inner_optimizer = MOI.Utilities.Model{Float64}()
138-
MOIU.Model{Float64}
145+
julia> inner_optimizer = MOI.Utilities.Model{Float64}();
139146
140-
julia> optimizer = MOI.Bridges.Constraint.SplitInterval{Float64}(inner_optimizer)
141-
MOIB.Constraint.SingleBridgeOptimizer{MOIB.Constraint.SplitIntervalBridge{Float64}, MOIU.Model{Float64}}
142-
with 0 constraint bridges
143-
with inner model MOIU.Model{Float64}
147+
julia> optimizer = MOI.Bridges.Constraint.SplitInterval{Float64}(inner_optimizer);
144148
145149
julia> x = MOI.add_variable(optimizer)
146150
MOI.VariableIndex(1)
@@ -168,13 +172,21 @@ First, wrap an inner optimizer:
168172
```jldoctest lazy_bridge_optimizer
169173
julia> inner_optimizer = MOI.Utilities.Model{Float64}()
170174
MOIU.Model{Float64}
175+
├ ObjectiveSense: FEASIBILITY_SENSE
176+
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
177+
├ NumberOfVariables: 0
178+
└ NumberOfConstraints: 0
171179
172180
julia> optimizer = MOI.Bridges.LazyBridgeOptimizer(inner_optimizer)
173181
MOIB.LazyBridgeOptimizer{MOIU.Model{Float64}}
174-
with 0 variable bridges
175-
with 0 constraint bridges
176-
with 0 objective bridges
177-
with inner model MOIU.Model{Float64}
182+
├ Variable bridges: none
183+
├ Constraint bridges: none
184+
├ Objective bridges: none
185+
└ model: MOIU.Model{Float64}
186+
├ ObjectiveSense: FEASIBILITY_SENSE
187+
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
188+
├ NumberOfVariables: 0
189+
└ NumberOfConstraints: 0
178190
```
179191

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

docs/src/submodules/FileFormats/overview.md

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,7 @@ A SemiDefinite Programming Algorithm Format (SDPA) model
7373
To write a model `src` to a [MathOptFormat file](https://jump.dev/MathOptFormat/),
7474
use:
7575
```jldoctest fileformats
76-
julia> src = MOI.Utilities.Model{Float64}()
77-
MOIU.Model{Float64}
76+
julia> src = MOI.Utilities.Model{Float64}();
7877
7978
julia> MOI.add_variable(src)
8079
MOI.VariableIndex(1)
@@ -130,8 +129,7 @@ argument to [`FileFormats.Model`](@ref). This will attempt to automatically
130129
guess the format from the file extension. For example:
131130

132131
```jldoctest fileformats
133-
julia> src = MOI.Utilities.Model{Float64}()
134-
MOIU.Model{Float64}
132+
julia> src = MOI.Utilities.Model{Float64}();
135133
136134
julia> dest = MOI.FileFormats.Model(filename = "file.cbf.gz")
137135
A Conic Benchmark Format (CBF) model
@@ -144,8 +142,7 @@ julia> MOI.write_to_file(dest, "file.cbf.gz")
144142
julia> src_2 = MOI.FileFormats.Model(filename = "file.cbf.gz")
145143
A Conic Benchmark Format (CBF) model
146144
147-
julia> src = MOI.Utilities.Model{Float64}()
148-
MOIU.Model{Float64}
145+
julia> src = MOI.Utilities.Model{Float64}();
149146
150147
julia> dest = MOI.FileFormats.Model(filename = "file.cbf.gz")
151148
A Conic Benchmark Format (CBF) model
@@ -189,8 +186,7 @@ MOI.write_to_file(dest, "my_model.cbf")
189186
In addition to [`write_to_file`](@ref) and [`read_from_file`](@ref), you can
190187
read and write directly from `IO` streams using `Base.write` and `Base.read!`:
191188
```jldoctest
192-
julia> src = MOI.Utilities.Model{Float64}()
193-
MOIU.Model{Float64}
189+
julia> src = MOI.Utilities.Model{Float64}();
194190
195191
julia> dest = MOI.FileFormats.Model(format = MOI.FileFormats.FORMAT_MPS)
196192
A Mathematical Programming System (MPS) model

docs/src/submodules/Utilities/overview.md

Lines changed: 79 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ Create a model as follows:
2121
```jldoctest
2222
julia> model = MOI.Utilities.Model{Float64}()
2323
MOIU.Model{Float64}
24+
├ ObjectiveSense: FEASIBILITY_SENSE
25+
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
26+
├ NumberOfVariables: 0
27+
└ NumberOfConstraints: 0
2428
```
2529

2630
## Utilities.UniversalFallback
@@ -36,7 +40,10 @@ fallback and [`Utilities.Model`](@ref) as a generic problem cache:
3640
```jldoctest
3741
julia> model = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
3842
MOIU.UniversalFallback{MOIU.Model{Float64}}
39-
fallback for MOIU.Model{Float64}
43+
├ ObjectiveSense: FEASIBILITY_SENSE
44+
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
45+
├ NumberOfVariables: 0
46+
└ NumberOfConstraints: 0
4047
```
4148

4249
!!! warning
@@ -87,6 +94,10 @@ MathOptInterface.Utilities.GenericOptimizer{T, MathOptInterface.Utilities.Object
8794
8895
julia> model = MyNewModel{Float64}()
8996
MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MyNewModelFunctionConstraints{Float64}}
97+
├ ObjectiveSense: FEASIBILITY_SENSE
98+
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
99+
├ NumberOfVariables: 0
100+
└ NumberOfConstraints: 0
90101
```
91102

92103
!!! warning
@@ -152,11 +163,19 @@ julia> model = MOI.Utilities.CachingOptimizer(
152163
MOI.Utilities.Model{Float64}(),
153164
PathOptimizer{Float64}(),
154165
)
155-
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}, MOIU.Model{Float64}}
156-
in state EMPTY_OPTIMIZER
157-
in mode AUTOMATIC
158-
with model cache MOIU.Model{Float64}
159-
with optimizer MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}
166+
MOIU.CachingOptimizer
167+
├ state: EMPTY_OPTIMIZER
168+
├ mode: AUTOMATIC
169+
├ model_cache: MOIU.Model{Float64}
170+
│ ├ ObjectiveSense: FEASIBILITY_SENSE
171+
│ ├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
172+
│ ├ NumberOfVariables: 0
173+
│ └ NumberOfConstraints: 0
174+
└ optimizer: MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}
175+
├ ObjectiveSense: FEASIBILITY_SENSE
176+
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
177+
├ NumberOfVariables: 0
178+
└ NumberOfConstraints: 0
160179
```
161180

162181
A [`Utilities.CachingOptimizer`](@ref) may be in one of three possible states:
@@ -175,12 +194,8 @@ Use [`Utilities.attach_optimizer`](@ref) to go from `EMPTY_OPTIMIZER` to
175194
```jldoctest pathoptimizer
176195
julia> MOI.Utilities.attach_optimizer(model)
177196
178-
julia> model
179-
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}, MOIU.Model{Float64}}
180-
in state ATTACHED_OPTIMIZER
181-
in mode AUTOMATIC
182-
with model cache MOIU.Model{Float64}
183-
with optimizer MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}
197+
julia> MOI.Utilities.state(model)
198+
ATTACHED_OPTIMIZER::CachingOptimizerState = 2
184199
```
185200

186201
!!! info
@@ -191,12 +206,8 @@ Use [`Utilities.reset_optimizer`](@ref) to go from `ATTACHED_OPTIMIZER` to
191206
```jldoctest pathoptimizer
192207
julia> MOI.Utilities.reset_optimizer(model)
193208
194-
julia> model
195-
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}, MOIU.Model{Float64}}
196-
in state EMPTY_OPTIMIZER
197-
in mode AUTOMATIC
198-
with model cache MOIU.Model{Float64}
199-
with optimizer MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}
209+
julia> MOI.Utilities.state(model)
210+
EMPTY_OPTIMIZER::CachingOptimizerState = 1
200211
```
201212

202213
!!! info
@@ -208,25 +219,43 @@ Use [`Utilities.drop_optimizer`](@ref) to go from any state to `NO_OPTIMIZER`:
208219
```jldoctest pathoptimizer
209220
julia> MOI.Utilities.drop_optimizer(model)
210221
222+
julia> MOI.Utilities.state(model)
223+
NO_OPTIMIZER::CachingOptimizerState = 0
224+
211225
julia> model
212-
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}, MOIU.Model{Float64}}
213-
in state NO_OPTIMIZER
214-
in mode AUTOMATIC
215-
with model cache MOIU.Model{Float64}
216-
with optimizer nothing
226+
MOIU.CachingOptimizer
227+
├ state: NO_OPTIMIZER
228+
├ mode: AUTOMATIC
229+
├ model_cache: MOIU.Model{Float64}
230+
│ ├ ObjectiveSense: FEASIBILITY_SENSE
231+
│ ├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
232+
│ ├ NumberOfVariables: 0
233+
│ └ NumberOfConstraints: 0
234+
└ optimizer: nothing
217235
```
218236

219237
Pass an empty optimizer to [`Utilities.reset_optimizer`](@ref) to go from
220238
`NO_OPTIMIZER` to `EMPTY_OPTIMIZER`:
221239
```jldoctest pathoptimizer
222240
julia> MOI.Utilities.reset_optimizer(model, PathOptimizer{Float64}())
223241
242+
julia> MOI.Utilities.state(model)
243+
EMPTY_OPTIMIZER::CachingOptimizerState = 1
244+
224245
julia> model
225-
MOIU.CachingOptimizer{MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}, MOIU.Model{Float64}}
226-
in state EMPTY_OPTIMIZER
227-
in mode AUTOMATIC
228-
with model cache MOIU.Model{Float64}
229-
with optimizer MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}
246+
MOIU.CachingOptimizer
247+
├ state: EMPTY_OPTIMIZER
248+
├ mode: AUTOMATIC
249+
├ model_cache: MOIU.Model{Float64}
250+
│ ├ ObjectiveSense: FEASIBILITY_SENSE
251+
│ ├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
252+
│ ├ NumberOfVariables: 0
253+
│ └ NumberOfConstraints: 0
254+
└ optimizer: MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}
255+
├ ObjectiveSense: FEASIBILITY_SENSE
256+
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
257+
├ NumberOfVariables: 0
258+
└ NumberOfConstraints: 0
230259
```
231260

232261
Deciding when to attach and reset the optimizer is tedious, and you will often
@@ -256,20 +285,32 @@ julia> model = MOI.Utilities.CachingOptimizer(
256285
MOI.Utilities.Model{Float64}(),
257286
MOI.Utilities.MANUAL,
258287
)
259-
MOIU.CachingOptimizer{MOI.AbstractOptimizer, MOIU.Model{Float64}}
260-
in state NO_OPTIMIZER
261-
in mode MANUAL
262-
with model cache MOIU.Model{Float64}
263-
with optimizer nothing
288+
MOIU.CachingOptimizer
289+
├ state: NO_OPTIMIZER
290+
├ mode: MANUAL
291+
├ model_cache: MOIU.Model{Float64}
292+
│ ├ ObjectiveSense: FEASIBILITY_SENSE
293+
│ ├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
294+
│ ├ NumberOfVariables: 0
295+
│ └ NumberOfConstraints: 0
296+
└ optimizer: nothing
264297
265298
julia> MOI.Utilities.reset_optimizer(model, PathOptimizer{Float64}())
266299
267300
julia> model
268-
MOIU.CachingOptimizer{MOI.AbstractOptimizer, MOIU.Model{Float64}}
269-
in state EMPTY_OPTIMIZER
270-
in mode MANUAL
271-
with model cache MOIU.Model{Float64}
272-
with optimizer MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}
301+
MOIU.CachingOptimizer
302+
├ state: EMPTY_OPTIMIZER
303+
├ mode: MANUAL
304+
├ model_cache: MOIU.Model{Float64}
305+
│ ├ ObjectiveSense: FEASIBILITY_SENSE
306+
│ ├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
307+
│ ├ NumberOfVariables: 0
308+
│ └ NumberOfConstraints: 0
309+
└ optimizer: MOIU.GenericOptimizer{Float64, MOIU.ObjectiveContainer{Float64}, MOIU.VariablesContainer{Float64}, MOIU.VectorOfConstraints{MOI.VectorAffineFunction{Float64}, MOI.Complements}}
310+
├ ObjectiveSense: FEASIBILITY_SENSE
311+
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
312+
├ NumberOfVariables: 0
313+
└ NumberOfConstraints: 0
273314
```
274315

275316
## Printing

src/Bridges/Constraint/map.jl

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,6 @@ struct Map <: AbstractDict{MOI.ConstraintIndex,AbstractBridge}
3232
end
3333
end
3434

35-
function Base.show(io::IO, B::Map)
36-
indent = " "^get(io, :indent, 0)
37-
n = length(B)
38-
s = n == 1 ? "" : "s"
39-
return print(io, "\n$(indent)with $(n) constraint bridge$s")
40-
end
41-
4235
# Implementation of `AbstractDict` interface.
4336

4437
function Base.isempty(map::Map)

src/Bridges/Constraint/single_bridge_optimizer.jl

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ julia> bridge = MOI.Bridges.Constraint.SingleBridgeOptimizer{MyNewBridge{Float64
2323
MOI.Utilities.Model{Float64}(),
2424
)
2525
MOIB.Constraint.SingleBridgeOptimizer{MyNewBridge{Float64}, MOIU.Model{Float64}}
26-
with 0 constraint bridges
27-
with inner model MOIU.Model{Float64}
26+
├ ObjectiveSense: FEASIBILITY_SENSE
27+
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
28+
├ NumberOfVariables: 0
29+
└ NumberOfConstraints: 0
2830
```
2931
3032
## Implementation notes
@@ -37,10 +39,7 @@ julia> const MyNewBridgeModel{T,OT<:MOI.ModelLike} =
3739
```
3840
This enables users to create bridged models as follows:
3941
```jldoctest con_singlebridgeoptimizer
40-
julia> MyNewBridgeModel{Float64}(MOI.Utilities.Model{Float64}())
41-
MOIB.Constraint.SingleBridgeOptimizer{MyNewBridge{Float64}, MOIU.Model{Float64}}
42-
with 0 constraint bridges
43-
with inner model MOIU.Model{Float64}
42+
julia> MyNewBridgeModel{Float64}(MOI.Utilities.Model{Float64}());
4443
```
4544
"""
4645
mutable struct SingleBridgeOptimizer{BT<:AbstractBridge,OT<:MOI.ModelLike} <:

src/Bridges/Objective/map.jl

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,6 @@ end
1717

1818
Map() = Map(Dict{MOI.ObjectiveFunction,AbstractBridge}(), nothing)
1919

20-
function Base.show(io::IO, B::Map)
21-
indent = " "^get(io, :indent, 0)
22-
n = length(B)
23-
s = n == 1 ? "" : "s"
24-
return print(io, "\n$(indent)with $(n) objective bridge$s")
25-
end
26-
2720
# Implementation of `AbstractDict` interface.
2821

2922
Base.isempty(map::Map) = isempty(map.bridges)

src/Bridges/Objective/single_bridge_optimizer.jl

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@ julia> struct MyNewBridge{T} <: MOI.Bridges.Objective.AbstractBridge end
2121
2222
julia> bridge = MOI.Bridges.Objective.SingleBridgeOptimizer{MyNewBridge{Float64}}(
2323
MOI.Utilities.Model{Float64}(),
24-
)
25-
MOIB.Objective.SingleBridgeOptimizer{MyNewBridge{Float64}, MOIU.Model{Float64}}
26-
with 0 objective bridges
27-
with inner model MOIU.Model{Float64}
24+
);
2825
```
2926
3027
## Implementation notes
@@ -37,10 +34,7 @@ julia> const MyNewBridgeModel{T,OT<:MOI.ModelLike} =
3734
```
3835
This enables users to create bridged models as follows:
3936
```jldoctest obj_singlebridgeoptimizer
40-
julia> MyNewBridgeModel{Float64}(MOI.Utilities.Model{Float64}())
41-
MOIB.Objective.SingleBridgeOptimizer{MyNewBridge{Float64}, MOIU.Model{Float64}}
42-
with 0 objective bridges
43-
with inner model MOIU.Model{Float64}
37+
julia> MyNewBridgeModel{Float64}(MOI.Utilities.Model{Float64}());
4438
```
4539
"""
4640
mutable struct SingleBridgeOptimizer{BT<:AbstractBridge,OT<:MOI.ModelLike} <:

src/Bridges/Variable/map.jl

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,6 @@ function Map()
6464
)
6565
end
6666

67-
function Base.show(io::IO, B::Map)
68-
indent = " "^get(io, :indent, 0)
69-
n = length(B)
70-
s = n == 1 ? "" : "s"
71-
return print(io, "\n$(indent)with $(n) variable bridge$s")
72-
end
73-
7467
# Implementation of `AbstractDict` interface.
7568

7669
Base.isempty(map::Map) = all(bridge -> bridge === nothing, map.bridges)

0 commit comments

Comments
 (0)