Recursive RINS#1482
Conversation
|
Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually. Contributors can view more details about this message here. |
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
cb9557d to
aefe31a
Compare
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
…bmip (and restarted) problems. Papilo can now be applied to an user_problem_t inplace. Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
# Conflicts: # cpp/src/mip_heuristics/diversity/lns/rins.cu # cpp/src/mip_heuristics/diversity/recombiners/sub_mip.cuh
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
…e old warm start code. Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
…/root change diving procedure when the RINS neighbourhood is not large enough Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
…ation count for the root relaxation (it should reflect the number of simplex iterations). Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
…. this enable the use of diving heuristics for RINS. Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
…f the neighbourhood is too loose or it already found an improving solution. Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
chris-maes
left a comment
There was a problem hiding this comment.
I only made it through branch_and_bound.cpp. I need to finish the review later.
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
| std::vector<omp_mutex_t> pseudo_cost_mutex_down; | ||
|
|
||
| omp_atomic_t<int64_t> strong_branching_lp_iter = 0; | ||
| bool has_initial_pseudocost = false; |
There was a problem hiding this comment.
Nit: member variables should end with and underscore has_initial_pseudocost_
There was a problem hiding this comment.
The other variables do not have the underscore. Do you want me to rename them all?
| "reduced problem must match crush output dimension"); | ||
| for (size_t j = 0; j < reduced_primal.size(); ++j) { | ||
| reduced_primal[j] = | ||
| std::clamp(reduced_primal[j], reduced_problem.lower[j], reduced_problem.upper[j]); |
There was a problem hiding this comment.
But couldn't clamping cause us to loose feasibility for the lb <= A*x <= ub constraints?
There was a problem hiding this comment.
@aliceb-nv for viz. This is just the duplicate of the other crush function (since I need to apply for an user_problem_t instead of optimization_problem_t)
There was a problem hiding this comment.
It can. That's the price to pay 😅 Dual reductions inherently cut off part of the polytope. If papilo performed some, we can mostly only hope that canonicalization back into the polytope is possible. Sometimes it may not be (e.g. papilo used DualFix to safely tighten the bounds of some variables because it proved it won't cut off any optimal solution, and then it may decide to do propagation on this.... But, afaik, this is just an inherent risk that cannot practically be avoided)
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
Signed-off-by: Nicolas L. Guidotti <nguidotti@nvidia.com>
This PR implements the recursive RINS heuristics. More specifically, it applies a dive-like procedure to create a RINS sub-MIP, presolved it with Papilo and then passes to the cut-and-branch procedure. It also launch a CPU FJ worker over the sub-MIP that runs in parallel to cut-and-branch.
Since the current implementation, does not have an unified problem representation, this PR also adds:
lp_problem_t(standard form) touser_problem_t(range form).user_problem_tinstead ofoptimization_problem_t.Additionally, the number of worker per diving heuristic is no longer tied to the total number of workers, which allows the solver to use all diving heuristics in low thread counts (we rotate between the different heuristics for each diving worker launch).
Results
MIPLIB2017, 10min, GH200