From 0af8afc4cb52d7d18c1dc4f2e8235f4dd7dff4ac Mon Sep 17 00:00:00 2001 From: ptaylor Date: Tue, 10 Feb 2026 17:20:20 -0800 Subject: [PATCH 01/11] add compile_commands.json to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 9edc9823c..4829b2ecd 100644 --- a/.gitignore +++ b/.gitignore @@ -52,6 +52,9 @@ cpp/doxygen/xml token_cache.json version_cache.json +# Clang compilation database +compile_commands.json + # Local Server Error Log error_log.txt From bcf8cb0f439fce6fd6f7978d12dcee8881039b63 Mon Sep 17 00:00:00 2001 From: ptaylor Date: Tue, 10 Feb 2026 17:20:40 -0800 Subject: [PATCH 02/11] add sccache and sccache-dist secrets and envvars to conda recipes --- conda/recipes/cuopt/recipe.yaml | 24 +++++++++++++++++++----- conda/recipes/libcuopt/recipe.yaml | 25 +++++++++++++++++++------ 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/conda/recipes/cuopt/recipe.yaml b/conda/recipes/cuopt/recipe.yaml index 51da0e6f2..0b4c8abc4 100644 --- a/conda/recipes/cuopt/recipe.yaml +++ b/conda/recipes/cuopt/recipe.yaml @@ -34,17 +34,31 @@ build: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN + - SCCACHE_DIST_AUTH_TOKEN env: CMAKE_C_COMPILER_LAUNCHER: ${{ env.get("CMAKE_C_COMPILER_LAUNCHER") }} CMAKE_CUDA_COMPILER_LAUNCHER: ${{ env.get("CMAKE_CUDA_COMPILER_LAUNCHER") }} CMAKE_CXX_COMPILER_LAUNCHER: ${{ env.get("CMAKE_CXX_COMPILER_LAUNCHER") }} CMAKE_GENERATOR: ${{ env.get("CMAKE_GENERATOR") }} - SCCACHE_BUCKET: ${{ env.get("SCCACHE_BUCKET") }} - SCCACHE_IDLE_TIMEOUT: ${{ env.get("SCCACHE_IDLE_TIMEOUT") }} - SCCACHE_REGION: ${{ env.get("SCCACHE_REGION") }} - SCCACHE_S3_USE_SSL: ${{ env.get("SCCACHE_S3_USE_SSL") }} - SCCACHE_S3_NO_CREDENTIALS: ${{ env.get("SCCACHE_S3_NO_CREDENTIALS") }} + NVCC_APPEND_FLAGS: ${{ env.get("NVCC_APPEND_FLAGS", default="") }} + PARALLEL_LEVEL: ${{ env.get("PARALLEL_LEVEL", default="8") }} + SCCACHE_BUCKET: ${{ env.get("SCCACHE_BUCKET", default="") }} + SCCACHE_DIST_AUTH_TYPE: ${{ env.get("SCCACHE_DIST_AUTH_TYPE", default="token") }} + SCCACHE_DIST_FALLBACK_TO_LOCAL_COMPILE: ${{ env.get("SCCACHE_DIST_FALLBACK_TO_LOCAL_COMPILE", default="false") }} + SCCACHE_DIST_MAX_RETRIES: ${{ env.get("SCCACHE_DIST_MAX_RETRIES", default="inf") }} + SCCACHE_DIST_REQUEST_TIMEOUT: ${{ env.get("SCCACHE_DIST_REQUEST_TIMEOUT", default="7140") }} + SCCACHE_DIST_SCHEDULER_URL: ${{ env.get("SCCACHE_DIST_SCHEDULER_URL", default="") }} + SCCACHE_ERROR_LOG: ${{ env.get("SCCACHE_ERROR_LOG", default="/tmp/sccache.log") }} + SCCACHE_IDLE_TIMEOUT: ${{ env.get("SCCACHE_IDLE_TIMEOUT", default="0") }} + SCCACHE_NO_CACHE: ${{ env.get("SCCACHE_NO_CACHE", default="") }} + SCCACHE_RECACHE: ${{ env.get("SCCACHE_RECACHE", default="") }} + SCCACHE_REGION: ${{ env.get("SCCACHE_REGION", default="") }} SCCACHE_S3_KEY_PREFIX: cuopt/${{ env.get("RAPIDS_CONDA_ARCH") }}/cuda${{ cuda_major }} + SCCACHE_S3_NO_CREDENTIALS: ${{ env.get("SCCACHE_S3_NO_CREDENTIALS", default="false") }} + SCCACHE_S3_PREPROCESSOR_CACHE_KEY_PREFIX: cuopt/${{ env.get("RAPIDS_CONDA_ARCH") }}/cuda${{ cuda_major }}/conda/preprocessor-cache + SCCACHE_S3_USE_PREPROCESSOR_CACHE_MODE: ${{ env.get("SCCACHE_S3_USE_PREPROCESSOR_CACHE_MODE", default="true") }} + SCCACHE_S3_USE_SSL: ${{ env.get("SCCACHE_S3_USE_SSL", default="true") }} + SCCACHE_SERVER_LOG: ${{ env.get("SCCACHE_SERVER_LOG", default="sccache=debug") }} requirements: build: diff --git a/conda/recipes/libcuopt/recipe.yaml b/conda/recipes/libcuopt/recipe.yaml index 279140edf..8ee40d6f1 100644 --- a/conda/recipes/libcuopt/recipe.yaml +++ b/conda/recipes/libcuopt/recipe.yaml @@ -34,6 +34,7 @@ cache: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN + - SCCACHE_DIST_AUTH_TOKEN env: # Enable assertions (-a flag) for PR builds, but not for nightly or release builds BUILD_EXTRA_FLAGS: '${{ "-a --host-lineinfo" if build_type == "pull-request" else "" }}' @@ -41,13 +42,25 @@ cache: CMAKE_CUDA_COMPILER_LAUNCHER: ${{ env.get("CMAKE_CUDA_COMPILER_LAUNCHER") }} CMAKE_CXX_COMPILER_LAUNCHER: ${{ env.get("CMAKE_CXX_COMPILER_LAUNCHER") }} CMAKE_GENERATOR: ${{ env.get("CMAKE_GENERATOR") }} - PARALLEL_LEVEL: ${{ env.get("PARALLEL_LEVEL") }} - SCCACHE_BUCKET: ${{ env.get("SCCACHE_BUCKET") }} - SCCACHE_IDLE_TIMEOUT: ${{ env.get("SCCACHE_IDLE_TIMEOUT") }} - SCCACHE_REGION: ${{ env.get("SCCACHE_REGION") }} - SCCACHE_S3_USE_SSL: ${{ env.get("SCCACHE_S3_USE_SSL") }} - SCCACHE_S3_NO_CREDENTIALS: ${{ env.get("SCCACHE_S3_NO_CREDENTIALS") }} + NVCC_APPEND_FLAGS: ${{ env.get("NVCC_APPEND_FLAGS", default="") }} + PARALLEL_LEVEL: ${{ env.get("PARALLEL_LEVEL", default="8") }} + SCCACHE_BUCKET: ${{ env.get("SCCACHE_BUCKET", default="") }} + SCCACHE_DIST_AUTH_TYPE: ${{ env.get("SCCACHE_DIST_AUTH_TYPE", default="token") }} + SCCACHE_DIST_FALLBACK_TO_LOCAL_COMPILE: ${{ env.get("SCCACHE_DIST_FALLBACK_TO_LOCAL_COMPILE", default="false") }} + SCCACHE_DIST_MAX_RETRIES: ${{ env.get("SCCACHE_DIST_MAX_RETRIES", default="inf") }} + SCCACHE_DIST_REQUEST_TIMEOUT: ${{ env.get("SCCACHE_DIST_REQUEST_TIMEOUT", default="7140") }} + SCCACHE_DIST_SCHEDULER_URL: ${{ env.get("SCCACHE_DIST_SCHEDULER_URL", default="") }} + SCCACHE_ERROR_LOG: ${{ env.get("SCCACHE_ERROR_LOG", default="/tmp/sccache.log") }} + SCCACHE_IDLE_TIMEOUT: ${{ env.get("SCCACHE_IDLE_TIMEOUT", default="0") }} + SCCACHE_NO_CACHE: ${{ env.get("SCCACHE_NO_CACHE", default="") }} + SCCACHE_RECACHE: ${{ env.get("SCCACHE_RECACHE", default="") }} + SCCACHE_REGION: ${{ env.get("SCCACHE_REGION", default="") }} SCCACHE_S3_KEY_PREFIX: libcuopt/${{ env.get("RAPIDS_CONDA_ARCH") }}/cuda${{ cuda_major }} + SCCACHE_S3_NO_CREDENTIALS: ${{ env.get("SCCACHE_S3_NO_CREDENTIALS", default="false") }} + SCCACHE_S3_PREPROCESSOR_CACHE_KEY_PREFIX: libcuopt/${{ env.get("RAPIDS_CONDA_ARCH") }}/cuda${{ cuda_major }}/conda/preprocessor-cache + SCCACHE_S3_USE_PREPROCESSOR_CACHE_MODE: ${{ env.get("SCCACHE_S3_USE_PREPROCESSOR_CACHE_MODE", default="true") }} + SCCACHE_S3_USE_SSL: ${{ env.get("SCCACHE_S3_USE_SSL", default="true") }} + SCCACHE_SERVER_LOG: ${{ env.get("SCCACHE_SERVER_LOG", default="sccache=debug") }} requirements: build: From 5d35f7a93ac39f436ae47f12af9bf2e4ceb8829d Mon Sep 17 00:00:00 2001 From: ptaylor Date: Wed, 11 Feb 2026 11:41:57 -0800 Subject: [PATCH 03/11] define C++ std for tests --- cpp/tests/CMakeLists.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt index 0cfde3872..1342a3cd2 100644 --- a/cpp/tests/CMakeLists.txt +++ b/cpp/tests/CMakeLists.txt @@ -37,6 +37,15 @@ set(CUOPT_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) function(ConfigureTest CMAKE_TEST_NAME) add_executable(${CMAKE_TEST_NAME} ${ARGN}) + set_target_properties(${CMAKE_TEST_NAME} + PROPERTIES + # set target compile options + CXX_STANDARD 20 + CXX_STANDARD_REQUIRED ON + INTERFACE_POSITION_INDEPENDENT_CODE ON + CXX_SCAN_FOR_MODULES OFF + ) + target_include_directories(${CMAKE_TEST_NAME} PRIVATE "${CUOPT_TEST_DIR}/../src" From b288f671d523b5683dacf613cee0e2e4682ddd39 Mon Sep 17 00:00:00 2001 From: ptaylor Date: Wed, 11 Feb 2026 11:47:20 -0800 Subject: [PATCH 04/11] set CUDA_STANDARD and use POSITION_INDEPENDENT_CODE instead of INTERFACE_POSITION_INDEPENDENT_CODE --- cpp/libmps_parser/tests/CMakeLists.txt | 6 ++++-- cpp/tests/CMakeLists.txt | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cpp/libmps_parser/tests/CMakeLists.txt b/cpp/libmps_parser/tests/CMakeLists.txt index b39a09607..2d86a1da1 100644 --- a/cpp/libmps_parser/tests/CMakeLists.txt +++ b/cpp/libmps_parser/tests/CMakeLists.txt @@ -15,9 +15,11 @@ function(ConfigureTest CMAKE_TEST_NAME) # set target compile options CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON - INTERFACE_POSITION_INDEPENDENT_CODE ON + CUDA_STANDARD 20 + CUDA_STANDARD_REQUIRED ON + POSITION_INDEPENDENT_CODE ON CXX_SCAN_FOR_MODULES OFF - ) + ) target_include_directories(${CMAKE_TEST_NAME} PRIVATE diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt index 1342a3cd2..343fe3b58 100644 --- a/cpp/tests/CMakeLists.txt +++ b/cpp/tests/CMakeLists.txt @@ -42,7 +42,9 @@ function(ConfigureTest CMAKE_TEST_NAME) # set target compile options CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON - INTERFACE_POSITION_INDEPENDENT_CODE ON + CUDA_STANDARD 20 + CUDA_STANDARD_REQUIRED ON + POSITION_INDEPENDENT_CODE ON CXX_SCAN_FOR_MODULES OFF ) From be612dbd0d8a85073493676b22144adaffde6910 Mon Sep 17 00:00:00 2001 From: ptaylor Date: Wed, 18 Feb 2026 20:32:41 -0800 Subject: [PATCH 05/11] use rapids_cpm_find to find or download argparse --- cpp/CMakeLists.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 6a684be70..dbe850811 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -253,6 +253,15 @@ include(${rapids-cmake-dir}/cpm/rapids_logger.cmake) rapids_cpm_rapids_logger(BUILD_EXPORT_SET cuopt-exports INSTALL_EXPORT_SET cuopt-exports) create_logger_macros(CUOPT "cuopt::default_logger()" include/cuopt) +rapids_cpm_find( + argparse 3.2.0 + CPM_ARGS + GIT_REPOSITORY https://github.com/p-ranav/argparse.git + GIT_TAG v3.2 + GIT_SHALLOW TRUE + OPTIONS "ARGPARSE_INSTALL TRUE" +) + find_package(CUDSS REQUIRED) if(BUILD_TESTS) @@ -515,6 +524,7 @@ target_link_libraries(cuopt_cli ${CUDSS_LIBRARIES} TBB::tbb PRIVATE + argparse ) # Use RUNPATH when building locally in order to allow LD_LIBRARY_PATH to override the conda env path if(NOT DEFINED INSTALL_TARGET OR "${INSTALL_TARGET}" STREQUAL "") From 5856efe9d9ff651d358684daa7500f8156a5e023 Mon Sep 17 00:00:00 2001 From: ptaylor Date: Wed, 18 Feb 2026 20:32:55 -0800 Subject: [PATCH 06/11] link c_api_tester to cudart --- cpp/tests/linear_programming/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cpp/tests/linear_programming/CMakeLists.txt b/cpp/tests/linear_programming/CMakeLists.txt index aaf3e5c9f..da950b55b 100644 --- a/cpp/tests/linear_programming/CMakeLists.txt +++ b/cpp/tests/linear_programming/CMakeLists.txt @@ -30,6 +30,11 @@ if (NOT SKIP_C_PYTHON_ADAPTERS) "${CMAKE_CURRENT_SOURCE_DIR}/c_api_tests" ) + target_link_libraries(c_api_tester + PRIVATE + ${CUOPT_PRIVATE_CUDA_LIBS} + ) + add_executable(C_API_TEST "${CMAKE_CURRENT_SOURCE_DIR}/c_api_tests/c_api_tests.cpp") target_include_directories(C_API_TEST From 6d54c1aa9ac67ef7e4ae54c7a220ae512b08a3bb Mon Sep 17 00:00:00 2001 From: ptaylor Date: Wed, 18 Feb 2026 20:33:06 -0800 Subject: [PATCH 07/11] fix printf format --- cpp/src/cuts/cuts.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/src/cuts/cuts.cpp b/cpp/src/cuts/cuts.cpp index cd3dbf000..2292ceb12 100644 --- a/cpp/src/cuts/cuts.cpp +++ b/cpp/src/cuts/cuts.cpp @@ -2746,7 +2746,7 @@ void write_solution_for_cut_verification(const lp_problem_t& lp, fprintf(fid, "%.17g\n", solution[j]); seed = hash_combine_f(seed, solution[j]); } - printf("Solution hash: %20x\n", seed); + printf("Solution hash: %20lx\n", seed); fclose(fid); } } From a6bbe564c84d04a013708c8998071f85c3fc26db Mon Sep 17 00:00:00 2001 From: ptaylor Date: Wed, 18 Feb 2026 20:54:11 -0800 Subject: [PATCH 08/11] apply suggestions from code review --- cpp/src/cuts/cuts.cpp | 4 ++-- cpp/tests/linear_programming/CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/src/cuts/cuts.cpp b/cpp/src/cuts/cuts.cpp index 2292ceb12..8ce99dab0 100644 --- a/cpp/src/cuts/cuts.cpp +++ b/cpp/src/cuts/cuts.cpp @@ -2693,7 +2693,7 @@ void read_saved_solution_for_cut_verification(const lp_problem_t& lp, for (i_t j = 0; j < lp.num_cols; ++j) { seed = hash_combine_f(seed, saved_solution[j]); } - settings.log.printf("Saved solution hash: %20x\n", seed); + settings.log.printf("Saved solution hash: %20zx\n", seed); // Compute || A * x - b ||_inf std::vector residual = lp.rhs; @@ -2746,7 +2746,7 @@ void write_solution_for_cut_verification(const lp_problem_t& lp, fprintf(fid, "%.17g\n", solution[j]); seed = hash_combine_f(seed, solution[j]); } - printf("Solution hash: %20lx\n", seed); + printf("Solution hash: %20zx\n", seed); fclose(fid); } } diff --git a/cpp/tests/linear_programming/CMakeLists.txt b/cpp/tests/linear_programming/CMakeLists.txt index da950b55b..e337f7e38 100644 --- a/cpp/tests/linear_programming/CMakeLists.txt +++ b/cpp/tests/linear_programming/CMakeLists.txt @@ -32,7 +32,7 @@ if (NOT SKIP_C_PYTHON_ADAPTERS) target_link_libraries(c_api_tester PRIVATE - ${CUOPT_PRIVATE_CUDA_LIBS} + CUDA::cudart ) add_executable(C_API_TEST "${CMAKE_CURRENT_SOURCE_DIR}/c_api_tests/c_api_tests.cpp") From dbb2c3aebb362576afaf3e4ad0671d871200e980 Mon Sep 17 00:00:00 2001 From: ptaylor Date: Wed, 18 Feb 2026 20:54:24 -0800 Subject: [PATCH 09/11] use namespaced argparse --- cpp/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index dbe850811..88710444a 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -255,6 +255,7 @@ create_logger_macros(CUOPT "cuopt::default_logger()" include/cuopt) rapids_cpm_find( argparse 3.2.0 + GLOBAL_TARGETS argparse::argparse CPM_ARGS GIT_REPOSITORY https://github.com/p-ranav/argparse.git GIT_TAG v3.2 @@ -524,7 +525,7 @@ target_link_libraries(cuopt_cli ${CUDSS_LIBRARIES} TBB::tbb PRIVATE - argparse + argparse::argparse ) # Use RUNPATH when building locally in order to allow LD_LIBRARY_PATH to override the conda env path if(NOT DEFINED INSTALL_TARGET OR "${INSTALL_TARGET}" STREQUAL "") From a6cd50e3a45366961230129ac8b904261ec9fdcc Mon Sep 17 00:00:00 2001 From: ptaylor Date: Wed, 18 Feb 2026 20:55:26 -0800 Subject: [PATCH 10/11] only find argparse if building cuopt_cli --- cpp/CMakeLists.txt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 88710444a..0aae3ed9b 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -253,16 +253,6 @@ include(${rapids-cmake-dir}/cpm/rapids_logger.cmake) rapids_cpm_rapids_logger(BUILD_EXPORT_SET cuopt-exports INSTALL_EXPORT_SET cuopt-exports) create_logger_macros(CUOPT "cuopt::default_logger()" include/cuopt) -rapids_cpm_find( - argparse 3.2.0 - GLOBAL_TARGETS argparse::argparse - CPM_ARGS - GIT_REPOSITORY https://github.com/p-ranav/argparse.git - GIT_TAG v3.2 - GIT_SHALLOW TRUE - OPTIONS "ARGPARSE_INSTALL TRUE" -) - find_package(CUDSS REQUIRED) if(BUILD_TESTS) @@ -494,6 +484,16 @@ endif() if(NOT BUILD_LP_ONLY) +rapids_cpm_find( + argparse 3.2.0 + GLOBAL_TARGETS argparse::argparse + CPM_ARGS + GIT_REPOSITORY https://github.com/p-ranav/argparse.git + GIT_TAG v3.2 + GIT_SHALLOW TRUE + OPTIONS "ARGPARSE_INSTALL TRUE" +) + add_executable(cuopt_cli cuopt_cli.cpp) set_target_properties(cuopt_cli From c708cb5d04ffd3c22cc8fd7a8fbd9f1383587546 Mon Sep 17 00:00:00 2001 From: ptaylor Date: Wed, 18 Feb 2026 21:39:44 -0800 Subject: [PATCH 11/11] don't set ARGPARSE_INSTALL TRUE --- cpp/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 0aae3ed9b..24dc0276a 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -491,7 +491,6 @@ rapids_cpm_find( GIT_REPOSITORY https://github.com/p-ranav/argparse.git GIT_TAG v3.2 GIT_SHALLOW TRUE - OPTIONS "ARGPARSE_INSTALL TRUE" ) add_executable(cuopt_cli cuopt_cli.cpp)