Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
234 commits
Select commit Hold shift + click to select a range
8cec498
bitwise determinism FJ progress
aliceb-nv Jul 14, 2025
a559d79
FJ determinism for non balanced codepath
aliceb-nv Jul 15, 2025
3269d87
deterministic tests for more parts of the solver
aliceb-nv Jul 17, 2025
20277f2
random spin kernel to perturb determinism tests
aliceb-nv Jul 21, 2025
55126d9
Fix uninitialized multiprobe buffer bug in constraint prop
aliceb-nv Jul 21, 2025
58d9a42
local search determinism tests
aliceb-nv Jul 22, 2025
6b9324c
tmp, fixing bug in constraint prop randomness
aliceb-nv Jul 22, 2025
db75bd6
fixed test bug
aliceb-nv Jul 22, 2025
7315ab8
determinism progress w/ recombiners
aliceb-nv Aug 7, 2025
24eb4ac
Merge branch 'main' into determinism
aliceb-nv Oct 27, 2025
8cbc37a
add determinism setting
aliceb-nv Oct 27, 2025
7ee2c49
restore determinism tests functionality
aliceb-nv Oct 28, 2025
d5677fe
adding cupti
aliceb-nv Oct 28, 2025
429c492
Adding support for work unit inference w/ xgboost
aliceb-nv Oct 29, 2025
f6e1370
log more FJ features
aliceb-nv Oct 29, 2025
f02837a
remove nvperf dep
aliceb-nv Oct 29, 2025
773dbd4
no cupti
aliceb-nv Oct 29, 2025
327fcec
added regression scripts
aliceb-nv Oct 30, 2025
c9cae3c
switch to using tl2cgen
aliceb-nv Oct 30, 2025
575520f
Merge branch 'main' into determinism
aliceb-nv Oct 30, 2025
017c4d5
merge w/ main, fix non-deterministic codepath
aliceb-nv Oct 30, 2025
8cb04ec
data collection
aliceb-nv Oct 30, 2025
f5f2726
script changes
aliceb-nv Oct 31, 2025
c4d3fde
bump
aliceb-nv Oct 31, 2025
6780893
bump
aliceb-nv Oct 31, 2025
7474ff0
work unit timers
aliceb-nv Nov 4, 2025
c6e9d15
linear estimation of PDLP work units
aliceb-nv Nov 4, 2025
c24f6ef
more work unit timer stuff
aliceb-nv Nov 4, 2025
c70bc1b
further work unit timer progress for gpu heuristics
aliceb-nv Nov 4, 2025
4e0f79a
fix determinism issue in bounds repair, further work limit progress
aliceb-nv Nov 6, 2025
bcadb92
bump 1
aliceb-nv Nov 6, 2025
66288f8
bump2
aliceb-nv Nov 6, 2025
8e19de8
fix FJ indeterminism
aliceb-nv Nov 7, 2025
5eacbb8
bump 1
aliceb-nv Nov 7, 2025
b96a784
bump 2
aliceb-nv Nov 7, 2025
ccc64a2
fix bounds repair indeterminism
aliceb-nv Nov 7, 2025
01afc9d
bump1
aliceb-nv Nov 7, 2025
6ba4905
bump2
aliceb-nv Nov 7, 2025
3e6d081
restore FJ moves
aliceb-nv Nov 7, 2025
38df1ec
bump1
aliceb-nv Nov 7, 2025
c713dbc
bump2
aliceb-nv Nov 7, 2025
3b0d116
recombiners record work
aliceb-nv Nov 8, 2025
380bb1d
Merge branch 'main' into determinism
aliceb-nv Nov 8, 2025
7f81da1
bump1
aliceb-nv Nov 8, 2025
2726d23
bump2
aliceb-nv Nov 8, 2025
7ea0f1d
fix brute force rounding indeterminism
aliceb-nv Nov 8, 2025
4e74f15
bump
aliceb-nv Nov 8, 2025
709f281
restore fj
aliceb-nv Nov 8, 2025
41198e2
bump1
aliceb-nv Nov 8, 2025
d98e083
more logging
aliceb-nv Nov 8, 2025
786ae8a
bump1
aliceb-nv Nov 8, 2025
2fade1d
bump2
aliceb-nv Nov 8, 2025
c89e2c9
fix missing grid sync
aliceb-nv Nov 8, 2025
cbfd34b
bump1
aliceb-nv Nov 8, 2025
ea5e1bd
bump2
aliceb-nv Nov 8, 2025
8c53c75
restore load balancing
aliceb-nv Nov 8, 2025
c6a1037
bump 1
aliceb-nv Nov 8, 2025
09a484a
remove unecessary grid sync
aliceb-nv Nov 8, 2025
f55e648
bump1
aliceb-nv Nov 8, 2025
554d24c
bump2
aliceb-nv Nov 8, 2025
db73e00
FJCPU in deterministic mode
aliceb-nv Nov 9, 2025
0b8b6e1
bump1
aliceb-nv Nov 9, 2025
122bfbc
bump2
aliceb-nv Nov 9, 2025
45ebd57
fix oversight
aliceb-nv Nov 9, 2025
a209096
bump1
aliceb-nv Nov 9, 2025
718f3e7
bump2
aliceb-nv Nov 9, 2025
1df9313
logger
aliceb-nv Nov 9, 2025
b45982e
fix cpufj
aliceb-nv Nov 9, 2025
d272180
bump1
aliceb-nv Nov 9, 2025
0987b5c
bump2
aliceb-nv Nov 9, 2025
f378246
tentative LB determinism fix
aliceb-nv Nov 10, 2025
4b77a59
extra logging CPUFJ, PAPI
aliceb-nv Nov 10, 2025
bcea60d
branch n bound nvtx ranges
aliceb-nv Nov 10, 2025
d7ff462
more cpufj logging
aliceb-nv Nov 10, 2025
37ca39e
BnB features logging
aliceb-nv Nov 10, 2025
5c9e59a
add memory instrumentation wrappers
aliceb-nv Nov 12, 2025
22c95a7
Merge branch 'main' into determinism
aliceb-nv Nov 12, 2025
0fc30c5
don't clog w/ improvements
aliceb-nv Nov 12, 2025
8bd70e3
fixed iter count
aliceb-nv Nov 13, 2025
7bcf3ba
bugfix
aliceb-nv Nov 13, 2025
4bfb96f
more memops logging
aliceb-nv Nov 13, 2025
f1afa59
fewer
aliceb-nv Nov 14, 2025
cd2595e
log-transform for regressor
aliceb-nv Nov 14, 2025
6a1192f
Merge branch 'release/25.12' into determinism
aliceb-nv Nov 18, 2025
8dfdfd8
fixes
aliceb-nv Nov 18, 2025
8f26067
restore fj scratch
aliceb-nv Nov 18, 2025
24fdc75
Merge branch 'release/25.12' into determinism
aliceb-nv Nov 25, 2025
759b896
fix build
aliceb-nv Nov 25, 2025
dc30219
tmp dual simplex instrument
aliceb-nv Nov 25, 2025
1ca01ba
dual simplex feature logging
aliceb-nv Nov 25, 2025
5894ffe
add support for building with clang
aliceb-nv Nov 18, 2025
9911c3a
remove debug calls
aliceb-nv Nov 18, 2025
24b828e
fix cmakelists
aliceb-nv Nov 18, 2025
d52bcb0
move suppressiosn
aliceb-nv Nov 25, 2025
ef69eb7
PDLP features
aliceb-nv Nov 25, 2025
7ac230f
script tweaks
aliceb-nv Nov 26, 2025
24d7ccb
more feature loggign
aliceb-nv Nov 26, 2025
d35bed2
fix logging
aliceb-nv Nov 27, 2025
1913946
basic dual simplex and pdlp predictors
aliceb-nv Nov 27, 2025
ecf9f25
improved dualsimplex instrumentation
aliceb-nv Nov 27, 2025
fb9c782
integrate work unit limiting with branch_and_bound
aliceb-nv Dec 1, 2025
4a51ca7
Merge branch 'release/25.12' into determinism
aliceb-nv Dec 1, 2025
1a4ac76
add work unit scheduler for parallel threads
aliceb-nv Dec 1, 2025
ce44aff
cleanup
aliceb-nv Dec 1, 2025
9b881d8
fix build
aliceb-nv Dec 1, 2025
b293e94
cleanup
aliceb-nv Dec 1, 2025
88adfcd
Merge branch 'release/25.12' into determinism
aliceb-nv Dec 2, 2025
ee7037f
cleanup
aliceb-nv Dec 2, 2025
fb0c072
add support for building with clang
aliceb-nv Nov 18, 2025
e3f2a79
remove debug calls
aliceb-nv Nov 18, 2025
057ecc7
fix cmakelists
aliceb-nv Nov 18, 2025
2463de6
move suppressiosn
aliceb-nv Nov 25, 2025
8356f1d
address warnings, add msan setting
aliceb-nv Dec 4, 2025
192ce53
Merge branch 'release/25.12' into clang-tsan
aliceb-nv Dec 10, 2025
8b31229
Merge branch 'main' into clang-tsan
aliceb-nv Dec 17, 2025
3cced01
clang compiler bug workaround
aliceb-nv Dec 17, 2025
63c917a
Merge remote-tracking branch 'fork-repo/clang-tsan' into clang-tsan
aliceb-nv Dec 17, 2025
d33939b
Merge branch 'main' into determinism
aliceb-nv Dec 18, 2025
47ae4cf
Merge branch 'main' into determinism
aliceb-nv Jan 5, 2026
ed224fb
Merge branch 'main' into determinism
aliceb-nv Jan 7, 2026
741f373
initial bb debug impl
aliceb-nv Jan 7, 2026
63b9ed1
Merge branch 'main' into clang-tsan
aliceb-nv Jan 7, 2026
0ea2c1f
some debug tweaks
aliceb-nv Jan 7, 2026
00326e2
Merge branch 'clang-tsan' into determinism
aliceb-nv Jan 7, 2026
c374f69
fix copyright
aliceb-nv Jan 7, 2026
2ae3d3e
Merge branch 'clang-tsan' into determinism
aliceb-nv Jan 7, 2026
d89c50a
flag to disable gpu heuristics
aliceb-nv Jan 8, 2026
d67f230
BSP b&b progress
aliceb-nv Jan 9, 2026
eb6bc28
initial working impl on small problens
aliceb-nv Jan 9, 2026
d80667c
more instrumentation
aliceb-nv Jan 10, 2026
8ed172a
keep basis when possible
aliceb-nv Jan 12, 2026
2a16ee6
merge and fix nondeterministic node compare
aliceb-nv Jan 14, 2026
ef777c6
more logs, cache cpu clock
aliceb-nv Jan 14, 2026
6dcb062
plunging for deterministic search
aliceb-nv Jan 14, 2026
35e8177
move to work_unit_scheduler to allow for mid-node syncs
aliceb-nv Jan 15, 2026
e06af9f
better debug printouts
aliceb-nv Jan 15, 2026
99e9ec2
improve ins_vector coverage; fix case where instrumeted mem accesses …
aliceb-nv Jan 15, 2026
8fdbff8
fix sync bug on termination
aliceb-nv Jan 15, 2026
b6d7ecc
revert disable heuristics
aliceb-nv Jan 15, 2026
668391e
no presovle when determinsitic
aliceb-nv Jan 15, 2026
3b6d532
restore nondeterminsitc codepath behavior
aliceb-nv Jan 16, 2026
81aaf20
Merge branch 'main' into determinism
aliceb-nv Jan 16, 2026
07cea4d
cleanup work
aliceb-nv Jan 16, 2026
9fb0edd
more cleanup to test for regressions
aliceb-nv Jan 16, 2026
21b5e29
move GPU determinism changes to another PR
aliceb-nv Jan 16, 2026
8ed90ac
restore run_bounds_strengthening=false in DS presolve
aliceb-nv Jan 16, 2026
cdcd101
spring cleaning
aliceb-nv Jan 16, 2026
cd5d073
cleaning
aliceb-nv Jan 16, 2026
14d3911
no bs changes
aliceb-nv Jan 16, 2026
9289be4
memins on
aliceb-nv Jan 16, 2026
c1526b8
fix memins bug
aliceb-nv Jan 16, 2026
a6e18d7
no ins_wrapper for bound strengthening to allow autovectorization (co…
aliceb-nv Jan 18, 2026
ac57402
stripped down ins_wrapper
aliceb-nv Jan 18, 2026
512a960
Revert "stripped down ins_wrapper"
aliceb-nv Jan 18, 2026
fb45144
merge attempt 1, needs cleanup
aliceb-nv Jan 18, 2026
61c1563
initial detemrinistic diving impl
aliceb-nv Jan 18, 2026
bfb6611
separate time limit and work unit parameters
aliceb-nv Jan 18, 2026
2f673e7
fix issue on presolved to optimality instances
aliceb-nv Jan 18, 2026
cfbb99b
restore gpu heurs
aliceb-nv Jan 18, 2026
01747f4
fix BSP b&b getting starved too early
aliceb-nv Jan 19, 2026
e689154
same diving ratio as base solver
aliceb-nv Jan 19, 2026
14eb9a7
cleanup work
aliceb-nv Jan 19, 2026
7755bd7
further cleanup work
aliceb-nv Jan 19, 2026
a63f032
incorporating cpufj into the deterministic framework
aliceb-nv Jan 19, 2026
bc3bfde
fjcpu cleanup
aliceb-nv Jan 20, 2026
50c574e
update terminology
aliceb-nv Jan 20, 2026
2947a23
unify pseudocost computations
aliceb-nv Jan 20, 2026
8c5e9f6
policy system for solve_lp_
aliceb-nv Jan 20, 2026
c2bab57
Revert policy system to move it to a later PR
aliceb-nv Jan 20, 2026
f16db00
restore fixes
aliceb-nv Jan 20, 2026
2b7859e
log ds features and bounds strenghtening
aliceb-nv Jan 20, 2026
af31388
fix logs
aliceb-nv Jan 20, 2026
f102139
timing stuff
aliceb-nv Jan 20, 2026
5a62393
bump 1
aliceb-nv Jan 20, 2026
fc82a41
bump 2
aliceb-nv Jan 20, 2026
261bfc8
add bounds strenghtening predictor (unused yet)
aliceb-nv Jan 21, 2026
1aca951
Fix issue with work limits that aren't multiples of the horizon steps
aliceb-nv Jan 21, 2026
19210f0
propagate solutions to the solver in determinsitic mode
aliceb-nv Jan 21, 2026
92a8705
fix envvar
aliceb-nv Jan 21, 2026
bbc966b
fix some issues with hashes
aliceb-nv Jan 21, 2026
cff46f3
bump1
aliceb-nv Jan 21, 2026
254be07
bump2
aliceb-nv Jan 21, 2026
ae98cbd
fix tie-breaking and ins_vector counters not being reset appropriately
aliceb-nv Jan 22, 2026
83e0b37
bump1
aliceb-nv Jan 22, 2026
f6a908d
no CPUFJ
aliceb-nv Jan 22, 2026
5ed3732
bump1
aliceb-nv Jan 22, 2026
4a5270f
Refactoring, fix incorrect optimality, add tests
aliceb-nv Jan 22, 2026
2ed103c
add work limit as a parameter
aliceb-nv Jan 22, 2026
16dcfa8
Merge branch 'main' into determinism
aliceb-nv Jan 22, 2026
0d2226c
add parameter for MIP seed
aliceb-nv Jan 22, 2026
409b1ee
restore probing cache
aliceb-nv Jan 22, 2026
addae13
bump1
aliceb-nv Jan 22, 2026
e9a5fac
bump2
aliceb-nv Jan 22, 2026
4f75132
fix compute_hash using the defautl stream and breaking graph capture
aliceb-nv Jan 22, 2026
2fd6859
bump1
aliceb-nv Jan 22, 2026
a10ac30
fix concurrent LP solve and probing cache in deterministic mode
aliceb-nv Jan 23, 2026
5000cda
more stats logging
aliceb-nv Jan 23, 2026
fab2ffe
horizon 0.15
aliceb-nv Jan 23, 2026
183e2ce
horizon 0.25
aliceb-nv Jan 23, 2026
24e4192
horizon 0.5
aliceb-nv Jan 23, 2026
48b74c8
horizon step 1.00
aliceb-nv Jan 23, 2026
12f7b87
restore
aliceb-nv Jan 23, 2026
61c5f77
fix incorrect optimal report
aliceb-nv Jan 23, 2026
a0137d1
Merge branch 'release/26.02' into determinism
aliceb-nv Jan 23, 2026
9e8488c
fix pseudocost updates
aliceb-nv Jan 24, 2026
30eb52e
w/ bounds strenght
aliceb-nv Jan 25, 2026
9817131
fix holes in implementation
aliceb-nv Jan 25, 2026
383e69a
no BS
aliceb-nv Jan 25, 2026
585bdf0
no BS typo
aliceb-nv Jan 25, 2026
dcf0542
greater horizon
aliceb-nv Jan 25, 2026
175ffc8
BS back
aliceb-nv Jan 25, 2026
0e89356
with logging
aliceb-nv Jan 25, 2026
15dd371
add numericla restart to diving and lower bound ceiling updates in BSP
aliceb-nv Jan 26, 2026
30a147a
cleanup
aliceb-nv Jan 26, 2026
dc2fd90
Merge branch 'release/26.02' into determinism
aliceb-nv Jan 26, 2026
91c95e2
heap instead of rebuild
aliceb-nv Jan 26, 2026
5ea1621
cleanup, fix loss of determinism
aliceb-nv Jan 26, 2026
b9960c0
more cleanup
aliceb-nv Jan 26, 2026
2c6e12e
fix determinism test seed
aliceb-nv Jan 26, 2026
be15f63
fix fjcpu bug
aliceb-nv Jan 26, 2026
3b93226
bump
aliceb-nv Jan 26, 2026
9e4b2ee
add comment description
aliceb-nv Jan 26, 2026
1b35ac9
Merge branch 'release/26.02' into determinism
aliceb-nv Jan 26, 2026
deff899
copyright fixes
aliceb-nv Jan 26, 2026
0b0e65b
review comments
aliceb-nv Jan 26, 2026
c5438a4
fix wait_for_producers target
aliceb-nv Jan 26, 2026
433ae0e
no cpufj for bench
aliceb-nv Jan 26, 2026
afd24ad
Merge branch 'release/26.02' into determinism
aliceb-nv Jan 27, 2026
9448dd7
Revert "no cpufj for bench"
aliceb-nv Jan 27, 2026
799f9f5
more logging for bounds strength
aliceb-nv Jan 27, 2026
6c408f2
fix logging
aliceb-nv Jan 28, 2026
4d1f684
disable RUNPATH
aliceb-nv Jan 28, 2026
8810401
Revert "fix logging"
aliceb-nv Jan 28, 2026
a811e86
Revert "more logging for bounds strength"
aliceb-nv Jan 28, 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
45 changes: 35 additions & 10 deletions benchmarks/linear_programming/cuopt/run_mip.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,9 @@ int run_single_file(std::string file_path,
int num_cpu_threads,
bool write_log_file,
bool log_to_console,
double time_limit)
double time_limit,
double work_limit,
bool deterministic)
{
const raft::handle_t handle_{};
cuopt::linear_programming::mip_solver_settings_t<int, double> settings;
Expand Down Expand Up @@ -197,13 +199,16 @@ int run_single_file(std::string file_path,
}
}

