23 #include "absl/base/thread_annotations.h"
24 #include "absl/memory/memory.h"
25 #include "absl/status/status.h"
26 #include "absl/status/statusor.h"
27 #include "absl/strings/str_cat.h"
28 #include "absl/synchronization/mutex.h"
29 #include "absl/types/span.h"
33 #include "ortools/math_opt/callback.pb.h"
39 #include "ortools/math_opt/model.pb.h"
40 #include "ortools/math_opt/model_update.pb.h"
41 #include "ortools/math_opt/parameters.pb.h"
42 #include "ortools/math_opt/result.pb.h"
57 absl::Status ToInternalError(
const absl::Status original) {
62 return absl::InternalError(original.message());
67 absl::Status PreviousFatalFailureOccurred() {
68 return absl::InvalidArgumentError(
69 "a previous call to Solve() or Update() failed, the Solver can't be used "
76 const ModelProto&
model,
const SolverTypeProto solver_type,
80 return solver->Solve(solve_args);
85 : underlying_solver_(std::move(underlying_solver)),
86 model_summary_(std::move(model_summary)) {
87 CHECK(underlying_solver_ !=
nullptr);
94 const SolverTypeProto solver_type,
const ModelProto&
model,
99 auto underlying_solver,
101 auto result = absl::WrapUnique(
102 new Solver(std::move(underlying_solver), std::move(summary)));
110 if (fatal_failure_occurred_) {
111 return PreviousFatalFailureOccurred();
113 CHECK(underlying_solver_ !=
nullptr);
116 fatal_failure_occurred_ =
true;
123 <<
"invalid parameters";
126 <<
"invalid model_parameters";
129 if (arguments.
user_cb !=
nullptr) {
132 cb = [&](
const CallbackDataProto& callback_data)
133 -> absl::StatusOr<CallbackResultProto> {
136 auto callback_result = arguments.
user_cb(callback_data);
138 callback_result, callback_data.event(),
140 return callback_result;
145 underlying_solver_->Solve(arguments.
parameters,
157 fatal_failure_occurred_ =
false;
165 if (fatal_failure_occurred_) {
166 return PreviousFatalFailureOccurred();
168 CHECK(underlying_solver_ !=
nullptr);
171 fatal_failure_occurred_ =
true;
175 underlying_solver_->Update(model_update));
181 underlying_solver_ =
nullptr;
185 fatal_failure_occurred_ =
false;
193 const SolverTypeProto solver_type) {
194 if (solver_type == SOLVER_TYPE_UNSPECIFIED) {
195 return absl::InvalidArgumentError(
196 "can't use SOLVER_TYPE_UNSPECIFIED as solver_type parameter");
201 return absl::InvalidArgumentError(
202 absl::StrCat(
"input non_streamable init arguments are for ",
207 return absl::OkStatus();
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
static AllSolversRegistry * Instance()
static absl::StatusOr< ConcurrentCallsGuard > TryAcquire(Tracker &tracker)
static absl::StatusOr< SolveResultProto > NonIncrementalSolve(const ModelProto &model, SolverTypeProto solver_type, const InitArgs &init_args, const SolveArgs &solve_args)
absl::StatusOr< SolveResultProto > Solve(const SolveArgs &arguments)
Solver(const Solver &)=delete
static absl::StatusOr< std::unique_ptr< Solver > > New(SolverTypeProto solver_type, const ModelProto &model, const InitArgs &arguments)
absl::StatusOr< bool > Update(const ModelUpdateProto &model_update)
std::function< absl::StatusOr< CallbackResultProto >(const CallbackDataProto &)> Callback
std::atomic< int64_t > debug_num_solver
absl::Status ValidateInitArgs(const Solver::InitArgs &init_args, const SolverTypeProto solver_type)
absl::Status ValidateResult(const SolveResultProto &result, const ModelSolveParametersProto ¶meters, const ModelSummary &model_summary)
absl::Status ValidateModelUpdate(const ModelUpdateProto &model_update, ModelSummary &model_summary)
absl::Status ValidateSolveParameters(const SolveParametersProto ¶meters)
absl::Status ValidateCallbackResultProto(const CallbackResultProto &callback_result, const CallbackEventProto callback_event, const CallbackRegistrationProto &callback_registration, const ModelSummary &model_summary)
absl::Status ValidateCallbackDataProto(const CallbackDataProto &cb_data, const CallbackRegistrationProto &callback_registration, const ModelSummary &model_summary)
absl::Status ValidateCallbackRegistration(const CallbackRegistrationProto &callback_registration, const ModelSummary &model_summary)
absl::StatusOr< ModelSummary > ValidateModel(const ModelProto &model, const bool check_names)
absl::Status ValidateModelSolveParameters(const ModelSolveParametersProto ¶meters, const ModelSummary &model_summary)
Collection of objects used to extend the Constraint Solver library.
std::string ProtoEnumToString(ProtoEnumType enum_value)
virtual SolverTypeProto solver_type() const =0
CallbackRegistrationProto callback_registration
ModelSolveParametersProto model_parameters
MessageCallback message_callback
SolveInterrupter * interrupter
SolveParametersProto parameters
const NonStreamableSolverInitArguments * non_streamable