24#include "absl/base/thread_annotations.h"
25#include "absl/container/flat_hash_set.h"
26#include "absl/memory/memory.h"
27#include "absl/status/statusor.h"
28#include "absl/strings/string_view.h"
29#include "absl/synchronization/mutex.h"
31#include "ortools/math_opt/callback.pb.h"
45 solver_init_args.
streamable = arguments.streamable.Proto();
46 if (arguments.non_streamable !=
nullptr) {
47 solver_init_args.non_streamable = arguments.non_streamable.get();
50 return solver_init_args;
55void CheckModelStorage(
const ModelStorage*
const storage,
56 const ModelStorage*
const expected_storage) {
57 if (storage !=
nullptr) {
63absl::StatusOr<SolveResult> CallSolve(
64 Solver& solver,
const ModelStorage*
const expected_storage,
65 const SolveArguments& arguments) {
66 CheckModelStorage(arguments.model_parameters.storage(),
68 CheckModelStorage(arguments.callback_registration.storage(),
71 if (arguments.callback ==
nullptr) {
72 CHECK(arguments.callback_registration.events.empty())
73 <<
"No callback was provided to run, but callback events were "
78 if (arguments.callback !=
nullptr) {
79 cb = [&](
const CallbackDataProto& callback_data_proto) {
80 const CallbackData data(expected_storage, callback_data_proto);
81 const CallbackResult result = arguments.callback(data);
82 CheckModelStorage(result.storage(),
84 return result.Proto();
88 SolveResultProto solve_result,
90 {.parameters = arguments.parameters.Proto(),
91 .model_parameters = arguments.model_parameters.Proto(),
92 .message_callback = arguments.message_callback,
93 .callback_registration = arguments.callback_registration.Proto(),
94 .user_cb = std::move(cb),
95 .interrupter = arguments.interrupter}));
99class PrinterMessageCallbackImpl {
101 PrinterMessageCallbackImpl(std::ostream& output_stream,
102 const absl::string_view prefix)
103 : output_stream_(output_stream), prefix_(prefix) {}
105 void Call(
const std::vector<std::string>& messages) {
106 const absl::MutexLock lock(&mutex_);
107 for (
const std::string&
message : messages) {
108 output_stream_ << prefix_ <<
message <<
'\n';
110 output_stream_.flush();
115 std::ostream& output_stream_ ABSL_GUARDED_BY(mutex_);
116 const std::string prefix_;
123 : streamable(
std::move(streamable)) {}
127 : non_streamable(non_streamable.Clone()) {}
132 : streamable(
std::move(streamable)),
133 non_streamable(non_streamable.Clone()) {}
136 : streamable(other.streamable),
137 non_streamable(other.non_streamable != nullptr
138 ? other.non_streamable->Clone()
144 if (&other ==
this) {
161 ToSolverInitArgs(init_args)));
162 return CallSolve(*solver,
model.storage(), solve_args);
167 std::unique_ptr<UpdateTracker> update_tracker =
model.NewUpdateTracker();
169 std::unique_ptr<Solver> solver,
171 ToSolverInitArgs(arguments)));
172 return absl::WrapUnique<IncrementalSolver>(
174 std::move(update_tracker), std::move(solver)));
177IncrementalSolver::IncrementalSolver(
180 std::unique_ptr<UpdateTracker> update_tracker,
181 std::unique_ptr<Solver> solver)
182 : solver_type_(solver_type),
183 init_args_(
std::move(init_args)),
184 expected_storage_(expected_storage),
185 update_tracker_(
std::move(update_tracker)),
186 solver_(
std::move(solver)) {}
195 std::optional<ModelUpdateProto> model_update =
196 update_tracker_->ExportModelUpdate();
202 update_tracker_->Checkpoint();
209 update_tracker_->ExportModel(),
210 ToSolverInitArgs(init_args_)));
217 return CallSolve(*solver_, expected_storage_, arguments);
221 const absl::string_view prefix) {
226 std::make_shared<PrinterMessageCallbackImpl>(output_stream, prefix);
228 [=](
const std::vector<std::string>& messages) { impl->Call(messages); };
#define CHECK_EQ(val1, val2)
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)
constexpr absl::string_view kObjectsFromOtherModelStorage
absl::StatusOr< SolveResult > Solve(const Model &model, const SolverType solver_type, const SolveArguments &solve_args, const SolverInitArguments &init_args)
MessageCallback PrinterMessageCallback(std::ostream &output_stream, const absl::string_view prefix)
std::function< void(const std::vector< std::string > &)> MessageCallback
Enum< E >::Proto EnumToProto(const std::optional< E > value)
Collection of objects used to extend the Constraint Solver library.
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
static SolveResult FromProto(const ModelStorage *model, const SolveResultProto &solve_result_proto)
SolverInitArguments()=default
SolverInitArguments & operator=(const SolverInitArguments &other)
std::unique_ptr< const NonStreamableSolverInitArguments > non_streamable
StreamableSolverInitArguments streamable
SolverInitializerProto streamable