Detect and skip duplicate cuts

feature/replay^2
Alinson S. Xavier 1 year ago
parent 24d93c8894
commit c5fe6bf712
Signed by: isoron
GPG Key ID: 0DA8E4B9E1109DCA

@ -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

Loading…
Cancel
Save