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()