18 #include "absl/status/status.h"
19 #include "absl/strings/numbers.h"
20 #include "absl/strings/str_format.h"
21 #include "absl/strings/str_split.h"
24 #include "scip/scip.h"
25 #include "scip/scip_numerics.h"
26 #include "scip/scip_param.h"
27 #include "scip/struct_paramset.h"
28 #include "scip/type_paramset.h"
34 for (
const auto parameter : absl::StrSplit(
parameters, absl::ByAnyChar(
",\n"),
35 absl::SkipWhitespace())) {
36 std::vector<std::string> key_value = absl::StrSplit(
37 parameter, absl::ByAnyChar(
"= "), absl::SkipWhitespace());
38 if (key_value.size() != 2) {
39 return absl::InvalidArgumentError(
40 absl::StrFormat(
"Cannot parse parameter '%s'. Expected format is "
41 "'parameter/name = value'",
45 std::string
name = key_value[0];
46 absl::RemoveExtraAsciiWhitespace(&
name);
47 std::string
value = key_value[1];
48 absl::RemoveExtraAsciiWhitespace(&
value);
49 const double infinity = SCIPinfinity(scip);
51 SCIP_PARAM* param = SCIPgetParam(scip,
name.c_str());
52 if (param ==
nullptr) {
53 return absl::InvalidArgumentError(
54 absl::StrFormat(
"Invalid parameter name '%s'",
name));
56 switch (param->paramtype) {
57 case SCIP_PARAMTYPE_BOOL: {
59 if (absl::SimpleAtob(
value, &parsed_value)) {
61 SCIPsetBoolParam(scip,
name.c_str(), parsed_value));
62 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s",
name,
value);
67 case SCIP_PARAMTYPE_INT: {
69 if (absl::SimpleAtoi(
value, &parsed_value)) {
71 SCIPsetIntParam(scip,
name.c_str(), parsed_value));
72 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s",
name,
value);
77 case SCIP_PARAMTYPE_LONGINT: {
79 if (absl::SimpleAtoi(
value, &parsed_value)) {
81 scip,
name.c_str(),
static_cast<SCIP_Longint
>(parsed_value)));
82 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s",
name,
value);
87 case SCIP_PARAMTYPE_REAL: {
89 if (absl::SimpleAtod(
value, &parsed_value)) {
90 if (parsed_value > infinity) parsed_value = infinity;
92 SCIPsetRealParam(scip,
name.c_str(), parsed_value));
93 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s",
name,
value);
98 case SCIP_PARAMTYPE_CHAR: {
99 if (
value.size() == 1) {
101 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s",
name,
value);
106 case SCIP_PARAMTYPE_STRING: {
107 if (
value.front() ==
'"' &&
value.back() ==
'"') {
112 SCIPsetStringParam(scip,
name.c_str(),
value.c_str()));
113 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s",
name,
value);
117 return absl::InvalidArgumentError(
118 absl::StrFormat(
"Invalid parameter value '%s'", parameter));
120 return absl::OkStatus();
#define VLOG(verboselevel)
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
absl::Status LegacyScipSetSolverSpecificParameters(const std::string ¶meters, SCIP *scip)
#define RETURN_IF_SCIP_ERROR(x)