21#include "absl/container/flat_hash_set.h"
22#include "absl/memory/memory.h"
23#include "absl/status/statusor.h"
26#include "ortools/math_opt/callback.pb.h"
38 solver_init_args.
streamable = arguments.streamable.Proto();
39 if (arguments.non_streamable !=
nullptr) {
40 solver_init_args.non_streamable = arguments.non_streamable.get();
43 return solver_init_args;
48void CheckModelStorage(
const ModelStorage*
const storage,
49 const ModelStorage*
const expected_storage) {
50 if (storage !=
nullptr) {
56absl::StatusOr<SolveResult> CallSolve(
57 Solver& solver,
const ModelStorage*
const expected_storage,
58 const SolveArguments& arguments) {
59 CheckModelStorage(arguments.model_parameters.storage(),
61 CheckModelStorage(arguments.callback_registration.storage(),
64 if (arguments.callback ==
nullptr) {
65 CHECK(arguments.callback_registration.events.empty())
66 <<
"No callback was provided to run, but callback events were "
71 if (arguments.callback !=
nullptr) {
72 cb = [&](
const CallbackDataProto& callback_data_proto) {
73 const CallbackData data(expected_storage, callback_data_proto);
74 const CallbackResult result = arguments.callback(data);
75 CheckModelStorage(result.storage(),
77 return result.Proto();
81 SolveResultProto solve_result,
83 {.parameters = arguments.parameters.Proto(),
84 .model_parameters = arguments.model_parameters.Proto(),
85 .message_callback = arguments.message_callback,
86 .callback_registration = arguments.callback_registration.Proto(),
87 .user_cb = std::move(cb),
88 .interrupter = arguments.interrupter}));
100 ToSolverInitArgs(init_args)));
101 return CallSolve(*solver,
model.storage(), solve_args);
107 if (
model ==
nullptr) {
108 return absl::InvalidArgumentError(
"input model can't be null");
110 std::unique_ptr<UpdateTracker> update_tracker =
model->NewUpdateTracker();
114 ToSolverInitArgs(arguments)));
115 return absl::WrapUnique<IncrementalSolver>(
117 std::move(update_tracker), std::move(solver)));
120IncrementalSolver::IncrementalSolver(
123 std::unique_ptr<UpdateTracker> update_tracker,
124 std::unique_ptr<Solver> solver)
125 : solver_type_(solver_type),
126 init_args_(
std::move(init_args)),
127 expected_storage_(expected_storage),
128 update_tracker_(
std::move(update_tracker)),
129 solver_(
std::move(solver)) {}
139 update_tracker_->ExportModelUpdate());
152 update_tracker_->ExportModel());
154 ToSolverInitArgs(init_args_)));
161 return CallSolve(*solver_, expected_storage_, arguments);
#define CHECK_EQ(val1, val2)
#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
constexpr absl::string_view kObjectsFromOtherModelStorage
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 SolveResult FromProto(const ModelStorage *model, const SolveResultProto &solve_result_proto)
SolverInitializerProto streamable