14#ifndef OR_TOOLS_MATH_OPT_CONSTRAINTS_SOS_STORAGE_H_
15#define OR_TOOLS_MATH_OPT_CONSTRAINTS_SOS_STORAGE_H_
24#include "absl/container/flat_hash_set.h"
25#include "absl/log/check.h"
40template <
typename Constra
intId>
49 std::disjunction_v<std::is_same<ConstraintId, Sos1ConstraintId>,
50 std::is_same<ConstraintId, Sos2ConstraintId>>,
51 "ID type may only be Sos1ConstraintId or Sos2ConstraintId");
56 std::vector<double> weights, std::string
name)
57 : expressions_(
std::move(expressions)), name_(
std::move(
name)) {
58 if (!weights.empty()) {
59 CHECK_EQ(weights.size(), expressions_.size());
60 weights_ = std::move(weights);
73 double weight(
const int index)
const {
74 AssertInbounds(index);
75 return weights_.has_value() ? (*weights_)[index] : index + 1;
78 AssertInbounds(index);
79 return expressions_[index];
82 const std::string&
name()
const {
return name_; }
86 void AssertInbounds(
const int index)
const {
88 CHECK_LT(index, expressions_.size());
92 std::optional<std::vector<double>> weights_;
93 std::vector<LinearExpressionData> expressions_;
120template <
typename Constra
intId>
122 const ProtoType& in_proto) {
125 data.name_ = in_proto.name();
127 data.expressions_.push_back(
131 if (!in_proto.weights().empty()) {
132 data.weights_.emplace().reserve(num_expressions);
133 for (
int i = 0; i < num_expressions; ++i) {
134 data.weights_->push_back(in_proto.weights(i));
140template <
typename Constra
intId>
143 ProtoType constraint;
146 *constraint.add_expressions() =
expression(i).Proto();
148 if (weights_.has_value()) {
149 for (
int i = 0; i < num_expressions(); ++i) {
150 constraint.add_weights(weight(i));
156template <
typename Constra
intId>
159 absl::flat_hash_set<VariableId> vars;
161 for (
const auto [var, _] :
expression.coeffs.terms()) {
165 return std::vector<VariableId>(vars.begin(), vars.end());
168template <
typename Constra
intId>
void set_name(Arg_ &&arg, Args_... args)
const LinearExpressionData & expression(const int index) const
double weight(const int index) const
static constexpr bool kSupportsElemental
static SosConstraintData FromProto(const ProtoType &in_proto)
SosConstraintProto ProtoType
std::vector< VariableId > RelatedVariables() const
void DeleteVariable(VariableId var)
const std::string & name() const
int64_t num_expressions() const
SosConstraintUpdatesProto UpdatesProtoType
SosConstraintData(std::vector< LinearExpressionData > expressions, std::vector< double > weights, std::string name)
An object oriented wrapper for quadratic constraints in ModelStorage.
internal::SosConstraintData< Sos1ConstraintId > Sos1ConstraintData
ElementId< ElementType::kVariable > VariableId
internal::SosConstraintData< Sos2ConstraintId > Sos2ConstraintData
static constexpr bool kSupportsElemental
Sos1ConstraintData ConstraintData
Sos2ConstraintData ConstraintData
static constexpr bool kSupportsElemental
static LinearExpressionData FromProto(const LinearExpressionProto &expr_proto)