19 #include "absl/container/flat_hash_set.h"
20 #include "absl/strings/str_cat.h"
21 #include "ortools/sat/sat_parameters.pb.h"
26 #define TEST_IN_RANGE(name, min, max) \
27 if (params.name() < min || params.name() > max) { \
28 return absl::StrCat("parameter '", #name, "' should be in [", min, ",", \
29 max, "]. Current value is ", params.name()); \
32 #define TEST_NON_NEGATIVE(name) \
33 if (params.name() < 0) { \
34 return absl::StrCat("Parameters ", #name, " must be non-negative"); \
37 #define TEST_POSITIVE(name) \
38 if (params.name() <= 0) { \
39 return absl::StrCat("Parameters ", #name, " must be positive"); \
42 #define TEST_NOT_NAN(name) \
43 if (std::isnan(params.name())) { \
44 return absl::StrCat("parameter '", #name, "' is NaN"); \
47 #define TEST_IS_FINITE(name) \
48 if (!std::isfinite(params.name())) { \
49 return absl::StrCat("parameter '", #name, "' is NaN or not finite"); \
111 if (params.enumerate_all_solutions() &&
112 (params.num_search_workers() > 1 || params.num_workers() > 1)) {
113 return "Enumerating all solutions does not work in parallel";
116 if (params.enumerate_all_solutions() &&
117 (!params.subsolvers().empty() || !params.extra_subsolvers().empty() ||
118 !params.ignore_subsolvers().empty())) {
119 return "Enumerating all solutions does not work with custom subsolvers";
122 if (params.num_search_workers() >= 1 && params.num_workers() >= 1) {
123 return "Do not specify both num_search_workers and num_workers";
126 if (params.enumerate_all_solutions() && params.interleave_search()) {
127 return "Enumerating all solutions does not work with interleaved search";
130 absl::flat_hash_set<std::string> valid_subsolvers({
144 "objective_lb_search_max_lp",
145 "objective_lb_search_no_lp",
146 "objective_lb_search",
150 "quick_restart_max_lp",
151 "quick_restart_no_lp",
155 for (
const SatParameters& new_subsolver : params.subsolver_params()) {
156 if (new_subsolver.name().empty()) {
157 return "New subsolver parameter defined without a name";
159 valid_subsolvers.insert(new_subsolver.name());
162 for (
const std::string& subsolver : params.subsolvers()) {
163 if (!valid_subsolvers.contains(subsolver)) {
164 return absl::StrCat(
"subsolver \'", subsolver,
"\' is not valid");
168 for (
const std::string& subsolver : params.extra_subsolvers()) {
169 if (!valid_subsolvers.contains(subsolver)) {
170 return absl::StrCat(
"subsolver \'", subsolver,
"\' is not valid");
174 for (
const std::string& subsolver : params.ignore_subsolvers()) {
175 if (!valid_subsolvers.contains(subsolver)) {
176 return absl::StrCat(
"subsolver \'", subsolver,
"\' is not valid");
184 #undef TEST_NON_NEGATIVE
186 #undef TEST_IS_FINITE
std::string ValidateParameters(const SatParameters ¶ms)
Collection of objects used to extend the Constraint Solver library.
#define TEST_IN_RANGE(name, min, max)
#define TEST_NON_NEGATIVE(name)
#define TEST_POSITIVE(name)
#define TEST_NOT_NAN(name)
#define TEST_IS_FINITE(name)