diff --git a/src/Cuts/tableau/gmi_dual.jl b/src/Cuts/tableau/gmi_dual.jl index 8042d21..f20ab78 100644 --- a/src/Cuts/tableau/gmi_dual.jl +++ b/src/Cuts/tableau/gmi_dual.jl @@ -439,7 +439,8 @@ end function _dualgmi_generate(train_h5, model) data = ProblemData(model) data_s, transforms = convert_to_standard_form(data) - all_cuts = [] + all_cuts = nothing + visited = Set() for h5_filename in train_h5 h5 = H5File(h5_filename) cut_basis_vars = h5.get_array("cuts_basis_vars") @@ -457,24 +458,36 @@ function _dualgmi_generate(train_h5, model) constr_nonbasic = cut_basis_vars[r, vbb+vnn+cbb+1:vbb+vnn+cbb+cnn], ) end + + # Detect and skip duplicated cuts + cut_id = (row, cut_basis_vars[r, :]) + cut_id ∉ visited || continue + push!(visited, cut_id) + tableau = compute_tableau(data_s, current_basis, rows = [row]) cuts_s = compute_gmi(data_s, tableau) cuts = backwards(transforms, cuts_s) - push!(all_cuts, cuts) + + if all_cuts === nothing + all_cuts = cuts + else + all_cuts.lhs = [all_cuts.lhs; cuts.lhs] + all_cuts.lb = [all_cuts.lb; cuts.lb] + all_cuts.ub = [all_cuts.ub; cuts.ub] + end end end + @info "Collected $(length(all_cuts.lb)) distinct cuts" return all_cuts end function _dualgmi_set_callback(model, all_cuts) function cut_callback(cb_data) if all_cuts !== nothing - @info "Dual GMI: Submitting cuts..." - for cuts in all_cuts - constrs = build_constraints(model, cuts) - for c in constrs - MOI.submit(model, MOI.UserCut(cb_data), c) - end + constrs = build_constraints(model, all_cuts) + @info "Enforcing $(length(constrs)) cuts..." + for c in constrs + MOI.submit(model, MOI.UserCut(cb_data), c) end all_cuts = nothing end