37 for (
const auto parameter : absl::StrSplit(parameters, absl::ByAnyChar(
",\n"),
38 absl::SkipWhitespace())) {
39 std::vector<std::string> key_value = absl::StrSplit(
40 parameter, absl::ByAnyChar(
"= "), absl::SkipWhitespace());
41 if (key_value.size() != 2) {
42 return absl::InvalidArgumentError(
43 absl::StrFormat(
"Cannot parse parameter '%s'. Expected format is "
44 "'parameter/name = value'",
48 std::string name = key_value[0];
49 absl::RemoveExtraAsciiWhitespace(&name);
50 std::string value = key_value[1];
51 absl::RemoveExtraAsciiWhitespace(&value);
52 const double infinity = SCIPinfinity(scip);
54 SCIP_PARAM* param = SCIPgetParam(scip, name.c_str());
55 if (param ==
nullptr) {
56 return absl::InvalidArgumentError(
57 absl::StrFormat(
"Invalid parameter name '%s'", name));
59 switch (param->paramtype) {
60 case SCIP_PARAMTYPE_BOOL: {
62 if (absl::SimpleAtob(value, &parsed_value)) {
64 SCIPsetBoolParam(scip, name.c_str(), parsed_value));
65 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s", name, value);
70 case SCIP_PARAMTYPE_INT: {
72 if (absl::SimpleAtoi(value, &parsed_value)) {
74 SCIPsetIntParam(scip, name.c_str(), parsed_value));
75 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s", name, value);
80 case SCIP_PARAMTYPE_LONGINT: {
82 if (absl::SimpleAtoi(value, &parsed_value)) {
84 scip, name.c_str(),
static_cast<SCIP_Longint
>(parsed_value)));
85 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s", name, value);
90 case SCIP_PARAMTYPE_REAL: {
92 if (absl::SimpleAtod(value, &parsed_value)) {
93 if (parsed_value > infinity) parsed_value = infinity;
95 SCIPsetRealParam(scip, name.c_str(), parsed_value));
96 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s", name, value);
101 case SCIP_PARAMTYPE_CHAR: {
102 if (value.size() == 1) {
104 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s", name, value);
109 case SCIP_PARAMTYPE_STRING: {
110 if (value.front() ==
'"' && value.back() ==
'"') {
111 value.erase(value.begin());
112 value.erase(value.end() - 1);
115 SCIPsetStringParam(scip, name.c_str(), value.c_str()));
116 VLOG(2) << absl::StrFormat(
"Set parameter %s to %s", name, value);
120 return absl::InvalidArgumentError(
121 absl::StrFormat(
"Invalid parameter value '%s'", parameter));
123 return absl::OkStatus();