GLPK.jl is a wrapper for the GNU Linear Programming Kit library.
The wrapper has two components:
- a thin wrapper around the complete C API
- an interface to MathOptInterface
This wrapper is maintained by the JuMP community and is not an GNU project.
If you need help, please ask a question on the JuMP community forum.
If you have a reproducible example of a bug, please open a GitHub issue.
GLPK.jl
is licensed under the GPL v3 license.
Install GLPK using Pkg.add
:
import Pkg
Pkg.add("GLPK")
In addition to installing the GLPK.jl package, this will also download and install the GLPK binaries. You do not need to install GLPK separately.
To use a custom binary, read the Custom solver binaries section of the JuMP documentation.
To use GLPK with JuMP, use GLPK.Optimizer
:
using JuMP, GLPK
model = Model(GLPK.Optimizer)
set_attribute(model, "tm_lim", 60 * 1_000)
set_attribute(model, "msg_lev", GLPK.GLP_MSG_OFF)
If the model is primal or dual infeasible, GLPK will attempt to find a certificate of infeasibility. This can be expensive, particularly if you do not intend to use the certificate. If this is the case, use:
model = Model(() -> GLPK.Optimizer(; want_infeasibility_certificates = false))
The GLPK optimizer supports the following constraints and attributes.
List of supported objective functions:
List of supported variable types:
List of supported constraint types:
MOI.ScalarAffineFunction{Float64}
inMOI.EqualTo{Float64}
MOI.ScalarAffineFunction{Float64}
inMOI.GreaterThan{Float64}
MOI.ScalarAffineFunction{Float64}
inMOI.LessThan{Float64}
MOI.VariableIndex
inMOI.EqualTo{Float64}
MOI.VariableIndex
inMOI.GreaterThan{Float64}
MOI.VariableIndex
inMOI.Integer
MOI.VariableIndex
inMOI.Interval{Float64}
MOI.VariableIndex
inMOI.LessThan{Float64}
MOI.VariableIndex
inMOI.ZeroOne
List of supported model attributes:
MOI.HeuristicCallback()
MOI.LazyConstraintCallback()
MOI.Name()
MOI.ObjectiveSense()
MOI.UserCutCallback()
Options for GLPK are comprehensively documented in the PDF documentation, but they are hard to find.
- Options when solving a linear program are defined in Section 2.8.1
- Options when solving a mixed-integer program are defined in Section 2.10.5
However, the following options are likely to be the most useful:
Parameter | Example | Explanation |
---|---|---|
msg_lev |
GLPK.GLP_MSG_ALL |
Message level for terminal output |
presolve |
GLPK.GLP_ON |
Turn presolve on or off |
tol_int |
1e-5 |
Absolute tolerance for integer feasibility |
tol_obj |
1e-7 |
Relative objective tolerance for mixed-integer programs |
Here is an example using GLPK's solver-specific callbacks.
using JuMP, GLPK, Test
model = Model(GLPK.Optimizer)
@variable(model, 0 <= x <= 2.5, Int)
@variable(model, 0 <= y <= 2.5, Int)
@objective(model, Max, y)
reasons = UInt8[]
function my_callback_function(cb_data)
reason = GLPK.glp_ios_reason(cb_data.tree)
push!(reasons, reason)
if reason != GLPK.GLP_IROWGEN
return
end
x_val = callback_value(cb_data, x)
y_val = callback_value(cb_data, y)
if y_val - x_val > 1 + 1e-6
con = @build_constraint(y - x <= 1)
MOI.submit(model, MOI.LazyConstraint(cb_data), con)
elseif y_val + x_val > 3 + 1e-6
con = @build_constraint(y - x <= 1)
MOI.submit(model, MOI.LazyConstraint(cb_data), con)
end
end
MOI.set(model, GLPK.CallbackFunction(), my_callback_function)
optimize!(model)
@test termination_status(model) == MOI.OPTIMAL
@test primal_status(model) == MOI.FEASIBLE_POINT
@test value(x) == 1
@test value(y) == 2
@show reasons
The C API can be accessed via GLPK.glp_XXX
functions, where the names and
arguments are identical to the C API. See the /tests
folder for inspiration.
GLPK is not thread-safe and should not be used with multithreading.