14 #ifndef OR_TOOLS_MATH_OPT_STORAGE_LINEAR_CONSTRAINT_STORAGE_H_
15 #define OR_TOOLS_MATH_OPT_STORAGE_LINEAR_CONSTRAINT_STORAGE_H_
24 #include "absl/container/flat_hash_map.h"
25 #include "absl/container/flat_hash_set.h"
26 #include "absl/meta/type_traits.h"
27 #include "absl/strings/string_view.h"
28 #include "absl/log/check.h"
30 #include "ortools/math_opt/model.pb.h"
31 #include "ortools/math_opt/model_update.pb.h"
32 #include "ortools/math_opt/sparse_containers.pb.h"
57 absl::flat_hash_set<LinearConstraintId>
deleted;
64 absl::flat_hash_set<std::pair<LinearConstraintId, VariableId>>
matrix_keys;
68 google::protobuf::RepeatedField<int64_t>
deleted;
80 absl::string_view
name);
82 inline double lower_bound(LinearConstraintId
id)
const;
83 inline double upper_bound(LinearConstraintId
id)
const;
84 inline const std::string&
name(LinearConstraintId
id)
const;
86 template <
typename DiffIter>
90 template <
typename DiffIter>
98 template <
typename DiffIter>
105 inline int64_t
size()
const;
110 inline LinearConstraintId
next_id()
const;
116 inline bool contains(LinearConstraintId
id)
const;
128 template <
typename DiffIter>
133 template <
typename DiffIter>
134 void set_term(LinearConstraintId constraint, VariableId variable,
143 std::pair<LinearConstraintsProto, SparseDoubleMatrixProto>
Proto()
const;
161 const absl::flat_hash_set<VariableId>& deleted_variables,
162 const std::vector<VariableId>& new_variables)
const;
170 double lower_bound = -std::numeric_limits<double>::infinity();
171 double upper_bound = std::numeric_limits<double>::infinity();
175 std::vector<LinearConstraintId> ConstraintsFrom(
176 const LinearConstraintId
start)
const;
178 void AppendConstraint(LinearConstraintId constraint,
179 LinearConstraintsProto*
proto)
const;
183 LinearConstraintsProto
Proto(LinearConstraintId
start,
184 LinearConstraintId
end)
const;
186 LinearConstraintId next_id_{0};
187 absl::flat_hash_map<LinearConstraintId, Data> linear_constraints_;
188 SparseMatrix<LinearConstraintId, VariableId> matrix_;
196 return linear_constraints_.at(
id).lower_bound;
200 return linear_constraints_.at(
id).upper_bound;
204 const LinearConstraintId
id)
const {
205 return linear_constraints_.at(
id).name;
208 template <
typename DiffIter>
210 const LinearConstraintId
id,
const double lower_bound,
212 const auto it = linear_constraints_.find(
id);
217 for (
Diff& diff : diffs) {
218 if (
id < diff.checkpoint) {
219 diff.lower_bounds.insert(
id);
224 template <
typename DiffIter>
226 const LinearConstraintId
id,
const double upper_bound,
228 const auto it = linear_constraints_.find(
id);
233 for (
Diff& diff : diffs) {
234 if (
id < diff.checkpoint) {
235 diff.upper_bounds.insert(
id);
240 template <
typename DiffIter>
243 for (
Diff& diff : diffs) {
245 if (
id >= diff.checkpoint) {
248 diff.lower_bounds.erase(
id);
249 diff.upper_bounds.erase(
id);
250 diff.deleted.insert(
id);
251 for (
const VariableId row_var : matrix_.
row(
id)) {
252 if (row_var < diff.variable_checkpoint) {
253 diff.matrix_keys.erase({id, row_var});
258 linear_constraints_.erase(
id);
261 template <
typename DiffIter>
264 for (
Diff& diff : diffs) {
265 if (variable >= diff.variable_checkpoint) {
268 for (
const LinearConstraintId constraint : matrix_.
column(variable)) {
269 if (constraint < diff.checkpoint) {
270 diff.matrix_keys.erase({constraint, variable});
278 return linear_constraints_.size();
284 const LinearConstraintId minimum) {
285 next_id_ =
std::max(minimum, next_id_);
289 return linear_constraints_.contains(
id);
292 template <
typename DiffIter>
294 const VariableId variable,
297 DCHECK(linear_constraints_.contains(constraint));
298 if (!matrix_.
set(constraint, variable,
value)) {
301 for (
Diff& diff : diffs) {
302 if (constraint < diff.checkpoint && variable < diff.variable_checkpoint) {
303 diff.matrix_keys.insert({constraint, variable});
double lower_bound(LinearConstraintId id) const
bool diff_is_empty(const Diff &diff) const
void set_upper_bound(LinearConstraintId id, double upper_bound, const iterator_range< DiffIter > &diffs)
void DeleteVariable(VariableId variable, const iterator_range< DiffIter > &diffs)
double upper_bound(LinearConstraintId id) const
const SparseMatrix< LinearConstraintId, VariableId > & matrix() const
void Delete(LinearConstraintId id, const iterator_range< DiffIter > &diffs)
UpdateResult Update(const Diff &diff, const absl::flat_hash_set< VariableId > &deleted_variables, const std::vector< VariableId > &new_variables) const
void set_lower_bound(LinearConstraintId id, double lower_bound, const iterator_range< DiffIter > &diffs)
LinearConstraintId next_id() const
void AdvanceCheckpointInDiff(VariableId variable_checkpoint, Diff &diff) const
bool contains(LinearConstraintId id) const
const std::string & name(LinearConstraintId id) const
LinearConstraintId Add(double lower_bound, double upper_bound, absl::string_view name)
void set_term(LinearConstraintId constraint, VariableId variable, double value, const iterator_range< DiffIter > &diffs)
void ensure_next_id_at_least(LinearConstraintId minimum)
std::vector< LinearConstraintId > LinearConstraints() const
std::pair< LinearConstraintsProto, SparseDoubleMatrixProto > Proto() const
std::vector< LinearConstraintId > SortedLinearConstraints() const
void DeleteRow(RowId row)
void DeleteColumn(ColumnId column)
bool set(RowId row, ColumnId column, double value)
std::vector< RowId > column(ColumnId column_id) const
std::vector< ColumnId > row(RowId row_id) const
std::optional< int64_t > end
absl::flat_hash_set< std::pair< LinearConstraintId, VariableId > > matrix_keys
absl::flat_hash_set< LinearConstraintId > upper_bounds
VariableId variable_checkpoint
absl::flat_hash_set< LinearConstraintId > lower_bounds
absl::flat_hash_set< LinearConstraintId > deleted
Diff(const LinearConstraintStorage &storage, VariableId variable_checkpoint)
LinearConstraintId checkpoint
SparseDoubleMatrixProto matrix_updates
LinearConstraintsProto creates
LinearConstraintUpdatesProto updates
google::protobuf::RepeatedField< int64_t > deleted