diff --git a/results/20260306_dhruv_windows.jsonl b/results/20260306_dhruv_windows.jsonl new file mode 100644 index 0000000..234515b --- /dev/null +++ b/results/20260306_dhruv_windows.jsonl @@ -0,0 +1,15 @@ +{"problem_name": "qp/portfolio_large", "solver_name": "CLARABEL", "compilation_time": 0.10566091537475586, "solve_time": 0.1790603, "setup_time": null, "total_time": 0.31874770001741126, "status": "optimal", "objective_value": -0.11845479466053731, "num_iters": 10, "problem_type": "QP", "num_scalar_variables": 2000, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 2000, "cvxpy_version": "1.8.1", "solver_version": "CLARABEL", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:33.907487+00:00", "contributor": "dhruv"} +{"problem_name": "qp/portfolio_large", "solver_name": "HIGHS", "compilation_time": 0.042612552642822266, "solve_time": 0.1562458999978844, "setup_time": null, "total_time": 0.2362062999745831, "status": "optimal", "objective_value": -0.11845479927483858, "num_iters": 176, "problem_type": "QP", "num_scalar_variables": 2000, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 2000, "cvxpy_version": "1.8.1", "solver_version": "HIGHS", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:34.149288+00:00", "contributor": "dhruv"} +{"problem_name": "qp/portfolio_large", "solver_name": "OSQP", "compilation_time": 0.03833127021789551, "solve_time": 0.29224459999999997, "setup_time": null, "total_time": 0.3394095000112429, "status": "optimal", "objective_value": -0.11845479927483929, "num_iters": 550, "problem_type": "QP", "num_scalar_variables": 2000, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 2000, "cvxpy_version": "1.8.1", "solver_version": "OSQP", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:34.493458+00:00", "contributor": "dhruv"} +{"problem_name": "qp/portfolio_large", "solver_name": "SCIPY", "compilation_time": null, "solve_time": null, "setup_time": null, "total_time": 0.0003561000048648566, "status": "solver_error", "objective_value": null, "num_iters": null, "problem_type": "QP", "num_scalar_variables": 2000, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 2000, "cvxpy_version": "1.8.1", "solver_version": "", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:34.500011+00:00", "contributor": "dhruv"} +{"problem_name": "qp/portfolio_large", "solver_name": "SCS", "compilation_time": 0.04887056350708008, "solve_time": 0.31787079999999995, "setup_time": 0.026249500000000002, "total_time": 0.39838179998332635, "status": "optimal", "objective_value": -0.11845405674731666, "num_iters": 525, "problem_type": "QP", "num_scalar_variables": 2000, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 2000, "cvxpy_version": "1.8.1", "solver_version": "SCS", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:34.901465+00:00", "contributor": "dhruv"} +{"problem_name": "qp/risk_parity_small", "solver_name": "CLARABEL", "compilation_time": 0.004888772964477539, "solve_time": 0.001065, "setup_time": null, "total_time": 0.006660699989879504, "status": "optimal", "objective_value": 0.0002597606131069493, "num_iters": 9, "problem_type": "QP", "num_scalar_variables": 50, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 50, "cvxpy_version": "1.8.1", "solver_version": "CLARABEL", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:34.923483+00:00", "contributor": "dhruv"} +{"problem_name": "qp/risk_parity_small", "solver_name": "HIGHS", "compilation_time": 0.0042154788970947266, "solve_time": 0.001967000018339604, "setup_time": null, "total_time": 0.007648599974345416, "status": "optimal", "objective_value": 0.00025976013848479513, "num_iters": 143, "problem_type": "QP", "num_scalar_variables": 50, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 50, "cvxpy_version": "1.8.1", "solver_version": "HIGHS", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:34.934212+00:00", "contributor": "dhruv"} +{"problem_name": "qp/risk_parity_small", "solver_name": "OSQP", "compilation_time": 0.003573894500732422, "solve_time": 0.0004896, "setup_time": null, "total_time": 0.0061113999981898814, "status": "optimal", "objective_value": 0.000259760138484762, "num_iters": 50, "problem_type": "QP", "num_scalar_variables": 50, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 50, "cvxpy_version": "1.8.1", "solver_version": "OSQP", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:34.943348+00:00", "contributor": "dhruv"} +{"problem_name": "qp/risk_parity_small", "solver_name": "SCIPY", "compilation_time": null, "solve_time": null, "setup_time": null, "total_time": 0.00024210000992752612, "status": "solver_error", "objective_value": null, "num_iters": null, "problem_type": "QP", "num_scalar_variables": 50, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 50, "cvxpy_version": "1.8.1", "solver_version": "", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:34.947202+00:00", "contributor": "dhruv"} +{"problem_name": "qp/risk_parity_small", "solver_name": "SCS", "compilation_time": 0.0046880245208740234, "solve_time": 0.000127, "setup_time": 0.0002821, "total_time": 0.005818600009661168, "status": "optimal", "objective_value": 0.0002597601288857309, "num_iters": 25, "problem_type": "QP", "num_scalar_variables": 50, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 50, "cvxpy_version": "1.8.1", "solver_version": "SCS", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:34.957040+00:00", "contributor": "dhruv"} +{"problem_name": "qp/risk_parity_medium", "solver_name": "CLARABEL", "compilation_time": 0.06456303596496582, "solve_time": 0.1214088, "setup_time": null, "total_time": 0.2096603999962099, "status": "optimal", "objective_value": 2.118578042230701e-05, "num_iters": 7, "problem_type": "QP", "num_scalar_variables": 500, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 500, "cvxpy_version": "1.8.1", "solver_version": "CLARABEL", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:35.351168+00:00", "contributor": "dhruv"} +{"problem_name": "qp/risk_parity_medium", "solver_name": "HIGHS", "compilation_time": 0.07010722160339355, "solve_time": 0.37664390000281855, "setup_time": null, "total_time": 0.49977530000614934, "status": "optimal", "objective_value": 2.1185435511323312e-05, "num_iters": 1497, "problem_type": "QP", "num_scalar_variables": 500, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 500, "cvxpy_version": "1.8.1", "solver_version": "HIGHS", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:36.068529+00:00", "contributor": "dhruv"} +{"problem_name": "qp/risk_parity_medium", "solver_name": "OSQP", "compilation_time": 0.07428789138793945, "solve_time": 0.0788078, "setup_time": null, "total_time": 0.1605682999943383, "status": "optimal", "objective_value": 2.1185435511323264e-05, "num_iters": 50, "problem_type": "QP", "num_scalar_variables": 500, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 500, "cvxpy_version": "1.8.1", "solver_version": "OSQP", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:36.423339+00:00", "contributor": "dhruv"} +{"problem_name": "qp/risk_parity_medium", "solver_name": "SCIPY", "compilation_time": null, "solve_time": null, "setup_time": null, "total_time": 0.0002442999975755811, "status": "solver_error", "objective_value": null, "num_iters": null, "problem_type": "QP", "num_scalar_variables": 500, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 500, "cvxpy_version": "1.8.1", "solver_version": "", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:36.703979+00:00", "contributor": "dhruv"} +{"problem_name": "qp/risk_parity_medium", "solver_name": "SCS", "compilation_time": 0.06734466552734375, "solve_time": 0.007136, "setup_time": 0.0399389, "total_time": 0.12719250001828186, "status": "optimal", "objective_value": 2.1185434418243035e-05, "num_iters": 25, "problem_type": "QP", "num_scalar_variables": 500, "num_scalar_eq_constr": 1, "num_scalar_leq_constr": 500, "cvxpy_version": "1.8.1", "solver_version": "SCS", "python_version": "3.13.12", "os_info": "Windows 11", "cpu_info": "Intel64 Family 6 Model 154 Stepping 4, GenuineIntel", "timestamp": "2026-03-06T10:20:37.149792+00:00", "contributor": "dhruv"} diff --git a/src/solver_benchmarks/problems/qp.py b/src/solver_benchmarks/problems/qp.py index ba2bdba..7b65c27 100644 --- a/src/solver_benchmarks/problems/qp.py +++ b/src/solver_benchmarks/problems/qp.py @@ -133,3 +133,55 @@ def elastic_net_bikeshare(seed: int = 0) -> cp.Problem: penalty2 = cp.norm2(x_sparse) / n_sparse + cp.norm2(x_dense) return cp.Problem(cp.Minimize(SSE + penalty1 + penalty2)) +@register_problem( + "qp/portfolio_large", + tags=["qp", "large"], + description="Large portfolio optimization (2000 assets)", +) +def portfolio_large(seed: int = 0) -> cp.Problem: + rng = np.random.default_rng(seed) + n = 2000 + mu = rng.standard_normal(n) * 0.05 + F = rng.standard_normal((n, 50)) * 0.1 + Sigma_sqrt = F + gamma = 1.0 + + x = cp.Variable(n) + ret = mu @ x + risk = cp.sum_squares(Sigma_sqrt.T @ x) + constraints = [cp.sum(x) == 1, x >= 0] + return cp.Problem(cp.Minimize(-ret + gamma * risk), constraints) + + +@register_problem( + "qp/risk_parity_small", + tags=["qp", "small", "finance"], + description="Risk parity portfolio optimization (50 assets)", +) +def risk_parity_small(seed: int = 0) -> cp.Problem: + rng = np.random.default_rng(seed) + n = 50 + F = rng.standard_normal((n, 10)) * 0.1 + Sigma = F @ F.T + 0.01 * np.eye(n) + + x = cp.Variable(n) + risk = cp.quad_form(x, Sigma) + constraints = [cp.sum(x) == 1, x >= 0] + return cp.Problem(cp.Minimize(risk), constraints) + + +@register_problem( + "qp/risk_parity_medium", + tags=["qp", "medium", "finance"], + description="Risk parity portfolio optimization (500 assets)", +) +def risk_parity_medium(seed: int = 0) -> cp.Problem: + rng = np.random.default_rng(seed) + n = 500 + F = rng.standard_normal((n, 30)) * 0.1 + Sigma = F @ F.T + 0.01 * np.eye(n) + + x = cp.Variable(n) + risk = cp.quad_form(x, Sigma) + constraints = [cp.sum(x) == 1, x >= 0] + return cp.Problem(cp.Minimize(risk), constraints) \ No newline at end of file diff --git a/tests/test_problems.py b/tests/test_problems.py index 7ad8efb..b71206f 100644 --- a/tests/test_problems.py +++ b/tests/test_problems.py @@ -38,7 +38,7 @@ def test_problem_names_have_type_prefix(): def test_problems_have_type_tag(): """Each problem should have a type tag matching its prefix.""" - valid_types = {"lp", "qp", "socp", "sdp", "mip"} + valid_types = {"lp", "qp", "socp", "sdp", "mip","ecp"} for spec in list_problems(): prefix = spec.name.split("/")[0] assert prefix in valid_types, f"{spec.name} has unknown prefix '{prefix}'"