18 #include "absl/status/status.h"
21 #include "ortools/math_opt/model.pb.h"
29 if (constraint.has_indicator_id() &&
30 !variable_universe.
HasId(constraint.indicator_id())) {
32 <<
"Invalid indicator variable id in indicator constraint: "
33 << constraint.indicator_id();
37 {.allow_positive_infinity = false, .allow_negative_infinity = false}))
38 <<
"expression of implied constraint in indicator constraint";
39 for (
const int64_t var_id : constraint.expression().ids()) {
40 if (!variable_universe.
HasId(var_id)) {
42 <<
"Invalid variable id in implied constraint in indicator "
48 constraint.lower_bound(),
49 {.allow_positive_infinity = false, .allow_negative_infinity = true}))
50 <<
"invalid lower bound in indicator constraint: "
51 << constraint.lower_bound();
53 constraint.upper_bound(),
54 {.allow_positive_infinity = true, .allow_negative_infinity = false}))
55 <<
"invalid upper bound in indicator constraint: "
56 << constraint.upper_bound();
57 return absl::OkStatus();
#define RETURN_IF_ERROR(expr)
bool HasId(int64_t id) const
absl::Status CheckScalar(const double value, const DoubleOptions &options)
absl::Status ValidateConstraint(const IndicatorConstraintProto &constraint, const IdNameBiMap &variable_universe)
absl::Status CheckIdsAndValues(const SparseVectorView< T > &vector_view, absl::string_view value_name="values")
SparseVectorView< T > MakeView(absl::Span< const int64_t > ids, const Collection &values)
StatusBuilder InvalidArgumentErrorBuilder()