JuMP Integration

ConicIP provides a MathOptInterface wrapper, so it can be used as a solver backend for JuMP.

Setup

using JuMP, ConicIP
model = Model(ConicIP.Optimizer)

Solver Options

Pass options at construction via an anonymous function:

model = Model(() -> ConicIP.Optimizer(verbose=false, optTol=1e-8, maxIters=200))

The available options are:

OptionTypeDefaultDescription
verboseBoolfalsePrint solver iterations
optTolFloat641e-6Optimality tolerance
maxItersInt100Maximum iterations

Example: Simple LP

using JuMP, ConicIP

model = Model(() -> ConicIP.Optimizer(verbose=false, optTol=1e-6))

@variable(model, x[1:2] >= 0)
@objective(model, Min, x[1] + x[2])
@constraint(model, x[1] + x[2] >= 1)

optimize!(model)
termination_status(model)
OPTIMAL::TerminationStatusCode = 1
round(objective_value(model), digits=6)
1.0

Example: SOC Constraint

using JuMP, ConicIP

model = Model(() -> ConicIP.Optimizer(verbose=false, optTol=1e-6))

@variable(model, x[1:2])
@variable(model, t)
@objective(model, Min, t)
@constraint(model, x[1] == 1)
@constraint(model, x[2] == 1)
@constraint(model, [t; x] in SecondOrderCone())

optimize!(model)
termination_status(model)
OPTIMAL::TerminationStatusCode = 1

The minimum norm is √2:

round(objective_value(model), digits=4)
1.4142

Example: Maximization

using JuMP, ConicIP

model = Model(() -> ConicIP.Optimizer(verbose=false, optTol=1e-6))

@variable(model, x[1:2] >= 0)
@objective(model, Max, x[1] + 2x[2])
@constraint(model, x[1] + x[2] <= 1)

optimize!(model)
termination_status(model)
OPTIMAL::TerminationStatusCode = 1
round(objective_value(model), digits=6)
2.0

Supported Constraints

Constraint typeJuMP syntax
Nonnegative@variable(model, x >= 0) or @constraint(model, x in MOI.Nonnegatives(n))
Nonpositive@constraint(model, x in MOI.Nonpositives(n))
Zero (equality)@constraint(model, x .== 0) or @constraint(model, x in MOI.Zeros(n))
Second-order cone@constraint(model, [t; x] in SecondOrderCone())
PSD (experimental)@constraint(model, X in PSDCone())
Scalar equal@constraint(model, x == 1)
Scalar greater@constraint(model, x >= 1)
Scalar less@constraint(model, x <= 1)

Limitations

No quadratic objectives through JuMP

The MOI wrapper currently supports only linear objectives. For quadratic programs, use the direct conicIP interface.

Other limitations:

  • No integer variables
  • No indicator or SOS constraints
  • Semidefinite support is experimental