Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
62d7a5f
pass global upper bound to strong branching. Added an estimation for …
nguidotti Mar 16, 2026
aa4d55c
Use a single dual simplex pivot to initialize pseudocost
chris-maes Mar 16, 2026
3289516
Merge branch 'fork/chris-maes/pseudo_cost_single_pivot_estimate' into…
nguidotti Mar 17, 2026
3ae3f22
reliability branching now rank the candidates based on the objective …
nguidotti Mar 17, 2026
2b2f94d
`single_pivot_objective_change_estimate` now returns the objective ch…
nguidotti Mar 18, 2026
925d36e
removed new cutoff in trial branching. adjusted reliability branching…
nguidotti Mar 19, 2026
c6b0e3c
small fixes
nguidotti Mar 19, 2026
94c3dc3
Merge branch 'release/26.04' into improve-reliable-branching
nguidotti Mar 20, 2026
703f30c
re-enable cutoff for trial branching
nguidotti Mar 21, 2026
bb71cde
fixed style
nguidotti Mar 23, 2026
a3193c9
fixed invalid symbols
nguidotti Mar 23, 2026
f535b49
removed debug code
nguidotti Mar 24, 2026
e8dea1e
enable by default the candidate ranking via simplex pivot
nguidotti Mar 24, 2026
839d562
remove additional debug code
nguidotti Mar 24, 2026
6c68a2b
small refactor
nguidotti Mar 25, 2026
b0cb041
Merge branch 'release/26.04' into improve-reliable-branching
nguidotti Mar 25, 2026
15604c7
small refactor
nguidotti Mar 26, 2026
7b5d429
Merge branch 'release/26.04' into improve-reliable-branching
nguidotti Mar 26, 2026
9c9d019
increasing time limit for `seymour1` instance for the determinism test
nguidotti Mar 30, 2026
5e16269
Merge branch 'release/26.04' into improve-reliable-branching
nguidotti Mar 31, 2026
bb20dd3
fixed incorrect cut off calculation. added pivot estimation for stron…
nguidotti Apr 1, 2026
c4f246e
Merge branch 'release/26.04' into improve-reliable-branching
nguidotti Apr 1, 2026
042eba2
added CLI parameter to control the maximum number of simplex iteratio…
nguidotti Apr 2, 2026
fa9e902
set simplex iteration limits to RINS and SubMIP
nguidotti Apr 2, 2026
9ea1248
Merged with release/26.04
nguidotti Apr 2, 2026
64d58f2
decreasing the work limit from 3 to 2 for `gmu-35-50` in the determin…
nguidotti Apr 2, 2026
cd852b5
Merge branch 'release/26.04' into improve-reliable-branching
nguidotti Apr 2, 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
117 changes: 59 additions & 58 deletions cpp/include/cuopt/linear_programming/constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,64 +20,65 @@
#define CUOPT_INSTANTIATE_INT64 0

