Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
20ad11d
refactor(tests): link internal tests against cuopt_static
ramakrishnap-nv Jul 16, 2026
de93a4d
refactor(tests): consolidate internal numopt tests into single binary
ramakrishnap-nv Jul 16, 2026
e6589c1
fix(tests): make combined internal test binaries link and run
ramakrishnap-nv Jul 16, 2026
a59bd8c
style(tests): remove stale comments from empty CMakeLists stubs
ramakrishnap-nv Jul 16, 2026
bd27745
refactor(tests): remove empty dual_simplex and socp CMakeLists stubs
ramakrishnap-nv Jul 16, 2026
0e5689a
fix(build): link PSLP directly on cuopt shared target
ramakrishnap-nv Jul 16, 2026
90e5d79
refactor(tests): delete CUOPT_TEST_PROGRAM_MAIN from combined-binary …
ramakrishnap-nv Jul 16, 2026
3e58684
refactor(tests): replace runtime cuSPARSE check with compile-time macro
ramakrishnap-nv Jul 17, 2026
c9476b2
fix(tests): require error when mixed precision is unsupported
ramakrishnap-nv Jul 17, 2026
1f52c5e
fix(tests): fix invalid CSR in problem_test create_problem helper
ramakrishnap-nv Jul 17, 2026
545ce45
fix(test): check runtime cuSPARSE version in pdlp_precision_mixed test
ramakrishnap-nv Jul 17, 2026
0effbce
fix(tests): restore RMM setup in ROUTING_UNIT_TEST
ramakrishnap-nv Jul 20, 2026
755ec5d
fix(tests): fix malformed SPDX block comment in internal/main.cu
ramakrishnap-nv Jul 20, 2026
8f23153
fix(build): add OpenMP::OpenMP_CUDA to cuopt_objs PRIVATE deps
ramakrishnap-nv Jul 20, 2026
c159896
fix(build): add simde::simde to cuopt_objs PRIVATE deps
ramakrishnap-nv Jul 21, 2026
3a55206
fix(tests): add missing symmetric QCMATRIX entry in fast parser edge …
ramakrishnap-nv Jul 21, 2026
5ec9425
Merge branch 'main' into refactor/test-static-link-for-internal-tests
ramakrishnap-nv Jul 22, 2026
57cd958
Merge branch 'main' into refactor/test-static-link-for-internal-tests
ramakrishnap-nv Jul 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 110 additions & 34 deletions cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -512,56 +512,41 @@ if (NOT SKIP_GRPC_BUILD)
APPEND PROPERTY COMPILE_OPTIONS "-DNDEBUG")
endif (NOT SKIP_GRPC_BUILD)

