The source files for all examples can be found in /examples.

Quadratic Program

We want to solve the following quadratic program with decision variable x:

\[\begin{array}{ll} \text{minimize} & 1/2 x^\top P x + q^\top x \\ \text{subject to} & l \leq A x \leq u \end{array}\]

The problem can be solved with COSMO in the following way. Start by defining the problem data

using COSMO, SparseArrays, LinearAlgebra, Test

q = [1; 1.];
P = sparse([4. 1; 1 2]);
A = [1. 1; 1 0; 0 1];
l = [1.; 0; 0];
u = [1; 0.7; 0.7];

First, we decide to solve the problem with two one-sided constraints using COSMO.Nonnegatives as the convex set:

Aa = [-A; A]
ba = [u; -l]
constraint1 = COSMO.Constraint(Aa, ba, COSMO.Nonnegatives);

Next, we define the settings object, the model and then assemble everything:

settings = COSMO.Settings(verbose=true);
model = COSMO.Model();
assemble!(model, P, q, constraint1, settings = settings);
res = COSMO.optimize!(model);
------------------------------------------------------------------
          COSMO v0.8.9 - A Quadratic Objective Conic Solver
                         Michael Garstka
                University of Oxford, 2017 - 2022
------------------------------------------------------------------

Problem:  x ∈ R^{2},
          constraints: A ∈ R^{6x2} (8 nnz),
          matrix size to factor: 8x8,
          Floating-point precision: Float64
Sets:     Nonnegatives of dim: 6
Settings: ϵ_abs = 1.0e-05, ϵ_rel = 1.0e-05,
          ϵ_prim_inf = 1.0e-04, ϵ_dual_inf = 1.0e-04,
          ρ = 0.1, σ = 1e-06, α = 1.6,
          max_iter = 5000,
          scaling iter = 10 (on),
          check termination every 25 iter,
          check infeasibility every 40 iter,
          KKT system solver: QDLDL
Acc:      Anderson Type2{QRDecomp},
          Memory size = 8, RestartedMemory,
          Safeguarded: true, tol: 2.0
Setup Time: 0.08ms

Iter:	Objective:	Primal Res:	Dual Res:	Rho:
1	-2.0835e-01	1.2796e+00	2.3510e-01	1.0000e-01
25	 1.8800e+00	9.4269e-16	0.0000e+00	1.0000e-01

------------------------------------------------------------------
>>> Results
Status: Solved
Iterations: 30 (incl. 5 safeguarding iter)
Optimal objective: 1.88
Runtime: 0.001s (0.55ms)

Alternatively, we can also use two-sided constraints with COSMO.Box:

constraint1 = COSMO.Constraint(A, zeros(3), COSMO.Box(l, u));

model = COSMO.Model();
assemble!(model, P, q, constraint1, settings = settings);
res_box = COSMO.optimize!(model);
------------------------------------------------------------------
          COSMO v0.8.9 - A Quadratic Objective Conic Solver
                         Michael Garstka
                University of Oxford, 2017 - 2022
------------------------------------------------------------------

Problem:  x ∈ R^{2},
          constraints: A ∈ R^{3x2} (4 nnz),
          matrix size to factor: 5x5,
          Floating-point precision: Float64
Sets:     Box of dim: 3
Settings: ϵ_abs = 1.0e-05, ϵ_rel = 1.0e-05,
          ϵ_prim_inf = 1.0e-04, ϵ_dual_inf = 1.0e-04,
          ρ = 0.1, σ = 1e-06, α = 1.6,
          max_iter = 5000,
          scaling iter = 10 (on),
          check termination every 25 iter,
          check infeasibility every 40 iter,
          KKT system solver: QDLDL
Acc:      Anderson Type2{QRDecomp},
          Memory size = 5, RestartedMemory,
          Safeguarded: true, tol: 2.0
Setup Time: 0.07ms

Iter:	Objective:	Primal Res:	Dual Res:	Rho:
1	-7.8808e-03	1.0079e+00	2.0033e+02	1.0000e-01
25	 1.8800e+00	1.5712e-16	8.8818e-16	1.0000e-01

------------------------------------------------------------------
>>> Results
Status: Solved
Iterations: 26 (incl. 1 safeguarding iter)
Optimal objective: 1.88
Runtime: 0.004s (3.66ms)

Let's check that the solution is correct:

@testset "QP Problem" begin
  @test norm(res.x[1:2] - [0.3; 0.7], Inf) < 1e-3
  @test norm(res_box.x[1:2] - [0.3; 0.7], Inf) < 1e-3
  @test abs(res.obj_val - 1.88) < 1e-3
  @test abs(res_box.obj_val - 1.88) < 1e-3
end
nothing
Test Summary: | Pass  Total  Time
QP Problem    |    4      4  0.1s

This page was generated using Literate.jl.