/* @brief LP/MIP parameter string constants */
#define CUOPT_ABSOLUTE_DUAL_TOLERANCE "absolute_dual_tolerance"
#define CUOPT_RELATIVE_DUAL_TOLERANCE "relative_dual_tolerance"
#define CUOPT_ABSOLUTE_PRIMAL_TOLERANCE "absolute_primal_tolerance"
#define CUOPT_RELATIVE_PRIMAL_TOLERANCE "relative_primal_tolerance"
#define CUOPT_ABSOLUTE_GAP_TOLERANCE "absolute_gap_tolerance"
#define CUOPT_RELATIVE_GAP_TOLERANCE "relative_gap_tolerance"
#define CUOPT_INFEASIBILITY_DETECTION "infeasibility_detection"
#define CUOPT_STRICT_INFEASIBILITY "strict_infeasibility"
#define CUOPT_PRIMAL_INFEASIBLE_TOLERANCE "primal_infeasible_tolerance"
#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"
#define CUOPT_SAVE_BEST_PRIMAL_SO_FAR "save_best_primal_so_far"
#define CUOPT_FIRST_PRIMAL_FEASIBLE "first_primal_feasible"
#define CUOPT_LOG_FILE "log_file"
#define CUOPT_LOG_TO_CONSOLE "log_to_console"
#define CUOPT_CROSSOVER "crossover"
#define CUOPT_FOLDING "folding"
#define CUOPT_AUGMENTED "augmented"
#define CUOPT_DUALIZE "dualize"
#define CUOPT_ORDERING "ordering"
#define CUOPT_BARRIER_DUAL_INITIAL_POINT "barrier_dual_initial_point"
#define CUOPT_ELIMINATE_DENSE_COLUMNS "eliminate_dense_columns"
#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"
#define CUOPT_MIP_ABSOLUTE_GAP "mip_absolute_gap"
#define CUOPT_MIP_RELATIVE_GAP "mip_relative_gap"
#define CUOPT_MIP_HEURISTICS_ONLY "mip_heuristics_only"
#define CUOPT_MIP_SCALING "mip_scaling"
#define CUOPT_MIP_PRESOLVE "mip_presolve"
#define CUOPT_MIP_RELIABILITY_BRANCHING "mip_reliability_branching"
#define CUOPT_MIP_CUT_PASSES "mip_cut_passes"
#define CUOPT_MIP_MIXED_INTEGER_ROUNDING_CUTS "mip_mixed_integer_rounding_cuts"
#define CUOPT_MIP_MIXED_INTEGER_GOMORY_CUTS "mip_mixed_integer_gomory_cuts"
#define CUOPT_MIP_KNAPSACK_CUTS "mip_knapsack_cuts"
#define CUOPT_MIP_IMPLIED_BOUND_CUTS "mip_implied_bound_cuts"
#define CUOPT_MIP_CLIQUE_CUTS "mip_clique_cuts"
#define CUOPT_MIP_STRONG_CHVATAL_GOMORY_CUTS "mip_strong_chvatal_gomory_cuts"
#define CUOPT_MIP_REDUCED_COST_STRENGTHENING "mip_reduced_cost_strengthening"
#define CUOPT_MIP_CUT_CHANGE_THRESHOLD "mip_cut_change_threshold"
#define CUOPT_MIP_CUT_MIN_ORTHOGONALITY "mip_cut_min_orthogonality"
#define CUOPT_MIP_BATCH_PDLP_STRONG_BRANCHING "mip_batch_pdlp_strong_branching"
#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"
#define CUOPT_PRESOLVE_FILE "presolve_file"
#define CUOPT_RANDOM_SEED "random_seed"
#define CUOPT_PDLP_PRECISION "pdlp_precision"
#define CUOPT_ABSOLUTE_DUAL_TOLERANCE "absolute_dual_tolerance"
#define CUOPT_RELATIVE_DUAL_TOLERANCE "relative_dual_tolerance"
#define CUOPT_ABSOLUTE_PRIMAL_TOLERANCE "absolute_primal_tolerance"
#define CUOPT_RELATIVE_PRIMAL_TOLERANCE "relative_primal_tolerance"
#define CUOPT_ABSOLUTE_GAP_TOLERANCE "absolute_gap_tolerance"
#define CUOPT_RELATIVE_GAP_TOLERANCE "relative_gap_tolerance"
#define CUOPT_INFEASIBILITY_DETECTION "infeasibility_detection"
#define CUOPT_STRICT_INFEASIBILITY "strict_infeasibility"
#define CUOPT_PRIMAL_INFEASIBLE_TOLERANCE "primal_infeasible_tolerance"
#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"
#define CUOPT_SAVE_BEST_PRIMAL_SO_FAR "save_best_primal_so_far"
#define CUOPT_FIRST_PRIMAL_FEASIBLE "first_primal_feasible"
#define CUOPT_LOG_FILE "log_file"
#define CUOPT_LOG_TO_CONSOLE "log_to_console"
#define CUOPT_CROSSOVER "crossover"
#define CUOPT_FOLDING "folding"
#define CUOPT_AUGMENTED "augmented"
#define CUOPT_DUALIZE "dualize"
#define CUOPT_ORDERING "ordering"
#define CUOPT_BARRIER_DUAL_INITIAL_POINT "barrier_dual_initial_point"
#define CUOPT_ELIMINATE_DENSE_COLUMNS "eliminate_dense_columns"
#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"
#define CUOPT_MIP_ABSOLUTE_GAP "mip_absolute_gap"
#define CUOPT_MIP_RELATIVE_GAP "mip_relative_gap"
#define CUOPT_MIP_HEURISTICS_ONLY "mip_heuristics_only"
#define CUOPT_MIP_SCALING "mip_scaling"
#define CUOPT_MIP_PRESOLVE "mip_presolve"
#define CUOPT_MIP_RELIABILITY_BRANCHING "mip_reliability_branching"
#define CUOPT_MIP_CUT_PASSES "mip_cut_passes"
#define CUOPT_MIP_MIXED_INTEGER_ROUNDING_CUTS "mip_mixed_integer_rounding_cuts"
#define CUOPT_MIP_MIXED_INTEGER_GOMORY_CUTS "mip_mixed_integer_gomory_cuts"
#define CUOPT_MIP_KNAPSACK_CUTS "mip_knapsack_cuts"
#define CUOPT_MIP_IMPLIED_BOUND_CUTS "mip_implied_bound_cuts"
#define CUOPT_MIP_CLIQUE_CUTS "mip_clique_cuts"
#define CUOPT_MIP_STRONG_CHVATAL_GOMORY_CUTS "mip_strong_chvatal_gomory_cuts"
#define CUOPT_MIP_REDUCED_COST_STRENGTHENING "mip_reduced_cost_strengthening"
#define CUOPT_MIP_CUT_CHANGE_THRESHOLD "mip_cut_change_threshold"
#define CUOPT_MIP_CUT_MIN_ORTHOGONALITY "mip_cut_min_orthogonality"
#define CUOPT_MIP_BATCH_PDLP_STRONG_BRANCHING "mip_batch_pdlp_strong_branching"
#define CUOPT_MIP_STRONG_BRANCHING_SIMPLEX_ITER_LIMIT "mip_strong_branching_simplex_iter_limit"
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.

