SOCP Example in Julia
We will show how to solve this problem both natively in Clarabel.jl and also by solving with Clarabel.jl within JuMP.
Clarabel.jl native interface
using Clarabel, SparseArrays
P = sparse([0. 0.;0. 1.].*2)
q = [0., 0.]
A = sparse([0. 0.
-2. 0.;
0. -1.])
b = [ 1.
-2.;
-2.]
cones = [Clarabel.SecondOrderConeT(3)]
settings = Clarabel.Settings(max_iter = 15, verbose = true)
solver = Clarabel.Solver()
Clarabel.setup!(solver, P, q, A, b, cones, settings)
result = Clarabel.solve!(solver)
-------------------------------------------------------------
Clarabel.jl v0.11.0 - Clever Acronym
(c) Paul Goulart
University of Oxford, 2022
-------------------------------------------------------------
problem:
variables = 2
constraints = 3
nnz(P) = 1
nnz(A) = 2
cones (total) = 1
: SecondOrder = 1, numel = 3
settings:
linear algebra: direct / qdldl, precision: 64 bit (1 thread)
max iter = 15, time limit = Inf, max step = 0.990
tol_feas = 1.0e-08, tol_gap_abs = 1.0e-08, tol_gap_rel = 1.0e-08,
static reg : on, ϵ1 = 1.0e-08, ϵ2 = 4.9e-32
dynamic reg: on, ϵ = 1.0e-13, δ = 2.0e-07
iter refine: on, reltol = 1.0e-13, abstol = 1.0e-12,
max iter = 10, stop ratio = 5.0
equilibrate: on, min_scale = 1.0e-04, max_scale = 1.0e+04
max iter = 10
iter pcost dcost gap pres dres k/t μ step
---------------------------------------------------------------------------------------------
0 4.9292e-01 -1.2888e-01 6.22e-01 2.16e-01 8.10e-17 1.00e+00 2.35e+00 ------
1 9.3926e-01 7.9266e-01 1.47e-01 8.20e-03 6.86e-17 4.74e-02 1.60e-01 9.67e-01
2 9.9952e-01 9.9654e-01 2.97e-03 8.15e-05 6.83e-17 8.14e-04 2.68e-03 9.90e-01
3 1.0000e+00 9.9997e-01 2.98e-05 8.15e-07 6.83e-17 8.16e-06 2.69e-05 9.90e-01
4 1.0000e+00 1.0000e+00 2.98e-07 8.15e-09 1.12e-14 8.16e-08 2.69e-07 9.90e-01
5 1.0000e+00 1.0000e+00 2.98e-09 8.15e-11 2.05e-16 8.16e-10 2.69e-09 9.90e-01
---------------------------------------------------------------------------------------------
Terminated with status = solved
solve time = 1.70ms
>>> Clarabel - Results
Status: SOLVED
Iterations: 5
Objective: 1.000
Solve time: 1.70ms
result.x
2-element Vector{Float64}:
1.0
0.9999999997592807
Using JuMP
We can solve the same problem using Clarabel.jl as the backend solver within JuMP. Here is the same problem again:
using Clarabel, JuMP
model = JuMP.Model(Clarabel.Optimizer)
set_optimizer_attribute(model, "verbose", true)
@variable(model, x[1:2])
@constraint(model, [1, 2x[1]-2, x[2] - 2] in SecondOrderCone())
@objective(model, Min, x[2]^2 )
optimize!(model)
-------------------------------------------------------------
Clarabel.jl v0.11.0 - Clever Acronym
(c) Paul Goulart
University of Oxford, 2022
-------------------------------------------------------------
problem:
variables = 2
constraints = 3
nnz(P) = 1
nnz(A) = 2
cones (total) = 1
: SecondOrder = 1, numel = 3
settings:
linear algebra: direct / qdldl, precision: 64 bit (1 thread)
max iter = 200, time limit = Inf, max step = 0.990
tol_feas = 1.0e-08, tol_gap_abs = 1.0e-08, tol_gap_rel = 1.0e-08,
static reg : on, ϵ1 = 1.0e-08, ϵ2 = 4.9e-32
dynamic reg: on, ϵ = 1.0e-13, δ = 2.0e-07
iter refine: on, reltol = 1.0e-13, abstol = 1.0e-12,
max iter = 10, stop ratio = 5.0
equilibrate: on, min_scale = 1.0e-04, max_scale = 1.0e+04
max iter = 10
iter pcost dcost gap pres dres k/t μ step
---------------------------------------------------------------------------------------------
0 4.9292e-01 -1.2888e-01 6.22e-01 2.16e-01 8.10e-17 1.00e+00 2.35e+00 ------
1 9.3926e-01 7.9266e-01 1.47e-01 8.20e-03 6.86e-17 4.74e-02 1.60e-01 9.67e-01
2 9.9952e-01 9.9654e-01 2.97e-03 8.15e-05 6.83e-17 8.14e-04 2.68e-03 9.90e-01
3 1.0000e+00 9.9997e-01 2.98e-05 8.15e-07 6.83e-17 8.16e-06 2.69e-05 9.90e-01
4 1.0000e+00 1.0000e+00 2.98e-07 8.15e-09 1.12e-14 8.16e-08 2.69e-07 9.90e-01
5 1.0000e+00 1.0000e+00 2.98e-09 8.15e-11 2.05e-16 8.16e-10 2.69e-09 9.90e-01
---------------------------------------------------------------------------------------------
Terminated with status = solved
solve time = 2.59ms
Here is the solution
JuMP.value.(x)
2-element Vector{Float64}:
1.0
0.9999999997592807
and the solver termination status again
JuMP.termination_status(model)
OPTIMAL::TerminationStatusCode = 1
Using Convex.jl
One more time using Clarabel.jl as the backend solver within Convex.jl:
using Clarabel, Convex
x = Variable(2)
problem = minimize(square(x[2]))
problem.constraints = [
norm([2x[1];x[2]] - [2;2], 2) <= 1
]
solve!(problem, Clarabel.Optimizer; silent = false);
[ Info: [Convex.jl] Compilation finished: 0.0 seconds, 137.750 KiB of memory allocated
-------------------------------------------------------------
Clarabel.jl v0.11.0 - Clever Acronym
(c) Paul Goulart
University of Oxford, 2022
-------------------------------------------------------------
problem:
variables = 4
constraints = 7
nnz(P) = 0
nnz(A) = 7
cones (total) = 3
: Nonnegative = 1, numel = 1
: SecondOrder = 2, numel = (3,3)
settings:
linear algebra: direct / qdldl, precision: 64 bit (1 thread)
max iter = 200, time limit = Inf, max step = 0.990
tol_feas = 1.0e-08, tol_gap_abs = 1.0e-08, tol_gap_rel = 1.0e-08,
static reg : on, ϵ1 = 1.0e-08, ϵ2 = 4.9e-32
dynamic reg: on, ϵ = 1.0e-13, δ = 2.0e-07
iter refine: on, reltol = 1.0e-13, abstol = 1.0e-12,
max iter = 10, stop ratio = 5.0
equilibrate: on, min_scale = 1.0e-04, max_scale = 1.0e+04
max iter = 10
iter pcost dcost gap pres dres k/t μ step
---------------------------------------------------------------------------------------------
0 1.3203e-16 -1.3981e+00 1.40e+00 3.83e-01 1.68e-01 1.00e+00 2.04e+00 ------
1 2.7695e-01 8.8296e-02 1.89e-01 9.11e-02 3.34e-02 2.62e-01 4.45e-01 8.34e-01
2 7.2394e-01 7.9586e-01 7.19e-02 2.34e-02 5.46e-03 1.90e-01 6.52e-02 8.83e-01
3 1.0043e+00 9.8945e-01 1.48e-02 5.47e-03 1.19e-03 1.38e-02 1.44e-02 9.90e-01
4 9.9849e-01 9.9765e-01 8.41e-04 2.47e-04 5.54e-05 4.49e-04 6.72e-04 9.53e-01
5 9.9992e-01 9.9993e-01 6.06e-06 1.25e-05 2.87e-06 7.11e-05 3.50e-05 9.90e-01
6 1.0000e+00 1.0000e+00 5.47e-08 1.29e-07 2.97e-08 7.28e-07 3.63e-07 9.90e-01
7 1.0000e+00 1.0000e+00 7.12e-10 1.72e-09 3.97e-10 9.70e-09 4.84e-09 9.87e-01
---------------------------------------------------------------------------------------------
Terminated with status = solved
solve time = 1.16ms
Here is our solution
evaluate(x)
2-element Vector{Float64}:
0.9999999999999998
0.999999997378313
and the solver termination status again
problem.status
OPTIMAL::TerminationStatusCode = 1
This page was generated using Literate.jl.