17 #include <initializer_list>
23 #include "absl/container/flat_hash_map.h"
24 #include "absl/status/status.h"
25 #include "absl/status/statusor.h"
26 #include "absl/strings/string_view.h"
27 #include "absl/types/span.h"
28 #include "absl/log/check.h"
32 #include "ortools/math_opt/model.pb.h"
33 #include "ortools/math_opt/model_update.pb.h"
42 absl::Span<const int64_t> ids) {
44 for (
int i = 0; i < ids.size(); previous = ids[i], ++i) {
47 <<
"Expected ids to be nonnegative and not max(int64_t) but at "
49 << i <<
" found id: " << ids[i];
51 if (ids[i] <= previous) {
53 <<
"Expected ids to be strictly increasing, but at index " << i
54 <<
" found id: " << ids[i] <<
" and at previous index " << i - 1
55 <<
" found id: " << ids[i - 1];
58 return absl::OkStatus();
64 std::initializer_list<std::pair<int64_t, absl::string_view>> ids)
66 for (
const auto& pair : ids) {
67 CHECK_OK(
Insert(pair.first, std::string(pair.second)));
77 next_free_id_ = other.next_free_id_;
78 id_to_name_ = other.id_to_name_;
79 if (!other.nonempty_name_to_id_.has_value()) {
80 nonempty_name_to_id_ = std::nullopt;
82 nonempty_name_to_id_.emplace();
83 for (
const auto& [
id,
name] : id_to_name_) {
85 const auto [it, success] =
86 nonempty_name_to_id_->insert({absl::string_view(
name),
id});
97 absl::Span<const int64_t> deleted_ids, absl::Span<const int64_t> new_ids,
98 const absl::Span<const std::string* const> names) {
100 <<
"invalid deleted ids";
102 <<
"invalid new ids";
103 if (!names.empty() && names.size() != new_ids.size()) {
105 <<
"names had size " << names.size()
106 <<
" but should either be empty of have size matching new_ids which "
110 for (
const int64_t
id : deleted_ids) {
113 for (
int i = 0; i < new_ids.size(); ++i) {
115 Insert(new_ids[i], names.empty() ? std::string{} : *names[i]));
117 return absl::OkStatus();
121 : variables(check_names),
122 auxiliary_objectives(check_names),
123 linear_constraints(check_names),
124 quadratic_constraints(check_names),
125 sos1_constraints(check_names),
126 sos2_constraints(check_names),
127 indicator_constraints(check_names) {}
130 const bool check_names) {
133 model.variables().names()))
134 <<
"ModelProto.variables are invalid";
137 <<
"ModelProto.auxiliary_objectives are invalid";
139 const std::string& objective_name =
model.objective().name();
142 <<
"duplicate objective name: " << objective_name;
147 {},
model.linear_constraints().ids(),
model.linear_constraints().names()))
148 <<
"ModelProto.linear_constraints are invalid";
151 <<
"ModelProto.quadratic_constraints are invalid";
154 <<
"ModelProto.sos1_constraints are invalid";
157 <<
"ModelProto.sos2_constraints are invalid";
160 <<
"ModelProto.indicator_constraints are invalid";
166 model_update.new_variables().ids(),
167 model_update.new_variables().names()))
168 <<
"invalid variables";
170 model_update.auxiliary_objectives_updates().deleted_objective_ids(),
171 model_update.auxiliary_objectives_updates().new_objectives(),
173 <<
"invalid auxiliary objectives";
179 model_update.deleted_linear_constraint_ids(),
180 model_update.new_linear_constraints().ids(),
181 model_update.new_linear_constraints().names()))
182 <<
"invalid linear constraints";
184 model_update.quadratic_constraint_updates().deleted_constraint_ids(),
185 model_update.quadratic_constraint_updates().new_constraints(),
187 <<
"invalid quadratic constraints";
189 model_update.sos1_constraint_updates().deleted_constraint_ids(),
190 model_update.sos1_constraint_updates().new_constraints(),
192 <<
"invalid sos1 constraints";
194 model_update.sos2_constraint_updates().deleted_constraint_ids(),
195 model_update.sos2_constraint_updates().new_constraints(),
197 <<
"invalid sos2 constraints";
199 model_update.indicator_constraint_updates().deleted_constraint_ids(),
200 model_update.indicator_constraint_updates().new_constraints(),
202 <<
"invalid indicator constraints";
203 return absl::OkStatus();
#define RETURN_IF_ERROR(expr)
bool HasName(absl::string_view name) const
absl::Status Erase(int64_t id)
IdNameBiMap(bool check_names=true)
IdNameBiMap & operator=(const IdNameBiMap &other)
absl::Status BulkUpdate(absl::Span< const int64_t > deleted_ids, absl::Span< const int64_t > new_ids, absl::Span< const std::string *const > names)
absl::Status Insert(int64_t id, std::string name)
absl::Status UpdateBiMapFromMappedData(const absl::Span< const int64_t > deleted_ids, const google::protobuf::Map< int64_t, DataProto > &proto_map, IdNameBiMap &bimap)
absl::Status CheckIdsRangeAndStrictlyIncreasing2(absl::Span< const int64_t > ids)
Collection of objects used to extend the Constraint Solver library.
StatusBuilder InvalidArgumentErrorBuilder()
IdNameBiMap indicator_constraints
ModelSummary(bool check_names=true)
IdNameBiMap sos1_constraints
IdNameBiMap sos2_constraints
absl::Status Update(const ModelUpdateProto &model_update)
static absl::StatusOr< ModelSummary > Create(const ModelProto &model, bool check_names=true)
IdNameBiMap linear_constraints
IdNameBiMap auxiliary_objectives
std::string primary_objective_name
IdNameBiMap quadratic_constraints