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.
-
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.
ConicIP requires Julia 1.10 or later. Install it from the General registry:
import Pkg
Pkg.add("ConicIP")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.
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).
The stable documentation (or the development version) covers
- Tutorials: linear, quadratic, second-order cone, and semidefinite programs; reading the iteration log; detecting infeasibility.
- How-to guides: JuMP integration, KKT solvers, and preprocessing.
- Mathematical background on the infeasible-start Mehrotra predictor-corrector method with Nesterov-Todd scaling.
- API reference.
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".
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.
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.
ConicIP.jl is maintained by the MPF Optimization Laboratory at the University of British Columbia.
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.
ConicIP.jl is licensed under the MIT License.