Model predictive control test set (sparse)

April 7, 2026 ยท View on GitHub

Number of problems4
Benchmark version2.5.0
Date2026-04-07 18:05:51.078798+00:00
CPUAMD Ryzen 7 8845HS w/ Radeon 780M Graphics
Run by@stephane-caron

Benchmark reports are copious as we aim to document comparison factors as much as possible. You can also jump to results directly.

Contents

Description

Problems arising from model predictive control in robotics, restricted to instances with sparse cost matrices (QUADCMPC).

Solvers

solverversion
clarabel0.11.1
cvxopt1.3.3
gurobi13.0.1 (size-limited)
highs1.14.0
kvxopt1.3.3.1
osqp1.1.1
piqp0.6.2
proxqp0.7.2
qpalm1.2.6
scs3.2.11

All solvers were called via qpsolvers v4.10.0.

CPU info

PropertyValue
archX86_64
arch_string_rawx86_64
bits64
brand_rawAMD Ryzen 7 8845HS w/ Radeon 780M Graphics
count16
family25
flags3dnowext, 3dnowprefetch, abm, adx, aes, amd_lbr_v2, aperfmperf, apic, arat, avx, avx2, avx512_bf16, avx512_bitalg, avx512_vbmi2, avx512_vnni, avx512_vpopcntdq, avx512bitalg, avx512bw, avx512cd, avx512dq, avx512f, avx512ifma, avx512vbmi, avx512vbmi2, avx512vl, avx512vnni, avx512vpopcntdq, bmi1, bmi2, bpext, cat_l3, cdp_l3, clflush, clflushopt, clwb, clzero, cmov, cmp_legacy, constant_tsc, cpb, cppc, cpuid, cpuid_fault, cqm, cqm_llc, cqm_mbm_local, cqm_mbm_total, cqm_occup_llc, cr8_legacy, cx16, cx8, dbx, de, decodeassists, erms, extapic, extd_apicid, f16c, flush_l1d, flushbyasid, fma, fpu, fsgsbase, fsrm, fxsr, fxsr_opt, gfni, ht, hw_pstate, ibpb, ibrs, ibrs_enhanced, ibs, invpcid, irperf, lahf_lm, lbrv, lm, mba, mca, mce, misalignsse, mmx, mmxext, monitor, movbe, msr, mtrr, mwaitx, nonstop_tsc, nopl, npt, nrip_save, nx, ospke, osvw, osxsave, overflow_recov, pae, pat, pausefilter, pci_l2i, pclmulqdq, pdpe1gb, perfctr_core, perfctr_llc, perfctr_nb, perfmon_v2, pfthreshold, pge, pku, pni, popcnt, pqe, pqm, pse, pse36, rapl, rdpid, rdpru, rdrand, rdrnd, rdseed, rdt_a, rdtscp, rep_good, sep, sha, sha_ni, skinit, smap, smca, smep, ssbd, sse, sse2, sse4_1, sse4_2, sse4a, ssse3, stibp, succor, svm, svm_lock, syscall, tce, topoext, tsc, tsc_scale, umip, user_shstk, v_spec_ctrl, vaes, vgif, vmcb_clean, vme, vmmcall, vnmi, vpclmulqdq, wbnoinvd, wdt, x2apic, x2avic, xgetbv1, xsave, xsavec, xsaveerptr, xsaveopt, xsaves, xtopology
l1_data_cache_size262144
l1_instruction_cache_size262144
l2_cache_associativity6
l2_cache_line_size1024
l2_cache_size8388608
l3_cache_size1048576
model117
python_version3.14.3.final.0 (64 bit)
stepping2
vendor_id_rawAuthenticAMD

Settings

There are 4 settings: default, high_accuracy, low_accuracy and mid_accuracy. They validate solutions using the following tolerances:

tolerancedefaulthigh_accuracylow_accuracymid_accuracy
dual11e-090.0011e-06
gap11e-090.0011e-06
primal11e-090.0011e-06
runtime10101010

Solvers for each settings are configured as follows:

solverparameterdefaulthigh_accuracylow_accuracymid_accuracy
clarabeltol_feas-1e-090.0011e-06
clarabeltol_gap_abs-1e-090.0011e-06
clarabeltol_gap_rel-000
cvxoptfeastol-1e-090.0011e-06
gurobiFeasibilityTol-1e-090.0011e-06
gurobiOptimalityTol-1e-090.0011e-06
gurobiTimeLimit10.0101010
highsdual_feasibility_tolerance-1e-090.0011e-06
highsprimal_feasibility_tolerance-1e-090.0011e-06
highstime_limit10.0101010
kvxoptfeastol-1e-090.0011e-06
osqpeps_abs-1e-090.0011e-06
osqpeps_rel-000
osqptime_limit10.0101010
piqpcheck_duality_gap-111
piqpeps_abs-1e-090.0011e-06
piqpeps_duality_gap_abs-1e-090.0011e-06
piqpeps_duality_gap_rel-000
piqpeps_rel-000
proxqpcheck_duality_gap-111
proxqpeps_abs-1e-090.0011e-06
proxqpeps_duality_gap_abs-1e-090.0011e-06
proxqpeps_duality_gap_rel-000
proxqpeps_rel-000
qpalmeps_abs-1e-090.0011e-06
qpalmeps_rel-000
qpalmtime_limit10.0101010
scseps_abs-1e-090.0011e-06
scseps_rel-000
scstime_limit_secs10.0101010

Known limitations

The following issues have been identified as impacting the fairness of this benchmark. Keep them in mind when drawing conclusions from the results.

  • #60: Conversion to SOCP limits performance of ECOS
  • #88: CPU thermal throttling

Results by settings

Default

Solvers are compared over the whole test set by shifted geometric mean (shm). Lower is better, 1.0 is the best.

Success rate (%)Runtime (shm)Primal residual (shm)Dual residual (shm)Duality gap (shm)
clarabel100.01.41.01.01.0
cvxopt0.02529.9562949953421313.058451869320.0571082742.8
gurobi0.02529.9562949953421313.058451869320.0571082742.8
highs75.0522.9135748005151019.014094966907.1137927645.4
kvxopt0.02529.9562949953421313.058451869320.0571082742.8
osqp100.01.01716385612685.0271327.8174044.8
piqp100.020.06.083.71.2
proxqp100.014.41552581870.0213908.8710141.3
qpalm100.01.0273576056623.0849112.5541560.6
scs100.05.3152239032446.0120963.817772.8

High accuracy

Solvers are compared over the whole test set by shifted geometric mean (shm). Lower is better, 1.0 is the best.

Success rate (%)Runtime (shm)Primal residual (shm)Dual residual (shm)Duality gap (shm)
clarabel100.01.01.027.24841.9
cvxopt0.01888.6562951.014434.651177.4
gurobi0.01888.6562951.014434.651177.4
highs0.01888.6562951.014434.651177.4
kvxopt0.01888.6562951.014434.651177.4
osqp0.01888.6562951.014434.651177.4
piqp100.028.11.01417.16028.1
proxqp75.0390.3168866.03692.723916.7
qpalm100.02.0247489.01.01.0
scs100.018.3502236.03.424181.5

Low accuracy

Solvers are compared over the whole test set by shifted geometric mean (shm). Lower is better, 1.0 is the best.

Success rate (%)Runtime (shm)Primal residual (shm)Dual residual (shm)Duality gap (shm)
clarabel100.01.381241.91.05.6
cvxopt0.03512.735184372088.86197.221.8
gurobi0.03512.735184372088.86197.221.8
highs0.045.71.018.67036.3
kvxopt0.03512.735184372088.86197.221.8
osqp100.01.514080910258.814.37.8
piqp100.0113.561751.2636.44.0
proxqp100.022.197028399.74.21.0
qpalm75.01.017098503538.990.020.7
scs100.01.79267168387.21191.818.6

Mid accuracy

Solvers are compared over the whole test set by shifted geometric mean (shm). Lower is better, 1.0 is the best.

Success rate (%)Runtime (shm)Primal residual (shm)Dual residual (shm)Duality gap (shm)
clarabel100.01.21.01.01.3
cvxopt0.02467.98529544.719240.26.1
gurobi0.02467.98529544.719240.26.1
highs0.0502.12167368.426658.92453.2
kvxopt0.02467.98529544.719240.26.1
osqp25.01683.18523196.714430.24.6
piqp100.037.31.02017.01.0
proxqp75.0476.22217327.45209.33.1
qpalm100.01.01761193.82288.21.4
scs100.09.04426330.15.81.1

Results by metric

Success rate

Precentage of problems each solver is able to solve:

defaulthigh_accuracylow_accuracymid_accuracy
clarabel100100100100
cvxopt0000
gurobi0000
highs75000
kvxopt0000
osqp100010025
piqp100100100100
proxqp1007510075
qpalm10010075100
scs100100100100

Rows are solvers and columns are settings. We consider that a solver successfully solved a problem when (1) it returned with a success status and (2) its solution satisfies optimality conditions within tolerance. The second table below summarizes the frequency at which solvers return success (1) and the corresponding solution did indeed pass tolerance checks.

