21#include "absl/algorithm/container.h"
22#include "absl/container/flat_hash_map.h"
23#include "absl/status/status.h"
24#include "absl/status/statusor.h"
25#include "absl/types/span.h"
26#include "google/protobuf/map.h"
43template <
typename SparseVectorProtoType>
44absl::Status CheckSparseVectorProto(
const SparseVectorProtoType& vec) {
47 return absl::OkStatus();
50template <
typename Key>
51absl::StatusOr<absl::flat_hash_map<Key, BasisStatus>> BasisVectorFromProto(
53 using IdType =
typename Key::IdType;
54 absl::flat_hash_map<Key, BasisStatus> map;
55 map.reserve(basis_proto.ids_size());
56 for (
const auto& [
id, basis_status_proto_int] :
MakeView(basis_proto)) {
57 const auto basis_status_proto =
59 const std::optional<BasisStatus> basis_status =
61 if (!basis_status.has_value()) {
63 <<
"basis status not specified for id " << id;
65 map[Key(model, IdType(
id))] = *basis_status;
70template <
typename Key>
72 const absl::flat_hash_map<Key, double>& id_map) {
73 using IdType =
typename Key::IdType;
74 std::vector<std::pair<IdType, double>> sorted_entries;
75 sorted_entries.reserve(id_map.size());
76 for (
const auto& [k, v] : id_map) {
77 sorted_entries.emplace_back(k.typed_id(), v);
79 absl::c_sort(sorted_entries);
81 for (
const auto& [
id, val] : sorted_entries) {
82 result.add_ids(
id.value());
83 result.add_values(val);
88template <
typename Key>
90 const absl::flat_hash_map<Key, BasisStatus>& basis_map) {
91 using IdType =
typename Key::IdType;
92 std::vector<std::pair<IdType, BasisStatus>> sorted_entries;
93 sorted_entries.reserve(basis_map.size());
94 for (
const auto& [k, v] : basis_map) {
95 sorted_entries.emplace_back(k.typed_id(), v);
97 absl::c_sort(sorted_entries);
99 for (
const auto& [
id, val] : sorted_entries) {
100 result.add_ids(
id.value());
107 const absl::Span<const int64_t> ids) {
108 for (
const int64_t
id : ids) {
111 <<
"no variable with id " <<
id <<
" exists";
114 return absl::OkStatus();
118 const absl::Span<const int64_t> ids) {
119 for (
const int64_t
id : ids) {
122 <<
"no linear constraint with id " <<
id <<
" exists";
125 return absl::OkStatus();
129 const absl::Span<const int64_t> ids) {
130 for (
const int64_t
id : ids) {
133 <<
"no quadratic constraint with id " <<
id <<
" exists";
136 return absl::OkStatus();
157 return MapToProto(variable_values);
160absl::StatusOr<absl::flat_hash_map<Objective, double>>
163 const google::protobuf::Map<int64_t, double>& aux_obj_proto) {
164 absl::flat_hash_map<Objective, double> result;
165 for (
const auto [raw_id, value] : aux_obj_proto) {
167 if (!model->has_auxiliary_objective(
id)) {
169 <<
"no auxiliary objective with id " << raw_id <<
" exists";
177 const absl::flat_hash_map<Objective, double>& aux_obj_values) {
178 google::protobuf::Map<int64_t, double> result;
179 for (
const auto& [objective, value] : aux_obj_values) {
180 CHECK(objective.id().has_value())
181 <<
"encountered primary objective in auxiliary objective value map";
182 result[objective.id().value()] = value;
197 return MapToProto(linear_constraint_values);
200absl::StatusOr<absl::flat_hash_map<QuadraticConstraint, double>>
210 const absl::flat_hash_map<QuadraticConstraint, double>&
211 quadratic_constraint_values) {
212 return MapToProto(quadratic_constraint_values);
219 return BasisVectorFromProto<Variable>(model, basis_proto);
224 return BasisMapToProto(basis_values);
231 return BasisVectorFromProto<LinearConstraint>(model, basis_proto);
236 return BasisMapToProto(basis_values);
#define RETURN_IF_ERROR(expr)
static Objective Auxiliary(ModelStorageCPtr storage, AuxiliaryObjectiveId id)
Returns an object that refers to an auxiliary objective of the model.
::int64_t ids(int index) const
::int64_t ids(int index) const
::int64_t ids(int index) const
An object oriented wrapper for quadratic constraints in ModelStorage.
google::protobuf::Map< int64_t, double > AuxiliaryObjectiveValuesToProto(const absl::flat_hash_map< Objective, double > &aux_obj_values)
absl::Status CheckIdsAndValuesSize(const SparseVectorView< T > &vector_view, absl::string_view value_name="values")
absl::flat_hash_map< Variable, V > VariableMap
absl::Nonnull< const ModelStorage * > ModelStorageCPtr
absl::flat_hash_map< LinearConstraint, V > LinearConstraintMap
SparseDoubleVectorProto LinearConstraintValuesToProto(const LinearConstraintMap< double > &linear_constraint_values)
Returns the proto equivalent of linear_constraint_values.
ElementId< ElementType::kAuxiliaryObjective > AuxiliaryObjectiveId
absl::StatusOr< LinearConstraintMap< double > > LinearConstraintValuesFromProto(const ModelStorageCPtr model, const SparseDoubleVectorProto &lin_cons_proto)
absl::StatusOr< absl::flat_hash_map< Objective, double > > AuxiliaryObjectiveValuesFromProto(const ModelStorageCPtr model, const google::protobuf::Map< int64_t, double > &aux_obj_proto)
std::optional< typename EnumProto< P >::Cpp > EnumFromProto(P proto_value)
ElementId< ElementType::kVariable > VariableId
SparseBasisStatusVector VariableBasisToProto(const VariableMap< BasisStatus > &basis_values)
Returns the proto equivalent of basis_values.
absl::StatusOr< LinearConstraintMap< BasisStatus > > LinearConstraintBasisFromProto(const ModelStorageCPtr model, const SparseBasisStatusVector &basis_proto)
absl::StatusOr< absl::flat_hash_map< QuadraticConstraint, double > > QuadraticConstraintValuesFromProto(const ModelStorageCPtr model, const SparseDoubleVectorProto &quad_cons_proto)
SparseVectorView< T > MakeView(absl::Span< const int64_t > ids, const Collection &values)
ElementId< ElementType::kQuadraticConstraint > QuadraticConstraintId
SparseBasisStatusVector LinearConstraintBasisToProto(const LinearConstraintMap< BasisStatus > &basis_values)
Returns the proto equivalent of basis_values.
SparseDoubleVectorProto VariableValuesToProto(const VariableMap< double > &variable_values)
Returns the proto equivalent of variable_values.
ElementId< ElementType::kLinearConstraint > LinearConstraintId
absl::StatusOr< VariableMap< BasisStatus > > VariableBasisFromProto(const ModelStorageCPtr model, const SparseBasisStatusVector &basis_proto)
SparseDoubleVectorProto QuadraticConstraintValuesToProto(const absl::flat_hash_map< QuadraticConstraint, double > &quadratic_constraint_values)
Returns the proto equivalent of quadratic_constraint_values.
Enum< E >::Proto EnumToProto(std::optional< E > value)
absl::StatusOr< VariableMap< double > > VariableValuesFromProto(const ModelStorageCPtr model, const SparseDoubleVectorProto &vars_proto)
absl::Status CheckIdsRangeAndStrictlyIncreasing(absl::Span< const int64_t > ids)
StatusBuilder InvalidArgumentErrorBuilder()