-
Notifications
You must be signed in to change notification settings - Fork 28
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Document how to use MOI.VectorAffineFunction
#171
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -126,3 +126,66 @@ m = Model() | |
|
||
poly = polyhedron(m, CDDLib.Library(:exact)) | ||
``` | ||
|
||
## Using a Polyhedra Optimizer with MathOptInterface | ||
|
||
Polyhedra Optimizers by dafault support only a few constraint types in MathOptInterface (MOI). | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. dafault -> default |
||
Apply `MOI.Bridges.full_bridge_optimizer` to a Polyhedra Optimizer to enable a broader set of constraint types, such as `VectorAffineFunction`: | ||
see the [list](http://www.juliaopt.org/MathOptInterface.jl/dev/apimanual/#Constraints-by-function-set-pairs-1) from MOI. | ||
|
||
As an example, consider the linear program: | ||
```math | ||
\[ | ||
\max\ c x \quad \text{s.t.}\ A x \leq b,\ x \geq 0 | ||
\] | ||
``` | ||
where | ||
```julia | ||
A = [1 2; 3 1] | ||
b = [1, 2] | ||
c = [1, 1] | ||
``` | ||
|
||
Let us solve this program with `CDDLib.Optimizer` in exact arithmetic. | ||
To set up: | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. remove empty line |
||
```julia | ||
using CDDLib | ||
using MathOptInterface | ||
const MOI = MathOptInterface | ||
|
||
m, n = size(A) | ||
T = Rational{BigInt} | ||
|
||
# Enable `VectorAffineTerm`, `VectorOfVariables`, `Nonnegatives`, `Nonpositives` | ||
optimizer = MOI.Bridges.full_bridge_optimizer(CDDLib.Optimizer{T}(), T) | ||
|
||
# max cx | ||
x = MOI.add_variables(optimizer, n) | ||
MOI.set(optimizer, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}(), | ||
MOI.ScalarAffineFunction{T}(MOI.ScalarAffineTerm{T}.(c, x), 0)) | ||
MOI.set(optimizer, MOI.ObjectiveSense(), MOI.MAX_SENSE) | ||
|
||
# Ax - b <= 0 | ||
terms = MOI.VectorAffineTerm{T}.( | ||
1:m, MOI.ScalarAffineTerm{T}.(A, reshape(x, 1, n)) | ||
) | ||
f = MOI.VectorAffineFunction{T}(vec(terms), -b) | ||
MOI.add_constraint(optimizer, f, MOI.Nonpositives(m)) | ||
|
||
# x >= 0 | ||
MOI.add_constraint(optimizer, MOI.VectorOfVariables(x), MOI.Nonnegatives(n)) | ||
``` | ||
|
||
To solve: | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove empty line |
||
```julia | ||
MOI.optimize!(optimizer) | ||
MOI.get(optimizer, MOI.VariablePrimal(), x) | ||
``` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The standard way is to add the output in the same code block after an |
||
|
||
``` | ||
2-element Array{Rational{BigInt},1}: | ||
3//5 | ||
1//5 | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Explain why one would use MOI directly instead of with JuMP (which is recommended) which is simply
Model(with_optimizer(CDDLib.Optimizer))
. The reason could be that JuMP only doesFloat64
arithmetic while CDD allows rational arithmetic.