settings.time_limit = time_limit;
settings.heuristics_only = heuristics_only;
settings.num_cpu_threads = num_cpu_threads;
settings.log_to_console = log_to_console;
settings.time_limit = time_limit;
settings.work_limit = work_limit;
settings.heuristics_only = heuristics_only;
settings.num_cpu_threads = num_cpu_threads;
settings.log_to_console = log_to_console;
settings.determinism_mode = deterministic ? CUOPT_MODE_DETERMINISTIC : CUOPT_MODE_OPPORTUNISTIC;
settings.tolerances.relative_tolerance = 1e-12;
settings.tolerances.absolute_tolerance = 1e-6;
settings.presolve = true;
settings.seed = 42;
cuopt::linear_programming::benchmark_info_t benchmark_info;
settings.benchmark_info_ptr = &benchmark_info;
auto start_run_solver = std::chrono::high_resolution_clock::now();
Expand Down Expand Up @@ -256,7 +261,9 @@ void run_single_file_mp(std::string file_path,
int num_cpu_threads,
bool write_log_file,
bool log_to_console,
double time_limit)
double time_limit,
double work_limit,
bool deterministic)
{
std::cout << "running file " << file_path << " on gpu : " << device << std::endl;
auto memory_resource = make_async();
Expand All @@ -271,7 +278,9 @@ void run_single_file_mp(std::string file_path,
num_cpu_threads,
write_log_file,
log_to_console,
time_limit);
time_limit,
work_limit,
deterministic);
// this is a bad design to communicate the result but better than adding complexity of IPC or
// pipes
exit(sol_found);
Expand Down Expand Up @@ -341,7 +350,12 @@ int main(int argc, char* argv[])
.default_value(std::string("t"));

