Maros-Meszaros dense subset¶
| Number of problems | 62 |
|---|---|
| Benchmark version | 2.3.0 |
| Date | 2024-09-07 14:57:17.966508+00:00 |
| CPU | Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz |
| 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¶
Subset of the Maros-Meszaros test set restricted to smaller dense problems.
Solvers¶
| solver | version |
|---|---|
| clarabel | 0.9.0 |
| cvxopt | 1.3.2 |
| daqp | 0.5.1 |
| ecos | 2.0.14 |
| gurobi | 11.0.3 (size-limited) |
| highs | 1.7.2 |
| hpipm | 0.2 |
| osqp | 0.6.7.post0 |
| piqp | 0.4.1 |
| proxqp | 0.6.6 |
| qpalm | 1.2.3 |
| qpoases | 3.2.1 |
| quadprog | 0.1.12 |
| scs | 3.2.6 |
All solvers were called via qpsolvers v4.3.3.
CPU info¶
| Property | Value |
|---|---|
arch |
X86_64 |
arch_string_raw |
x86_64 |
bits |
64 |
brand_raw |
Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz |
count |
4 |
cpuinfo_version_string |
9.0.0 |
family |
6 |
flags |
3dnowprefetch, abm, acpi, adx, aes, aperfmperf, apic, arat, arch_capabilities, arch_perfmon, art, avx, avx2, bmi1, bmi2, bts, clflush, clflushopt, cmov, constant_tsc, cpuid, cpuid_fault, cx16, cx8, de, ds_cpl, dtes64, dtherm, dts, epb, ept, ept_ad, erms, est, f16c, flexpriority, flush_l1d, fma, fpu, fsgsbase, fxsr, ht, hwp, hwp_act_window, hwp_epp, hwp_notify, ibpb, ibrs, ida, intel_pt, invpcid, invpcid_single, lahf_lm, lm, mca, mce, md_clear, mmx, monitor, movbe, mpx, msr, mtrr, nonstop_tsc, nopl, nx, osxsave, pae, pat, pbe, pcid, pclmulqdq, pdcm, pdpe1gb, pebs, pge, pln, pni, popcnt, pse, pse36, pti, pts, rdrand, rdrnd, rdseed, rdtscp, rep_good, sdbg, sep, sgx, smap, smep, ss, ssbd, sse, sse2, sse4_1, sse4_2, ssse3, stibp, syscall, tm, tm2, tpr_shadow, tsc, tsc_adjust, tsc_deadline_timer, tscdeadline, vme, vmx, vnmi, vpid, x2apic, xgetbv1, xsave, xsavec, xsaveopt, xsaves, xtopology, xtpr |
hz_actual_friendly |
2.6000 GHz |
hz_advertised_friendly |
2.5000 GHz |
l1_data_cache_size |
65536 |
l1_instruction_cache_size |
65536 |
l2_cache_associativity |
6 |
l2_cache_line_size |
256 |
l2_cache_size |
524288 |
l3_cache_size |
4194304 |
model |
78 |
python_version |
3.12.4.final.0 (64 bit) |
stepping |
3 |
vendor_id_raw |
GenuineIntel |
Settings¶
There are 4 settings: default, high_accuracy, low_accuracy and mid_accuracy. They validate solutions using the following tolerances:
| tolerance | default | high_accuracy | low_accuracy | mid_accuracy |
|---|---|---|---|---|
dual |
1 | 1e-09 | 0.001 | 1e-06 |
gap |
1 | 1e-09 | 0.001 | 1e-06 |
primal |
1 | 1e-09 | 0.001 | 1e-06 |
runtime |
1000 | 1000 | 1000 | 1000 |
Solvers for each settings are configured as follows:
| solver | parameter | default | high_accuracy | low_accuracy | mid_accuracy |
|---|---|---|---|---|---|
| clarabel | tol_feas |
- | 1e-09 | 0.001 | 1e-06 |
| clarabel | tol_gap_abs |
- | 1e-09 | 0.001 | 1e-06 |
| clarabel | tol_gap_rel |
- | 0.0 | 0.0 | 0.0 |
| cvxopt | feastol |
- | 1e-09 | 0.001 | 1e-06 |
| daqp | dual_tol |
- | 1e-09 | 0.001 | 1e-06 |
| daqp | primal_tol |
- | 1e-09 | 0.001 | 1e-06 |
| ecos | feastol |
- | 1e-09 | 0.001 | 1e-06 |
| gurobi | FeasibilityTol |
- | 1e-09 | 0.001 | 1e-06 |
| gurobi | OptimalityTol |
- | 1e-09 | 0.001 | 1e-06 |
| gurobi | TimeLimit |
1000.0 | 1000.0 | 1000.0 | 1000.0 |
| highs | dual_feasibility_tolerance |
- | 1e-09 | 0.001 | 1e-06 |
| highs | primal_feasibility_tolerance |
- | 1e-09 | 0.001 | 1e-06 |
| highs | time_limit |
1000.0 | 1000.0 | 1000.0 | 1000.0 |
| hpipm | tol_comp |
- | 1e-09 | 0.001 | 1e-06 |
| hpipm | tol_eq |
- | 1e-09 | 0.001 | 1e-06 |
| hpipm | tol_ineq |
- | 1e-09 | 0.001 | 1e-06 |
| hpipm | tol_stat |
- | 1e-09 | 0.001 | 1e-06 |
| osqp | eps_abs |
- | 1e-09 | 0.001 | 1e-06 |
| osqp | eps_rel |
- | 0.0 | 0.0 | 0.0 |
| osqp | time_limit |
1000.0 | 1000.0 | 1000.0 | 1000.0 |
| piqp | check_duality_gap |
- | 1.0 | 1.0 | 1.0 |
| piqp | eps_abs |
- | 1e-09 | 0.001 | 1e-06 |
| piqp | eps_duality_gap_abs |
- | 1e-09 | 0.001 | 1e-06 |
| piqp | eps_duality_gap_rel |
- | 0.0 | 0.0 | 0.0 |
| piqp | eps_rel |
- | 0.0 | 0.0 | 0.0 |
| proxqp | check_duality_gap |
- | 1.0 | 1.0 | 1.0 |
| proxqp | eps_abs |
- | 1e-09 | 0.001 | 1e-06 |
| proxqp | eps_duality_gap_abs |
- | 1e-09 | 0.001 | 1e-06 |
| proxqp | eps_duality_gap_rel |
- | 0.0 | 0.0 | 0.0 |
| proxqp | eps_rel |
- | 0.0 | 0.0 | 0.0 |
| qpalm | eps_abs |
- | 1e-09 | 0.001 | 1e-06 |
| qpalm | eps_rel |
- | 0.0 | 0.0 | 0.0 |
| qpalm | time_limit |
1000.0 | 1000.0 | 1000.0 | 1000.0 |
| qpoases | predefined_options |
default | reliable | fast | - |
| qpoases | time_limit |
1000.0 | 1000.0 | 1000.0 | 1000.0 |
| scs | eps_abs |
- | 1e-09 | 0.001 | 1e-06 |
| scs | eps_rel |
- | 0.0 | 0.0 | 0.0 |
| scs | time_limit_secs |
1000.0 | 1000.0 | 1000.0 | 1000.0 |
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.
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) | |
|---|---|---|---|---|---|
| clarabel | 51.6 | 20793.9 | 304539748.1 | 84505.9 | 2.4 |
| cvxopt | 66.1 | 5835.1 | 160672590.1 | 44582.8 | 5.8 |
| daqp | 30.6 | 58795.1 | 440931769.1 | 122347.0 | 3.4 |
| ecos | 12.9 | 126497.0 | 547719105.2 | 155901.6 | 4.2 |
| gurobi | 56.5 | 16132.9 | 273449877.0 | 75875.2 | 2.1 |
| highs | 72.6 | 1364.7 | 49787378.8 | 14012.1 | 23.6 |
| hpipm | 24.2 | 20794.6 | 4812749808.5 | 84501.8 | 2.4 |
| osqp | 51.6 | 1409.0 | 3404366339.9 | 592424.2 | 577.2 |
| piqp | 98.4 | 1.0 | 1.0 | 1.0 | 1.1 |
| proxqp | 85.5 | 2067.5 | 79843142.0 | 22154.3 | 1.0 |
| qpalm | 59.7 | 198.1 | 448093182.1 | 37815.9 | 147.2 |
| qpoases | 24.2 | 17999.9 | 4409382869.3 | 3869853.2 | 2.2 |
| quadprog | 32.3 | 54380.5 | 430342953.5 | 119408.9 | 3.3 |
| scs | 71.0 | 440.7 | 1837055027.2 | 61344.3 | 71.4 |
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) | |
|---|---|---|---|---|---|
| clarabel | 43.5 | 20.1 | 4.6 | 5.1 | 1.9 |
| cvxopt | 8.1 | 7.0 | 7.7 | 777.4 | 841504147.6 |
| daqp | 24.2 | 56.4 | 299.6 | 3.5 | 1363649.6 |
| ecos | 0.0 | 112.3 | 7.8 | 24030498.5 | 1008053.0 |
| gurobi | 16.1 | 14.3 | 4.3 | 581.0 | 13358.4 |
| highs | 0.0 | 1.5 | 14897.3 | 5219407.6 | 10340470841.6 |
| hpipm | 41.9 | 25.6 | 5.0 | 2.7 | 5.2 |
| osqp | 41.9 | 18.5 | 5.1 | 2.7 | 3.7 |
| piqp | 80.6 | 1.0 | 1.0 | 1.2 | 5.3 |
| proxqp | 75.8 | 2.8 | 2.2 | 1.0 | 2.4 |
| qpalm | 46.8 | 6.9 | 3.7 | 1.8 | 291.1 |
| qpoases | 19.4 | 17.7 | 55892436445.8 | 95778787657.2 | 1.7 |
| quadprog | 25.8 | 48.3 | 11.6 | 13.0 | 11.5 |
| scs | 67.7 | 7.6 | 3.4 | 1.9 | 1.0 |
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) | |
|---|---|---|---|---|---|
| clarabel | 48.4 | 26095.2 | 150.7 | 6.2 | 2.7 |
| cvxopt | 51.6 | 6589.8 | 75.4 | 2.8 | 3672.6 |
| daqp | 25.8 | 73786.0 | 261.7 | 7.7 | 5.4 |
| ecos | 11.3 | 171259.8 | 271.3 | 10.9 | 3.7 |
| gurobi | 56.5 | 20245.5 | 135.6 | 4.8 | 1.8 |
| highs | 58.1 | 510.1 | 10.6 | 7.5 | 19917.3 |
| hpipm | 35.5 | 33412.9 | 167.0 | 6.2 | 14.8 |
| osqp | 38.7 | 15569.4 | 145.6 | 5.9 | 563.3 |
| piqp | 100.0 | 1.0 | 1.0 | 1.2 | 1.0 |
| proxqp | 82.3 | 2593.5 | 54.0 | 1.5 | 40.3 |
| qpalm | 56.5 | 250.6 | 60.6 | 1.0 | 4435.3 |
| qpoases | 19.4 | 26184.2 | 1244352.5 | 150752.3 | 2.0 |
| quadprog | 32.3 | 68246.7 | 211.0 | 7.5 | 2.8 |
| scs | 80.6 | 4618.3 | 94.1 | 3.1 | 1.5 |
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) | |
|---|---|---|---|---|---|
| clarabel | 50.0 | 116.6 | 28.9 | 8.4 | 2.9 |
| cvxopt | 35.5 | 27.1 | 14.1 | 90.7 | 4185008.3 |
| daqp | 25.8 | 303.4 | 47.2 | 10.7 | 2879.5 |
| ecos | 1.6 | 652.7 | 49.4 | 7839634.2 | 781855.6 |
| gurobi | 41.9 | 83.3 | 25.2 | 8.6 | 30.2 |
| highs | 41.9 | 4.5 | 98.1 | 17106.6 | 22835974.2 |
| hpipm | 41.9 | 149.0 | 31.7 | 8.8 | 5.2 |
| osqp | 41.9 | 83.2 | 27.7 | 8.9 | 10.0 |
| piqp | 98.4 | 1.0 | 1.0 | 1.0 | 1.0 |
| proxqp | 87.1 | 10.7 | 11.1 | 2.3 | 1.5 |
| qpalm | 53.2 | 4.5 | 13.8 | 1.7 | 20336.5 |
| qpoases | 19.4 | 85.3 | 778371782.1 | 311509421.3 | 3.4 |
| quadprog | 32.3 | 280.6 | 39.2 | 10.5 | 3.2 |
| scs | 74.2 | 29.7 | 18.4 | 5.2 | 1.8 |
Results by metric¶
Success rate¶
Precentage of problems each solver is able to solve:
| default | high_accuracy | low_accuracy | mid_accuracy | |
|---|---|---|---|---|
| clarabel | 52 | 44 | 48 | 50 |
| cvxopt | 66 | 8 | 52 | 35 |
| daqp | 31 | 24 | 26 | 26 |
| ecos | 13 | 0 | 11 | 2 |
| gurobi | 56 | 16 | 56 | 42 |
| highs | 73 | 0 | 58 | 42 |
| hpipm | 24 | 42 | 35 | 42 |
| osqp | 52 | 42 | 39 | 42 |
| piqp | 98 | 81 | 100 | 98 |
| proxqp | 85 | 76 | 82 | 87 |
| qpalm | 60 | 47 | 56 | 53 |
| qpoases | 24 | 19 | 19 | 19 |
| quadprog | 32 | 26 | 32 | 32 |
| scs | 71 | 68 | 81 | 74 |
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:
| default | high_accuracy | low_accuracy | mid_accuracy | |
|---|---|---|---|---|
| clarabel | 100 | 94 | 97 | 100 |
| cvxopt | 92 | 39 | 76 | 60 |
| daqp | 100 | 95 | 95 | 95 |
| ecos | 98 | 85 | 98 | 87 |
| gurobi | 100 | 60 | 100 | 85 |
| highs | 81 | 10 | 61 | 48 |
| hpipm | 73 | 97 | 89 | 97 |
| osqp | 61 | 90 | 77 | 85 |
| piqp | 98 | 89 | 100 | 100 |
| proxqp | 98 | 94 | 95 | 100 |
| qpalm | 61 | 77 | 58 | 60 |
| qpoases | 69 | 65 | 68 | 63 |
| quadprog | 100 | 94 | 100 | 100 |
| scs | 74 | 100 | 100 | 100 |
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):
| default | high_accuracy | low_accuracy | mid_accuracy | |
|---|---|---|---|---|
| clarabel | 20793.9 | 20.1 | 26095.2 | 116.6 |
| cvxopt | 5835.1 | 7.0 | 6589.8 | 27.1 |
| daqp | 58795.1 | 56.4 | 73786.0 | 303.4 |
| ecos | 126497.0 | 112.3 | 171259.8 | 652.7 |
| gurobi | 16132.9 | 14.3 | 20245.5 | 83.3 |
| highs | 1364.7 | 1.5 | 510.1 | 4.5 |
| hpipm | 20794.6 | 25.6 | 33412.9 | 149.0 |
| osqp | 1409.0 | 18.5 | 15569.4 | 83.2 |
| piqp | 1.0 | 1.0 | 1.0 | 1.0 |
| proxqp | 2067.5 | 2.8 | 2593.5 | 10.7 |
| qpalm | 198.1 | 6.9 | 250.6 | 4.5 |
| qpoases | 17999.9 | 17.7 | 26184.2 | 85.3 |
| quadprog | 54380.5 | 48.3 | 68246.7 | 280.6 |
| scs | 440.7 | 7.6 | 4618.3 | 29.7 |
Rows are solvers and columns are solver settings. The shift is sh = 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):
| default | high_accuracy | low_accuracy | mid_accuracy | |
|---|---|---|---|---|
| clarabel | 304539748.1 | 4.6 | 150.7 | 28.9 |
| cvxopt | 160672590.1 | 7.7 | 75.4 | 14.1 |
| daqp | 440931769.1 | 299.6 | 261.7 | 47.2 |
| ecos | 547719105.2 | 7.8 | 271.3 | 49.4 |
| gurobi | 273449877.0 | 4.3 | 135.6 | 25.2 |
| highs | 49787378.8 | 14897.3 | 10.6 | 98.1 |
| hpipm | 4812749808.5 | 5.0 | 167.0 | 31.7 |
| osqp | 3404366339.9 | 5.1 | 145.6 | 27.7 |
| piqp | 1.0 | 1.0 | 1.0 | 1.0 |
| proxqp | 79843142.0 | 2.2 | 54.0 | 11.1 |
| qpalm | 448093182.1 | 3.7 | 60.6 | 13.8 |
| qpoases | 4409382869.3 | 55892436445.8 | 1244352.5 | 778371782.1 |
| quadprog | 430342953.5 | 11.6 | 211.0 | 39.2 |
| scs | 1837055027.2 | 3.4 | 94.1 | 18.4 |
Rows are solvers and columns are solver settings. The shift is sh = 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):
| default | high_accuracy | low_accuracy | mid_accuracy | |
|---|---|---|---|---|
| clarabel | 84505.9 | 5.1 | 6.2 | 8.4 |
| cvxopt | 44582.8 | 777.4 | 2.8 | 90.7 |
| daqp | 122347.0 | 3.5 | 7.7 | 10.7 |
| ecos | 155901.6 | 24030498.5 | 10.9 | 7839634.2 |
| gurobi | 75875.2 | 581.0 | 4.8 | 8.6 |
| highs | 14012.1 | 5219407.6 | 7.5 | 17106.6 |
| hpipm | 84501.8 | 2.7 | 6.2 | 8.8 |
| osqp | 592424.2 | 2.7 | 5.9 | 8.9 |
| piqp | 1.0 | 1.2 | 1.2 | 1.0 |
| proxqp | 22154.3 | 1.0 | 1.5 | 2.3 |
| qpalm | 37815.9 | 1.8 | 1.0 | 1.7 |
| qpoases | 3869853.2 | 95778787657.2 | 150752.3 | 311509421.3 |
| quadprog | 119408.9 | 13.0 | 7.5 | 10.5 |
| scs | 61344.3 | 1.9 | 3.1 | 5.2 |
Rows are solvers and columns are solver settings. The shift is sh = 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):
| default | high_accuracy | low_accuracy | mid_accuracy | |
|---|---|---|---|---|
| clarabel | 2.4 | 1.9 | 2.7 | 2.9 |
| cvxopt | 5.8 | 841504147.6 | 3672.6 | 4185008.3 |
| daqp | 3.4 | 1363649.6 | 5.4 | 2879.5 |
| ecos | 4.2 | 1008053.0 | 3.7 | 781855.6 |
| gurobi | 2.1 | 13358.4 | 1.8 | 30.2 |
| highs | 23.6 | 10340470841.6 | 19917.3 | 22835974.2 |
| hpipm | 2.4 | 5.2 | 14.8 | 5.2 |
| osqp | 577.2 | 3.7 | 563.3 | 10.0 |
| piqp | 1.1 | 5.3 | 1.0 | 1.0 |
| proxqp | 1.0 | 2.4 | 40.3 | 1.5 |
| qpalm | 147.2 | 291.1 | 4435.3 | 20336.5 |
| qpoases | 2.2 | 1.7 | 2.0 | 3.4 |
| quadprog | 3.3 | 11.5 | 2.8 | 3.2 |
| scs | 71.4 | 1.0 | 1.5 | 1.8 |
Rows are solvers and columns are solver settings. The shift is sh = 10. A solver that fails to find a solution receives a duality gap equal to the full gap tolerance.