Commit e4e1aad
authored
Recursive RINS (#1482)
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:
- A routine for converting a `lp_problem_t` (standard form) to `user_problem_t` (range form).
- Allow Papilo to be applied to an `user_problem_t` instead of `optimization_problem_t`.
- Adds an upper bound callback for retrieving the upper bound of the main solver (since it may change if another worker find a better incumbent).
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
```
================================================================================
main-2026-07-03 (1) vs recursive-submip (2)
================================================================================
------------------------------------------------------------------------------------------------------------------------------
| | Run 1 | Run 2 | Abs. Diff. | Rel. Diff. (%) |
------------------------------------------------------------------------------------------------------------------------------
| Imported 240 240 +0 --- |
| Feasible 227 228 +1 --- |
| Optimal 86 91 +5 --- |
| Solutions with <0.1% primal gap 138 151 +13 --- |
| Nodes explored (mean) 1.326e+07 1.296e+07 -3.057e+05 -2.31 |
| Nodes explored (shifted geomean) 1.262e+04 1.239e+04 -230 -1.82 |
| Relative MIP gap (mean) 0.2777 0.2726 -0.00512 -1.84 |
| Relative MIP gap (shifted geomean) 0.09089 0.08901 -0.001883 -2.07 |
| Solve time (mean) 422.6 435.4 +12.79 +3.03 |
| Solve time (shifted geomean) 196.9 226.6 +29.66 +15.1 |
| Primal gap (mean) 9.969 9.29 -0.679 -6.81 |
| Primal gap (shifted geomean) 0.4584 0.3491 -0.1093 -23.8 |
| Primal integral (mean) 25.02 22.97 -2.051 -8.2 |
| Primal integral (shifted geomean) 2.849 2.421 -0.4275 -15 |
------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------
| Name | status 1 | status 2 |
----------------------------------------------------------------------
| neos-1171737 feasible optimal |
| radiationm40-10-02 feasible optimal |
| rail01 timeout feasible |
| ran14x18-disj-8 feasible optimal |
| triptim1 feasible optimal |
| unitcal_7 feasible optimal |
----------------------------------------------------------------------
```
Authors:
- Nicolas L. Guidotti (https://github.com/nguidotti)
Approvers:
- Alice Boucher (https://github.com/aliceb-nv)
- Chris Maes (https://github.com/chris-maes)
- Ramakrishna Prabhu (https://github.com/ramakrishnap-nv)
URL: #14821 parent 37a7b63 commit e4e1aad
38 files changed
Lines changed: 2099 additions & 978 deletions
File tree
- cpp
- include/cuopt/mathematical_optimization
- mip
- src
- branch_and_bound
- cuts
- dual_simplex
- math_optimization
- mip_heuristics
- diversity
- lns
- recombiners
- feasibility_jump
- presolve
- problem
- tests/linear_programming/unit_tests
- datasets/mip
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
252 | 252 | | |
253 | 253 | | |
254 | 254 | | |
255 | | - | |
| 255 | + | |
256 | 256 | | |
257 | 257 | | |
258 | 258 | | |
259 | 259 | | |
260 | 260 | | |
261 | 261 | | |
262 | | - | |
| 262 | + | |
263 | 263 | | |
264 | 264 | | |
265 | 265 | | |
| |||
293 | 293 | | |
294 | 294 | | |
295 | 295 | | |
296 | | - | |
297 | | - | |
298 | | - | |
299 | | - | |
300 | | - | |
301 | | - | |
302 | | - | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
303 | 303 | | |
304 | 304 | | |
305 | 305 | | |
| |||
369 | 369 | | |
370 | 370 | | |
371 | 371 | | |
372 | | - | |
| 372 | + | |
373 | 373 | | |
374 | 374 | | |
375 | 375 | | |
| |||
441 | 441 | | |
442 | 442 | | |
443 | 443 | | |
444 | | - | |
445 | | - | |
| 444 | + | |
| 445 | + | |
446 | 446 | | |
447 | 447 | | |
448 | 448 | | |
| |||
495 | 495 | | |
496 | 496 | | |
497 | 497 | | |
498 | | - | |
499 | | - | |
| 498 | + | |
| 499 | + | |
500 | 500 | | |
501 | 501 | | |
502 | 502 | | |
| |||
528 | 528 | | |
529 | 529 | | |
530 | 530 | | |
531 | | - | |
532 | | - | |
| 531 | + | |
| 532 | + | |
533 | 533 | | |
534 | 534 | | |
535 | 535 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
75 | 75 | | |
76 | 76 | | |
77 | 77 | | |
| 78 | + | |
78 | 79 | | |
79 | 80 | | |
80 | 81 | | |
| |||
127 | 128 | | |
128 | 129 | | |
129 | 130 | | |
130 | | - | |
| 131 | + | |
131 | 132 | | |
132 | 133 | | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
133 | 144 | | |
134 | 145 | | |
135 | 146 | | |
| |||
Lines changed: 1 addition & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
| 13 | + | |
19 | 14 | | |
20 | 15 | | |
21 | 16 | | |
| |||
Lines changed: 2 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
16 | 17 | | |
17 | 18 | | |
18 | 19 | | |
| |||
184 | 185 | | |
185 | 186 | | |
186 | 187 | | |
187 | | - | |
188 | 188 | | |
| 189 | + | |
189 | 190 | | |
190 | 191 | | |
191 | 192 | | |
| |||
Lines changed: 46 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
0 commit comments