20 #include "absl/container/flat_hash_set.h"
21 #include "absl/memory/memory.h"
22 #include "absl/status/status.h"
23 #include "absl/status/statusor.h"
24 #include "absl/synchronization/mutex.h"
25 #include "absl/time/time.h"
28 #include "ortools/math_opt/callback.pb.h"
31 #include "scip/scip.h"
32 #include "scip/type_scip.h"
37 std::unique_ptr<GScipSolverCallbackHandler>
39 const CallbackRegistrationProto& callback_registration,
49 : callback_(std::move(ABSL_DIE_IF_NULL(
callback))),
50 solve_start_(std::move(solve_start)),
51 scip_(ABSL_DIE_IF_NULL(scip)) {}
54 const absl::MutexLock lock(&callback_mutex_);
58 std::optional<CallbackResultProto> GScipSolverCallbackHandler::CallUserCallback(
59 const CallbackDataProto& callback_data) {
67 absl::MutexLock lock(&callback_mutex_);
72 absl::StatusOr<CallbackResultProto> result_or = callback_(callback_data);
73 status_ = result_or.status();
74 if (!result_or.ok() || result_or->terminate()) {
78 const auto interrupt_status =
SCIP_TO_STATUS(SCIPinterruptSolve(scip_));
79 if (!interrupt_status.ok()) {
81 status_ = interrupt_status;
83 LOG(ERROR) <<
"Failed to interrupt the solve on error: "
90 return *std::move(result_or);
static std::unique_ptr< GScipSolverCallbackHandler > RegisterIfNeeded(const CallbackRegistrationProto &callback_registration, SolverInterface::Callback callback, absl::Time solve_start, SCIP *scip)
GScipSolverCallbackHandler(const GScipSolverCallbackHandler &)=delete
std::function< absl::StatusOr< CallbackResultProto >(const CallbackDataProto &)> Callback
Collection of objects used to extend the Constraint Solver library.
#define SCIP_TO_STATUS(x)