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);