14#ifndef OR_TOOLS_MATH_OPT_CORE_SOLVER_INTERFACE_H_
15#define OR_TOOLS_MATH_OPT_CORE_SOLVER_INTERFACE_H_
22#include "absl/base/attributes.h"
23#include "absl/container/flat_hash_map.h"
24#include "absl/status/status.h"
25#include "absl/status/statusor.h"
26#include "absl/strings/string_view.h"
27#include "absl/synchronization/mutex.h"
28#include "ortools/math_opt/callback.pb.h"
31#include "ortools/math_opt/model.pb.h"
32#include "ortools/math_opt/model_parameters.pb.h"
33#include "ortools/math_opt/model_update.pb.h"
34#include "ortools/math_opt/parameters.pb.h"
35#include "ortools/math_opt/result.pb.h"
44 "This solver does not support message callbacks.";
83 using Callback = std::function<absl::StatusOr<CallbackResultProto>(
84 const CallbackDataProto&)>;
96 std::function<absl::StatusOr<std::unique_ptr<SolverInterface>>(
124 virtual absl::StatusOr<SolveResultProto>
Solve(
126 const ModelSolveParametersProto& model_parameters,
128 const CallbackRegistrationProto& callback_registration,
Callback cb,
135 virtual absl::Status
Update(
const ModelUpdateProto& model_update) = 0;
141 virtual bool CanUpdate(
const ModelUpdateProto& model_update) = 0;
160 absl::StatusOr<std::unique_ptr<SolverInterface>>
Create(
161 SolverTypeProto solver_type,
const ModelProto&
model,
176 mutable absl::Mutex mutex_;
177 absl::flat_hash_map<SolverTypeProto, SolverInterface::Factory>
191#define MATH_OPT_REGISTER_SOLVER(solver_type, solver_factory) \
193 const void* const kRegisterSolver ABSL_ATTRIBUTE_UNUSED = [] { \
194 AllSolversRegistry::Instance()->Register(solver_type, solver_factory); \
void Register(SolverTypeProto solver_type, SolverInterface::Factory factory)
absl::StatusOr< std::unique_ptr< SolverInterface > > Create(SolverTypeProto solver_type, const ModelProto &model, const SolverInterface::InitArgs &init_args) const
AllSolversRegistry(const AllSolversRegistry &)=delete
bool IsRegistered(SolverTypeProto solver_type) const
std::string RegisteredSolversToString() const
AllSolversRegistry & operator=(const AllSolversRegistry &)=delete
static AllSolversRegistry * Instance()
std::vector< SolverTypeProto > RegisteredSolvers() const
virtual absl::Status Update(const ModelUpdateProto &model_update)=0
SolverInterface & operator=(const SolverInterface &)=delete
virtual absl::StatusOr< SolveResultProto > Solve(const SolveParametersProto ¶meters, const ModelSolveParametersProto &model_parameters, MessageCallback message_cb, const CallbackRegistrationProto &callback_registration, Callback cb, SolveInterrupter *interrupter)=0
virtual ~SolverInterface()=default
std::function< void(const std::vector< std::string > &)> MessageCallback
std::function< absl::StatusOr< std::unique_ptr< SolverInterface > >(const ModelProto &model, const InitArgs &init_args)> Factory
std::function< absl::StatusOr< CallbackResultProto >(const CallbackDataProto &)> Callback
SolverInterface()=default
virtual bool CanUpdate(const ModelUpdateProto &model_update)=0
SolverInterface(const SolverInterface &)=delete
constexpr absl::string_view kMessageCallbackNotSupported
Collection of objects used to extend the Constraint Solver library.
const NonStreamableSolverInitArguments * non_streamable
SolverInitializerProto streamable