program.add_argument("--time-limit")
.help("time limit")
.help("time limit in seconds")
.scan<'g', double>()
.default_value(std::numeric_limits<double>::infinity());

program.add_argument("--work-limit")
.help("work unit limit (for deterministic mode)")
.scan<'g', double>()
.default_value(std::numeric_limits<double>::infinity());

Expand All @@ -354,6 +368,11 @@ int main(int argc, char* argv[])
.help("track allocations (t/f)")
.default_value(std::string("f"));

program.add_argument("-d", "--determinism")
.help("enable deterministic mode")
.default_value(false)
.implicit_value(true);

// Parse arguments
try {
program.parse_args(argc, argv);
Expand All @@ -368,6 +387,7 @@ int main(int argc, char* argv[])
std::string run_dir_arg = program.get<std::string>("--run-dir");
bool run_dir = run_dir_arg[0] == 't';
double time_limit = program.get<double>("--time-limit");
double work_limit = program.get<double>("--work-limit");

bool run_selected = program.get<std::string>("--run-selected")[0] == 't';
int n_gpus = program.get<int>("--n-gpus");
Expand All @@ -382,6 +402,7 @@ int main(int argc, char* argv[])
bool log_to_console = program.get<std::string>("--log-to-console")[0] == 't';
double memory_limit = program.get<double>("--memory-limit");
bool track_allocations = program.get<std::string>("--track-allocations")[0] == 't';
bool deterministic = program.get<bool>("--determinism");

if (num_cpu_threads < 0) { num_cpu_threads = omp_get_max_threads() / n_gpus; }

Expand Down Expand Up @@ -469,7 +490,9 @@ int main(int argc, char* argv[])
num_cpu_threads,
write_log_file,
log_to_console,
time_limit);
time_limit,
work_limit,
deterministic);
} else if (sys_pid < 0) {
std::cerr << "Fork failed!" << std::endl;
exit(1);
Expand Down Expand Up @@ -509,7 +532,9 @@ int main(int argc, char* argv[])
num_cpu_threads,
write_log_file,
log_to_console,
time_limit);
time_limit,
work_limit,
deterministic);
}

