20 #include "absl/container/flat_hash_map.h"
21 #include "absl/status/status.h"
22 #include "absl/status/statusor.h"
23 #include "absl/strings/str_cat.h"
24 #include "absl/strings/str_split.h"
27 #include "ortools/linear_solver/linear_solver.pb.h"
34 absl::StatusOr<glop::DenseRow>
ParseSolFile(
const std::string& file_name,
40 absl::StatusOr<MPSolutionResponse>
ParseSolFile(
const std::string& file_name,
41 const MPModelProto&
model) {
48 constexpr
double kInfinity = std::numeric_limits<double>::infinity();
50 absl::flat_hash_map<std::string, glop::ColIndex> var_index_by_name;
52 var_index_by_name[
model.GetVariableName(
col)] =
col;
55 glop::ColIndex num_variables =
model.num_variables();
57 std::vector<std::string> lines =
58 absl::StrSplit(solution,
'\n', absl::SkipEmpty());
59 for (
const std::string&
line : lines) {
60 std::vector<std::string> fields =
61 absl::StrSplit(
line, absl::ByAnyChar(
" \t"), absl::SkipEmpty());
64 for (
int i = 0; i < fields.size(); ++i) {
65 if (fields[i][0] ==
'#') {
71 if (fields.empty())
continue;
73 if (fields.size() == 1) {
74 return absl::InvalidArgumentError(
75 absl::StrCat(
"Found only one field on line '",
line,
"'."));
77 if (fields.size() > 2) {
78 return absl::InvalidArgumentError(
79 absl::StrCat(
"Found more than two fields on line '",
line,
"'."));
82 const std::string var_name = fields[0];
83 const double var_value =
86 return absl::InvalidArgumentError(
87 absl::StrCat(
"Couldn't parse value on line '",
line,
"'."));
90 if (var_name ==
"=obj=")
continue;
92 auto iter = var_index_by_name.find(var_name);
93 if (iter == var_index_by_name.end()) {
94 return absl::InvalidArgumentError(absl::StrCat(
95 "Couldn't find variable named '", var_name,
"' in the model."));
97 dense_row[iter->second] = var_value;
104 const MPModelProto&
model) {
105 constexpr
double kInfinity = std::numeric_limits<double>::infinity();
107 absl::flat_hash_map<std::string, int> var_index_by_name;
108 for (
int var_index = 0; var_index <
model.variable_size(); ++var_index) {
109 if (
model.variable(var_index).name().empty()) {
110 return absl::InvalidArgumentError(
"Found variable without name.");
112 var_index_by_name[
model.variable(var_index).name()] = var_index;
116 std::vector<double> var_values(
model.variable_size(), 0);
117 std::vector<std::string> lines =
118 absl::StrSplit(solution,
'\n', absl::SkipEmpty());
119 for (
const std::string&
line : lines) {
120 std::vector<std::string> fields =
121 absl::StrSplit(
line, absl::ByAnyChar(
" \t"), absl::SkipEmpty());
124 for (
int i = 0; i < fields.size(); ++i) {
125 if (fields[i][0] ==
'#') {
131 if (fields.empty())
continue;
133 if (fields.size() == 1) {
134 return absl::InvalidArgumentError(
135 absl::StrCat(
"Found only one field on line '",
line,
"'."));
137 if (fields.size() > 2) {
138 return absl::InvalidArgumentError(
139 absl::StrCat(
"Found more than two fields on line '",
line,
"'."));
142 const std::string var_name = fields[0];
143 const double var_value =
146 return absl::InvalidArgumentError(
147 absl::StrCat(
"Couldn't parse value on line '",
line,
"'."));
150 if (var_name ==
"=obj=") {
151 response.set_objective_value(var_value);
155 auto iter = var_index_by_name.find(var_name);
156 if (iter == var_index_by_name.end()) {
157 return absl::InvalidArgumentError(absl::StrCat(
158 "Couldn't find variable named '", var_name,
"' in the model."));
160 var_values[iter->second] = var_value;
163 for (
const double value : var_values) {
#define ASSIGN_OR_RETURN(lhs, rexpr)
SharedResponseManager * response
Collection of objects used to extend the Constraint Solver library.
absl::StatusOr< std::string > ReadFileToString(absl::string_view filename)
absl::StatusOr< glop::DenseRow > ParseSolFile(const std::string &file_name, const glop::LinearProgram &model)
absl::StatusOr< glop::DenseRow > ParseSolString(const std::string &solution, const glop::LinearProgram &model)
double ParseLeadingDoubleValue(const char *str, double deflt)
constexpr double kInfinity