14#ifndef ORTOOLS_MATH_OPT_CORE_SOLVER_INTERFACE_H_
15#define ORTOOLS_MATH_OPT_CORE_SOLVER_INTERFACE_H_
22#include "absl/base/attributes.h"
23#include "absl/base/nullability.h"
24#include "absl/base/thread_annotations.h"
25#include "absl/container/flat_hash_map.h"
26#include "absl/container/flat_hash_set.h"
27#include "absl/status/statusor.h"
28#include "absl/synchronization/mutex.h"
96 using Callback = std::function<absl::StatusOr<CallbackResultProto>(
109 std::function<absl::StatusOr<std::unique_ptr<SolverInterface>>(
144 virtual absl::StatusOr<SolveResultProto>
Solve(
175 virtual absl::StatusOr<ComputeInfeasibleSubsystemResultProto>
197 absl::StatusOr<std::unique_ptr<SolverInterface>>
Create(
225 const absl::flat_hash_set<SolverTypeProto>& kept);
237 static void SetTemporaryTestInstance(
240 mutable absl::Mutex mutex_;
241 absl::flat_hash_map<SolverTypeProto, SolverInterface::Factory>
242 registered_solvers_ ABSL_GUARDED_BY(mutex_);
260#define MATH_OPT_REGISTER_SOLVER(solver_type, solver_factory) \
262 const void* const kRegisterSolver ABSL_ATTRIBUTE_UNUSED = [] { \
263 AllSolversRegistry::Instance()->Register(solver_type, solver_factory); \
bool IsRegistered(SolverTypeProto solver_type) const
AllSolversRegistry & operator=(const AllSolversRegistry &)=delete
std::vector< SolverTypeProto > RegisteredSolvers() const
friend class WithAlternateAllSolversRegistry
void Register(SolverTypeProto solver_type, SolverInterface::Factory factory)
std::string RegisteredSolversToString() const
absl::StatusOr< std::unique_ptr< SolverInterface > > Create(SolverTypeProto solver_type, const ModelProto &model, const SolverInterface::InitArgs &init_args) const
static AllSolversRegistry *absl_nonnull Instance()
AllSolversRegistry(const AllSolversRegistry &)=delete
SolverInterface(const SolverInterface &)=delete
std::function< void(const std::vector< std::string > &)> MessageCallback
SolverInterface()=default
virtual absl::StatusOr< bool > Update(const ModelUpdateProto &model_update)=0
virtual absl::StatusOr< SolveResultProto > Solve(const SolveParametersProto ¶meters, const ModelSolveParametersProto &model_parameters, MessageCallback message_cb, const CallbackRegistrationProto &callback_registration, Callback cb, const SolveInterrupter *absl_nullable interrupter)=0
virtual absl::StatusOr< ComputeInfeasibleSubsystemResultProto > ComputeInfeasibleSubsystem(const SolveParametersProto ¶meters, MessageCallback message_cb, const SolveInterrupter *absl_nullable interrupter)=0
std::function< absl::StatusOr< CallbackResultProto >( const CallbackDataProto &)> Callback
virtual ~SolverInterface()=default
SolverInterface & operator=(const SolverInterface &)=delete
std::function< absl::StatusOr< std::unique_ptr< SolverInterface > >( const ModelProto &model, const InitArgs &init_args)> Factory
SolverInitializerProto streamable
const NonStreamableSolverInitArguments *absl_nullable non_streamable