Percentage of problems where "solved" return codes are correct:

defaulthigh_accuracylow_accuracymid_accuracy
clarabel100100100100
cvxopt100100100100
gurobi100100100100
highs100100025
kvxopt100100100100
osqp100100100100
piqp100100100100
proxqp100100100100
qpalm10010075100
scs100100100100

Computation time

We compare solver computation times over the whole test set using the shifted geometric mean. Intuitively, a solver with a shifted-geometric-mean runtime of Y is Y times slower than the best solver over the test set. See Metrics for details.

Shifted geometric mean of solver computation times (1.0 is the best):

defaulthigh_accuracylow_accuracymid_accuracy
clarabel1.41.01.31.2
cvxopt2529.91888.63512.72467.9
gurobi2529.91888.63512.72467.9
highs522.91888.645.7502.1
kvxopt2529.91888.63512.72467.9
osqp1.01888.61.51683.1
piqp20.028.1113.537.3
proxqp14.4390.322.1476.2
qpalm1.02.01.01.0
scs5.318.31.79.0

Rows are solvers and columns are solver settings. The shift is sh=10sh = 10. As in the OSQP and ProxQP benchmarks, we assume a solver's run time is at the time limit when it fails to solve a problem.

Optimality conditions

Primal residual

The primal residual measures the maximum (equality and inequality) constraint violation in the solution returned by a solver. We use the shifted geometric mean to compare solver primal residuals over the whole test set. Intuitively, a solver with a shifted-geometric-mean primal residual of Y is Y times less precise on constraints than the best solver over the test set. See Metrics for details.

Shifted geometric means of primal residuals (1.0 is the best):

defaulthigh_accuracylow_accuracymid_accuracy
clarabel1.01.081241.91.0
cvxopt562949953421313.0562951.035184372088.88529544.7
gurobi562949953421313.0562951.035184372088.88529544.7
highs135748005151019.0562951.01.02167368.4
kvxopt562949953421313.0562951.035184372088.88529544.7
osqp1716385612685.0562951.014080910258.88523196.7
piqp6.01.061751.21.0
proxqp1552581870.0168866.097028399.72217327.4
qpalm273576056623.0247489.017098503538.91761193.8
scs152239032446.0502236.09267168387.24426330.1

Rows are solvers and columns are solver settings. The shift is sh=10sh = 10. A solver that fails to find a solution receives a primal residual equal to the full primal tolerance.

Dual residual

The dual residual measures the maximum violation of the dual feasibility condition in the solution returned by a solver. We use the shifted geometric mean to compare solver dual residuals over the whole test set. Intuitively, a solver with a shifted-geometric-mean dual residual of Y is Y times less precise on the dual feasibility condition than the best solver over the test set. See Metrics for details.

Shifted geometric means of dual residuals (1.0 is the best):

defaulthigh_accuracylow_accuracymid_accuracy
clarabel1.027.21.01.0
cvxopt58451869320.014434.66197.219240.2
gurobi58451869320.014434.66197.219240.2
highs14094966907.114434.618.626658.9
kvxopt58451869320.014434.66197.219240.2
osqp271327.814434.614.314430.2
piqp83.71417.1636.42017.0
proxqp213908.83692.74.25209.3
qpalm849112.51.090.02288.2
scs120963.83.41191.85.8

Rows are solvers and columns are solver settings. The shift is sh=10sh = 10. A solver that fails to find a solution receives a dual residual equal to the full dual tolerance.

Duality gap

The duality gap measures the consistency of the primal and dual solutions returned by a solver. A duality gap close to zero ensures that the complementarity slackness optimality condition is satisfied. We use the shifted geometric mean to compare solver duality gaps over the whole test set. Intuitively, a solver with a shifted-geometric-mean duality gap of Y is Y times less precise on the complementarity slackness condition than the best solver over the test set. See Metrics for details.

Shifted geometric means of duality gaps (1.0 is the best):

defaulthigh_accuracylow_accuracymid_accuracy
clarabel1.04841.95.61.3
cvxopt571082742.851177.421.86.1
gurobi571082742.851177.421.86.1
highs137927645.451177.47036.32453.2
kvxopt571082742.851177.421.86.1
osqp174044.851177.47.84.6
piqp1.26028.14.01.0
proxqp710141.323916.71.03.1
qpalm541560.61.020.71.4
scs17772.824181.518.61.1

Rows are solvers and columns are solver settings. The shift is sh=10sh = 10. A solver that fails to find a solution receives a duality gap equal to the full gap tolerance.