20#include "absl/container/btree_set.h"
21#include "absl/container/flat_hash_map.h"
22#include "absl/log/check.h"
23#include "absl/log/log.h"
24#include "absl/status/status.h"
25#include "absl/status/statusor.h"
26#include "absl/strings/str_cat.h"
27#include "absl/strings/string_view.h"
50 data_->SetDcheckBounds(
false);
54 void SetName(absl::string_view name) { data_->SetName(name); }
57 data_->SetMaximizationProblem(maximize);
61 data_->SetObjectiveOffset(objective_offset);
65 return data_->FindOrCreateConstraint(name).value();
68 data_->SetConstraintBounds(RowIndex(index), lower_bound, upper_bound);
72 data_->SetCoefficient(RowIndex(row_index), ColIndex(col_index),
76 LOG_FIRST_N(WARNING, 1)
77 <<
"LAZYCONS section detected. It will be handled as an extension of "
81 return data_->constraint_lower_bounds()[RowIndex(row_index)];
84 return data_->constraint_upper_bounds()[RowIndex(row_index)];
88 return data_->FindOrCreateVariable(name).value();
91 data_->SetVariableType(ColIndex(index),
95 LOG(FATAL) <<
"Semi continuous variables are not supported";
98 data_->SetVariableBounds(ColIndex(index), lower_bound, upper_bound);
101 data_->SetObjectiveCoefficient(ColIndex(index), coefficient);
104 return data_->variable_lower_bounds()[ColIndex(index)];
107 return data_->variable_upper_bounds()[ColIndex(index)];
111 int col_index,
bool col_value) {
112 return absl::UnimplementedError(
113 "LinearProgram does not support indicator constraints.");
130 variable_indices_by_name_.clear();
131 constraint_indices_by_name_.clear();
132 constraints_to_delete_.clear();
133 semi_continuous_variables_.clear();
136 void SetName(absl::string_view name) { data_->set_name(name); }
141 data_->set_objective_offset(objective_offset);
145 const auto it = constraint_indices_by_name_.find(name);
146 if (it != constraint_indices_by_name_.end())
return it->second;
148 const int index = data_->constraint_size();
153 constraint_indices_by_name_[name] = index;
157 data_->mutable_constraint(index)->set_lower_bound(lower_bound);
158 data_->mutable_constraint(index)->set_upper_bound(upper_bound);
161 double coefficient) {
171 data_->mutable_constraint(row_index)->set_is_lazy(
true);
174 return data_->constraint(row_index).lower_bound();
177 return data_->constraint(row_index).upper_bound();
181 const auto it = variable_indices_by_name_.find(name);
182 if (it != variable_indices_by_name_.end())
return it->second;
184 const int index = data_->variable_size();
188 variable_indices_by_name_[name] = index;
192 data_->mutable_variable(index)->set_is_integer(
true);
195 semi_continuous_variables_.push_back(index);
198 data_->mutable_variable(index)->set_lower_bound(lower_bound);
199 data_->mutable_variable(index)->set_upper_bound(upper_bound);
202 data_->mutable_variable(index)->set_objective_coefficient(coefficient);
205 return data_->variable(index).lower_bound();
208 return data_->variable(index).upper_bound();
212 int var_index,
bool var_value) {
213 const auto it = constraint_indices_by_name_.find(cst_name);
214 if (it == constraint_indices_by_name_.end()) {
215 return absl::InvalidArgumentError(
216 absl::StrCat(
"Constraint \"", cst_name,
"\" doesn't exist."));
218 const int cst_index = it->second;
221 data_->add_general_constraint();
223 absl::StrCat(
"ind_", data_->constraint(cst_index).name()));
229 constraints_to_delete_.insert(cst_index);
231 return absl::OkStatus();
236 constraints_to_delete_);
238 for (
const int index : semi_continuous_variables_) {
249 const int bool_var_index = data_->variable_size();
259 data_->add_general_constraint();
271 data_->add_general_constraint();
305 absl::flat_hash_map<std::string, int> variable_indices_by_name_;
306 absl::flat_hash_map<std::string, int> constraint_indices_by_name_;
307 absl::btree_set<int> constraints_to_delete_;
308 std::vector<int> semi_continuous_variables_;
315MPSReaderFormat TemplateFormat(MPSReader::Form form) {
316 return (form == MPSReader::FIXED) ? MPSReaderFormat::kFixed
317 : (form == MPSReader::FREE) ? MPSReaderFormat::kFree
318 : MPSReaderFormat::kAutoDetect;
324absl::Status MPSReader::ParseFile(absl::string_view file_name,
327 return MPSReaderTemplate<DataWrapper<LinearProgram>>()
328 .
ParseFile(file_name, &data_wrapper, TemplateFormat(form))
332absl::Status MPSReader::ParseFile(absl::string_view file_name,
333 MPModelProto* data, Form form) {
335 return MPSReaderTemplate<DataWrapper<MPModelProto>>()
336 .
ParseFile(file_name, &data_wrapper, TemplateFormat(form))
342absl::Status MPSReader::ParseProblemFromString(absl::string_view source,
344 MPSReader::Form form) {
346 return MPSReaderTemplate<DataWrapper<LinearProgram>>()
347 .ParseString(source, &data_wrapper, TemplateFormat(form))
351absl::Status MPSReader::ParseProblemFromString(absl::string_view source,
353 MPSReader::Form form) {
355 return MPSReaderTemplate<DataWrapper<MPModelProto>>()
356 .ParseString(source, &data_wrapper, TemplateFormat(form))
365 .ParseString(mps_data, &data_wrapper, MPSReaderFormat::kAutoDetect)
375 .ParseFile(mps_file, &data_wrapper, MPSReaderFormat::kAutoDetect)
#define RETURN_IF_ERROR(expr)
void set_name(Arg_ &&arg, Args_... args)
void set_lower_bound(double value)
void add_coefficient(double value)
void set_upper_bound(double value)
void add_var_index(::int32_t value)
::operations_research::MPIndicatorConstraint *PROTOBUF_NONNULL mutable_indicator_constraint()
void set_name(Arg_ &&arg, Args_... args)
void set_var_index(::int32_t value)
void set_var_value(::int32_t value)
::operations_research::MPConstraintProto *PROTOBUF_NONNULL mutable_constraint()
void set_upper_bound(double value)
void set_name(Arg_ &&arg, Args_... args)
void set_is_integer(bool value)
double lower_bound() const
double upper_bound() const
void set_lower_bound(double value)
void SetName(absl::string_view name)
int FindOrCreateVariable(absl::string_view name)
void SetObjectiveCoefficient(int index, double coefficient)
double VariableUpperBound(int index)
void SetVariableTypeToSemiContinuous(int index)
DataWrapper(LinearProgram *data)
void SetObjectiveDirection(bool maximize)
double VariableLowerBound(int index)
int FindOrCreateConstraint(absl::string_view name)
double ConstraintLowerBound(int row_index)
void SetIsLazy(int row_index)
absl::Status CreateIndicatorConstraint(absl::string_view row_name, int col_index, bool col_value)
void SetObjectiveOffset(double objective_offset)
void SetConstraintBounds(int index, double lower_bound, double upper_bound)
void SetVariableTypeToInteger(int index)
double ConstraintUpperBound(int row_index)
void SetConstraintCoefficient(int row_index, int col_index, double coefficient)
void SetVariableBounds(int index, double lower_bound, double upper_bound)
void SetName(absl::string_view name)
void SetVariableTypeToSemiContinuous(int index)
double VariableLowerBound(int index)
double ConstraintLowerBound(int row_index)
double VariableUpperBound(int index)
double ConstraintUpperBound(int row_index)
void SetConstraintBounds(int index, double lower_bound, double upper_bound)
void SetObjectiveCoefficient(int index, double coefficient)
int FindOrCreateConstraint(absl::string_view name)
void SetVariableTypeToInteger(int index)
void SetObjectiveOffset(double objective_offset)
void SetObjectiveDirection(bool maximize)
DataWrapper(MPModelProto *data)
absl::Status CreateIndicatorConstraint(absl::string_view cst_name, int var_index, bool var_value)
void SetConstraintCoefficient(int row_index, int col_index, double coefficient)
void SetVariableBounds(int index, double lower_bound, double upper_bound)
int FindOrCreateVariable(absl::string_view name)
void SetIsLazy(int row_index)
@ INTEGER
The variable must only take integer values.
int RemoveAt(RepeatedType *array, const IndexContainer &indices)
void ParseFile(const std::string &filename)
absl::StatusOr< MPModelProto > MpsFileToMPModelProto(absl::string_view mps_file)
Parses an MPS model from a file.
absl::StatusOr< MPModelProto > MpsDataToMPModelProto(absl::string_view mps_data)
Parses an MPS model from a string.
In SWIG mode, we don't want anything besides these top-level includes.