add_library(cuopt SHARED
add_library(cuopt_objs OBJECT
${CUOPT_SRC_FILES}
)

set_target_properties(cuopt
PROPERTIES BUILD_RPATH "\$ORIGIN"
INSTALL_RPATH "\$ORIGIN"
INTERFACE_POSITION_INDEPENDENT_CODE ON
set_target_properties(cuopt_objs
PROPERTIES POSITION_INDEPENDENT_CODE ON
CXX_SCAN_FOR_MODULES OFF
)

target_compile_definitions(cuopt
PUBLIC "CUOPT_LOG_ACTIVE_LEVEL=RAPIDS_LOGGER_LOG_LEVEL_${LIBCUOPT_LOGGING_LEVEL}"
PUBLIC CUSPARSE_ENABLE_EXPERIMENTAL_API
target_compile_definitions(cuopt_objs
PUBLIC "CUOPT_LOG_ACTIVE_LEVEL=RAPIDS_LOGGER_LOG_LEVEL_${LIBCUOPT_LOGGING_LEVEL}"
PUBLIC CUSPARSE_ENABLE_EXPERIMENTAL_API
)

target_compile_options(cuopt
target_compile_options(cuopt_objs
PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CUOPT_CXX_FLAGS}>"
"$<$<COMPILE_LANGUAGE:CUDA>:${CUOPT_CUDA_FLAGS}>"
)

if (WRITE_FATBIN)
file(WRITE "${CUOPT_BINARY_DIR}/fatbin.ld"
[=[
SECTIONS
{
.nvFatBinSegment : { *(.nvFatBinSegment) }
.nv_fatbin : { *(.nv_fatbin) }
}
]=])
target_link_options(cuopt PRIVATE "${CUOPT_BINARY_DIR}/fatbin.ld")
endif ()

add_library(cuopt::cuopt ALIAS cuopt)
# ##################################################################################################
# - include paths ---------------------------------------------------------------------------------
message(STATUS "target include directories CUDSS_INCLUDES = ${CUDSS_INCLUDE}")

# Adding Papilo as a system include messes up clang's include resolution if papilo is already installed as a conda package
target_include_directories(cuopt PRIVATE
target_include_directories(cuopt_objs PRIVATE
"${papilo_SOURCE_DIR}/src"
"${papilo_BINARY_DIR}"
)

target_include_directories(cuopt SYSTEM PRIVATE
"${pslp_SOURCE_DIR}/include"
"${dejavu_SOURCE_DIR}"
target_include_directories(cuopt_objs SYSTEM PRIVATE
"${pslp_SOURCE_DIR}/include"
"${dejavu_SOURCE_DIR}"
)

target_include_directories(cuopt
target_include_directories(cuopt_objs
PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty"
"${CMAKE_CURRENT_SOURCE_DIR}/src"
Expand All @@ -581,8 +566,8 @@ target_include_directories(cuopt
)

# Link PSLP by file to avoid export dependency tracking
target_link_libraries(cuopt PRIVATE $<TARGET_FILE:PSLP>)
add_dependencies(cuopt PSLP)
target_link_libraries(cuopt_objs PRIVATE $<TARGET_FILE:PSLP>)
add_dependencies(cuopt_objs PSLP)

# ##################################################################################################
# - link libraries --------------------------------------------------------------------------------
Expand All @@ -597,7 +582,7 @@ list(PREPEND CUOPT_PRIVATE_CUDA_LIBS CUDA::cublasLt)

# Pass CUDSS_MT_LIB_FILE_NAME as a compile definition
get_filename_component(CUDSS_MT_LIB_FILE_NAME "${CUDSS_MT_LIB_FILE}" NAME)
target_compile_definitions(cuopt PRIVATE CUDSS_MT_LIB_FILE_NAME="${CUDSS_MT_LIB_FILE_NAME}")
target_compile_definitions(cuopt_objs PRIVATE CUDSS_MT_LIB_FILE_NAME="${CUDSS_MT_LIB_FILE_NAME}")

execute_process(
COMMAND git rev-parse --short HEAD
Expand All @@ -616,14 +601,14 @@ configure_file(
)

# Add the generated include directory
target_include_directories(cuopt PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/include)
target_include_directories(cuopt_objs PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/include)

list(JOIN CMAKE_CUDA_ARCHITECTURES "," JOINED_CUDA_ARCHITECTURES)
target_compile_definitions(cuopt PUBLIC
target_compile_definitions(cuopt_objs PUBLIC
CUOPT_CUDA_ARCHITECTURES="${JOINED_CUDA_ARCHITECTURES}"
CUOPT_CPU_ARCHITECTURE="${CMAKE_SYSTEM_PROCESSOR}")

target_link_libraries(cuopt
target_link_libraries(cuopt_objs
PUBLIC
CUDA::cublas
CUDA::cusparse
Expand All @@ -635,7 +620,6 @@ target_link_libraries(cuopt
PRIVATE
${CUOPT_PRIVATE_CUDA_LIBS}
simde::simde

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is needed for the compilation and internal objects(Your compilation already fails because of this). OpenMP is also needed IMO.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commits 8f23153c (OpenMP::OpenMP_CUDA) and c1598967 (simde::simde). Both were PRIVATE deps of the old cuopt SHARED target that were providing compile-time flags/includes; after the refactor to cuopt_objs, they need to be on the OBJECT library where sources are actually compiled.

OpenMP::OpenMP_CXX
OpenMP::OpenMP_CUDA
$<$<BOOL:${CUOPT_ENABLE_GRPC}>:protobuf::libprotobuf>
$<$<BOOL:${CUOPT_ENABLE_GRPC}>:gRPC::grpc++>
Expand All @@ -645,9 +629,101 @@ target_link_libraries(cuopt
# - generate tests --------------------------------------------------------------------------------
if (BUILD_TESTS)
include(CTest)
add_library(cuopt_static STATIC $<TARGET_OBJECTS:cuopt_objs>)
target_link_libraries(cuopt_static
PUBLIC
CUDA::cublas
CUDA::cusparse
rmm::rmm
rapids_logger::rapids_logger
CCCL::CCCL
raft::raft
${CUDSS_LIB_FILE}
OpenMP::OpenMP_CXX
PRIVATE
${CUOPT_PRIVATE_CUDA_LIBS}
$<$<BOOL:${CUOPT_ENABLE_GRPC}>:protobuf::libprotobuf>
$<$<BOOL:${CUOPT_ENABLE_GRPC}>:gRPC::grpc++>
)
# Internal test sources include OMP-dependent headers (omp_helpers.hpp, omp_atomic_t).
# Propagate -fopenmp for CUDA TUs since OpenMP::OpenMP_CXX only covers CXX.
target_compile_options(cuopt_static INTERFACE
"$<$<COMPILE_LANGUAGE:CUDA>:-fopenmp>"
)
target_include_directories(cuopt_static
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>"
"$<INSTALL_INTERFACE:include>"
)
target_compile_definitions(cuopt_static PUBLIC
CUOPT_CUDA_ARCHITECTURES="${JOINED_CUDA_ARCHITECTURES}"
CUOPT_CPU_ARCHITECTURE="${CMAKE_SYSTEM_PROCESSOR}"
"CUOPT_LOG_ACTIVE_LEVEL=RAPIDS_LOGGER_LOG_LEVEL_${LIBCUOPT_LOGGING_LEVEL}"
CUSPARSE_ENABLE_EXPERIMENTAL_API
)
target_link_libraries(cuopt_static PRIVATE $<TARGET_FILE:PSLP>)
add_dependencies(cuopt_static PSLP)
add_subdirectory(tests)
endif (BUILD_TESTS)

add_library(cuopt SHARED $<TARGET_OBJECTS:cuopt_objs>)
add_library(cuopt::cuopt ALIAS cuopt)
set_target_properties(cuopt
PROPERTIES BUILD_RPATH "\$ORIGIN"
INSTALL_RPATH "\$ORIGIN"
INTERFACE_POSITION_INDEPENDENT_CODE ON
CXX_SCAN_FOR_MODULES OFF
LINKER_LANGUAGE CUDA
)
# cuopt needs PUBLIC interface for consumers
target_include_directories(cuopt
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>"
INTERFACE
"$<INSTALL_INTERFACE:include>"
)
target_link_libraries(cuopt
PUBLIC
CUDA::cublas
CUDA::cusparse
rmm::rmm
rapids_logger::rapids_logger
CCCL::CCCL
raft::raft
${CUDSS_LIB_FILE}
PRIVATE
${CUOPT_PRIVATE_CUDA_LIBS}
simde::simde
OpenMP::OpenMP_CXX
OpenMP::OpenMP_CUDA
$<$<BOOL:${CUOPT_ENABLE_GRPC}>:protobuf::libprotobuf>
$<$<BOOL:${CUOPT_ENABLE_GRPC}>:gRPC::grpc++>
)
target_link_libraries(cuopt PRIVATE $<TARGET_FILE:PSLP>)
add_dependencies(cuopt PSLP)
# Propagate compile definitions that consumers need when including cuopt headers.
# These were on cuopt directly before the cuopt_objs refactor; $<TARGET_OBJECTS:...>
# does not carry INTERFACE properties, so we restore them explicitly.
target_compile_definitions(cuopt
PUBLIC
"CUOPT_LOG_ACTIVE_LEVEL=RAPIDS_LOGGER_LOG_LEVEL_${LIBCUOPT_LOGGING_LEVEL}"
CUSPARSE_ENABLE_EXPERIMENTAL_API
)
Comment thread
coderabbitai[bot] marked this conversation as resolved.

if (WRITE_FATBIN)
file(WRITE "${CUOPT_BINARY_DIR}/fatbin.ld"
[=[
SECTIONS
{
.nvFatBinSegment : { *(.nvFatBinSegment) }
.nv_fatbin : { *(.nv_fatbin) }
}
]=])
target_link_options(cuopt PRIVATE "${CUOPT_BINARY_DIR}/fatbin.ld")
endif ()

# ##################################################################################################
# - install targets -------------------------------------------------------------------------------

Expand Down
25 changes: 13 additions & 12 deletions cpp/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,19 @@ endif()
set(CUOPT_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR})

# ################################################################ ------------------------------------------------------------------
# ConfigureTest(NAME source1.cu source2.cu [LABELS label1 label2 ...])
# ConfigureTest(NAME source1.cu source2.cu [STATIC_LIB] [LABELS label1 label2 ...])
#
# LABELS sets CTest labels for selective local test execution via `ctest -L <label>`.
# STATIC_LIB links cuopt_static instead of cuopt (for tests needing internal symbols).
function(ConfigureTest CMAKE_TEST_NAME)
cmake_parse_arguments(CT "" "" "LABELS" ${ARGN})
cmake_parse_arguments(CT "STATIC_LIB" "" "LABELS" ${ARGN})
if(CT_STATIC_LIB)
set(_cuopt_link_target cuopt_static)
set(_extra_libs "")
else()
set(_cuopt_link_target cuopt)
set(_extra_libs cuopttestutils)
endif()
add_executable(${CMAKE_TEST_NAME} ${CT_UNPARSED_ARGUMENTS})
target_include_directories(${CMAKE_TEST_NAME}
PRIVATE
Expand All @@ -53,13 +61,10 @@ function(ConfigureTest CMAKE_TEST_NAME)
"${pslp_SOURCE_DIR}/include"
"${dejavu_SOURCE_DIR}"
)

target_link_libraries(${CMAKE_TEST_NAME}
PRIVATE
cuopt
cuopttestutils
OpenMP::OpenMP_CXX
OpenMP::OpenMP_CUDA
${_cuopt_link_target}
${_extra_libs}
GTest::gmock
GTest::gmock_main
GTest::gtest
Expand All @@ -69,13 +74,10 @@ function(ConfigureTest CMAKE_TEST_NAME)
if(NOT DEFINED INSTALL_TARGET OR "${INSTALL_TARGET}" STREQUAL "")
target_link_options(${CMAKE_TEST_NAME} PRIVATE -Wl,--enable-new-dtags)
endif()

add_test(NAME ${CMAKE_TEST_NAME} COMMAND ${CMAKE_TEST_NAME})

if(CT_LABELS)
set_tests_properties(${CMAKE_TEST_NAME} PROPERTIES LABELS "${CT_LABELS}")
endif()

install(
TARGETS ${CMAKE_TEST_NAME}
COMPONENT testing
Expand Down Expand Up @@ -105,8 +107,7 @@ if(BUILD_TESTS)
add_subdirectory(mip)
endif()
add_subdirectory(linear_programming)
add_subdirectory(dual_simplex)
add_subdirectory(socp)
add_subdirectory(internal)
add_subdirectory(qp)
add_subdirectory(utilities)

Expand Down
10 changes: 0 additions & 10 deletions cpp/tests/dual_simplex/CMakeLists.txt

This file was deleted.

37 changes: 37 additions & 0 deletions cpp/tests/internal/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# cmake-format: off
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# cmake-format: on

# Single binary for all numopt tests that require internal symbols (cuopt_static).
# Add new internal numopt tests here instead of creating separate STATIC_LIB targets.
ConfigureTest(NUMOPT_INTERNAL_TEST

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a reason we are creating one giant binary? It kind of removes the isolation of test that belong to different functional parts of the solver. This increases link time as well. It might also create name collusions on which you have encountered some of them and fixed with static functions. Also now when we want to run a test, it is more cumbersome with --gtest-filter.

${CUOPT_TEST_DIR}/internal/main.cu
# dual_simplex
${CUOPT_TEST_DIR}/dual_simplex/unit_tests/solve.cpp
${CUOPT_TEST_DIR}/dual_simplex/unit_tests/solve_barrier.cu
${CUOPT_TEST_DIR}/dual_simplex/unit_tests/right_looking_ldlt.cpp
# linear_programming
${CUOPT_TEST_DIR}/linear_programming/pdlp_test.cu
${CUOPT_TEST_DIR}/linear_programming/unit_tests/optimization_problem_test.cu
${CUOPT_TEST_DIR}/linear_programming/unit_tests/presolve_test.cu
${CUOPT_TEST_DIR}/linear_programming/parser_test.cpp
# mip
${CUOPT_TEST_DIR}/mip/miplib_test.cu
${CUOPT_TEST_DIR}/mip/problem_test.cu
${CUOPT_TEST_DIR}/mip/elim_var_remap_test.cu
${CUOPT_TEST_DIR}/mip/bounds_standardization_test.cu
${CUOPT_TEST_DIR}/mip/multi_probe_test.cu
${CUOPT_TEST_DIR}/mip/cuts_test.cu
${CUOPT_TEST_DIR}/mip/unit_test.cu
${CUOPT_TEST_DIR}/mip/integer_with_real_bounds.cu
${CUOPT_TEST_DIR}/mip/empty_fixed_problems_test.cu
${CUOPT_TEST_DIR}/mip/presolve_test.cu
${CUOPT_TEST_DIR}/mip/termination_test.cu
${CUOPT_TEST_DIR}/mip/determinism_test.cu
# socp
${CUOPT_TEST_DIR}/socp/second_order_cone_kernels.cu
${CUOPT_TEST_DIR}/socp/solve_barrier_socp.cu
${CUOPT_TEST_DIR}/socp/general_quadratic_test.cu
LABELS numopt
STATIC_LIB)
18 changes: 18 additions & 0 deletions cpp/tests/internal/main.cu
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/* clang-format off */
/*
* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
/* clang-format on */

#include <utilities/base_fixture.hpp>

int main(int argc, char** argv)
{
::testing::InitGoogleTest(&argc, argv);
auto const cmd_opts = parse_test_options(argc, argv);
auto const rmm_mode = cmd_opts["rmm_mode"].as<std::string>();
auto resource = cuopt::test::create_memory_resource(rmm_mode);
rmm::mr::set_current_device_resource(resource);
return RUN_ALL_TESTS();
}
14 changes: 1 addition & 13 deletions cpp/tests/linear_programming/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,9 @@
# cmake-format: on

ConfigureTest(LP_UNIT_TEST
${CMAKE_CURRENT_SOURCE_DIR}/unit_tests/optimization_problem_test.cu
${CMAKE_CURRENT_SOURCE_DIR}/unit_tests/solver_settings_test.cu
${CMAKE_CURRENT_SOURCE_DIR}/unit_tests/presolve_test.cu
${CMAKE_CURRENT_SOURCE_DIR}/unit_tests/solution_interface_test.cu
LABELS numopt)
# ##################################################################################################
# - Linear programming PDLP tests ----------------------------------------------------------------------
ConfigureTest(PDLP_TEST
${CMAKE_CURRENT_SOURCE_DIR}/pdlp_test.cu
LABELS numopt)

# ##################################################################################################
# - MPS / LP parser tests --------------------------------------------------------------------------
ConfigureTest(MPS_PARSER_TEST
${CMAKE_CURRENT_SOURCE_DIR}/parser_test.cpp
LABELS numopt)

ConfigureTest(MPS_FAST_PARSER_TEST
${CMAKE_CURRENT_SOURCE_DIR}/experimental_mps_fast/fast_fp64_parser_test.cpp
Expand All @@ -31,6 +18,7 @@ target_include_directories(MPS_FAST_PARSER_TEST
)
target_link_libraries(MPS_FAST_PARSER_TEST PRIVATE simde::simde)


# ##################################################################################################
# - C API Tests----------------------------------------------------------------------
# The C API tests require a separate library to be linked against. So we don't use the ConfigureTest macro.
Expand Down
Loading