18 #include "absl/container/flat_hash_map.h"
28 int unassigned_index = -1;
29 for (
int i = 0; i < literals_.size(); ++i) {
37 if (unassigned_index != -1)
return true;
43 if (unassigned_index != -1) {
44 literal_reason_.clear();
45 for (
int i = 0; i < literals_.size(); ++i) {
46 if (i == unassigned_index)
continue;
48 literal_reason_.push_back(
51 const Literal u = literals_[unassigned_index];
58 if (sum == value_)
return true;
63 for (
int i = 0; i < literals_.size(); ++i) {
72 const int id = watcher->
Register(
this);
73 for (
const Literal& l : literals_) {
80 IntegerVariable target_var,
const absl::Span<const IntegerVariable> vars,
81 const absl::Span<const IntegerValue> offsets,
82 const absl::Span<const Literal> selectors,
83 const absl::Span<const Literal> enforcements,
Model*
model)
85 vars_(vars.begin(), vars.end()),
86 offsets_(offsets.begin(), offsets.end()),
87 selectors_(selectors.begin(), selectors.end()),
88 enforcements_(enforcements.begin(), enforcements.end()),
95 for (
const Literal l : enforcements_) {
103 const IntegerValue current_min = integer_trail_->
LowerBound(target_var_);
104 for (
int i = 0; i < vars_.size(); ++i) {
108 integer_trail_->
LowerBound(vars_[i]) + offsets_[i]);
111 if (target_min <= current_min)
return true;
119 literal_reason_.clear();
120 integer_reason_.clear();
121 for (
const Literal l : enforcements_) {
122 literal_reason_.push_back(l.Negated());
124 for (
int i = 0; i < vars_.size(); ++i) {
126 literal_reason_.push_back(selectors_[i]);
128 integer_reason_.push_back(
132 return integer_trail_->
Enqueue(
139 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.
std::vector< Literal > * MutableConflict()
const VariablesAssignment & Assignment() const
bool LiteralIsTrue(Literal literal) const
bool LiteralIsFalse(Literal literal) const
constexpr IntegerValue kMaxIntegerValue(std::numeric_limits< IntegerValue::ValueType >::max() - 1)
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
IntervalVar *const target_var_
static IntegerLiteral GreaterOrEqual(IntegerVariable i, IntegerValue bound)