Skip to content

Commit 5025b50

Browse files
authored
Print algebraic form of AbstractFunction by default (#2112)
1 parent ea66fd8 commit 5025b50

File tree

9 files changed

+176
-107
lines changed

9 files changed

+176
-107
lines changed

docs/src/manual/variables.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Use [`add_variable`](@ref) to add a single variable.
1414

1515
```jldoctest variables; setup=:(model = MOI.Utilities.Model{Float64}(); )
1616
julia> x = MOI.add_variable(model)
17-
MathOptInterface.VariableIndex(1)
17+
MOI.VariableIndex(1)
1818
```
1919
[`add_variable`](@ref) returns a [`VariableIndex`](@ref) type, which is used to
2020
refer to the added variable in other calls.
@@ -29,8 +29,8 @@ Use [`add_variables`](@ref) to add a number of variables.
2929
```jldoctest variables
3030
julia> y = MOI.add_variables(model, 2)
3131
2-element Vector{MathOptInterface.VariableIndex}:
32-
MathOptInterface.VariableIndex(2)
33-
MathOptInterface.VariableIndex(3)
32+
MOI.VariableIndex(2)
33+
MOI.VariableIndex(3)
3434
```
3535

3636
!!! warning

docs/src/submodules/FileFormats/overview.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ julia> src = MOI.Utilities.Model{Float64}()
7878
MOIU.Model{Float64}
7979
8080
julia> MOI.add_variable(src)
81-
MathOptInterface.VariableIndex(1)
81+
MOI.VariableIndex(1)
8282
8383
julia> dest = MOI.FileFormats.Model(format = MOI.FileFormats.FORMAT_MOF)
8484
A MathOptFormat Model
@@ -119,7 +119,7 @@ julia> MOI.read_from_file(dest, "file.mof.json")
119119
120120
julia> MOI.get(dest, MOI.ListOfVariableIndices())
121121
1-element Vector{MathOptInterface.VariableIndex}:
122-
MathOptInterface.VariableIndex(1)
122+
MOI.VariableIndex(1)
123123
124124
julia> rm("file.mof.json") # Clean up after ourselves.
125125
```

docs/src/submodules/Nonlinear/overview.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ incorporate [`VariableIndex`](@ref)es, but these must be interpolated into
6262
the expression with `$`:
6363
```jldoctest nonlinear_developer
6464
julia> x = MOI.VariableIndex(1)
65-
MathOptInterface.VariableIndex(1)
65+
MOI.VariableIndex(1)
6666
6767
julia> input = :(1 + sin($x)^2)
6868
:(1 + sin(MathOptInterface.VariableIndex(1)) ^ 2)
@@ -429,9 +429,9 @@ julia> expr = Any[:+, 2, :^, 2, :sin, 1, x, 2.0, x]
429429
2
430430
:sin
431431
1
432-
MathOptInterface.VariableIndex(1)
432+
MOI.VariableIndex(1)
433433
2.0
434-
MathOptInterface.VariableIndex(1)
434+
MOI.VariableIndex(1)
435435
```
436436
The `Int` after each operator `Symbol` specifies the number of arguments.
437437

docs/src/submodules/Utilities/overview.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ Use `print` to print the formulation of the model.
279279
julia> model = MOI.Utilities.Model{Float64}();
280280
281281
julia> x = MOI.add_variable(model)
282-
MathOptInterface.VariableIndex(1)
282+
MOI.VariableIndex(1)
283283
284284
julia> MOI.set(model, MOI.VariableName(), x, "x_var")
285285
@@ -345,7 +345,7 @@ VariableIndex-in-GreaterThan{Float64}
345345
v[2] >= 0.0
346346
347347
julia> map[c]
348-
MathOptInterface.ScalarAffineFunction{Float64}(MathOptInterface.ScalarAffineTerm{Float64}[MathOptInterface.ScalarAffineTerm{Float64}(1.0, MathOptInterface.VariableIndex(2))], 0.0)
348+
0.0 + 1.0 MOI.VariableIndex(2)
349349
```
350350

351351
You can also modify a single constraint using [`Utilities.ScalarPenaltyRelaxation`](@ref):
@@ -373,7 +373,7 @@ VariableIndex-in-GreaterThan{Float64}
373373
v[2] >= 0.0
374374
375375
julia> f
376-
MathOptInterface.ScalarAffineFunction{Float64}(MathOptInterface.ScalarAffineTerm{Float64}[MathOptInterface.ScalarAffineTerm{Float64}(1.0, MathOptInterface.VariableIndex(2))], 0.0)
376+
0.0 + 1.0 MOI.VariableIndex(2)
377377
```
378378

379379
## Utilities.MatrixOfConstraints

docs/src/tutorials/manipulating_expressions.md

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ The simplest scalar function is simply a variable:
2222

2323
```jldoctest expr; setup=:(model = MOI.Utilities.CachingOptimizer(MOI.Utilities.Model{Float64}(), MOI.Utilities.AUTOMATIC); )
2424
julia> x = MOI.add_variable(model) # Create the variable x
25-
MathOptInterface.VariableIndex(1)
25+
MOI.VariableIndex(1)
2626
```
2727

2828
This type of function is extremely simple; to express more complex functions,
@@ -32,14 +32,14 @@ can be built using the standard constructor:
3232

3333
```jldoctest expr
3434
julia> f = MOI.ScalarAffineFunction([MOI.ScalarAffineTerm(1, x)], 2) # x + 2
35-
MathOptInterface.ScalarAffineFunction{Int64}(MathOptInterface.ScalarAffineTerm{Int64}[MathOptInterface.ScalarAffineTerm{Int64}(1, MathOptInterface.VariableIndex(1))], 2)
35+
(2) + (1) MOI.VariableIndex(1)
3636
```
3737

3838
However, you can also use operators to build the same scalar function:
3939

4040
```jldoctest expr
4141
julia> f = x + 2
42-
MathOptInterface.ScalarAffineFunction{Int64}(MathOptInterface.ScalarAffineTerm{Int64}[MathOptInterface.ScalarAffineTerm{Int64}(1, MathOptInterface.VariableIndex(1))], 2)
42+
(2) + (1) MOI.VariableIndex(1)
4343
```
4444

4545
### Creating scalar quadratic functions
@@ -50,13 +50,13 @@ obtain a quadratic function as a product of affine functions:
5050

5151
```jldoctest expr
5252
julia> 1 * x * x
53-
MathOptInterface.ScalarQuadraticFunction{Int64}(MathOptInterface.ScalarQuadraticTerm{Int64}[MathOptInterface.ScalarQuadraticTerm{Int64}(2, MathOptInterface.VariableIndex(1), MathOptInterface.VariableIndex(1))], MathOptInterface.ScalarAffineTerm{Int64}[], 0)
53+
(0) + 1.0 MOI.VariableIndex(1)²
5454
5555
julia> f * f # (x + 2)²
56-
MathOptInterface.ScalarQuadraticFunction{Int64}(MathOptInterface.ScalarQuadraticTerm{Int64}[MathOptInterface.ScalarQuadraticTerm{Int64}(2, MathOptInterface.VariableIndex(1), MathOptInterface.VariableIndex(1))], MathOptInterface.ScalarAffineTerm{Int64}[MathOptInterface.ScalarAffineTerm{Int64}(2, MathOptInterface.VariableIndex(1)), MathOptInterface.ScalarAffineTerm{Int64}(2, MathOptInterface.VariableIndex(1))], 4)
56+
(4) + (2) MOI.VariableIndex(1) + (2) MOI.VariableIndex(1) + 1.0 MOI.VariableIndex(1)²
5757
5858
julia> f^2 # (x + 2)² too
59-
MathOptInterface.ScalarQuadraticFunction{Int64}(MathOptInterface.ScalarQuadraticTerm{Int64}[MathOptInterface.ScalarQuadraticTerm{Int64}(2, MathOptInterface.VariableIndex(1), MathOptInterface.VariableIndex(1))], MathOptInterface.ScalarAffineTerm{Int64}[MathOptInterface.ScalarAffineTerm{Int64}(2, MathOptInterface.VariableIndex(1)), MathOptInterface.ScalarAffineTerm{Int64}(2, MathOptInterface.VariableIndex(1))], 4)
59+
(4) + (2) MOI.VariableIndex(1) + (2) MOI.VariableIndex(1) + 1.0 MOI.VariableIndex(1)²
6060
```
6161

6262
### Creating vector functions
@@ -73,7 +73,10 @@ dimension corresponding to a dimension of the vector.
7373

7474
```jldoctest expr
7575
julia> g = MOI.Utilities.vectorize([f, 2 * f])
76-
MathOptInterface.VectorAffineFunction{Int64}(MathOptInterface.VectorAffineTerm{Int64}[MathOptInterface.VectorAffineTerm{Int64}(1, MathOptInterface.ScalarAffineTerm{Int64}(1, MathOptInterface.VariableIndex(1))), MathOptInterface.VectorAffineTerm{Int64}(2, MathOptInterface.ScalarAffineTerm{Int64}(2, MathOptInterface.VariableIndex(1)))], [2, 4])
76+
┌ ┐
77+
│(2) + (1) MOI.VariableIndex(1)│
78+
│(4) + (2) MOI.VariableIndex(1)│
79+
└ ┘
7780
```
7881

7982
!!! warning
@@ -108,7 +111,7 @@ function:
108111

109112
```jldoctest expr
110113
julia> MOI.Utilities.canonical(f + f) # Returns 2x + 4
111-
MathOptInterface.ScalarAffineFunction{Int64}(MathOptInterface.ScalarAffineTerm{Int64}[MathOptInterface.ScalarAffineTerm{Int64}(2, MathOptInterface.VariableIndex(1))], 4)
114+
(4) + (2) MOI.VariableIndex(1)
112115
```
113116

114117
## Exploring functions
@@ -124,8 +127,8 @@ vector function:
124127
```jldoctest expr
125128
julia> MOI.Utilities.scalarize(g) # Returns a vector [f, 2 * f].
126129
2-element Vector{MathOptInterface.ScalarAffineFunction{Int64}}:
127-
MathOptInterface.ScalarAffineFunction{Int64}(MathOptInterface.ScalarAffineTerm{Int64}[MathOptInterface.ScalarAffineTerm{Int64}(1, MathOptInterface.VariableIndex(1))], 2)
128-
MathOptInterface.ScalarAffineFunction{Int64}(MathOptInterface.ScalarAffineTerm{Int64}[MathOptInterface.ScalarAffineTerm{Int64}(2, MathOptInterface.VariableIndex(1))], 4)
130+
(2) + (1) MOI.VariableIndex(1)
131+
(4) + (2) MOI.VariableIndex(1)
129132
```
130133

131134
!!! note

src/Utilities/print.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,3 +636,33 @@ end
636636
function Base.print(io::IO, model::MOI.ModelLike; kwargs...)
637637
return _print_model(io, _PrintOptions(MIME("text/plain"); kwargs...), model)
638638
end
639+
640+
struct _NoVariableNameModel{M} <: MOI.ModelLike end
641+
642+
function MOI.get(
643+
::_NoVariableNameModel{MIME"text/plain"},
644+
::MOI.VariableName,
645+
x::MOI.VariableIndex,
646+
)
647+
return "MOI.VariableIndex($(x.value))"
648+
end
649+
650+
function MOI.get(
651+
::_NoVariableNameModel{MIME"text/latex"},
652+
::MOI.VariableName,
653+
::MOI.VariableIndex,
654+
)
655+
return "" # Leave as default
656+
end
657+
658+
function Base.show(io::IO, mime::MIME"text/plain", f::MOI.AbstractFunction)
659+
model = _NoVariableNameModel{MIME"text/plain"}()
660+
print(io, _to_string(_PrintOptions(mime), model, f))
661+
return
662+
end
663+
664+
function Base.show(io::IO, mime::MIME"text/latex", f::MOI.AbstractFunction)
665+
model = _NoVariableNameModel{MIME"text/latex"}()
666+
print(io, _to_string(_PrintOptions(mime), model, f))
667+
return
668+
end

src/functions.jl

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ Represents the scalar-valued term `coefficient * variable`.
8181
julia> import MathOptInterface as MOI
8282
8383
julia> x = MOI.VariableIndex(1)
84-
MathOptInterface.VariableIndex(1)
84+
MOI.VariableIndex(1)
8585
8686
julia> MOI.ScalarAffineTerm(2.0, x)
8787
MathOptInterface.ScalarAffineTerm{Float64}(2.0, MathOptInterface.VariableIndex(1))
@@ -126,15 +126,15 @@ coefficients are summed together.
126126
julia> import MathOptInterface as MOI
127127
128128
julia> x = MOI.VariableIndex(1)
129-
MathOptInterface.VariableIndex(1)
129+
MOI.VariableIndex(1)
130130
131131
julia> terms = [MOI.ScalarAffineTerm(2.0, x), MOI.ScalarAffineTerm(3.0, x)]
132132
2-element Vector{MathOptInterface.ScalarAffineTerm{Float64}}:
133133
MathOptInterface.ScalarAffineTerm{Float64}(2.0, MathOptInterface.VariableIndex(1))
134134
MathOptInterface.ScalarAffineTerm{Float64}(3.0, MathOptInterface.VariableIndex(1))
135135
136136
julia> f = MOI.ScalarAffineFunction(terms, 4.0)
137-
MathOptInterface.ScalarAffineFunction{Float64}(MathOptInterface.ScalarAffineTerm{Float64}[MathOptInterface.ScalarAffineTerm{Float64}(2.0, MathOptInterface.VariableIndex(1)), MathOptInterface.ScalarAffineTerm{Float64}(3.0, MathOptInterface.VariableIndex(1))], 4.0)
137+
4.0 + 2.0 MOI.VariableIndex(1) + 3.0 MOI.VariableIndex(1)
138138
```
139139
"""
140140
mutable struct ScalarAffineFunction{T} <: AbstractScalarFunction
@@ -168,7 +168,7 @@ Represents the scalar-valued term ``c x_i x_j`` where ``c`` is `coefficient`,
168168
julia> import MathOptInterface as MOI
169169
170170
julia> x = MOI.VariableIndex(1)
171-
MathOptInterface.VariableIndex(1)
171+
MOI.VariableIndex(1)
172172
173173
julia> MOI.ScalarQuadraticTerm(2.0, x, x)
174174
MathOptInterface.ScalarQuadraticTerm{Float64}(2.0, MathOptInterface.VariableIndex(1), MathOptInterface.VariableIndex(1))
@@ -258,7 +258,7 @@ julia> quadratic_terms = [
258258
MathOptInterface.ScalarQuadraticTerm{Float64}(3.0, MathOptInterface.VariableIndex(1), MathOptInterface.VariableIndex(2))
259259
260260
julia> f = MOI.ScalarQuadraticFunction(quadratic_terms, affine_terms, constant)
261-
MathOptInterface.ScalarQuadraticFunction{Float64}(MathOptInterface.ScalarQuadraticTerm{Float64}[MathOptInterface.ScalarQuadraticTerm{Float64}(4.0, MathOptInterface.VariableIndex(1), MathOptInterface.VariableIndex(1)), MathOptInterface.ScalarQuadraticTerm{Float64}(3.0, MathOptInterface.VariableIndex(1), MathOptInterface.VariableIndex(2))], MathOptInterface.ScalarAffineTerm{Float64}[MathOptInterface.ScalarAffineTerm{Float64}(4.0, MathOptInterface.VariableIndex(1))], 5.0)
261+
5.0 + 4.0 MOI.VariableIndex(1) + 2.0 MOI.VariableIndex(1)² + 3.0 MOI.VariableIndex(1)*MOI.VariableIndex(2)
262262
```
263263
264264
"""
@@ -306,11 +306,15 @@ julia> import MathOptInterface as MOI
306306
307307
julia> x = MOI.VariableIndex.(1:2)
308308
2-element Vector{MathOptInterface.VariableIndex}:
309-
MathOptInterface.VariableIndex(1)
310-
MathOptInterface.VariableIndex(2)
309+
MOI.VariableIndex(1)
310+
MOI.VariableIndex(2)
311311
312312
julia> f = MOI.VectorOfVariables([x[1], x[2], x[1]])
313-
MathOptInterface.VectorOfVariables(MathOptInterface.VariableIndex[MathOptInterface.VariableIndex(1), MathOptInterface.VariableIndex(2), MathOptInterface.VariableIndex(1)])
313+
┌ ┐
314+
│MOI.VariableIndex(1)│
315+
│MOI.VariableIndex(2)│
316+
│MOI.VariableIndex(1)│
317+
└ ┘
314318
315319
julia> MOI.output_dimension(f)
316320
3
@@ -404,7 +408,10 @@ julia> terms = [
404408
];
405409
406410
julia> f = MOI.VectorAffineFunction(terms, [4.0, 5.0])
407-
MathOptInterface.VectorAffineFunction{Float64}(MathOptInterface.VectorAffineTerm{Float64}[MathOptInterface.VectorAffineTerm{Float64}(1, MathOptInterface.ScalarAffineTerm{Float64}(2.0, MathOptInterface.VariableIndex(1))), MathOptInterface.VectorAffineTerm{Float64}(2, MathOptInterface.ScalarAffineTerm{Float64}(3.0, MathOptInterface.VariableIndex(1)))], [4.0, 5.0])
411+
┌ ┐
412+
│4.0 + 2.0 MOI.VariableIndex(1)│
413+
│5.0 + 3.0 MOI.VariableIndex(1)│
414+
└ ┘
408415
409416
julia> MOI.output_dimension(f)
410417
2
@@ -516,7 +523,10 @@ julia> quad_terms = [
516523
];
517524
518525
julia> f = MOI.VectorQuadraticFunction(quad_terms, affine_terms, constants)
519-
MathOptInterface.VectorQuadraticFunction{Float64}(MathOptInterface.VectorQuadraticTerm{Float64}[MathOptInterface.VectorQuadraticTerm{Float64}(1, MathOptInterface.ScalarQuadraticTerm{Float64}(2.0, MathOptInterface.VariableIndex(1), MathOptInterface.VariableIndex(1))), MathOptInterface.VectorQuadraticTerm{Float64}(2, MathOptInterface.ScalarQuadraticTerm{Float64}(3.0, MathOptInterface.VariableIndex(1), MathOptInterface.VariableIndex(2)))], MathOptInterface.VectorAffineTerm{Float64}[MathOptInterface.VectorAffineTerm{Float64}(1, MathOptInterface.ScalarAffineTerm{Float64}(2.0, MathOptInterface.VariableIndex(1))), MathOptInterface.VectorAffineTerm{Float64}(2, MathOptInterface.ScalarAffineTerm{Float64}(3.0, MathOptInterface.VariableIndex(1)))], [4.0, 5.0])
526+
┌ ┐
527+
│4.0 + 2.0 MOI.VariableIndex(1) + 1.0 MOI.VariableIndex(1)² │
528+
│5.0 + 3.0 MOI.VariableIndex(1) + 3.0 MOI.VariableIndex(1)*MOI.VariableIndex(2)│
529+
└ ┘
520530
521531
julia> MOI.output_dimension(f)
522532
2

0 commit comments

Comments
 (0)