From 1bd5665d1e4c34b55ef25c7392cabc2d7940e4ba Mon Sep 17 00:00:00 2001 From: Ian McInerney Date: Sun, 26 Oct 2025 16:31:10 +0000 Subject: [PATCH 1/8] Add cuDSS support --- CMakeLists.txt | 2 +- src/bindings.cpp.in | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 33349318..8ef3fac7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,7 @@ list(APPEND CMAKE_MESSAGE_INDENT " ") FetchContent_Declare( osqp GIT_REPOSITORY https://github.com/osqp/osqp.git - GIT_TAG v1.0.0 + GIT_TAG im/cudss ) list(POP_BACK CMAKE_MESSAGE_INDENT) FetchContent_MakeAvailable(osqp) diff --git a/src/bindings.cpp.in b/src/bindings.cpp.in index 4ceac544..e98cbb82 100644 --- a/src/bindings.cpp.in +++ b/src/bindings.cpp.in @@ -369,7 +369,8 @@ PYBIND11_MODULE(@OSQP_EXT_MODULE_NAME@, m) { .value("OSQP_ALGEBRA_LOAD_ERROR", OSQP_ALGEBRA_LOAD_ERROR) .value("OSQP_CODEGEN_DEFINES_ERROR", OSQP_CODEGEN_DEFINES_ERROR) .value("OSQP_DATA_NOT_INITIALIZED", OSQP_DATA_NOT_INITIALIZED) - .value("OSQP_FUNC_NOT_IMPLEMENTED", OSQP_FUNC_NOT_IMPLEMENTED); + .value("OSQP_FUNC_NOT_IMPLEMENTED", OSQP_FUNC_NOT_IMPLEMENTED) + .value("OSQP_RUNTIME_ERROR", OSQP_RUNTIME_ERROR); // Preconditioner Type py::enum_(m, "osqp_precond_type", py::module_local()) From ea2800d1283812637adce253e03187afe4d9ea72 Mon Sep 17 00:00:00 2001 From: Ian McInerney Date: Sun, 26 Oct 2025 16:49:12 +0000 Subject: [PATCH 2/8] Allow building Float64 CUDA --- backend/cuda/pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/cuda/pyproject.toml b/backend/cuda/pyproject.toml index 15a1e1e7..aab40919 100644 --- a/backend/cuda/pyproject.toml +++ b/backend/cuda/pyproject.toml @@ -32,6 +32,7 @@ OSQP_ALGEBRA_BACKEND = "cuda" OSQP_EXT_MODULE_NAME = "osqp_cuda" CMAKE_CUDA_COMPILER = {env="CMAKE_CUDA_COMPILER"} CUDA_TOOLKIT_ROOT_DIR = {env="CUDA_TOOLKIT_ROOT_DIR"} +OSQP_USE_FLOAT = {env="OSQP_USE_FLOAT"} [tool.setuptools_scm] root = "../.." From 5f6137473f649ce4839d7295139875d03cbbca9c Mon Sep 17 00:00:00 2001 From: Ian McInerney Date: Sun, 26 Oct 2025 16:54:37 +0000 Subject: [PATCH 3/8] Export solver error type enum --- src/bindings.cpp.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bindings.cpp.in b/src/bindings.cpp.in index e98cbb82..eddf05d2 100644 --- a/src/bindings.cpp.in +++ b/src/bindings.cpp.in @@ -370,7 +370,8 @@ PYBIND11_MODULE(@OSQP_EXT_MODULE_NAME@, m) { .value("OSQP_CODEGEN_DEFINES_ERROR", OSQP_CODEGEN_DEFINES_ERROR) .value("OSQP_DATA_NOT_INITIALIZED", OSQP_DATA_NOT_INITIALIZED) .value("OSQP_FUNC_NOT_IMPLEMENTED", OSQP_FUNC_NOT_IMPLEMENTED) - .value("OSQP_RUNTIME_ERROR", OSQP_RUNTIME_ERROR); + .value("OSQP_RUNTIME_ERROR", OSQP_RUNTIME_ERROR) + .export_values(); // Preconditioner Type py::enum_(m, "osqp_precond_type", py::module_local()) From 8de928a360e1652a05248e2b3794cbb6d042f99a Mon Sep 17 00:00:00 2001 From: Ian McInerney Date: Sun, 26 Oct 2025 17:09:40 +0000 Subject: [PATCH 4/8] Update bindings with settings and info fields --- src/bindings.cpp.in | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/bindings.cpp.in b/src/bindings.cpp.in index eddf05d2..03598afe 100644 --- a/src/bindings.cpp.in +++ b/src/bindings.cpp.in @@ -438,6 +438,7 @@ PYBIND11_MODULE(@OSQP_EXT_MODULE_NAME@, m) { .def_readwrite("eps_dual_inf", &OSQPSettings::eps_dual_inf) .def_readwrite("scaled_termination", &OSQPSettings::scaled_termination) .def_readwrite("check_termination", &OSQPSettings::check_termination) + .def_readwrite("check_dualgap", &OSQPSettings::check_dualgap) .def_readwrite("time_limit", &OSQPSettings::time_limit) // Settings - Polishing @@ -474,8 +475,10 @@ PYBIND11_MODULE(@OSQP_EXT_MODULE_NAME@, m) { .def_readonly("status_polish", &OSQPInfo::status_polish) // obj_val is readwrite because Python wrappers may overwrite this value based on status_val .def_readwrite("obj_val", &OSQPInfo::obj_val) + .def_readwrite("dual_obj_val", &OSQPInfo::dual_obj_val) .def_readonly("prim_res", &OSQPInfo::prim_res) .def_readonly("dual_res", &OSQPInfo::dual_res) + .def_readonly("duality_gap", &OSQPInfo::duality_gap) .def_readonly("iter", &OSQPInfo::iter) .def_readonly("rho_updates", &OSQPInfo::rho_updates) .def_readonly("rho_estimate", &OSQPInfo::rho_estimate) @@ -483,7 +486,9 @@ PYBIND11_MODULE(@OSQP_EXT_MODULE_NAME@, m) { .def_readonly("solve_time", &OSQPInfo::solve_time) .def_readonly("update_time", &OSQPInfo::update_time) .def_readonly("polish_time", &OSQPInfo::polish_time) - .def_readonly("run_time", &OSQPInfo::run_time); + .def_readonly("run_time", &OSQPInfo::run_time) + .def_readonly("primdual_int", &OSQPInfo::primdual_int) + .def_readonly("rel_kkt_error", &OSQPInfo::rel_kkt_error); // Solver py::class_(m, "OSQPSolver", py::module_local()) From ab88722d9f01d2e68dbbf2810d864ad6c1707d6d Mon Sep 17 00:00:00 2001 From: Bartolomeo Stellato Date: Mon, 17 Nov 2025 21:37:34 -0500 Subject: [PATCH 5/8] Fix bindings.cpp.in: comment out fields not in im/cudss-rebased - Commented out dual_obj_val, primdual_int, rel_kkt_error fields - These fields are from upstream but not present in im/cudss-rebased C code - Kept restart-related fields (restart, total_integral, prim_normalized, etc.) --- src/bindings.cpp.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings.cpp.in b/src/bindings.cpp.in index 9f4546f3..31abe4c4 100644 --- a/src/bindings.cpp.in +++ b/src/bindings.cpp.in @@ -525,7 +525,7 @@ PYBIND11_MODULE(@OSQP_EXT_MODULE_NAME@, m) { .def_readonly("status_polish", &OSQPInfo::status_polish) // obj_val is readwrite because Python wrappers may overwrite this value based on status_val .def_readwrite("obj_val", &OSQPInfo::obj_val) - .def_readwrite("dual_obj_val", &OSQPInfo::dual_obj_val) + //.def_readwrite("dual_obj_val", &OSQPInfo::dual_obj_val) .def_readonly("prim_res", &OSQPInfo::prim_res) .def_readonly("dual_res", &OSQPInfo::dual_res) .def_readonly("duality_gap", &OSQPInfo::duality_gap) From 87ef56331ba62db22050e2998196970426a93f6d Mon Sep 17 00:00:00 2001 From: Bartolomeo Stellato Date: Mon, 17 Nov 2025 21:43:58 -0500 Subject: [PATCH 6/8] Add cuda-direct and cuda-indirect test configurations - Added cuda-direct solver type testing alongside cuda-indirect - Follows same pattern as mkl-direct and mkl-indirect - Both use same tolerances: atol=1e-2, rtol=1e-3, decimal_tol=2 - Tests now verify both CUDA indirect and direct (cuDSS) solvers --- src/osqp/tests/conftest.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/osqp/tests/conftest.py b/src/osqp/tests/conftest.py index f4010987..596b16b5 100644 --- a/src/osqp/tests/conftest.py +++ b/src/osqp/tests/conftest.py @@ -23,7 +23,11 @@ def pytest_generate_tests(metafunc): values.append( ('mkl', 'indirect', 1e-3, 1e-4, 3), ) - if algebra_available('cuda') and 'cuda' in algebras: + if algebra_available('cuda') and 'cuda-direct' in algebras: + values.append( + ('cuda', 'direct', 1e-2, 1e-3, 2), + ) + if algebra_available('cuda') and 'cuda-indirect' in algebras: values.append( ('cuda', 'indirect', 1e-2, 1e-3, 2), ) From 5bf2807bf8404f984a0ebebecd651dba805b2508 Mon Sep 17 00:00:00 2001 From: Bartolomeo Stellato Date: Mon, 17 Nov 2025 21:50:16 -0500 Subject: [PATCH 7/8] updated gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index fcf7cea7..8587415a 100644 --- a/.gitignore +++ b/.gitignore @@ -132,6 +132,8 @@ src/osqp/bindings.cpp +codegen_vec_out/ +codegen_mat_out/ CMakeFiles/ INSTALL.vcxproj INSTALL.vcxproj.filters From 943f652096e4cec99dcaf11274c93936180c55c6 Mon Sep 17 00:00:00 2001 From: Bartolomeo Stellato Date: Tue, 18 Nov 2025 22:30:38 -0500 Subject: [PATCH 8/8] updated C branch --- CMakeLists.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 75abdbf1..0c3945d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,11 +48,7 @@ FetchContent_Declare( osqp # GIT_REPOSITORY https://github.com/osqp/osqp.git GIT_REPOSITORY https://github.com/lb3825/osqp.git - # SOURCE_DIR "C:/Users/baice/Documents/GitHub/osqp" - # SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../osqp" -# GIT_TAG v1.0.0 - GIT_TAG b/develop-halpern-ci-fixes -# GIT_TAG plot + GIT_TAG b/cudss-polish-fix ) list(POP_BACK CMAKE_MESSAGE_INDENT) FetchContent_MakeAvailable(osqp)