17#include <initializer_list>
23#include "absl/container/flat_hash_map.h"
24#include "absl/log/check.h"
25#include "absl/status/status.h"
26#include "absl/status/statusor.h"
27#include "absl/strings/string_view.h"
28#include "absl/types/span.h"
41 absl::Span<const int64_t> ids) {
43 for (
int i = 0; i < ids.size(); previous = ids[i], ++i) {
44 if (ids[i] < 0 || ids[i] == std::numeric_limits<int64_t>::max()) {
46 <<
"Expected ids to be nonnegative and not max(int64_t) but at "
48 << i <<
" found id: " << ids[i];
50 if (ids[i] <= previous) {
52 <<
"Expected ids to be strictly increasing, but at index " << i
53 <<
" found id: " << ids[i] <<
" and at previous index " << i - 1
54 <<
" found id: " << ids[i - 1];
57 return absl::OkStatus();
63 std::initializer_list<std::pair<int64_t, absl::string_view>> ids)
65 for (
const auto& pair : ids) {
66 CHECK_OK(
Insert(pair.first, std::string(pair.second)));
76 next_free_id_ = other.next_free_id_;
77 id_to_name_ = other.id_to_name_;
78 if (!other.nonempty_name_to_id_.has_value()) {
79 nonempty_name_to_id_ = std::nullopt;
81 nonempty_name_to_id_.emplace();
82 for (
const auto& [
id, name] : id_to_name_) {
84 const auto [it, success] =
85 nonempty_name_to_id_->insert({absl::string_view(name),
id});
96 absl::Span<const int64_t> deleted_ids, absl::Span<const int64_t> new_ids,
97 const absl::Span<const std::string* const> names) {
99 <<
"invalid deleted ids";
101 <<
"invalid new ids";
102 if (!names.empty() && names.size() != new_ids.size()) {
104 <<
"names had size " << names.size()
105 <<
" but should either be empty of have size matching new_ids which "
109 for (
const int64_t
id : deleted_ids) {
112 for (
int i = 0; i < new_ids.size(); ++i) {
114 Insert(new_ids[i], names.empty() ? std::string{} : *names[i]));
116 return absl::OkStatus();
130 const bool check_names) {
135 <<
"ModelProto.variables are invalid";
138 <<
"ModelProto.auxiliary_objectives are invalid";
143 <<
"duplicate objective name: " << objective_name;
149 <<
"ModelProto.linear_constraints are invalid";
152 <<
"ModelProto.quadratic_constraints are invalid";
156 <<
"ModelProto.second_order_cone_constraints are invalid";
159 <<
"ModelProto.sos1_constraints are invalid";
162 <<
"ModelProto.sos2_constraints are invalid";
165 <<
"ModelProto.indicator_constraints are invalid";
176 <<
"invalid variables";
181 <<
"invalid auxiliary objectives";
190 <<
"invalid linear constraints";
195 <<
"invalid quadratic constraints";
201 <<
"invalid second-order cone constraints";
206 <<
"invalid sos1 constraints";
211 <<
"invalid sos2 constraints";
216 <<
"invalid indicator constraints";
217 return absl::OkStatus();
#define RETURN_IF_ERROR(expr)
::int64_t deleted_objective_ids(int index) const
const ::google::protobuf::Map<::int64_t, ::operations_research::math_opt::ObjectiveProto > & new_objectives() const
absl::Status Erase(int64_t id)
Removes the given id, or returns an error if id is not present.
IdNameBiMap(bool check_names=true)
bool HasName(absl::string_view name) const
Will always return false if name is empty or if check_names was false.
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)
::int64_t deleted_constraint_ids(int index) const
const ::google::protobuf::Map<::int64_t, ::operations_research::math_opt::IndicatorConstraintProto > & new_constraints() const
::int64_t ids(int index) const
const ::std::string & names(int index) const
const ::operations_research::math_opt::VariablesProto & variables() const
const ::google::protobuf::Map<::int64_t, ::operations_research::math_opt::QuadraticConstraintProto > & quadratic_constraints() const
const ::operations_research::math_opt::LinearConstraintsProto & linear_constraints() const
const ::google::protobuf::Map<::int64_t, ::operations_research::math_opt::SosConstraintProto > & sos1_constraints() const
const ::google::protobuf::Map<::int64_t, ::operations_research::math_opt::SosConstraintProto > & sos2_constraints() const
const ::google::protobuf::Map<::int64_t, ::operations_research::math_opt::SecondOrderConeConstraintProto > & second_order_cone_constraints() const
const ::operations_research::math_opt::ObjectiveProto & objective() const
const ::google::protobuf::Map<::int64_t, ::operations_research::math_opt::ObjectiveProto > & auxiliary_objectives() const
const ::google::protobuf::Map<::int64_t, ::operations_research::math_opt::IndicatorConstraintProto > & indicator_constraints() const
const ::operations_research::math_opt::SosConstraintUpdatesProto & sos1_constraint_updates() const
::int64_t deleted_linear_constraint_ids(int index) const
const ::operations_research::math_opt::LinearConstraintsProto & new_linear_constraints() const
const ::operations_research::math_opt::AuxiliaryObjectivesUpdatesProto & auxiliary_objectives_updates() const
const ::operations_research::math_opt::QuadraticConstraintUpdatesProto & quadratic_constraint_updates() const
const ::operations_research::math_opt::SosConstraintUpdatesProto & sos2_constraint_updates() const
const ::operations_research::math_opt::IndicatorConstraintUpdatesProto & indicator_constraint_updates() const
const ::operations_research::math_opt::ObjectiveUpdatesProto & objective_updates() const
const ::operations_research::math_opt::SecondOrderConeConstraintUpdatesProto & second_order_cone_constraint_updates() const
::int64_t deleted_variable_ids(int index) const
const ::operations_research::math_opt::VariablesProto & new_variables() const
const ::std::string & name() const
bool direction_update() const
bool has_direction_update() const
optional bool direction_update = 1;
const ::google::protobuf::Map<::int64_t, ::operations_research::math_opt::QuadraticConstraintProto > & new_constraints() const
::int64_t deleted_constraint_ids(int index) const
const ::google::protobuf::Map<::int64_t, ::operations_research::math_opt::SecondOrderConeConstraintProto > & new_constraints() const
::int64_t deleted_constraint_ids(int index) const
const ::google::protobuf::Map<::int64_t, ::operations_research::math_opt::SosConstraintProto > & new_constraints() const
::int64_t deleted_constraint_ids(int index) const
const ::std::string & names(int index) const
::int64_t ids(int index) const
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)
An object oriented wrapper for quadratic constraints in ModelStorage.
In SWIG mode, we don't want anything besides these top-level includes.
StatusBuilder InvalidArgumentErrorBuilder()
ModelSummary(bool check_names=true)
absl::Status Update(const ModelUpdateProto &model_update)
IdNameBiMap sos2_constraints
IdNameBiMap second_order_cone_constraints
IdNameBiMap linear_constraints
IdNameBiMap sos1_constraints
IdNameBiMap quadratic_constraints
IdNameBiMap auxiliary_objectives
IdNameBiMap indicator_constraints
static absl::StatusOr< ModelSummary > Create(const ModelProto &model, bool check_names=true)
std::string primary_objective_name