19#include "absl/types/span.h"
30 int unassigned_index = -1;
31 for (
int i = 0; i < literals_.size(); ++i) {
39 if (unassigned_index != -1)
return true;
45 if (unassigned_index != -1) {
46 literal_reason_.clear();
47 for (
int i = 0; i < literals_.size(); ++i) {
48 if (i == unassigned_index)
continue;
50 literal_reason_.push_back(
53 const Literal u = literals_[unassigned_index];
60 if (sum == value_)
return true;
65 for (
int i = 0; i < literals_.size(); ++i) {
74 const int id = watcher->
Register(
this);
75 for (
const Literal& l : literals_) {
82 IntegerVariable target_var,
const absl::Span<const IntegerVariable> vars,
83 const absl::Span<const IntegerValue> offsets,
84 const absl::Span<const Literal> selectors,
85 const absl::Span<const Literal> enforcements,
Model*
model)
88 offsets_(offsets.begin(), offsets.
end()),
89 selectors_(selectors.begin(), selectors.
end()),
90 enforcements_(enforcements.begin(), enforcements.
end()),
97 for (
const Literal l : enforcements_) {
105 const IntegerValue current_min = integer_trail_->
LowerBound(target_var_);
106 for (
int i = 0; i < vars_.size(); ++i) {
110 integer_trail_->
LowerBound(vars_[i]) + offsets_[i]);
113 if (target_min <= current_min)
return true;
121 literal_reason_.clear();
122 integer_reason_.clear();
123 for (
const Literal l : enforcements_) {
124 literal_reason_.push_back(l.Negated());
126 for (
int i = 0; i < vars_.size(); ++i) {
128 literal_reason_.push_back(selectors_[i]);
130 integer_reason_.push_back(
134 return integer_trail_->
Enqueue(
141 const int id = watcher->
Register(
this);
const std::vector< IntVar * > vars_
void RegisterWith(GenericLiteralWatcher *watcher)
void WatchLiteral(Literal l, int id, int watch_index=-1)
void WatchLowerBound(IntegerVariable var, int id, int watch_index=-1)
int Register(PropagatorInterface *propagator)
void RegisterWith(GenericLiteralWatcher *watcher)
GreaterThanAtLeastOneOfPropagator(IntegerVariable target_var, const absl::Span< const IntegerVariable > vars, const absl::Span< const IntegerValue > offsets, const absl::Span< const Literal > selectors, const absl::Span< const Literal > enforcements, Model *model)
ABSL_MUST_USE_RESULT bool Enqueue(IntegerLiteral i_lit, absl::Span< const Literal > literal_reason, absl::Span< const IntegerLiteral > integer_reason)
void EnqueueLiteral(Literal literal, absl::Span< const Literal > literal_reason, absl::Span< const IntegerLiteral > integer_reason)
IntegerValue LowerBound(IntegerVariable i) const
Class that owns everything related to a particular optimization model.
const VariablesAssignment & Assignment() const
std::vector< Literal > * MutableConflict()
bool LiteralIsTrue(Literal literal) const
bool LiteralIsFalse(Literal literal) const
constexpr IntegerValue kMaxIntegerValue(std::numeric_limits< IntegerValue::ValueType >::max() - 1)
Collection of objects used to extend the Constraint Solver library.
IntervalVar *const target_var_
std::optional< int64_t > end
static IntegerLiteral GreaterOrEqual(IntegerVariable i, IntegerValue bound)