return 0;
Expand Down
18 changes: 9 additions & 9 deletions cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -491,9 +491,9 @@ target_link_libraries(cuopt_cli
PRIVATE
)
# 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 "")
target_link_options(cuopt_cli PRIVATE -Wl,--enable-new-dtags)
endif()
# if(NOT DEFINED INSTALL_TARGET OR "${INSTALL_TARGET}" STREQUAL "")
# target_link_options(cuopt_cli PRIVATE -Wl,--enable-new-dtags)
# endif()
set_property(TARGET cuopt_cli PROPERTY INSTALL_RPATH "$ORIGIN/../${lib_dir}")

# adds the cuopt_cli executable to the runtime deb package
Expand Down Expand Up @@ -525,9 +525,9 @@ if(BUILD_MIP_BENCHMARKS AND NOT BUILD_LP_ONLY)
OpenMP::OpenMP_CXX
PRIVATE
)
if(NOT DEFINED INSTALL_TARGET OR "${INSTALL_TARGET}" STREQUAL "")
target_link_options(solve_MIP PRIVATE -Wl,--enable-new-dtags)
endif()
# if(NOT DEFINED INSTALL_TARGET OR "${INSTALL_TARGET}" STREQUAL "")
# target_link_options(solve_MIP PRIVATE -Wl,--enable-new-dtags)
# endif()

