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 google::protobuf::RepeatedField<int64_t>& into_old,
62 const google::protobuf::RepeatedField<int64_t>& deleted);
73template <
typename SparseVector>
75 const google::protobuf::RepeatedField<int64_t>& deleted);
85 const SparseDoubleMatrixProto& from_new, SparseDoubleMatrixProto& into_old,
86 const google::protobuf::RepeatedField<int64_t>& deleted_rows,
87 const google::protobuf::RepeatedField<int64_t>& deleted_columns);
102template <
typename RepeatedField,
typename SparseVector>
104 RepeatedField& values,
105 const google::protobuf::RepeatedField<int64_t>& deleted,
106 const SparseVector& updates);
116template <
typename SparseVector>
118 const google::protobuf::RepeatedField<int64_t>& deleted) {
119 CHECK_EQ(from_new.ids_size(), from_new.values_size());
120 CHECK_EQ(into_old.ids_size(), into_old.values_size());
123 auto& result_ids = *result.mutable_ids();
124 auto& result_values = *result.mutable_values();
132 const auto add_if_not_deleted =
134 while (deleted_i < deleted.size() && deleted[deleted_i] < id) {
137 if (deleted_i == deleted.size() || deleted[deleted_i] != id) {
139 result_values.Add(
value);
143 while (from_new_i < from_new.ids_size() && into_old_i < into_old.ids_size()) {
144 if (from_new.
ids(from_new_i) < into_old.
ids(into_old_i)) {
145 add_if_not_deleted(from_new.
ids(from_new_i), from_new.
values(from_new_i));
147 }
else if (from_new.
ids(from_new_i) > into_old.
ids(into_old_i)) {
148 add_if_not_deleted(into_old.
ids(into_old_i), into_old.
values(into_old_i));
151 add_if_not_deleted(from_new.
ids(from_new_i), from_new.
values(from_new_i));
160 for (; from_new_i < from_new.ids_size(); ++from_new_i) {
161 add_if_not_deleted(from_new.
ids(from_new_i), from_new.
values(from_new_i));
163 for (; into_old_i < into_old.ids_size(); ++into_old_i) {
164 add_if_not_deleted(into_old.
ids(into_old_i), into_old.
values(into_old_i));
167 into_old.Swap(&result);
170template <
typename RepeatedField,
typename SparseVector>
172 RepeatedField& values,
173 const google::protobuf::RepeatedField<int64_t>& deleted,
175 int next_insertion_point = 0;
179 for (
int i = 0; i < ids.size(); ++i) {
180 const int id = ids[i];
182 while (deleted_i < deleted.size() && deleted[deleted_i] <
id) {
185 if (deleted_i < deleted.size() && deleted[deleted_i] ==
id) {
189 while (updates_i < updates.ids_size() && updates.
ids(updates_i) <
id) {
192 if (updates_i < updates.ids_size() && updates.
ids(updates_i) ==
id) {
193 values[next_insertion_point] = updates.
values(updates_i);
197 values.SwapElements(next_insertion_point, i);
199 ++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