This is minor, but it becomes part of the API, so probably worth getting it correct. All other parameters use full word rather than abbreviations.

So we should probably call this mip_strong_branching_simplex_iteration_limit

#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"
#define CUOPT_PRESOLVE_FILE "presolve_file"
#define CUOPT_RANDOM_SEED "random_seed"
#define CUOPT_PDLP_PRECISION "pdlp_precision"

/* @brief MIP determinism mode constants */
#define CUOPT_MODE_OPPORTUNISTIC 0
Expand Down
15 changes: 8 additions & 7 deletions cpp/include/cuopt/linear_programming/mip/solver_settings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,14 @@ class mip_solver_settings_t {
i_t knapsack_cuts = -1;
i_t clique_cuts = -1;
i_t implied_bound_cuts = -1;
i_t strong_chvatal_gomory_cuts = -1;
i_t reduced_cost_strengthening = -1;
f_t cut_change_threshold = -1.0;
f_t cut_min_orthogonality = 0.5;
i_t mip_batch_pdlp_strong_branching = 0;
i_t num_gpus = 1;
bool log_to_console = true;
i_t strong_chvatal_gomory_cuts = -1;
i_t reduced_cost_strengthening = -1;
f_t cut_change_threshold = -1.0;
f_t cut_min_orthogonality = 0.5;
i_t mip_batch_pdlp_strong_branching = 0;
i_t strong_branching_simplex_iteration_limit = -1;
i_t num_gpus = 1;
bool log_to_console = true;

std::string log_file;
std::string sol_file;
Expand Down
13 changes: 8 additions & 5 deletions cpp/src/branch_and_bound/branch_and_bound.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -840,11 +840,10 @@ branch_variable_t<i_t> branch_and_bound_t<i_t, f_t>::variable_selection(
if (settings_.reliability_branching != 0) {
branch_var = pc_.reliable_variable_selection(node_ptr,
fractional,
solution,
settings_,
var_types_,
worker,
var_types_,
exploration_stats_,
settings_,
upper_bound_,
worker_pool_.num_idle_workers(),
log);
Expand Down Expand Up @@ -1176,7 +1175,6 @@ std::pair<node_status_t, rounding_direction_t> branch_and_bound_t<i_t, f_t>::upd
dual::status_t lp_status,
Policy& policy)
{
constexpr f_t inf = std::numeric_limits<f_t>::infinity();
const f_t abs_fathom_tol = settings_.absolute_mip_gap_tol / 10;
lp_problem_t<i_t, f_t>& leaf_problem = worker->leaf_problem;
lp_solution_t<i_t, f_t>& leaf_solution = worker->leaf_solution;
Expand Down Expand Up @@ -2499,18 +2497,23 @@ mip_status_t branch_and_bound_t<i_t, f_t>::solve(mip_solution_t<i_t, f_t>& solut
set_uninitialized_steepest_edge_norms(original_lp_, basic_list, edge_norms_);

pc_.resize(original_lp_.num_cols);
original_lp_.A.transpose(pc_.AT);
{
raft::common::nvtx::range scope_sb("BB::strong_branching");
strong_branching<i_t, f_t>(original_problem_,
original_lp_,
settings_,
exploration_stats_.start_time,
var_types_,
root_relax_soln_.x,
root_relax_soln_,
fractional,
root_objective_,
upper_bound_,
root_vstatus_,
edge_norms_,
basic_list,
nonbasic_list,
basis_update,
pc_);
}

Expand Down
Loading
Loading