target_include_directories(solve_MIP
PRIVATE
Expand Down Expand Up @@ -559,9 +559,9 @@ if(BUILD_LP_BENCHMARKS)
OpenMP::OpenMP_CXX
PRIVATE
)
if(NOT DEFINED INSTALL_TARGET OR "${INSTALL_TARGET}" STREQUAL "")
target_link_options(solve_LP PRIVATE -Wl,--enable-new-dtags)
endif()
# if(NOT DEFINED INSTALL_TARGET OR "${INSTALL_TARGET}" STREQUAL "")
# target_link_options(solve_LP PRIVATE -Wl,--enable-new-dtags)
# endif()
endif()


Expand Down
10 changes: 9 additions & 1 deletion cpp/include/cuopt/linear_programming/constants.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* clang-format off */
/*
* SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
/* clang-format on */
Expand Down Expand Up @@ -32,6 +32,7 @@
#define CUOPT_DUAL_INFEASIBLE_TOLERANCE "dual_infeasible_tolerance"
#define CUOPT_ITERATION_LIMIT "iteration_limit"
#define CUOPT_TIME_LIMIT "time_limit"
#define CUOPT_WORK_LIMIT "work_limit"
#define CUOPT_PDLP_SOLVER_MODE "pdlp_solver_mode"
#define CUOPT_METHOD "method"
#define CUOPT_PER_CONSTRAINT_RESIDUAL "per_constraint_residual"
Expand All @@ -49,6 +50,7 @@
#define CUOPT_CUDSS_DETERMINISTIC "cudss_deterministic"
#define CUOPT_PRESOLVE "presolve"
#define CUOPT_DUAL_POSTSOLVE "dual_postsolve"
#define CUOPT_MIP_DETERMINISM_MODE "mip_determinism_mode"
#define CUOPT_MIP_ABSOLUTE_TOLERANCE "mip_absolute_tolerance"
#define CUOPT_MIP_RELATIVE_TOLERANCE "mip_relative_tolerance"
#define CUOPT_MIP_INTEGRALITY_TOLERANCE "mip_integrality_tolerance"
Expand All @@ -57,11 +59,16 @@
#define CUOPT_MIP_HEURISTICS_ONLY "mip_heuristics_only"
#define CUOPT_MIP_SCALING "mip_scaling"
#define CUOPT_MIP_PRESOLVE "mip_presolve"
#define CUOPT_MIP_SEED "mip_seed"
#define CUOPT_SOLUTION_FILE "solution_file"
#define CUOPT_NUM_CPU_THREADS "num_cpu_threads"
#define CUOPT_NUM_GPUS "num_gpus"
#define CUOPT_USER_PROBLEM_FILE "user_problem_file"

