From 4129d9ad8f85fd3d4483a4fd9cefc95c121154d2 Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Tue, 10 Oct 2023 16:49:59 +0200 Subject: [PATCH 1/2] [presolve] update master using repr master erases rhs update --- src/Algorithm/presolve/interface.jl | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Algorithm/presolve/interface.jl b/src/Algorithm/presolve/interface.jl index 24d9ed177..c5804a339 100644 --- a/src/Algorithm/presolve/interface.jl +++ b/src/Algorithm/presolve/interface.jl @@ -313,7 +313,9 @@ function update_reform_from_presolve!(reform::Reformulation{DwMaster}, presolve_ update_form_from_presolve!(sp, sp_presolve_form) end - update_form_from_presolve!(master, presolve_repr_master) + update_form_from_presolve!(master, presolve_repr_master) # TODO: erase rhs changes so we need to recall update on the restricted master. + + update_form_from_presolve!(master, presolve_restr_master) return end @@ -369,12 +371,13 @@ function run!(algo::PresolveAlgorithm, ::Env, reform::Reformulation, input::Pres end presolve_reform = create_presolve_reform(reform) - tightened_bounds_restr = bounds_tightening(presolve_reform.restricted_master.form) - new_restricted_master = propagate_in_presolve_form(presolve_reform.restricted_master, Int[], tightened_bounds_restr) tightened_bounds_repr = bounds_tightening(presolve_reform.original_master.form) new_original_master = propagate_in_presolve_form(presolve_reform.original_master, Int[], tightened_bounds_repr; fix_vars = false) + tightened_bounds_restr = bounds_tightening(presolve_reform.restricted_master.form) + new_restricted_master = propagate_in_presolve_form(presolve_reform.restricted_master, Int[], tightened_bounds_restr) + presolve_reform.restricted_master = new_restricted_master presolve_reform.original_master = new_original_master From 74fea34bdff1c8b64adbf45827d128226fb2f09b Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Tue, 10 Oct 2023 17:08:46 +0200 Subject: [PATCH 2/2] ok --- src/Algorithm/presolve/helpers.jl | 2 ++ src/Algorithm/presolve/interface.jl | 30 ++++++++++++++++------------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/Algorithm/presolve/helpers.jl b/src/Algorithm/presolve/helpers.jl index 08b65468f..9389a290e 100644 --- a/src/Algorithm/presolve/helpers.jl +++ b/src/Algorithm/presolve/helpers.jl @@ -128,6 +128,8 @@ end function bounds_tightening(form::PresolveFormRepr) #length(ignore_rows) == form.nb_constrs || throw(ArgumentError("Inconsistent sizes of ignore_rows and nb of constraints.")) + println("Bounds tightening over $(form.nb_vars) variables and $(form.nb_constrs) constraints.") + tightened_bounds = Dict{Int, Tuple{Float64, Bool, Float64, Bool}}() for col in 1:form.nb_vars diff --git a/src/Algorithm/presolve/interface.jl b/src/Algorithm/presolve/interface.jl index c5804a339..ba5172c6b 100644 --- a/src/Algorithm/presolve/interface.jl +++ b/src/Algorithm/presolve/interface.jl @@ -236,7 +236,7 @@ function create_presolve_reform(reform::Reformulation{DwMaster}) return DwPresolveReform(original_master, restricted_master, dw_sps) end -function update_form_from_presolve!(form::Formulation, presolve_form::PresolveFormulation) +function update_form_from_presolve!(form::Formulation, presolve_form::PresolveFormulation; update_rhs = true) # Deactivate Constraints for constr_id in presolve_form.deactivated_constrs deactivate!(form, getconstr(form, constr_id)) @@ -251,17 +251,19 @@ function update_form_from_presolve!(form::Formulation, presolve_form::PresolveFo end # Update rhs - for (row, rhs) in enumerate(presolve_form.form.rhs) - constr = presolve_form.row_to_constr[row] - - if getduty(getid(constr)) <= MasterConvexityConstr - if getcursense(form, constr) == Less - setcurrhs!(form, constr, max(rhs, 0)) - elseif getcursense(form, constr) == Greater - setcurrhs!(form, constr, max(rhs, 0)) + if update_rhs + for (row, rhs) in enumerate(presolve_form.form.rhs) + constr = presolve_form.row_to_constr[row] + + if getduty(getid(constr)) <= MasterConvexityConstr + if getcursense(form, constr) == Less + setcurrhs!(form, constr, max(rhs, 0)) + elseif getcursense(form, constr) == Greater + setcurrhs!(form, constr, max(rhs, 0)) + end + else + setcurrhs!(form, constr, rhs) end - else - setcurrhs!(form, constr, rhs) end end @@ -313,9 +315,8 @@ function update_reform_from_presolve!(reform::Reformulation{DwMaster}, presolve_ update_form_from_presolve!(sp, sp_presolve_form) end - update_form_from_presolve!(master, presolve_repr_master) # TODO: erase rhs changes so we need to recall update on the restricted master. + update_form_from_presolve!(master, presolve_repr_master; update_rhs = false) - update_form_from_presolve!(master, presolve_restr_master) return end @@ -372,9 +373,11 @@ function run!(algo::PresolveAlgorithm, ::Env, reform::Reformulation, input::Pres presolve_reform = create_presolve_reform(reform) + println("Presolving representative master.") tightened_bounds_repr = bounds_tightening(presolve_reform.original_master.form) new_original_master = propagate_in_presolve_form(presolve_reform.original_master, Int[], tightened_bounds_repr; fix_vars = false) + println("Presolving restricted master.") tightened_bounds_restr = bounds_tightening(presolve_reform.restricted_master.form) new_restricted_master = propagate_in_presolve_form(presolve_reform.restricted_master, Int[], tightened_bounds_restr) @@ -389,6 +392,7 @@ function run!(algo::PresolveAlgorithm, ::Env, reform::Reformulation, input::Pres # propagate_var_bounds_from!(new_original_master, sp) # end + println("Updating formulations.") update_reform_from_presolve!(reform, presolve_reform) return PresolveOutput(true)