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) function _dualgmi_generate(train_h5, model)
data = ProblemData(model) data = ProblemData(model)
data_s, transforms = convert_to_standard_form(data) data_s, transforms = convert_to_standard_form(data)
all_cuts = [] all_cuts = nothing
visited = Set()
for h5_filename in train_h5 for h5_filename in train_h5
h5 = H5File(h5_filename) h5 = H5File(h5_filename)
cut_basis_vars = h5.get_array("cuts_basis_vars") cut_basis_vars = h5.get_array("cuts_basis_vars")
@ -457,25 +458,37 @@ function _dualgmi_generate(train_h5, model)
constr_nonbasic = cut_basis_vars[r, vbb+vnn+cbb+1:vbb+vnn+cbb+cnn], constr_nonbasic = cut_basis_vars[r, vbb+vnn+cbb+1:vbb+vnn+cbb+cnn],
) )
end 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]) tableau = compute_tableau(data_s, current_basis, rows = [row])
cuts_s = compute_gmi(data_s, tableau) cuts_s = compute_gmi(data_s, tableau)
cuts = backwards(transforms, cuts_s) 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
end end
@info "Collected $(length(all_cuts.lb)) distinct cuts"
return all_cuts return all_cuts
end end
function _dualgmi_set_callback(model, all_cuts) function _dualgmi_set_callback(model, all_cuts)
function cut_callback(cb_data) function cut_callback(cb_data)
if all_cuts !== nothing if all_cuts !== nothing
@info "Dual GMI: Submitting cuts..." constrs = build_constraints(model, all_cuts)
for cuts in all_cuts @info "Enforcing $(length(constrs)) cuts..."
constrs = build_constraints(model, cuts)
for c in constrs for c in constrs
MOI.submit(model, MOI.UserCut(cb_data), c) MOI.submit(model, MOI.UserCut(cb_data), c)
end end
end
all_cuts = nothing all_cuts = nothing
end end
end end

Loading…
Cancel
Save