From 9a6714f086d80f099de98031bd120ed8a40feeeb Mon Sep 17 00:00:00 2001 From: Christopher Maes Date: Mon, 11 Aug 2025 11:26:01 -0700 Subject: [PATCH 1/2] Don't remove empty columns with infinite bounds --- cpp/src/dual_simplex/presolve.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/cpp/src/dual_simplex/presolve.cpp b/cpp/src/dual_simplex/presolve.cpp index 68043e06a6..1aa8b4b04d 100644 --- a/cpp/src/dual_simplex/presolve.cpp +++ b/cpp/src/dual_simplex/presolve.cpp @@ -165,19 +165,24 @@ i_t remove_empty_cols(lp_problem_t& problem, std::vector col_marker(problem.num_cols); i_t new_cols = 0; for (i_t j = 0; j < problem.num_cols; ++j) { + bool remove_var = false; if ((problem.A.col_start[j + 1] - problem.A.col_start[j]) == 0) { - col_marker[j] = 1; - presolve_info.removed_variables.push_back(j); - presolve_info.removed_reduced_costs.push_back(problem.objective[j]); - if (problem.objective[j] >= 0) { + if (problem.objective[j] >= 0 && problem.lower[j] > -inf) { presolve_info.removed_values.push_back(problem.lower[j]); problem.obj_constant += problem.objective[j] * problem.lower[j]; - assert(problem.lower[j] > -inf); - } else { + remove_var = true; + } else if (problem.objective[j] <= 0 && problem.upper[j] < inf) { presolve_info.removed_values.push_back(problem.upper[j]); problem.obj_constant += problem.objective[j] * problem.upper[j]; - assert(problem.upper[j] < inf); + remove_var = true; } + } + + if (remove_var) + { + col_marker[j] = 1; + presolve_info.removed_variables.push_back(j); + presolve_info.removed_reduced_costs.push_back(problem.objective[j]); } else { col_marker[j] = 0; new_cols++; @@ -751,7 +756,7 @@ i_t presolve(const lp_problem_t& original, } } if (num_empty_cols > 0) { - settings.log.printf("Presolve removing %d empty cols\n", num_empty_cols); + settings.log.printf("Presolve attempt to remove %d empty cols\n", num_empty_cols); remove_empty_cols(problem, num_empty_cols, presolve_info); } From 0c0cf4377574005d2a2373dead1ffe079efca64c Mon Sep 17 00:00:00 2001 From: Christopher Maes Date: Mon, 11 Aug 2025 11:29:23 -0700 Subject: [PATCH 2/2] Style fixes --- cpp/src/dual_simplex/presolve.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cpp/src/dual_simplex/presolve.cpp b/cpp/src/dual_simplex/presolve.cpp index 1aa8b4b04d..457da9113d 100644 --- a/cpp/src/dual_simplex/presolve.cpp +++ b/cpp/src/dual_simplex/presolve.cpp @@ -178,8 +178,7 @@ i_t remove_empty_cols(lp_problem_t& problem, } } - if (remove_var) - { + if (remove_var) { col_marker[j] = 1; presolve_info.removed_variables.push_back(j); presolve_info.removed_reduced_costs.push_back(problem.objective[j]);