22#include "absl/base/nullability.h"
23#include "absl/log/check.h"
24#include "absl/log/log.h"
25#include "absl/memory/memory.h"
26#include "absl/status/status.h"
27#include "absl/status/statusor.h"
28#include "absl/strings/string_view.h"
29#include "absl/types/span.h"
41std::vector<T> ConvertIdVector(absl::Span<const int64_t> ids) {
42 std::vector<T> result;
43 result.reserve(ids.size());
44 for (
const int64_t
id : ids) {
45 result.push_back(T{
id});
50template <
typename T,
int i,
typename AttrKeyT>
51std::vector<T> ConvertKeyVector(
const std::vector<AttrKeyT>& keys) {
52 std::vector<T> result;
53 result.reserve(keys.size());
54 for (
const AttrKeyT key : keys) {
55 result.push_back(T{key[
i]});
61std::vector<T> Sorted(std::vector<T> vec) {
69 CHECK(elemental_.DeleteElement(
id))
70 <<
"cannot delete variable with id: " <<
id <<
", it is not in the model";
74 CHECK(elemental_.DeleteElement(
id))
75 <<
"cannot delete linear constraint with id: " <<
id
76 <<
", it is not in the model";
79absl::StatusOr<absl::Nonnull<std::unique_ptr<ModelStorageV2>>>
86 const std::optional<absl::string_view> new_name)
const {
87 return absl::WrapUnique(
new ModelStorageV2(elemental_.Clone(new_name)));
91 return ConvertIdVector<VariableId>(
100 if (
id.has_value()) {
102 elemental_.Slice<0>(DoubleAttr2::kAuxObjLinCoef,
id->value());
103 return ConvertKeyVector<VariableId, 1>(slice);
105 return ConvertKeyVector<VariableId, 0>(
106 elemental_.AttrNonDefaults(DoubleAttr1::kObjLinCoef));
111 return ConvertIdVector<LinearConstraintId>(
121 const bool remove_names)
const {
122 return elemental_.ExportModel(remove_names);
126 return UpdateTrackerId(elemental_.AddDiff().id());
130 const std::optional<Elemental::DiffHandle> diff =
131 elemental_.GetDiffHandle(update_tracker.value());
132 CHECK(diff.has_value()) <<
"UpdateTrackerId " << update_tracker
134 elemental_.DeleteDiff(*diff);
137absl::StatusOr<std::optional<ModelUpdateProto>>
139 const bool remove_names)
const {
140 const std::optional<Elemental::DiffHandle> diff =
141 elemental_.GetDiffHandle(update_tracker.value());
142 CHECK(diff.has_value()) <<
"UpdateTrackerId " << update_tracker
144 return elemental_.ExportModelUpdate(*diff, remove_names);
148 const std::optional<Elemental::DiffHandle> diff =
149 elemental_.GetDiffHandle(update_tracker.value());
150 CHECK(diff.has_value()) <<
"UpdateTrackerId " << update_tracker
152 elemental_.Advance(*diff);
156 const ModelUpdateProto& update_proto) {
157 LOG(FATAL) <<
"not implemented";
#define ASSIGN_OR_RETURN(lhs, rexpr)
static absl::StatusOr< Elemental > FromModelProto(const ModelProto &proto)
Creates an equivalent Elemental to proto.
absl::Status ApplyUpdateProto(const ModelUpdateProto &update_proto)
void DeleteUpdateTracker(UpdateTrackerId update_tracker)
static absl::StatusOr< absl::Nonnull< std::unique_ptr< ModelStorageV2 > > > FromModelProto(const ModelProto &model_proto)
std::vector< LinearConstraintId > LinearConstraints() const
The LinearConstraintsIds in use (not deleted), order not defined.
void DeleteVariable(VariableId id)
std::vector< VariableId > Variables() const
The VariableIds in use (not deleted), order not defined.
UpdateTrackerId NewUpdateTracker()
std::vector< VariableId > LinearObjectiveNonzeros(ObjectiveId id) const
ModelStorageV2(absl::string_view model_name="", absl::string_view primary_objective_name="")
Creates an empty minimization problem.
void AdvanceCheckpoint(UpdateTrackerId update_tracker)
absl::StatusOr< ModelProto > ExportModelV2(bool remove_names=false) const
std::vector< LinearConstraintId > SortedLinearConstraints() const
void DeleteLinearConstraint(LinearConstraintId id)
std::vector< VariableId > SortedVariables() const
absl::Nonnull< std::unique_ptr< ModelStorageV2 > > Clone(std::optional< absl::string_view > new_name=std::nullopt) const
absl::StatusOr< std::optional< ModelUpdateProto > > ExportModelUpdateV2(UpdateTrackerId update_tracker, bool remove_names=false) const
An object oriented wrapper for quadratic constraints in ModelStorage.
ElementId< ElementType::kVariable > VariableId
ElementId< ElementType::kLinearConstraint > LinearConstraintId
std::optional< AuxiliaryObjectiveId > ObjectiveId
nullopt denotes the primary objective.