/* @brief MIP determinism mode constants */
#define CUOPT_MODE_OPPORTUNISTIC 0
#define CUOPT_MODE_DETERMINISTIC 1

/* @brief LP/MIP termination status constants */
#define CUOPT_TERIMINATION_STATUS_NO_TERMINATION 0
#define CUOPT_TERIMINATION_STATUS_OPTIMAL 1
Expand All @@ -73,6 +80,7 @@
#define CUOPT_TERIMINATION_STATUS_PRIMAL_FEASIBLE 7
#define CUOPT_TERIMINATION_STATUS_FEASIBLE_FOUND 8
#define CUOPT_TERIMINATION_STATUS_CONCURRENT_LIMIT 9
#define CUOPT_TERIMINATION_STATUS_WORK_LIMIT 10

/* @brief The objective sense constants */
#define CUOPT_MINIMIZE 1
Expand Down
20 changes: 19 additions & 1 deletion cpp/include/cuopt/linear_programming/mip/solver_settings.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* clang-format off */
/*
* SPDX-FileCopyrightText: Copyright (c) 2023-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
/* clang-format on */
Expand Down Expand Up @@ -79,6 +79,7 @@ class mip_solver_settings_t {
tolerances_t tolerances;

f_t time_limit = std::numeric_limits<f_t>::infinity();
f_t work_limit = std::numeric_limits<f_t>::infinity();
bool heuristics_only = false;
i_t num_cpu_threads = -1; // -1 means use default number of threads in branch and bound
i_t num_gpus = 1;
Expand All @@ -91,6 +92,23 @@ class mip_solver_settings_t {
std::vector<std::shared_ptr<rmm::device_uvector<f_t>>> initial_solutions;
bool mip_scaling = true;
bool presolve = true;
/**
* @brief Determinism mode for MIP solver.
*
* Controls the determinism behavior of the MIP solver:
* - CUOPT_MODE_OPPORTUNISTIC (0): Default mode, allows non-deterministic
* parallelism for better performance
* - CUOPT_MODE_DETERMINISTIC (1): Ensures deterministic results across runs
* at potential cost of performance
*/
int determinism_mode = CUOPT_MODE_OPPORTUNISTIC;
/**
* @brief Random seed for the MIP solver.
*
* Controls the initial seed for random number generation in the solver.
* Use -1 to generate a random seed.
*/
i_t seed = -1;
// this is for extracting info from different places of the solver during
// benchmarks
benchmark_info_t* benchmark_info_ptr = nullptr;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* clang-format off */
/*
* SPDX-FileCopyrightText: Copyright (c) 2022-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
/* clang-format on */
Expand Down Expand Up @@ -30,6 +30,7 @@ enum class mip_termination_status_t : int8_t {
Infeasible = CUOPT_TERIMINATION_STATUS_INFEASIBLE,
Unbounded = CUOPT_TERIMINATION_STATUS_UNBOUNDED,
TimeLimit = CUOPT_TERIMINATION_STATUS_TIME_LIMIT,
WorkLimit = CUOPT_TERIMINATION_STATUS_WORK_LIMIT,
};

template <typename i_t, typename f_t>
Expand Down
16 changes: 14 additions & 2 deletions cpp/src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
# cmake-format: off
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# cmake-format: on

set(UTIL_SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/utilities/seed_generator.cu
${CMAKE_CURRENT_SOURCE_DIR}/utilities/logger.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/version_info.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/timestamp_utils.cpp)
${CMAKE_CURRENT_SOURCE_DIR}/utilities/timestamp_utils.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/work_unit_predictor.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/work_unit_scheduler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/models/fj_predictor/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/models/fj_predictor/quantize.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/models/cpufj_predictor/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/models/cpufj_predictor/quantize.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/models/dualsimplex_predictor/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/models/dualsimplex_predictor/quantize.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/models/pdlp_predictor/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/models/pdlp_predictor/quantize.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/models/bounds_strengthening_predictor/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utilities/models/bounds_strengthening_predictor/quantize.cpp)

add_subdirectory(linear_programming)
add_subdirectory(math_optimization)
Expand Down
2 changes: 1 addition & 1 deletion cpp/src/dual_simplex/barrier.cu
Original file line number Diff line number Diff line change
Expand Up @@ -1388,7 +1388,7 @@ class iteration_data_t {
// v = alpha * A * w + beta * v = alpha * A * Dinv * A^T * y + beta * v
matrix_vector_multiply(A, alpha, w, beta, v);
if (debug) {
printf("||A|| = %.16e\n", vector_norm2<i_t, f_t>(A.x));
printf("||A|| = %.16e\n", vector_norm2<i_t, f_t>(A.x.underlying()));
printf("||w|| = %.16e\n", vector_norm2<i_t, f_t>(w));
printf("||v|| = %.16e\n", vector_norm2<i_t, f_t>(v));
}
Expand Down
23 changes: 16 additions & 7 deletions cpp/src/dual_simplex/basis_solves.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,15 @@
#include <dual_simplex/singletons.hpp>
#include <dual_simplex/tic_toc.hpp>
#include <dual_simplex/triangle_solve.hpp>
#include <utilities/memory_instrumentation.hpp>

#include <raft/common/nvtx.hpp>

namespace cuopt::linear_programming::dual_simplex {

// Import instrumented vector type
using cuopt::ins_vector;
Copy link
Contributor

Choose a reason for hiding this comment

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

Do we need to declare the alias here? It does not seem to be used in this file.


template <typename i_t>
i_t reorder_basic_list(const std::vector<i_t>& q, std::vector<i_t>& basic_list)
{
Expand Down Expand Up @@ -57,14 +63,14 @@ void get_basis_from_vstatus(i_t m,

namespace {

template <typename i_t, typename f_t>
template <typename i_t, typename f_t, typename VectorI>
void write_singleton_info(i_t m,
i_t col_singletons,
i_t row_singletons,
const csc_matrix_t<i_t, f_t>& B,
const std::vector<i_t>& row_perm,
const std::vector<i_t>& row_perm_inv,
const std::vector<i_t>& col_perm)
const VectorI& row_perm,
const VectorI& row_perm_inv,
const VectorI& col_perm)
{
FILE* file = fopen("singleton_debug.m", "w");
if (file != NULL) {
Expand Down Expand Up @@ -94,7 +100,7 @@ void write_singleton_info(i_t m,
fclose(file);
}

template <typename i_t, typename f_t>
template <typename i_t, typename f_t, typename VectorI>
void write_factor_info(const char* filename,
i_t m,
i_t row_singletons,
Expand All @@ -104,8 +110,8 @@ void write_factor_info(const char* filename,
const csc_matrix_t<i_t, f_t>& D,
const csc_matrix_t<i_t, f_t>& L,
const csc_matrix_t<i_t, f_t>& U,
const std::vector<i_t>& row_perm,
const std::vector<i_t>& col_perm)
const VectorI& row_perm,
const VectorI& col_perm)
{
FILE* file = fopen(filename, "w");
if (file != NULL) {
Expand Down Expand Up @@ -165,6 +171,7 @@ i_t factorize_basis(const csc_matrix_t<i_t, f_t>& A,
std::vector<i_t>& deficient,
std::vector<i_t>& slacks_needed)
{
raft::common::nvtx::range scope("LU::factorize_basis");
const i_t m = basic_list.size();
constexpr f_t medium_tol = 1e-12;

Expand Down Expand Up @@ -765,6 +772,8 @@ i_t b_transpose_solve(const csc_matrix_t<i_t, f_t>& L,
// U'*r = c
// L'*w = r

raft::common::nvtx::range scope("LU::b_transpose_solve");

// Solve for r such that U'*r = c
std::vector<f_t> r = rhs;
upper_triangular_transpose_solve(U, r);
Expand Down
Loading
Loading