Skip to content

Repository files navigation

ConicIP.jl

CI codecov Documentation (stable) Documentation (dev) Version License: MIT

ConicIP.jl (Conic Interior Point) is a pure-Julia interior-point solver for quadratic programs with linear equality constraints and polyhedral, second-order cone, and semidefinite cone constraints. It solves

minimize    ½yᵀQy - cᵀy
subject to  Ay ≥_K b,   K = K₁ × ⋯ × Kⱼ
            Gy  = d

where Q ⪰ 0 and each Kᵢ is a nonnegative orthant, a second-order cone, or a cone of positive semidefinite matrices. Because ConicIP is written in Julia, it accepts abstract matrix types and custom KKT solver callbacks for exploiting problem structure.

Features

  • Pure Julia. No binary dependencies or external solver installations.

  • Cones. Cartesian products of the cones below, in any order.

    Cone Spec Description
    Nonnegative orthant ("R", n) Linear inequalities
    Second-order cone ("Q", n) Norm constraints
    Semidefinite ("S", k) Matrix positivity
  • Quadratic objectives. Handled natively, through both the direct API and JuMP, without reformulation to a second-order cone; positive semidefinite but singular Hessians are fine.

  • Custom KKT solvers. Plug in your own factorization or iterative method at each interior-point iteration; built-in dense, sparse, and reduced 2×2 solvers with automatic selection.

  • Nesterov-Todd scaling. Symmetric primal-dual scaling for good numerical behaviour.

  • Infeasibility detection. Returns validated certificates for infeasible and unbounded problems.

  • JuMP support. A MathOptInterface wrapper makes ConicIP a drop-in solver for JuMP.

Installation

ConicIP requires Julia 1.10 or later. Install it from the General registry:

import Pkg
Pkg.add("ConicIP")

Quick start

With JuMP

Minimize the Euclidean norm of a vector whose entries sum to one:

using JuMP, ConicIP

model = Model(ConicIP.Optimizer)
set_silent(model)
@variable(model, x[1:3])
@variable(model, t)
@constraint(model, sum(x) == 1)
@constraint(model, [t; x] in SecondOrderCone())
@objective(model, Min, t)
optimize!(model)

termination_status(model)   # OPTIMAL
value.(x)                   # ≈ [0.3333, 0.3333, 0.3333]

See the JuMP integration guide for solver options and supported constraint types.

Direct API

The direct interface is

sol = conicIP(Q, c, A, b, K, G, d)

where K is a vector of (cone, dimension) tuples. For example, the cone K = R² × Q³ × R² is written

K = [("R", 2), ("Q", 3), ("R", 2)]

To solve the bound-constrained QP minimize ½yᵀQy - cᵀy subject to y ≥ 0:

using ConicIP
using SparseArrays, LinearAlgebra

n = 1000
Q = sprandn(n, n, 0.1)
Q = Q'*Q
c = ones(n)
A = sparse(1.0I, n, n)
b = zeros(n)
K = [("R", n)]

sol = conicIP(Q, c, A, b, K, verbose=true);

sol holds the status (sol.status), primal variables (sol.y), dual variables (sol.v, sol.w), objective values (sol.pobj, sol.dobj), and convergence residuals (sol.prFeas, sol.duFeas, sol.muFeas).

Documentation

The stable documentation (or the development version) covers

Citing

If you use ConicIP in your research, please cite it as

@software{ConicIP.jl,
  author  = {Friedlander, Michael P. and Goh, Gabriel},
  title   = {{ConicIP.jl}: A conic interior-point solver in {Julia}},
  year    = {2026},
  version = {0.3.2},
  url     = {https://github.com/MPF-Optimization-Laboratory/ConicIP.jl}
}

The repository also ships a CITATION.cff file that GitHub renders under "Cite this repository".

Contributing

Bug reports, fixes, and documentation improvements are welcome. See CONTRIBUTING.md for the workflow and the policy on disclosing AI-assisted contributions, and CHANGELOG.md for release notes.

Getting help

If you need help, please ask a question by opening a GitHub issue. Questions about modelling with JuMP are also welcome on the JuMP community forum.

Affiliation

ConicIP.jl is maintained by the MPF Optimization Laboratory at the University of British Columbia.

History

ConicIP.jl was originally written by Gabriel Goh in 2016 as a PhD project under the supervision of Michael P. Friedlander at the University of California, Davis. Development paused after Gabriel graduated. Michael Friedlander revived the package in 2026, modernized it for current Julia and JuMP, and registered it in the General registry. Thanks also to Tony Kelman and Miles Lubin for early contributions.

License

ConicIP.jl is licensed under the MIT License.

About

Conic interior-point solver for LP, SOCP, and SDP in pure Julia

Topics

Resources

Contributing

Stars

29 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages