From 1c44cb4e8668d6f6bd0e76360fc221ea09968a6a Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Mon, 4 Aug 2025 23:29:00 -0500 Subject: [PATCH] Fix incorrect integer slacks --- src/Cuts/tableau/transform.jl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Cuts/tableau/transform.jl b/src/Cuts/tableau/transform.jl index bce5a1e..020687e 100644 --- a/src/Cuts/tableau/transform.jl +++ b/src/Cuts/tableau/transform.jl @@ -102,10 +102,13 @@ function forward!(t::AddSlackVariables, data::ProblemData) ge = [i for i = 1:nrows if isfinite(data.constr_lb[i]) && !isequality[i]] le = [i for i = 1:nrows if isfinite(data.constr_ub[i]) && !isequality[i]] EQ, GE, LE = length(eq), length(ge), length(le) - is_integral(row_idx, rhs) = ( - abs(rhs - round(rhs)) <= 1e-6 && - all(j -> data.var_types[j] ∈ ['I', 'B'], findnz(data.constr_lhs[row_idx, :])[1]) - ) + function is_integral(row_idx, rhs) + rhs_is_integer = abs(rhs - round(rhs)) <= 1e-6 + cols, coeffs = findnz(data.constr_lhs[row_idx, :])[1:2] + vars_are_integer = all(j -> data.var_types[j] ∈ ['I', 'B'], cols) + coeffs_are_integer = all(v -> abs(v - round(v)) <= 1e-6, coeffs) + return rhs_is_integer && vars_are_integer && coeffs_are_integer + end slack_types = [ [is_integral(ge[i], data.constr_lb[ge[i]]) ? 'I' : 'C' for i = 1:GE]; [is_integral(le[i], data.constr_ub[le[i]]) ? 'I' : 'C' for i = 1:LE]