Skip to content

Commit 8e80e60

Browse files
Merge pull request #1040 from rgsl888prabhu/main-merge-release/26.04_2
Main merge release/26.04 2
2 parents 40c8f04 + b5b6dfa commit 8e80e60

99 files changed

Lines changed: 5049 additions & 1378 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cpp/CMakeLists.txt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ endif(BUILD_MSAN)
138138
# infrastructure files. Those files include abseil headers, and abseil's shared library
139139
# on conda-forge doesn't export Mutex::Dtor() in NDEBUG builds (abseil-cpp#1624).
140140
# Keeping NDEBUG defined for gRPC files makes the header inline an empty Dtor(),
141-
# avoiding the missing symbol at runtime.
141+
# avoiding the missing symbol at runtime. Additionally, gRPC files are always
142+
# compiled with -DNDEBUG (see below) so Debug builds also avoid the missing symbol.
142143
if(DEFINE_ASSERT)
143144
add_definitions(-DASSERT_MODE)
144145
list(APPEND CUOPT_CUDA_FLAGS -UNDEBUG)
@@ -390,7 +391,7 @@ if(DEFINE_ASSERT)
390391
endif()
391392

392393
# Add gRPC mapper files and generated protobuf sources
393-
list(APPEND CUOPT_SRC_FILES
394+
set(GRPC_INFRA_FILES
394395
${PROTO_SRCS}
395396
${GRPC_PROTO_SRCS}
396397
${GRPC_SERVICE_SRCS}
@@ -401,6 +402,15 @@ list(APPEND CUOPT_SRC_FILES
401402
src/grpc/client/grpc_client.cpp
402403
src/grpc/client/solve_remote.cpp
403404
)
405+
list(APPEND CUOPT_SRC_FILES ${GRPC_INFRA_FILES})
406+
407+
# Always keep NDEBUG defined for gRPC infrastructure files so that abseil
408+
# headers inline Mutex::Dtor() instead of emitting an external call.
409+
# The conda-forge abseil shared library is built with NDEBUG and does not
410+
# export that symbol (abseil-cpp#1624). Without this, Debug builds fail
411+
# at runtime with "undefined symbol: absl::…::Mutex::Dtor".
412+
set_property(SOURCE ${GRPC_INFRA_FILES} DIRECTORY ${CMAKE_SOURCE_DIR}
413+
APPEND PROPERTY COMPILE_OPTIONS "-DNDEBUG")
404414

405415
add_library(cuopt SHARED
406416
${CUOPT_SRC_FILES}

cpp/cuopt_cli.cpp

Lines changed: 61 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <cuopt/linear_programming/solve.hpp>
1414
#include <mps_parser/parser.hpp>
1515
#include <utilities/logger.hpp>
16+
#include <utilities/timer.hpp>
1617

1718
#include <raft/core/device_setter.hpp>
1819
#include <raft/core/handle.hpp>
@@ -85,30 +86,22 @@ inline cuopt::init_logger_t dummy_logger(
8586
* @brief Run a single file
8687
* @param file_path Path to the MPS format input file containing the optimization problem
8788
* @param initial_solution_file Path to initial solution file in SOL format
88-
* @param settings_strings Map of solver parameters
89+
* @param settings Merged solver settings (config file loaded in main, then CLI overrides applied)
8990
*/
9091
int run_single_file(const std::string& file_path,
9192
const std::string& initial_solution_file,
9293
bool solve_relaxation,
93-
const std::map<std::string, std::string>& settings_strings)
94+
cuopt::linear_programming::solver_settings_t<int, double>& settings)
9495
{
95-
cuopt::linear_programming::solver_settings_t<int, double> settings;
96-
97-
try {
98-
for (auto& [key, val] : settings_strings) {
99-
settings.set_parameter_from_string(key, val);
100-
}
101-
} catch (const std::exception& e) {
102-
auto log = dummy_logger(settings);
103-
CUOPT_LOG_ERROR("Error: %s", e.what());
104-
return -1;
105-
}
96+
cuopt::init_logger_t log(settings.get_parameter<std::string>(CUOPT_LOG_FILE),
97+
settings.get_parameter<bool>(CUOPT_LOG_TO_CONSOLE));
10698

10799
std::string base_filename = file_path.substr(file_path.find_last_of("/\\") + 1);
108100

109101
constexpr bool input_mps_strict = false;
110102
cuopt::mps_parser::mps_data_model_t<int, double> mps_data_model;
111103
bool parsing_failed = false;
104+
auto timer = cuopt::timer_t(settings.get_parameter<double>(CUOPT_TIME_LIMIT));
112105
{
113106
CUOPT_LOG_INFO("Reading file %s", base_filename.c_str());
114107
try {
@@ -123,6 +116,7 @@ int run_single_file(const std::string& file_path,
123116
CUOPT_LOG_ERROR("Parsing MPS failed. Exiting!");
124117
return -1;
125118
}
119+
CUOPT_LOG_INFO("Read file %s in %.2f seconds", base_filename.c_str(), timer.elapsed_time());
126120

127121
// Determine memory backend and create problem using interface
128122
// Create handle only for GPU memory backend (avoid CUDA init on CPU-only hosts)
@@ -259,6 +253,21 @@ int set_cuda_module_loading(int argc, char* argv[])
259253
*/
260254
int main(int argc, char* argv[])
261255
{
256+
// Handle dump flags before argparse so no other args are required
257+
for (int i = 1; i < argc; ++i) {
258+
std::string arg = argv[i];
259+
if (arg == "--dump-hyper-params") {
260+
cuopt::linear_programming::solver_settings_t<int, double> settings;
261+
settings.dump_parameters_to_file("/dev/stdout", true);
262+
return 0;
263+
}
264+
if (arg == "--dump-params") {
265+
cuopt::linear_programming::solver_settings_t<int, double> settings;
266+
settings.dump_parameters_to_file("/dev/stdout", false);
267+
return 0;
268+
}
269+
}
270+
262271
if (set_cuda_module_loading(argc, argv) != 0) { return 1; }
263272

264273
// Get the version string from the version_config.hpp file
@@ -287,6 +296,20 @@ int main(int argc, char* argv[])
287296
.default_value(true)
288297
.implicit_value(true);
289298

299+
program.add_argument("--params-file")
300+
.help("path to parameter config file (key = value format, supports all parameters)")
301+
.default_value(std::string(""));
302+
303+
program.add_argument("--dump-hyper-params")
304+
.help("print hyper-parameters only in config file format and exit")
305+
.default_value(false)
306+
.implicit_value(true);
307+
308+
program.add_argument("--dump-params")
309+
.help("print all parameters in config file format and exit")
310+
.default_value(false)
311+
.implicit_value(true);
312+
290313
std::map<std::string, std::string> arg_name_to_param_name;
291314

292315
// Register --pdlp-precision with string-to-int mapping so that it flows
@@ -312,37 +335,39 @@ int main(int argc, char* argv[])
312335
std::string arg_name = param_name_to_arg_name(param.param_name);
313336
// handle duplicate parameters appearing in MIP and LP settings
314337
if (arg_name_to_param_name.count(arg_name) == 0) {
315-
program.add_argument(arg_name.c_str()).default_value(param.default_value);
338+
auto& arg = program.add_argument(arg_name.c_str()).default_value(param.default_value);
339+
if (param.param_name.find("hyper_") != std::string::npos) { arg.hidden(); }
316340
arg_name_to_param_name[arg_name] = param.param_name;
317341
}
318342
}
319343

320344
for (auto& param : double_params) {
321345
std::string arg_name = param_name_to_arg_name(param.param_name);
322-
// handle duplicate parameters appearing in MIP and LP settings
323346
if (arg_name_to_param_name.count(arg_name) == 0) {
324-
program.add_argument(arg_name.c_str()).default_value(param.default_value);
347+
auto& arg = program.add_argument(arg_name.c_str()).default_value(param.default_value);
348+
if (param.param_name.find("hyper_") != std::string::npos) { arg.hidden(); }
325349
arg_name_to_param_name[arg_name] = param.param_name;
326350
}
327351
}
328352

329353
for (auto& param : bool_params) {
330354
std::string arg_name = param_name_to_arg_name(param.param_name);
331355
if (arg_name_to_param_name.count(arg_name) == 0) {
332-
program.add_argument(arg_name.c_str()).default_value(param.default_value);
356+
auto& arg = program.add_argument(arg_name.c_str()).default_value(param.default_value);
357+
if (param.param_name.find("hyper_") != std::string::npos) { arg.hidden(); }
333358
arg_name_to_param_name[arg_name] = param.param_name;
334359
}
335360
}
336361

337362
for (auto& param : string_params) {
338363
std::string arg_name = param_name_to_arg_name(param.param_name);
339-
// handle duplicate parameters appearing in MIP and LP settings
340364
if (arg_name_to_param_name.count(arg_name) == 0) {
341-
program.add_argument(arg_name.c_str()).default_value(param.default_value);
365+
auto& arg = program.add_argument(arg_name.c_str()).default_value(param.default_value);
366+
if (param.param_name.find("hyper_") != std::string::npos) { arg.hidden(); }
342367
arg_name_to_param_name[arg_name] = param.param_name;
343368
}
344-
} // done with solver settings
345-
}
369+
}
370+
} // done with solver settings
346371

347372
// Parse arguments
348373
try {
@@ -374,16 +399,26 @@ int main(int argc, char* argv[])
374399

375400
const auto initial_solution_file = program.get<std::string>("--initial-solution");
376401
const auto solve_relaxation = program.get<bool>("--relaxation");
402+
const auto params_file = program.get<std::string>("--params-file");
403+
404+
cuopt::linear_programming::solver_settings_t<int, double> settings;
405+
try {
406+
if (!params_file.empty()) { settings.load_parameters_from_file(params_file); }
407+
for (auto& [key, val] : settings_strings) {
408+
settings.set_parameter_from_string(key, val);
409+
}
410+
} catch (const std::exception& e) {
411+
auto log = dummy_logger(settings);
412+
CUOPT_LOG_ERROR("Error: %s", e.what());
413+
return -1;
414+
}
377415

378416
// Only initialize CUDA resources if using GPU memory backend (not remote execution)
379417
auto memory_backend = cuopt::linear_programming::get_memory_backend_type();
380418
std::vector<std::shared_ptr<rmm::mr::device_memory_resource>> memory_resources;
381419

382420
if (memory_backend == cuopt::linear_programming::memory_backend_t::GPU) {
383-
// All arguments are parsed as string, default values are parsed as int if unused.
384-
const auto num_gpus = program.is_used("--num-gpus")
385-
? std::stoi(program.get<std::string>("--num-gpus"))
386-
: program.get<int>("--num-gpus");
421+
const int num_gpus = settings.get_parameter<int>(CUOPT_NUM_GPUS);
387422

388423
for (int i = 0; i < std::min(raft::device_setter::get_device_count(), num_gpus); ++i) {
389424
RAFT_CUDA_TRY(cudaSetDevice(i));
@@ -393,5 +428,5 @@ int main(int argc, char* argv[])
393428
RAFT_CUDA_TRY(cudaSetDevice(0));
394429
}
395430

396-
return run_single_file(file_name, initial_solution_file, solve_relaxation, settings_strings);
431+
return run_single_file(file_name, initial_solution_file, solve_relaxation, settings);
397432
}

cpp/include/cuopt/linear_programming/constants.h

Lines changed: 90 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -20,64 +20,90 @@
2020
#define CUOPT_INSTANTIATE_INT64 0
2121

2222
/* @brief LP/MIP parameter string constants */
23-
#define CUOPT_ABSOLUTE_DUAL_TOLERANCE "absolute_dual_tolerance"
24-
#define CUOPT_RELATIVE_DUAL_TOLERANCE "relative_dual_tolerance"
25-
#define CUOPT_ABSOLUTE_PRIMAL_TOLERANCE "absolute_primal_tolerance"
26-
#define CUOPT_RELATIVE_PRIMAL_TOLERANCE "relative_primal_tolerance"
27-
#define CUOPT_ABSOLUTE_GAP_TOLERANCE "absolute_gap_tolerance"
28-
#define CUOPT_RELATIVE_GAP_TOLERANCE "relative_gap_tolerance"
29-
#define CUOPT_INFEASIBILITY_DETECTION "infeasibility_detection"
30-
#define CUOPT_STRICT_INFEASIBILITY "strict_infeasibility"
31-
#define CUOPT_PRIMAL_INFEASIBLE_TOLERANCE "primal_infeasible_tolerance"
32-
#define CUOPT_DUAL_INFEASIBLE_TOLERANCE "dual_infeasible_tolerance"
33-
#define CUOPT_ITERATION_LIMIT "iteration_limit"
34-
#define CUOPT_TIME_LIMIT "time_limit"
35-
#define CUOPT_WORK_LIMIT "work_limit"
36-
#define CUOPT_PDLP_SOLVER_MODE "pdlp_solver_mode"
37-
#define CUOPT_METHOD "method"
38-
#define CUOPT_PER_CONSTRAINT_RESIDUAL "per_constraint_residual"
39-
#define CUOPT_SAVE_BEST_PRIMAL_SO_FAR "save_best_primal_so_far"
40-
#define CUOPT_FIRST_PRIMAL_FEASIBLE "first_primal_feasible"
41-
#define CUOPT_LOG_FILE "log_file"
42-
#define CUOPT_LOG_TO_CONSOLE "log_to_console"
43-
#define CUOPT_CROSSOVER "crossover"
44-
#define CUOPT_FOLDING "folding"
45-
#define CUOPT_AUGMENTED "augmented"
46-
#define CUOPT_DUALIZE "dualize"
47-
#define CUOPT_ORDERING "ordering"
48-
#define CUOPT_BARRIER_DUAL_INITIAL_POINT "barrier_dual_initial_point"
49-
#define CUOPT_ELIMINATE_DENSE_COLUMNS "eliminate_dense_columns"
50-
#define CUOPT_CUDSS_DETERMINISTIC "cudss_deterministic"
51-
#define CUOPT_PRESOLVE "presolve"
52-
#define CUOPT_DUAL_POSTSOLVE "dual_postsolve"
53-
#define CUOPT_MIP_DETERMINISM_MODE "mip_determinism_mode"
54-
#define CUOPT_MIP_ABSOLUTE_TOLERANCE "mip_absolute_tolerance"
55-
#define CUOPT_MIP_RELATIVE_TOLERANCE "mip_relative_tolerance"
56-
#define CUOPT_MIP_INTEGRALITY_TOLERANCE "mip_integrality_tolerance"
57-
#define CUOPT_MIP_ABSOLUTE_GAP "mip_absolute_gap"
58-
#define CUOPT_MIP_RELATIVE_GAP "mip_relative_gap"
59-
#define CUOPT_MIP_HEURISTICS_ONLY "mip_heuristics_only"
60-
#define CUOPT_MIP_SCALING "mip_scaling"
61-
#define CUOPT_MIP_PRESOLVE "mip_presolve"
62-
#define CUOPT_MIP_RELIABILITY_BRANCHING "mip_reliability_branching"
63-
#define CUOPT_MIP_CUT_PASSES "mip_cut_passes"
64-
#define CUOPT_MIP_MIXED_INTEGER_ROUNDING_CUTS "mip_mixed_integer_rounding_cuts"
65-
#define CUOPT_MIP_MIXED_INTEGER_GOMORY_CUTS "mip_mixed_integer_gomory_cuts"
66-
#define CUOPT_MIP_KNAPSACK_CUTS "mip_knapsack_cuts"
67-
#define CUOPT_MIP_IMPLIED_BOUND_CUTS "mip_implied_bound_cuts"
68-
#define CUOPT_MIP_CLIQUE_CUTS "mip_clique_cuts"
69-
#define CUOPT_MIP_STRONG_CHVATAL_GOMORY_CUTS "mip_strong_chvatal_gomory_cuts"
70-
#define CUOPT_MIP_REDUCED_COST_STRENGTHENING "mip_reduced_cost_strengthening"
71-
#define CUOPT_MIP_CUT_CHANGE_THRESHOLD "mip_cut_change_threshold"
72-
#define CUOPT_MIP_CUT_MIN_ORTHOGONALITY "mip_cut_min_orthogonality"
73-
#define CUOPT_MIP_BATCH_PDLP_STRONG_BRANCHING "mip_batch_pdlp_strong_branching"
74-
#define CUOPT_SOLUTION_FILE "solution_file"
75-
#define CUOPT_NUM_CPU_THREADS "num_cpu_threads"
76-
#define CUOPT_NUM_GPUS "num_gpus"
77-
#define CUOPT_USER_PROBLEM_FILE "user_problem_file"
78-
#define CUOPT_PRESOLVE_FILE "presolve_file"
79-
#define CUOPT_RANDOM_SEED "random_seed"
80-
#define CUOPT_PDLP_PRECISION "pdlp_precision"
23+
#define CUOPT_ABSOLUTE_DUAL_TOLERANCE "absolute_dual_tolerance"
24+
#define CUOPT_RELATIVE_DUAL_TOLERANCE "relative_dual_tolerance"
25+
#define CUOPT_ABSOLUTE_PRIMAL_TOLERANCE "absolute_primal_tolerance"
26+
#define CUOPT_RELATIVE_PRIMAL_TOLERANCE "relative_primal_tolerance"
27+
#define CUOPT_ABSOLUTE_GAP_TOLERANCE "absolute_gap_tolerance"
28+
#define CUOPT_RELATIVE_GAP_TOLERANCE "relative_gap_tolerance"
29+
#define CUOPT_INFEASIBILITY_DETECTION "infeasibility_detection"
30+
#define CUOPT_STRICT_INFEASIBILITY "strict_infeasibility"
31+
#define CUOPT_PRIMAL_INFEASIBLE_TOLERANCE "primal_infeasible_tolerance"
32+
#define CUOPT_DUAL_INFEASIBLE_TOLERANCE "dual_infeasible_tolerance"
33+
#define CUOPT_ITERATION_LIMIT "iteration_limit"
34+
#define CUOPT_TIME_LIMIT "time_limit"
35+
#define CUOPT_WORK_LIMIT "work_limit"
36+
#define CUOPT_PDLP_SOLVER_MODE "pdlp_solver_mode"
37+
#define CUOPT_METHOD "method"
38+
#define CUOPT_PER_CONSTRAINT_RESIDUAL "per_constraint_residual"
39+
#define CUOPT_SAVE_BEST_PRIMAL_SO_FAR "save_best_primal_so_far"
40+
#define CUOPT_FIRST_PRIMAL_FEASIBLE "first_primal_feasible"
41+
#define CUOPT_LOG_FILE "log_file"
42+
#define CUOPT_LOG_TO_CONSOLE "log_to_console"
43+
#define CUOPT_CROSSOVER "crossover"
44+
#define CUOPT_FOLDING "folding"
45+
#define CUOPT_AUGMENTED "augmented"
46+
#define CUOPT_DUALIZE "dualize"
47+
#define CUOPT_ORDERING "ordering"
48+
#define CUOPT_BARRIER_DUAL_INITIAL_POINT "barrier_dual_initial_point"
49+
#define CUOPT_ELIMINATE_DENSE_COLUMNS "eliminate_dense_columns"
50+
#define CUOPT_CUDSS_DETERMINISTIC "cudss_deterministic"
51+
#define CUOPT_PRESOLVE "presolve"
52+
#define CUOPT_DUAL_POSTSOLVE "dual_postsolve"
53+
#define CUOPT_MIP_DETERMINISM_MODE "mip_determinism_mode"
54+
#define CUOPT_MIP_ABSOLUTE_TOLERANCE "mip_absolute_tolerance"
55+
#define CUOPT_MIP_RELATIVE_TOLERANCE "mip_relative_tolerance"
56+
#define CUOPT_MIP_INTEGRALITY_TOLERANCE "mip_integrality_tolerance"
57+
#define CUOPT_MIP_ABSOLUTE_GAP "mip_absolute_gap"
58+
#define CUOPT_MIP_RELATIVE_GAP "mip_relative_gap"
59+
#define CUOPT_MIP_HEURISTICS_ONLY "mip_heuristics_only"
60+
#define CUOPT_MIP_SCALING "mip_scaling"
61+
#define CUOPT_MIP_PRESOLVE "mip_presolve"
62+
#define CUOPT_MIP_RELIABILITY_BRANCHING "mip_reliability_branching"
63+
#define CUOPT_MIP_CUT_PASSES "mip_cut_passes"
64+
#define CUOPT_MIP_MIXED_INTEGER_ROUNDING_CUTS "mip_mixed_integer_rounding_cuts"
65+
#define CUOPT_MIP_MIXED_INTEGER_GOMORY_CUTS "mip_mixed_integer_gomory_cuts"
66+
#define CUOPT_MIP_KNAPSACK_CUTS "mip_knapsack_cuts"
67+
#define CUOPT_MIP_IMPLIED_BOUND_CUTS "mip_implied_bound_cuts"
68+
#define CUOPT_MIP_CLIQUE_CUTS "mip_clique_cuts"
69+
#define CUOPT_MIP_STRONG_CHVATAL_GOMORY_CUTS "mip_strong_chvatal_gomory_cuts"
70+
#define CUOPT_MIP_REDUCED_COST_STRENGTHENING "mip_reduced_cost_strengthening"
71+
#define CUOPT_MIP_CUT_CHANGE_THRESHOLD "mip_cut_change_threshold"
72+
#define CUOPT_MIP_CUT_MIN_ORTHOGONALITY "mip_cut_min_orthogonality"
73+
#define CUOPT_MIP_BATCH_PDLP_STRONG_BRANCHING "mip_batch_pdlp_strong_branching"
74+
#define CUOPT_MIP_BATCH_PDLP_RELIABILITY_BRANCHING "mip_batch_pdlp_reliability_branching"
75+
#define CUOPT_MIP_STRONG_BRANCHING_SIMPLEX_ITERATION_LIMIT \
76+
"mip_strong_branching_simplex_iteration_limit"
77+
#define CUOPT_SOLUTION_FILE "solution_file"
78+
#define CUOPT_NUM_CPU_THREADS "num_cpu_threads"
79+
#define CUOPT_NUM_GPUS "num_gpus"
80+
#define CUOPT_USER_PROBLEM_FILE "user_problem_file"
81+
#define CUOPT_PRESOLVE_FILE "presolve_file"
82+
#define CUOPT_RANDOM_SEED "random_seed"
83+
#define CUOPT_PDLP_PRECISION "pdlp_precision"
84+
85+
#define CUOPT_MIP_HYPER_HEURISTIC_POPULATION_SIZE "mip_hyper_heuristic_population_size"
86+
#define CUOPT_MIP_HYPER_HEURISTIC_NUM_CPUFJ_THREADS "mip_hyper_heuristic_num_cpufj_threads"
87+
#define CUOPT_MIP_HYPER_HEURISTIC_PRESOLVE_TIME_RATIO "mip_hyper_heuristic_presolve_time_ratio"
88+
#define CUOPT_MIP_HYPER_HEURISTIC_PRESOLVE_MAX_TIME "mip_hyper_heuristic_presolve_max_time"
89+
#define CUOPT_MIP_HYPER_HEURISTIC_ROOT_LP_TIME_RATIO "mip_hyper_heuristic_root_lp_time_ratio"
90+
#define CUOPT_MIP_HYPER_HEURISTIC_ROOT_LP_MAX_TIME "mip_hyper_heuristic_root_lp_max_time"
91+
#define CUOPT_MIP_HYPER_HEURISTIC_RINS_TIME_LIMIT "mip_hyper_heuristic_rins_time_limit"
92+
#define CUOPT_MIP_HYPER_HEURISTIC_RINS_MAX_TIME_LIMIT "mip_hyper_heuristic_rins_max_time_limit"
93+
#define CUOPT_MIP_HYPER_HEURISTIC_RINS_FIX_RATE "mip_hyper_heuristic_rins_fix_rate"
94+
#define CUOPT_MIP_HYPER_HEURISTIC_STAGNATION_TRIGGER "mip_hyper_heuristic_stagnation_trigger"
95+
#define CUOPT_MIP_HYPER_HEURISTIC_MAX_ITERS_WITHOUT_IMPROVEMENT \
96+
"mip_hyper_heuristic_max_iterations_without_improvement"
97+
#define CUOPT_MIP_HYPER_HEURISTIC_INITIAL_INFEASIBILITY_WEIGHT \
98+
"mip_hyper_heuristic_initial_infeasibility_weight"
99+
#define CUOPT_MIP_HYPER_HEURISTIC_N_OF_MINIMUMS_FOR_EXIT \
100+
"mip_hyper_heuristic_n_of_minimums_for_exit"
101+
#define CUOPT_MIP_HYPER_HEURISTIC_ENABLED_RECOMBINERS "mip_hyper_heuristic_enabled_recombiners"
102+
#define CUOPT_MIP_HYPER_HEURISTIC_CYCLE_DETECTION_LENGTH \
103+
"mip_hyper_heuristic_cycle_detection_length"
104+
#define CUOPT_MIP_HYPER_HEURISTIC_RELAXED_LP_TIME_LIMIT "mip_hyper_heuristic_relaxed_lp_time_limit"
105+
#define CUOPT_MIP_HYPER_HEURISTIC_RELATED_VARS_TIME_LIMIT \
106+
"mip_hyper_heuristic_related_vars_time_limit"
81107

82108
/* @brief MIP determinism mode constants */
83109
#define CUOPT_MODE_OPPORTUNISTIC 0
@@ -129,6 +155,7 @@
129155
#define CUOPT_METHOD_PDLP 1
130156
#define CUOPT_METHOD_DUAL_SIMPLEX 2
131157
#define CUOPT_METHOD_BARRIER 3
158+
#define CUOPT_METHOD_UNSET 4
132159

133160
/* @brief PDLP precision mode constants */
134161
#define CUOPT_PDLP_DEFAULT_PRECISION -1
@@ -153,4 +180,9 @@
153180
#define CUOPT_PRESOLVE_PAPILO 1
154181
#define CUOPT_PRESOLVE_PSLP 2
155182

183+
/* @brief MIP scaling mode constants */
184+
#define CUOPT_MIP_SCALING_OFF 0
185+
#define CUOPT_MIP_SCALING_ON 1
186+
#define CUOPT_MIP_SCALING_NO_OBJECTIVE 2
187+
156188
#endif // CUOPT_CONSTANTS_H

0 commit comments

Comments
 (0)