22#include "absl/base/nullability.h"
23#include "absl/container/flat_hash_map.h"
24#include "absl/container/flat_hash_set.h"
25#include "absl/log/check.h"
26#include "absl/log/log.h"
27#include "absl/status/statusor.h"
28#include "absl/strings/ascii.h"
29#include "absl/strings/match.h"
30#include "absl/strings/str_cat.h"
31#include "absl/strings/str_join.h"
32#include "absl/strings/string_view.h"
33#include "absl/synchronization/mutex.h"
51 return absl::StrCat(
"unknown(",
static_cast<int>(solver_type),
")");
63 if (temporary_test_instance_ !=
nullptr) {
64 return temporary_test_instance_;
72 const absl::flat_hash_set<SolverTypeProto>& kept) {
74 absl::flat_hash_map<SolverTypeProto, SolverInterface::Factory>
75 kept_registered_solvers;
77 const absl::MutexLock lock(other.mutex_);
78 for (
const auto& [solver_type, factory] : other.registered_solvers_) {
79 if (kept.contains(solver_type)) {
80 kept_registered_solvers.try_emplace(solver_type, factory);
87 CHECK(kept_registered_solvers.contains(solver_type))
88 <<
"Kept solver type " << SolverTypeName(solver_type)
89 <<
" was not registered in AllSolversRegistry::Instance().";
92 registered_solvers_ = std::move(kept_registered_solvers);
96 absl_nullable temp_instance) {
99 if (temp_instance ==
nullptr) {
100 CHECK(temporary_test_instance_ !=
nullptr)
101 <<
"Can't reset temporary_test_instance_ if not already set!";
102 temporary_test_instance_ =
nullptr;
108 CHECK(temporary_test_instance_ ==
nullptr)
109 <<
"Can't set temporary_test_instance_ to " << temp_instance
110 <<
", it is already set to " << temporary_test_instance_ <<
"!";
111 temporary_test_instance_ = temp_instance;
118 const absl::MutexLock lock(mutex_);
120 registered_solvers_.emplace(solver_type, std::move(factory)).second;
123 <<
" already registered.";
131 const absl::MutexLock lock(mutex_);
134 if (factory ==
nullptr) {
136 <<
"solver type " << SolverTypeName(solver_type)
137 <<
" is not registered"
138 <<
", support for this solver has not been compiled";
140 return (*factory)(model, init_args);
144 const absl::MutexLock lock(mutex_);
145 return registered_solvers_.contains(solver_type);
149 std::vector<SolverTypeProto> result;
151 const absl::MutexLock lock(mutex_);
152 for (
const auto& kv_pair : registered_solvers_) {
153 result.push_back(kv_pair.first);
156 std::sort(result.begin(), result.end());
161 std::vector<std::string> solver_names;
163 const absl::MutexLock lock(mutex_);
164 for (
const auto& kv_pair : registered_solvers_) {
168 std::sort(solver_names.begin(), solver_names.end());
169 return absl::StrCat(
"[", absl::StrJoin(solver_names,
","),
"]");
bool IsRegistered(SolverTypeProto solver_type) const
std::vector< SolverTypeProto > RegisteredSolvers() const
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
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)
const ::std::string & SolverTypeProto_Name(T value)
std::string ProtoEnumToString(ProtoEnumType enum_value)
StatusBuilder InvalidArgumentErrorBuilder()