From 5a867fd4578bb80391f3bf76340bd7c6ec038992 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Thu, 18 Dec 2025 16:53:26 +0100 Subject: [PATCH] Add nullability to SolveInterrupter in linear solver (#4958) --- ortools/linear_solver/BUILD.bazel | 1 + ortools/linear_solver/linear_solver.cc | 1 - ortools/linear_solver/solve_mp_model.cc | 6 ++++-- ortools/linear_solver/solve_mp_model.h | 6 ++++-- ortools/util/python/py_solve_interrupter_testing.cc | 4 +++- ortools/util/python/py_solve_interrupter_testing.h | 3 ++- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/ortools/linear_solver/BUILD.bazel b/ortools/linear_solver/BUILD.bazel index f26292ab8b..468af61a92 100644 --- a/ortools/linear_solver/BUILD.bazel +++ b/ortools/linear_solver/BUILD.bazel @@ -598,5 +598,6 @@ cc_library( ":linear_solver_cc_proto", "//ortools/util:lazy_mutable_copy", "//ortools/util:solve_interrupter", + "@abseil-cpp//absl/base:nullability", ], ) diff --git a/ortools/linear_solver/linear_solver.cc b/ortools/linear_solver/linear_solver.cc index f7e299fdf4..74c14c54cf 100644 --- a/ortools/linear_solver/linear_solver.cc +++ b/ortools/linear_solver/linear_solver.cc @@ -516,7 +516,6 @@ absl::string_view ToString( } LOG(FATAL) << "Unrecognized solver type: " << static_cast(optimization_problem_type); - return ""; } bool AbslParseFlag(const absl::string_view text, diff --git a/ortools/linear_solver/solve_mp_model.cc b/ortools/linear_solver/solve_mp_model.cc index 35b5783c72..8c8e918e9d 100644 --- a/ortools/linear_solver/solve_mp_model.cc +++ b/ortools/linear_solver/solve_mp_model.cc @@ -17,6 +17,7 @@ #include #include +#include "absl/base/nullability.h" #include "ortools/linear_solver/linear_solver.h" #include "ortools/linear_solver/linear_solver.pb.h" #include "ortools/util/lazy_mutable_copy.h" @@ -26,8 +27,9 @@ namespace operations_research { // TODO(b/311704821): this function should not delegate to MPSolver, also true // for the functions below. -MPSolutionResponse SolveMPModel(LazyMutableCopy request, - const SolveInterrupter* interrupter) { +MPSolutionResponse SolveMPModel( + LazyMutableCopy request, + const SolveInterrupter* absl_nullable interrupter) { MPSolutionResponse response; if (interrupter != nullptr) { std::atomic atomic_bool = false; diff --git a/ortools/linear_solver/solve_mp_model.h b/ortools/linear_solver/solve_mp_model.h index c830e001ec..198c41a6e2 100644 --- a/ortools/linear_solver/solve_mp_model.h +++ b/ortools/linear_solver/solve_mp_model.h @@ -20,6 +20,7 @@ #include +#include "absl/base/nullability.h" #include "ortools/linear_solver/linear_solver.pb.h" #include "ortools/util/lazy_mutable_copy.h" #include "ortools/util/solve_interrupter.h" @@ -41,8 +42,9 @@ namespace operations_research { * Passing a non-null pointer with any other solver type immediately returns an * MPSOLVER_INCOMPATIBLE_OPTIONS error. */ -MPSolutionResponse SolveMPModel(LazyMutableCopy request, - const SolveInterrupter* interrupter = nullptr); +MPSolutionResponse SolveMPModel( + LazyMutableCopy request, + const SolveInterrupter* absl_nullable interrupter = nullptr); bool SolverTypeSupportsInterruption(MPModelRequest::SolverType solver); diff --git a/ortools/util/python/py_solve_interrupter_testing.cc b/ortools/util/python/py_solve_interrupter_testing.cc index 1c57248970..14e07a20f7 100644 --- a/ortools/util/python/py_solve_interrupter_testing.cc +++ b/ortools/util/python/py_solve_interrupter_testing.cc @@ -15,11 +15,13 @@ #include +#include "absl/base/nullability.h" #include "ortools/util/python/py_solve_interrupter.h" namespace operations_research { -std::optional IsInterrupted(const PySolveInterrupter* interrupter) { +std::optional IsInterrupted( + const PySolveInterrupter* absl_nullable interrupter) { if (interrupter == nullptr) { return std::nullopt; } diff --git a/ortools/util/python/py_solve_interrupter_testing.h b/ortools/util/python/py_solve_interrupter_testing.h index 29ff08c872..b8602dce4e 100644 --- a/ortools/util/python/py_solve_interrupter_testing.h +++ b/ortools/util/python/py_solve_interrupter_testing.h @@ -31,7 +31,8 @@ namespace operations_research { // // The Clif/pybind11 wrapper will return a `bool | None` value, with None for // nullopt. -std::optional IsInterrupted(const PySolveInterrupter* interrupter); +std::optional IsInterrupted( + const PySolveInterrupter* absl_nullable interrupter); // Class that keeps a reference on a std::shared_ptr to // test that the C++ object survive the cleanup of the Python reference.