19#include "absl/log/check.h"
20#include "absl/memory/memory.h"
21#include "absl/status/status.h"
22#include "absl/status/statusor.h"
23#include "absl/strings/str_cat.h"
52absl::Status ToInternalError(absl::Status original) {
57 return absl::InternalError(original.message());
62absl::Status PreviousFatalFailureOccurred() {
63 return absl::InvalidArgumentError(
64 "a previous call to Solve(), ComputeInfeasibleSubsystem(), or Update() "
65 "failed, the Solver can't be used anymore");
75 return solver->Solve(solve_args);
78Solver::Solver(std::unique_ptr<SolverInterface> underlying_solver,
80 : underlying_solver_(
std::move(underlying_solver)),
81 model_summary_(
std::move(model_summary)) {
82 CHECK(underlying_solver_ !=
nullptr);
94 auto underlying_solver,
96 auto result = absl::WrapUnique(
97 new Solver(std::move(underlying_solver), std::move(summary)));
105 if (fatal_failure_occurred_) {
106 return PreviousFatalFailureOccurred();
108 CHECK(underlying_solver_ !=
nullptr);
111 fatal_failure_occurred_ =
true;
118 <<
"invalid parameters";
121 <<
"invalid model_parameters";
127 arguments.
user_cb ==
nullptr) {
128 return absl::InvalidArgumentError(
129 "no callback function was provided but callback events were "
132 if (arguments.
user_cb !=
nullptr) {
134 -> absl::StatusOr<CallbackResultProto> {
137 auto callback_result = arguments.
user_cb(callback_data);
139 callback_result, callback_data.event(),
141 return callback_result;
146 underlying_solver_->Solve(arguments.
parameters,
160 fatal_failure_occurred_ =
false;
168 if (fatal_failure_occurred_) {
169 return PreviousFatalFailureOccurred();
171 CHECK(underlying_solver_ !=
nullptr);
174 fatal_failure_occurred_ =
true;
178 underlying_solver_->Update(model_update));
184 underlying_solver_ =
nullptr;
188 fatal_failure_occurred_ =
false;
193absl::StatusOr<ComputeInfeasibleSubsystemResultProto>
199 if (fatal_failure_occurred_) {
200 return PreviousFatalFailureOccurred();
202 CHECK(underlying_solver_ !=
nullptr);
205 fatal_failure_occurred_ =
true;
208 <<
"invalid parameters";
211 underlying_solver_->ComputeInfeasibleSubsystem(
221 fatal_failure_occurred_ =
false;
225absl::StatusOr<ComputeInfeasibleSubsystemResultProto>
232 return solver->ComputeInfeasibleSubsystem(compute_infeasible_subsystem_args);
240 return absl::InvalidArgumentError(
241 "can't use SOLVER_TYPE_UNSPECIFIED as solver_type parameter");
246 return absl::InvalidArgumentError(
247 absl::StrCat(
"input non_streamable init arguments are for ",
252 return absl::OkStatus();
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
static AllSolversRegistry *absl_nonnull Instance()
::operations_research::math_opt::CallbackEventProto request_registration(int index) const
static absl::StatusOr< ConcurrentCallsGuard > TryAcquire(Tracker &tracker)
std::function< absl::StatusOr< CallbackResultProto >( const CallbackDataProto &)> Callback
static absl::StatusOr< SolveResultProto > NonIncrementalSolve(const ModelProto &model, SolverTypeProto solver_type, const InitArgs &init_args, const SolveArgs &solve_args)
SolverInterface::InitArgs InitArgs
absl::StatusOr< bool > Update(ModelUpdateProto model_update) override
absl::StatusOr< ComputeInfeasibleSubsystemResultProto > ComputeInfeasibleSubsystem(const ComputeInfeasibleSubsystemArgs &arguments) override
absl::StatusOr< SolveResultProto > Solve(const SolveArgs &arguments) override
static absl::StatusOr< ComputeInfeasibleSubsystemResultProto > NonIncrementalComputeInfeasibleSubsystem(const ModelProto &model, SolverTypeProto solver_type, const InitArgs &init_args, const ComputeInfeasibleSubsystemArgs &compute_infeasible_subsystem_args)
static absl::StatusOr< std::unique_ptr< Solver > > New(SolverTypeProto solver_type, const ModelProto &model, const InitArgs &arguments)
std::atomic< int64_t > debug_num_solver
absl::Status ValidateInitArgs(const Solver::InitArgs &init_args, const SolverTypeProto solver_type)
absl::Status ValidateCallbackResultProto(const CallbackResultProto &callback_result, const CallbackEventProto callback_event, const CallbackRegistrationProto &callback_registration, const ModelSummary &model_summary)
void UpgradeSolveResultProtoForStatsMigration(SolveResultProto &solve_result_proto)
absl::Status ValidateModelUpdate(const ModelUpdateProto &model_update, ModelSummary &model_summary)
@ SOLVER_TYPE_UNSPECIFIED
absl::Status ValidateComputeInfeasibleSubsystemResult(const ComputeInfeasibleSubsystemResultProto &result, const ModelSummary &model_summary)
absl::Status ValidateCallbackDataProto(const CallbackDataProto &cb_data, const CallbackRegistrationProto &callback_registration, const ModelSummary &model_summary)
absl::Status ValidateResult(const SolveResultProto &result, const ModelSolveParametersProto ¶meters, const ModelSummary &model_summary)
absl::Status ValidateModelSolveParameters(const ModelSolveParametersProto ¶meters, const ModelSummary &model_summary)
absl::StatusOr< ModelSummary > ValidateModel(const ModelProto &model, const bool check_names)
absl::Status ValidateSolveParameters(const SolveParametersProto ¶meters)
absl::Status ValidateCallbackRegistration(const CallbackRegistrationProto &callback_registration, const ModelSummary &model_summary)
std::string ProtoEnumToString(ProtoEnumType enum_value)
MessageCallback message_callback
SolveParametersProto parameters
const SolveInterrupter *absl_nullable interrupter
SolveParametersProto parameters
const SolveInterrupter *absl_nullable interrupter
ModelSolveParametersProto model_parameters
CallbackRegistrationProto callback_registration
MessageCallback message_callback
virtual SolverTypeProto solver_type() const =0
const NonStreamableSolverInitArguments *absl_nullable non_streamable