Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
6d7de76
initial BVE impl
aliceb-nv Jul 16, 2026
e2d23ec
more tests
aliceb-nv Jul 16, 2026
77fc1d7
bve presolve time limit checks
aliceb-nv Jul 16, 2026
94a61b7
work unit accounting
aliceb-nv Jul 16, 2026
172a436
ai review
aliceb-nv Jul 17, 2026
36e16a1
more test tweaks
aliceb-nv Jul 17, 2026
73888a1
ai review, improve work units
aliceb-nv Jul 17, 2026
14b13fc
caps for block BVE
aliceb-nv Jul 17, 2026
8f3b3e2
multi-round BVE
aliceb-nv Jul 17, 2026
68fa3d3
bit of refactor
aliceb-nv Jul 22, 2026
d27dfc3
integrality
aliceb-nv Jul 22, 2026
e545813
warn on obj mismatch
aliceb-nv Jul 23, 2026
5e9616f
agents make for terrible maintainers
aliceb-nv Jul 23, 2026
9ce69f1
cleanup
aliceb-nv Jul 24, 2026
8a12608
bundle mps test files in the git tree
aliceb-nv Jul 24, 2026
4ff40d3
clarity changes
aliceb-nv Aug 4, 2026
d86ba90
greedy cover enumeration
aliceb-nv Aug 5, 2026
2bc6e83
do not rerun probing between blockbve rounds
aliceb-nv Aug 5, 2026
8b7ebb4
propagating implications back into the probing cache
aliceb-nv Aug 5, 2026
1cfd1e5
Promote row integer scaling into utilities, report fractional A coeff…
aliceb-nv Aug 6, 2026
5065bad
fix incorrect infeasibility detection
aliceb-nv Aug 6, 2026
70fb277
parameters for blockBVE
aliceb-nv Aug 6, 2026
ec5d3fc
clarity pass
aliceb-nv Aug 6, 2026
6e4239d
exit when requested to output the GPU presolved problem
aliceb-nv Aug 6, 2026
3c22cd6
pre-PR cleanup
aliceb-nv Aug 6, 2026
288038e
more cleanup
aliceb-nv Aug 6, 2026
00496e0
ai review
aliceb-nv Aug 6, 2026
c656925
fix build
aliceb-nv Aug 7, 2026
2007158
fix lib size limit
aliceb-nv Aug 7, 2026
4389af6
put limits on the blockBVE phase
aliceb-nv Aug 17, 2026
5176b3f
more gating
aliceb-nv Aug 17, 2026
df3f584
cleanup
aliceb-nv Aug 19, 2026
ff8d897
cleanup
aliceb-nv Aug 19, 2026
3323635
AI Review
aliceb-nv Aug 19, 2026
e6f06a7
review comment cleanup
aliceb-nv Aug 19, 2026
aab2beb
review comments
aliceb-nv Aug 19, 2026
c7f06ac
style
aliceb-nv Aug 19, 2026
9495453
fix build
aliceb-nv Aug 20, 2026
45d722a
rebase
aliceb-nv Aug 22, 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
2 changes: 1 addition & 1 deletion ci/validate_wheel.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ PYDISTCHECK_ARGS=(
if [[ "${package_dir}" == "python/libcuopt" ]]; then
if [[ "${RAPIDS_CUDA_MAJOR}" == "12" ]]; then
PYDISTCHECK_ARGS+=(
--max-allowed-size-compressed '690Mi'
--max-allowed-size-compressed '695Mi'
)
else
PYDISTCHECK_ARGS+=(
Expand Down
3 changes: 3 additions & 0 deletions cpp/include/cuopt/mathematical_optimization/constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,9 @@
#define CUOPT_MIP_HYPER_SUBMIP_ITERATION_LIMIT_RATIO "mip_hyper_submip_iteration_limit_ratio"
#define CUOPT_MIP_HYPER_SUBMIP_ENABLE_CPUFJ "mip_hyper_submip_enable_cpufj"

/* @brief Block bounded-variable-elimination step of cuOpt's internal MIP presolve */
#define CUOPT_MIP_HYPER_BLOCK_BVE "mip_hyper_block_bve"

/* @brief QCQP (barrier) scaling hyper-parameters */
#define CUOPT_QCQP_HYPER_RUIZ_EQUILIBRATION "qcqp_hyper_ruiz_equilibration"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,15 @@ class mip_solver_settings_t {
* When this is `false`, probing is skipped even if presolve is otherwise on.
*/
bool probing{true};
/**
* @brief Enable the block bounded-variable-elimination step of cuOpt's MIP presolve.
*
* Runs after trivial_presolve and eliminates blocks of functionally-determined binary auxiliary
* variables discovered via the probing-cache implication closure, re-encoding each block's
* projected relation as certified prime-implicate clauses. Requires the probing-cache step; a
* no-op when no certified reduction exists.
*/
bool block_bve{true};
/**
* @brief Determinism mode for MIP solver.
*
Expand Down
4 changes: 2 additions & 2 deletions cpp/src/io/mps_writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,8 +229,8 @@ void mps_writer_t<i_t, f_t>::write(const std::string& mps_file_path)
// save coefficients with full precision
mps_file << std::setprecision(std::numeric_limits<f_t>::max_digits10);

// NAME section
mps_file << "NAME " << problem_.get_problem_name() << "\n";
const std::string& pname = problem_.get_problem_name();
mps_file << "NAME " << (pname.empty() ? "cuopt" : pname) << "\n";

if (problem_.get_sense()) { mps_file << "OBJSENSE\n MAXIMIZE\n"; }

Expand Down
1 change: 1 addition & 0 deletions cpp/src/math_optimization/solver_settings.cu
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ solver_settings_t<i_t, f_t>::solver_settings_t() : pdlp_settings(), mip_settings
{CUOPT_MIP_HYPER_DIVING_SHOW_TYPE, &mip_settings.diving_params.show_type, false, "log diving heuristic type when it finds a new incumbent"},
// Recursive sub-MIP (RINS) hyper-parameters (hidden from default --help: name contains "hyper_")
{CUOPT_MIP_HYPER_SUBMIP_ENABLE_CPUFJ, &mip_settings.submip_params.enable_cpufj, true, "run CPU FJ over the sub-MIP"},
{CUOPT_MIP_HYPER_BLOCK_BVE, &mip_settings.block_bve, true, "eliminate blocks of binaries in cuOpt's MIP presolve (needs " CUOPT_MIP_PROBING ")"},
};
// String parameters
string_parameters = {
Expand Down
1 change: 1 addition & 0 deletions cpp/src/mip_heuristics/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ set(MIP_NON_LP_FILES
${CMAKE_CURRENT_SOURCE_DIR}/local_search/rounding/simple_rounding.cu
${CMAKE_CURRENT_SOURCE_DIR}/local_search/feasibility_pump/feasibility_pump.cu
${CMAKE_CURRENT_SOURCE_DIR}/local_search/line_segment_search/line_segment_search.cu
${CMAKE_CURRENT_SOURCE_DIR}/presolve/block_bve.cu
${CMAKE_CURRENT_SOURCE_DIR}/presolve/bounds_presolve.cu
${CMAKE_CURRENT_SOURCE_DIR}/presolve/bounds_update_data.cu
${CMAKE_CURRENT_SOURCE_DIR}/presolve/semi_continuous.cu
Expand Down
19 changes: 16 additions & 3 deletions cpp/src/mip_heuristics/diversity/diversity_manager.cu
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@
#include <mip_heuristics/mip_constants.hpp>
#include <mip_heuristics/presolve/third_party_presolve.hpp>

#include <mip_heuristics/presolve/block_bve.cuh>
#include <mip_heuristics/presolve/conflict_graph/clique_table.cuh>
#include <mip_heuristics/presolve/probing_cache.cuh>
#include <mip_heuristics/presolve/trivial_presolve.cuh>
#include <mip_heuristics/problem/problem_helpers.cuh>

#include <pdlp/solve.cuh>

#include <utilities/copy_helpers.hpp>
#include <utilities/scope_guard.hpp>

#include <chrono>
Expand Down Expand Up @@ -307,7 +309,10 @@ bool diversity_manager_t<i_t, f_t>::run_presolve(f_t time_limit, timer_t global_
CUOPT_LOG_INFO("Probing-cache step disabled via %s=false", CUOPT_MIP_PROBING);
run_probing_cache = false;
}
if (run_probing_cache) {
const bool remap_cache_ids = true;
problem_ptr->related_vars_time_limit = context.settings.heuristic_params.related_vars_time_limit;

if (run_probing_cache && !global_timer.check_time_limit() && !presolve_timer.check_time_limit()) {
log_presolve_budget("PROBING", probing_features, probing_budget);
f_t time_for_probing_cache = std::min(time_limit, (f_t)global_timer.remaining_time());
timer_t probing_timer{time_for_probing_cache};
Expand All @@ -324,9 +329,17 @@ bool diversity_manager_t<i_t, f_t>::run_presolve(f_t time_limit, timer_t global_
std::chrono::duration<double>(std::chrono::steady_clock::now() - probing_t0).count());
if (problem_is_infeasible) { return false; }
}
const bool remap_cache_ids = true;
problem_ptr->related_vars_time_limit = context.settings.heuristic_params.related_vars_time_limit;

if (!global_timer.check_time_limit()) { trivial_presolve(*problem_ptr, remap_cache_ids); }

if (context.settings.block_bve && run_probing_cache) {
timer_t bve_deadline(std::min(global_timer.remaining_time(), presolve_timer.remaining_time()));
if (!block_bve_phase(ls.constraint_prop.bounds_update, *problem_ptr, bve_deadline)) {
stats.presolve_time = timer.elapsed_time();
return false;
}
}

if (!problem_ptr->empty && !check_bounds_sanity(*problem_ptr)) { return false; }
// if (!presolve_timer.check_time_limit() && !context.settings.heuristics_only &&
// !problem_ptr->empty) {
Expand Down
6 changes: 6 additions & 0 deletions cpp/src/mip_heuristics/diversity/population.cu
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,12 @@ std::vector<solution_t<i_t, f_t>> population_t<i_t, f_t>::get_external_solutions
sol.compute_number_of_integers(),
problem_ptr->n_integer_vars);
}
if (std::abs(sol.get_objective() - h_entry.objective) > OBJECTIVE_EPSILON) {
CUOPT_LOG_DEBUG(
"External solution objective mismatch: sol.get_objective() = %g, h_entry.objective = %g",
sol.get_objective(),
h_entry.objective);
}
sol.handle_ptr->sync_stream();
return_vector.emplace_back(std::move(sol));
counter++;
Expand Down
Loading
Loading