22 template <
typename SparseVectorProtoType>
23 absl::Status CheckSparseVectorProto(
const SparseVectorProtoType& vec) {
26 return absl::OkStatus();
29 template <
typename Key>
30 absl::StatusOr<IdMap<Key, BasisStatus>> BasisVectorFromProto(
31 const ModelStorage*
const model,
32 const SparseBasisStatusVector& basis_proto) {
33 using IdType =
typename Key::IdType;
34 absl::flat_hash_map<IdType, BasisStatus> raw_map;
35 raw_map.reserve(basis_proto.ids_size());
36 for (
const auto& [
id, basis_status_proto_int] :
MakeView(basis_proto)) {
37 const auto basis_status_proto =
38 static_cast<BasisStatusProto
>(basis_status_proto_int);
39 const std::optional<BasisStatus> basis_status =
41 if (!basis_status.has_value()) {
43 <<
"basis status not specified for id " << id;
45 raw_map[IdType(
id)] = *basis_status;
47 return IdMap<Key, BasisStatus>(
model, std::move(raw_map));
50 template <
typename Key>
51 SparseDoubleVectorProto IdMapToProto(
const IdMap<Key, double>& id_map) {
52 using IdType =
typename Key::IdType;
53 SparseDoubleVectorProto result;
54 std::vector<std::pair<IdType, double>> sorted_entries(
55 id_map.raw_map().begin(), id_map.raw_map().end());
56 std::sort(sorted_entries.begin(), sorted_entries.end());
57 for (
const auto& [
id, val] : sorted_entries) {
58 result.add_ids(
id.
value());
59 result.add_values(val);
64 template <
typename Key>
65 SparseBasisStatusVector BasisIdMapToProto(
66 const IdMap<Key, BasisStatus>& basis_map) {
67 using IdType =
typename Key::IdType;
68 SparseBasisStatusVector result;
69 std::vector<std::pair<IdType, BasisStatus>> sorted_entries(
70 basis_map.raw_map().begin(), basis_map.raw_map().end());
71 std::sort(sorted_entries.begin(), sorted_entries.end());
72 for (
const auto& [
id, val] : sorted_entries) {
73 result.add_ids(
id.
value());
79 absl::Status VariableIdsExist(
const ModelStorage*
const model,
80 const absl::Span<const int64_t> ids) {
81 for (
const int64_t
id : ids) {
82 if (!
model->has_variable(VariableId(
id))) {
84 <<
"no variable with id " <<
id <<
" exists";
87 return absl::OkStatus();
90 absl::Status LinearConstraintIdsExist(
const ModelStorage*
const model,
91 const absl::Span<const int64_t> ids) {
92 for (
const int64_t
id : ids) {
93 if (!
model->has_linear_constraint(LinearConstraintId(
id))) {
95 <<
"no linear constraint with id " <<
id <<
" exists";
98 return absl::OkStatus();
105 const SparseDoubleVectorProto& vars_proto) {
113 return IdMapToProto(variable_values);
118 const SparseDoubleVectorProto& lin_cons_proto) {
122 model,
MakeView(lin_cons_proto).as_map<LinearConstraintId>());
127 return IdMapToProto(linear_constraint_values);
132 const SparseBasisStatusVector& basis_proto) {
135 return BasisVectorFromProto<Variable>(
model, basis_proto);
140 return BasisIdMapToProto(basis_values);
145 const SparseBasisStatusVector& basis_proto) {
148 return BasisVectorFromProto<LinearConstraint>(
model, basis_proto);
153 return BasisIdMapToProto(basis_values);
#define RETURN_IF_ERROR(expr)
absl::Status CheckIdsAndValuesSize(const SparseVectorView< T > &vector_view, absl::string_view value_name="values")
SparseBasisStatusVector VariableBasisToProto(const VariableMap< BasisStatus > &basis_values)
SparseBasisStatusVector LinearConstraintBasisToProto(const LinearConstraintMap< BasisStatus > &basis_values)
absl::StatusOr< LinearConstraintMap< double > > LinearConstraintValuesFromProto(const ModelStorage *const model, const SparseDoubleVectorProto &lin_cons_proto)
SparseDoubleVectorProto LinearConstraintValuesToProto(const LinearConstraintMap< double > &linear_constraint_values)
absl::Status CheckIdsRangeAndStrictlyIncreasing(absl::Span< const int64_t > ids)
absl::StatusOr< VariableMap< BasisStatus > > VariableBasisFromProto(const ModelStorage *const model, const SparseBasisStatusVector &basis_proto)
absl::StatusOr< VariableMap< double > > VariableValuesFromProto(const ModelStorage *const model, const SparseDoubleVectorProto &vars_proto)
SparseDoubleVectorProto VariableValuesToProto(const VariableMap< double > &variable_values)
SparseVectorView< T > MakeView(absl::Span< const int64_t > ids, const Collection &values)
std::optional< typename EnumProto< P >::Cpp > EnumFromProto(const P proto_value)
absl::StatusOr< LinearConstraintMap< BasisStatus > > LinearConstraintBasisFromProto(const ModelStorage *const model, const SparseBasisStatusVector &basis_proto)
Enum< E >::Proto EnumToProto(const std::optional< E > value)
StatusBuilder InvalidArgumentErrorBuilder()