21 #include "absl/container/flat_hash_set.h"
22 #include "absl/memory/memory.h"
23 #include "absl/status/status.h"
24 #include "absl/status/statusor.h"
25 #include "absl/synchronization/mutex.h"
27 #include "ortools/math_opt/callback.pb.h"
40 solver_init_args.
streamable = arguments.streamable.Proto();
41 if (arguments.non_streamable !=
nullptr) {
42 solver_init_args.non_streamable = arguments.non_streamable.get();
45 return solver_init_args;
48 absl::StatusOr<SolveResult> CallSolve(
49 Solver& solver,
const ModelStorage*
const expected_storage,
50 const SolveArguments& arguments) {
51 RETURN_IF_ERROR(arguments.CheckModelStorageAndCallback(expected_storage));
55 absl::Status cb_status;
56 if (arguments.callback !=
nullptr) {
57 cb = [&](
const CallbackDataProto& callback_data_proto) {
58 const CallbackData data(expected_storage, callback_data_proto);
61 const CallbackResult result = arguments.callback(data);
63 if (
const absl::Status
status =
64 result.CheckModelStorage(expected_storage);
69 builder <<
"invalid CallbackResult returned by user callback";
71 const absl::MutexLock lock(&mutex);
72 cb_status.Update(builder);
75 CallbackResultProto result_proto;
76 result_proto.set_terminate(
true);
80 return result.Proto();
84 const SolveResultProto solve_result,
86 {.parameters = arguments.parameters.Proto(),
87 .model_parameters = arguments.model_parameters.Proto(),
88 .message_callback = arguments.message_callback,
89 .callback_registration = arguments.callback_registration.Proto(),
90 .user_cb = std::move(cb),
91 .interrupter = arguments.interrupter}));
93 const absl::MutexLock lock(&mutex);
107 ToSolverInitArgs(init_args)));
108 return CallSolve(*solver,
model.storage(), solve_args);
114 if (
model ==
nullptr) {
115 return absl::InvalidArgumentError(
"input model can't be null");
117 std::unique_ptr<UpdateTracker> update_tracker =
model->NewUpdateTracker();
121 ToSolverInitArgs(arguments)));
122 return absl::WrapUnique<IncrementalSolver>(
124 std::move(update_tracker), std::move(solver)));
127 IncrementalSolver::IncrementalSolver(
130 std::unique_ptr<UpdateTracker> update_tracker,
131 std::unique_ptr<Solver> solver)
132 : solver_type_(solver_type),
133 init_args_(std::move(init_args)),
134 expected_storage_(expected_storage),
135 update_tracker_(std::move(update_tracker)),
136 solver_(std::move(solver)) {}
146 update_tracker_->ExportModelUpdate());
152 _ <<
"update failed");
160 update_tracker_->ExportModel());
163 ToSolverInitArgs(init_args_)),
164 _ <<
"solver re-creation failed");
171 return CallSolve(*solver_, expected_storage_, arguments);
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
absl::StatusOr< SolveResult > Solve(const SolveArguments &arguments={})
absl::StatusOr< UpdateResult > Update()
absl::StatusOr< SolveResult > SolveWithoutUpdate(const SolveArguments &arguments={}) const
static absl::StatusOr< std::unique_ptr< IncrementalSolver > > New(Model *model, SolverType solver_type, SolverInitArguments arguments={})
SolverInterface::InitArgs InitArgs
std::function< CallbackResultProto(const CallbackDataProto &)> Callback
static absl::StatusOr< std::unique_ptr< Solver > > New(SolverTypeProto solver_type, const ModelProto &model, const InitArgs &arguments)
CpModelProto const * model_proto
absl::StatusOr< SolveResult > Solve(const Model &model, const SolverType solver_type, const SolveArguments &solve_args, const SolverInitArguments &init_args)
Enum< E >::Proto EnumToProto(const std::optional< E > value)
Collection of objects used to extend the Constraint Solver library.
static absl::StatusOr< SolveResult > FromProto(const ModelStorage *model, const SolveResultProto &solve_result_proto)
SolverInitializerProto streamable
#define OR_ASSIGN_OR_RETURN3(lhs, rexpr, error_expression)