From d21b147fe0a0f23f4a7196a46417bf425e4e7935 Mon Sep 17 00:00:00 2001 From: Trevor McKay Date: Thu, 26 Feb 2026 12:17:02 -0500 Subject: [PATCH] fix lifetime bug with presolve result --- .../optimization_problem.hpp | 2 ++ cpp/src/pdlp/solve.cu | 20 +++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/cpp/include/cuopt/linear_programming/optimization_problem.hpp b/cpp/include/cuopt/linear_programming/optimization_problem.hpp index d0731f3aa9..92ca17216e 100644 --- a/cpp/include/cuopt/linear_programming/optimization_problem.hpp +++ b/cpp/include/cuopt/linear_programming/optimization_problem.hpp @@ -104,6 +104,8 @@ class optimization_problem_t { optimization_problem_t(raft::handle_t const* handle_ptr); optimization_problem_t(const optimization_problem_t& other); + optimization_problem_t(optimization_problem_t&&) = default; + optimization_problem_t& operator=(optimization_problem_t&&) = default; /** * @brief Check if this optimization problem is equivalent to another. diff --git a/cpp/src/pdlp/solve.cu b/cpp/src/pdlp/solve.cu index 9d4ab483fb..460ddc3921 100644 --- a/cpp/src/pdlp/solve.cu +++ b/cpp/src/pdlp/solve.cu @@ -1201,6 +1201,10 @@ optimization_problem_solution_t solve_lp( CUOPT_LOG_INFO("Third-party presolve is disabled, skipping"); } + // Declare result at outer scope so that result->reduced_problem (which may be + // referenced by problem.original_problem_ptr) remains alive through the solve. + std::optional> result; + if (run_presolve) { detail::sort_csr(op_problem); // allocate no more than 10% of the time limit to presolve. @@ -1208,14 +1212,14 @@ optimization_problem_solution_t solve_lp( // But no less than 1 second, to avoid early timeout triggering known crashes const double presolve_time_limit = std::max(1.0, std::min(0.1 * lp_timer.remaining_time(), 60.0)); - presolver = std::make_unique>(); - auto result = presolver->apply(op_problem, - cuopt::linear_programming::problem_category_t::LP, - settings.presolver, - settings.dual_postsolve, - settings.tolerances.absolute_primal_tolerance, - settings.tolerances.relative_primal_tolerance, - presolve_time_limit); + presolver = std::make_unique>(); + result = presolver->apply(op_problem, + cuopt::linear_programming::problem_category_t::LP, + settings.presolver, + settings.dual_postsolve, + settings.tolerances.absolute_primal_tolerance, + settings.tolerances.relative_primal_tolerance, + presolve_time_limit); if (!result.has_value()) { return optimization_problem_solution_t( pdlp_termination_status_t::PrimalInfeasible, op_problem.get_handle_ptr()->get_stream());