14#ifndef OR_TOOLS_MATH_OPT_CORE_MODEL_UPDATE_MERGE_H_
15#define OR_TOOLS_MATH_OPT_CORE_MODEL_UPDATE_MERGE_H_
23#include "ortools/math_opt/model_update.pb.h"
24#include "ortools/math_opt/sparse_containers.pb.h"
44 ModelUpdateProto& into_old);
51 const google::protobuf::RepeatedField<int64_t>& deleted);
61 const google::protobuf::RepeatedField<int64_t>& from_new,
62 google::protobuf::RepeatedField<int64_t>& into_old,
63 const google::protobuf::RepeatedField<int64_t>& deleted);
74template <
typename SparseVector>
76 const SparseVector& from_new, SparseVector& into_old,
77 const google::protobuf::RepeatedField<int64_t>& deleted);
87 const SparseDoubleMatrixProto& from_new, SparseDoubleMatrixProto& into_old,
88 const google::protobuf::RepeatedField<int64_t>& deleted_rows,
89 const google::protobuf::RepeatedField<int64_t>& deleted_columns);
104template <
typename RepeatedField,
typename SparseVector>
106 const google::protobuf::RepeatedField<int64_t>& ids, RepeatedField& values,
107 const google::protobuf::RepeatedField<int64_t>& deleted,
108 const SparseVector& updates);
118template <
typename SparseVector>
121 const google::protobuf::RepeatedField<int64_t>& deleted) {
122 CHECK_EQ(from_new.ids_size(), from_new.values_size());
123 CHECK_EQ(into_old.ids_size(), into_old.values_size());
126 auto& result_ids = *result.mutable_ids();
127 auto& result_values = *result.mutable_values();
135 const auto add_if_not_deleted =
137 while (deleted_i < deleted.size() && deleted[deleted_i] < id) {
140 if (deleted_i == deleted.size() || deleted[deleted_i] != id) {
142 result_values.Add(
value);
146 while (from_new_i < from_new.ids_size() && into_old_i < into_old.ids_size()) {
147 if (from_new.
ids(from_new_i) < into_old.
ids(into_old_i)) {
148 add_if_not_deleted(from_new.
ids(from_new_i), from_new.
values(from_new_i));
150 }
else if (from_new.
ids(from_new_i) > into_old.
ids(into_old_i)) {
151 add_if_not_deleted(into_old.
ids(into_old_i), into_old.
values(into_old_i));
154 add_if_not_deleted(from_new.
ids(from_new_i), from_new.
values(from_new_i));
163 for (; from_new_i < from_new.ids_size(); ++from_new_i) {
164 add_if_not_deleted(from_new.
ids(from_new_i), from_new.
values(from_new_i));
166 for (; into_old_i < into_old.ids_size(); ++into_old_i) {
167 add_if_not_deleted(into_old.
ids(into_old_i), into_old.
values(into_old_i));
170 into_old.Swap(&result);
173template <
typename RepeatedField,
typename SparseVector>
175 const google::protobuf::RepeatedField<int64_t>& ids, RepeatedField& values,
176 const google::protobuf::RepeatedField<int64_t>& deleted,
178 int next_insertion_point = 0;
182 for (
int i = 0; i < ids.size(); ++i) {
183 const int64_t
id = ids[i];
185 while (deleted_i < deleted.size() && deleted[deleted_i] <
id) {
188 if (deleted_i < deleted.size() && deleted[deleted_i] ==
id) {
192 while (updates_i < updates.ids_size() && updates.
ids(updates_i) <
id) {
195 if (updates_i < updates.ids_size() && updates.
ids(updates_i) ==
id) {
196 values[next_insertion_point] = updates.
values(updates_i);
200 values.SwapElements(next_insertion_point, i);
202 ++next_insertion_point;
#define CHECK_EQ(val1, val2)
void Truncate(RepeatedPtrField< T > *array, int new_size)
void MergeIntoSparseDoubleMatrix(const SparseDoubleMatrixProto &from_new, SparseDoubleMatrixProto &into_old, const google::protobuf::RepeatedField< int64_t > &deleted_rows, const google::protobuf::RepeatedField< int64_t > &deleted_columns)
void MergeIntoSortedIds(const google::protobuf::RepeatedField< int64_t > &from_new, google::protobuf::RepeatedField< int64_t > &into_old, const google::protobuf::RepeatedField< int64_t > &deleted)
void UpdateNewElementProperty(const google::protobuf::RepeatedField< int64_t > &ids, RepeatedField &values, const google::protobuf::RepeatedField< int64_t > &deleted, const SparseVector &updates)
void RemoveDeletedIds(google::protobuf::RepeatedField< int64_t > &ids, const google::protobuf::RepeatedField< int64_t > &deleted)
void MergeIntoSparseVector(const SparseVector &from_new, SparseVector &into_old, const google::protobuf::RepeatedField< int64_t > &deleted)
typename std::remove_reference< decltype(SparseVector().values())>::type::value_type sparse_value_type
void MergeIntoUpdate(const ModelUpdateProto &from_new, ModelUpdateProto &into_old)
Collection of objects used to extend the Constraint Solver library.
std::vector< int64_t > ids