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.