22 #include "absl/container/flat_hash_map.h"
23 #include "absl/status/status.h"
24 #include "absl/status/statusor.h"
25 #include "absl/strings/str_cat.h"
26 #include "absl/strings/str_join.h"
27 #include "absl/synchronization/mutex.h"
31 #include "ortools/math_opt/model.pb.h"
32 #include "ortools/math_opt/parameters.pb.h"
47 const absl::MutexLock lock(&mutex_);
49 registered_solvers_.emplace(solver_type, std::move(factory)).second;
52 <<
" already registered.";
56 SolverTypeProto solver_type,
const ModelProto&
model,
60 const absl::MutexLock lock(&mutex_);
63 if (factory ==
nullptr) {
64 std::string
name = SolverTypeProto_Name(solver_type);
66 name = absl::StrCat(
"unknown(",
static_cast<int>(solver_type),
")");
69 <<
"solver type " <<
name <<
" is not registered";
71 return (*factory)(
model, init_args);
75 const absl::MutexLock lock(&mutex_);
76 return registered_solvers_.contains(solver_type);
80 std::vector<SolverTypeProto> result;
82 const absl::MutexLock lock(&mutex_);
83 for (
const auto& kv_pair : registered_solvers_) {
84 result.push_back(kv_pair.first);
87 std::sort(result.begin(), result.end());
92 std::vector<std::string> solver_names;
94 const absl::MutexLock lock(&mutex_);
95 for (
const auto& kv_pair : registered_solvers_) {
99 std::sort(solver_names.begin(), solver_names.end());
100 return absl::StrCat(
"[", absl::StrJoin(solver_names,
","),
"]");
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
bool IsRegistered(SolverTypeProto solver_type) const
std::string RegisteredSolversToString() const
static AllSolversRegistry * Instance()
std::vector< SolverTypeProto > RegisteredSolvers() const
std::function< absl::StatusOr< std::unique_ptr< SolverInterface > >(const ModelProto &model, const InitArgs &init_args)> Factory
const Collection::value_type::second_type * FindOrNull(const Collection &collection, const typename Collection::value_type::first_type &key)
Collection of objects used to extend the Constraint Solver library.
std::string ProtoEnumToString(ProtoEnumType enum_value)
StatusBuilder InvalidArgumentErrorBuilder()