23 #include "ortools/math_opt/model.pb.h" 24 #include "ortools/math_opt/model_update.pb.h" 25 #include "ortools/math_opt/sparse_containers.pb.h" 32 *into.mutable_deleted_variable_ids());
34 *into.mutable_deleted_linear_constraint_ids());
37 from.variable_updates().lower_bounds(),
38 *into.mutable_variable_updates()->mutable_lower_bounds());
40 from.variable_updates().upper_bounds(),
41 *into.mutable_variable_updates()->mutable_upper_bounds());
43 from.variable_updates().integers(),
44 *into.mutable_variable_updates()->mutable_integers());
47 from.linear_constraint_updates().lower_bounds(),
48 *into.mutable_linear_constraint_updates()->mutable_lower_bounds());
50 from.linear_constraint_updates().upper_bounds(),
51 *into.mutable_linear_constraint_updates()->mutable_upper_bounds());
53 if (!from.new_variables().ids().empty() &&
54 !into.new_variables().ids().empty()) {
55 CHECK_GT(*from.new_variables().ids().begin(),
56 *into.new_variables().ids().rbegin());
58 into.mutable_new_variables()->MergeFrom(from.new_variables());
60 if (!from.new_linear_constraints().ids().empty() &&
61 !into.new_linear_constraints().ids().empty()) {
62 CHECK_GT(*from.new_linear_constraints().ids().begin(),
63 *into.new_linear_constraints().ids().rbegin());
65 into.mutable_new_linear_constraints()->MergeFrom(
66 from.new_linear_constraints());
68 if (from.objective_updates().has_direction_update()) {
69 into.mutable_objective_updates()->set_direction_update(
70 from.objective_updates().direction_update());
72 if (from.objective_updates().has_offset_update()) {
73 into.mutable_objective_updates()->set_offset_update(
74 from.objective_updates().offset_update());
77 from.objective_updates().linear_coefficients(),
78 *into.mutable_objective_updates()->mutable_linear_coefficients());
81 from.linear_constraint_matrix_updates(),
82 *into.mutable_linear_constraint_matrix_updates());
88 google::protobuf::RepeatedField<int64_t>& into) {
89 google::protobuf::RepeatedField<int64_t> result;
94 result.Reserve(
std::max(from.size(), into.size()));
98 while (from_i < from.size() && into_i < into.size()) {
99 if (from[from_i] < into[into_i]) {
100 result.Add(from[from_i]);
102 }
else if (from[from_i] > into[into_i]) {
103 result.Add(into[into_i]);
106 result.Add(from[from_i]);
115 result.Reserve(result.size() +
116 std::max(from.size() - from_i, into.size() - into_i));
117 for (; from_i < from.size(); ++from_i) {
118 result.Add(from[from_i]);
120 for (; into_i < into.size(); ++into_i) {
121 result.Add(into[into_i]);
128 SparseDoubleMatrixProto& into) {
129 SparseDoubleMatrixProto result;
130 auto& result_row_ids = *result.mutable_row_ids();
131 auto& result_column_ids = *result.mutable_column_ids();
132 auto& result_coefficients = *result.mutable_coefficients();
137 const int max_size =
std::max(from.row_ids_size(), into.row_ids_size());
138 result_row_ids.Reserve(max_size);
139 result_column_ids.Reserve(max_size);
140 result_coefficients.Reserve(max_size);
144 while (from_i < from.row_ids_size() && into_i < into.row_ids_size()) {
148 const auto from_coordinates =
149 std::make_pair(from.row_ids(from_i), from.column_ids(from_i));
150 const auto into_coordinates =
151 std::make_pair(into.row_ids(into_i), into.column_ids(into_i));
152 if (from_coordinates < into_coordinates) {
153 result_row_ids.Add(from_coordinates.first);
154 result_column_ids.Add(from_coordinates.second);
155 result_coefficients.Add(from.coefficients(from_i));
157 }
else if (from_coordinates > into_coordinates) {
158 result_row_ids.Add(into_coordinates.first);
159 result_column_ids.Add(into_coordinates.second);
160 result_coefficients.Add(into.coefficients(into_i));
163 result_row_ids.Add(from_coordinates.first);
164 result_column_ids.Add(from_coordinates.second);
165 result_coefficients.Add(from.coefficients(from_i));
174 const int remaining_size =
175 std::max(from.row_ids_size() - from_i, into.row_ids_size() - into_i);
176 result_row_ids.Reserve(result_row_ids.size() + remaining_size);
177 result_column_ids.Reserve(result_column_ids.size() + remaining_size);
178 result_coefficients.Reserve(result_coefficients.size() + remaining_size);
179 for (; from_i < from.row_ids_size(); ++from_i) {
180 result_row_ids.Add(from.row_ids(from_i));
181 result_column_ids.Add(from.column_ids(from_i));
182 result_coefficients.Add(from.coefficients(from_i));
184 for (; into_i < into.row_ids_size(); ++into_i) {
185 result_row_ids.Add(into.row_ids(into_i));
186 result_column_ids.Add(into.column_ids(into_i));
187 result_coefficients.Add(into.coefficients(into_i));
void MergeIntoSortedIds(const google::protobuf::RepeatedField< int64_t > &from, google::protobuf::RepeatedField< int64_t > &into)
#define CHECK_GT(val1, val2)
void MergeIntoSparseVector(const SparseVector &from, SparseVector &into)
void MergeIntoUpdate(const ModelUpdateProto &from, ModelUpdateProto &into)
Collection of objects used to extend the Constraint Solver library.
void MergeIntoSparseDoubleMatrix(const SparseDoubleMatrixProto &from, SparseDoubleMatrixProto &into)