Describe the bug
ROUTING_TEST crashed with SIGABRT on the level0_retail/retail_float_test_t.CVRPTW_Retail/4 case. The cuopt_assert invariant on the aggregate cost change after a batch of VRP local-search moves did not hold:
ROUTING_TEST: cpp/src/routing/local_search/vrp/vrp_execute.cu:466:
bool cuopt::routing::detail::execute_vrp_moves(
solution_t<i_t, f_t, REQUEST>&, move_candidates_t<i_t, f_t>&, i_t)
[with i_t = int; f_t = float;
cuopt::routing::request_t REQUEST = cuopt::routing::request_t::VRP]:
Assertion `cost_before - cost_after > EPSILON && "Cost should improve!"' failed.
./ci/run_ctests.sh: line 86: 4820 Aborted (core dumped) "${gt}" --gtest_output="xml:${xml_file}" "$@"
CRASH: ROUTING_TEST died from SIGABRT (exit code 134)
The assertion fires after a batch of accepted VRP moves is executed: the planner predicted a cost decrease, but the post-execution measured cost decrease was not greater than EPSILON. This indicates either stale move-candidate data, conflicting moves applied together, or a predicted/actual delta mismatch.
Where
- File:
cpp/src/routing/local_search/vrp/vrp_execute.cu:466
- Function:
cuopt::routing::detail::execute_vrp_moves<int, float, VRP>
- Test:
level0_retail/retail_float_test_t.CVRPTW_Retail/4
- Binary:
ROUTING_TEST (debug build — assertion is inside cuopt_func_call / cuopt_assert)
Reproducer / observed run
- PR: #1269 (CI-only change — does not touch routing code)
- Run: actions/runs/26237894930
- Job:
conda-cpp-tests / 13.2.0, 3.13, amd64, ubuntu24.04, rtxpro6000, latest-driver, latest-deps (job 77225276444)
- Head SHA:
371edafa (branch pull-request/1269, base release/26.06)
- Surrounding tests
CVRPTW_Retail/0..3 passed; only /4 aborted.
Expected behavior
execute_vrp_moves should only accept and execute moves whose net post-execution cost change matches the predicted delta within EPSILON. The assertion should hold for every batch on every accepted test instance.
Environment
- CI runner:
rtxpro6000 (NVIDIA RTX PRO 6000 Blackwell Server Edition, 94.97 GiB VRAM)
- CPU: INTEL(R) XEON(R) GOLD 5512U, 16 threads
- CUDA: 13.2
- Driver: latest-driver
- Deps: latest-deps
- Build: conda, ubuntu24.04, amd64, Python 3.13
- Branch under test:
release/26.06
Related issues
Additional context
Describe the bug
ROUTING_TESTcrashed withSIGABRTon thelevel0_retail/retail_float_test_t.CVRPTW_Retail/4case. Thecuopt_assertinvariant on the aggregate cost change after a batch of VRP local-search moves did not hold:The assertion fires after a batch of accepted VRP moves is executed: the planner predicted a cost decrease, but the post-execution measured cost decrease was not greater than
EPSILON. This indicates either stale move-candidate data, conflicting moves applied together, or a predicted/actual delta mismatch.Where
cpp/src/routing/local_search/vrp/vrp_execute.cu:466cuopt::routing::detail::execute_vrp_moves<int, float, VRP>level0_retail/retail_float_test_t.CVRPTW_Retail/4ROUTING_TEST(debug build — assertion is insidecuopt_func_call/cuopt_assert)Reproducer / observed run
conda-cpp-tests / 13.2.0, 3.13, amd64, ubuntu24.04, rtxpro6000, latest-driver, latest-deps(job 77225276444)371edafa(branchpull-request/1269, baserelease/26.06)CVRPTW_Retail/0..3passed; only/4aborted.Expected behavior
execute_vrp_movesshould only accept and execute moves whose net post-execution cost change matches the predicted delta withinEPSILON. The assertion should hold for every batch on every accepted test instance.Environment
rtxpro6000(NVIDIA RTX PRO 6000 Blackwell Server Edition, 94.97 GiB VRAM)release/26.06Related issues
CVRPTW_RetailSIGABRT, but on case/18and root-caused to route-priority-sort out-of-bounds (fixed by 1d85aed). Current failure is on/4and at a different assertion site, so likely a distinct root cause that survived that fix.local_search.cu:315("Cost mismatch after a move"), case/18. Cross-link for context.Additional context
.github/workflows/*andci/release/update-version.sh, so the failure cannot have been caused by its changes. Either:release/26.06that this run happened to expose.cuopt_assertshould be relaxed for the aggregated-batch case, or the failing instance saved for offline reproduction.release/26.06since ROUTING_TEST retail_float CVRPTW_Retail/18 intermittent SIGABRT from out-of-bounds route priority sort #1221's fix landed (1d85aed on 2026-05-18) to identify the change that exposed it.