68 trail_(model->GetOrCreate<
Trail>()),
72 watcher_id_(watcher_->Register(this)) {
74 integer_trail_->RegisterWatcher(&modified_vars_);
75 watcher_->SetPropagatorPriority(watcher_id_, 0);
101 IntegerVariable offset_var);
108 IntegerValue offset,
Literal l);
113 IntegerVariable offset_var,
118 IntegerValue offset);
121 DEFINE_STRONG_INDEX_TYPE(ArcIndex);
122 DEFINE_STRONG_INDEX_TYPE(OptionalArcIndex);
126 IntegerVariable tail_var;
127 IntegerVariable head_var;
130 IntegerVariable offset_var;
133 absl::InlinedVector<Literal, 6> presence_literals;
137 mutable bool is_marked;
145 void AdjustSizeFor(IntegerVariable
i);
146 void AddArc(IntegerVariable tail, IntegerVariable head, IntegerValue offset,
147 IntegerVariable offset_var,
148 absl::Span<const Literal> presence_literals);
152 bool EnqueueAndCheck(
const ArcInfo& arc, IntegerValue new_head_lb,
154 IntegerValue ArcOffset(
const ArcInfo& arc)
const;
159 bool PropagateOptionalArcs(
Trail* trail);
177 void InitializeBFQueueWithModifiedNodes();
178 bool BellmanFordTarjan(
Trail* trail);
179 bool DisassembleSubtree(
int source,
int target,
180 std::vector<bool>* can_be_skipped);
181 void AnalyzePositiveCycle(ArcIndex first_arc,
Trail* trail,
182 std::vector<Literal>* must_be_all_true,
183 std::vector<Literal>* literal_reason,
184 std::vector<IntegerLiteral>* integer_reason);
185 void CleanUpMarkedArcsAndParents();
189 bool NoPropagationLeft(
const Trail& trail)
const;
192 void PushConditionalRelations(
const ArcInfo& arc);
226 absl::InlinedVector<OptionalArcIndex, 6>>
227 impacted_potential_arcs_;
238 literal_to_new_impacted_arcs_;
242 std::vector<Literal> literal_reason_;
243 std::vector<IntegerLiteral> integer_reason_;
248 std::deque<int> bf_queue_;
249 std::vector<bool> bf_in_queue_;
250 std::vector<bool> bf_can_be_skipped_;
251 std::vector<ArcIndex> bf_parent_arc_of_;
254 std::vector<int> tmp_vector_;
257 int64_t num_cycles_ = 0;
258 int64_t num_pushes_ = 0;
259 int64_t num_enforcement_pushes_ = 0;
297 AddArc(i1, i2, offset, offset_var, presence_literals);
350 p->AddConditionalPrecedenceWithOffset(a,
b, IntegerValue(offset), is_le);