20 #include "absl/container/flat_hash_map.h"
21 #include "absl/strings/str_format.h"
22 #include "absl/strings/str_join.h"
32 "Display all trace information, even if the modifiers has no effect");
37 class TraceIntVar :
public IntVar {
39 TraceIntVar(Solver*
const solver, IntVar*
const inner)
40 : IntVar(solver), inner_(inner) {
41 if (inner->HasName()) {
42 set_name(inner->name());
47 ~TraceIntVar()
override {}
49 int64 Min()
const override {
return inner_->Min(); }
51 void SetMin(
int64 m)
override {
52 if (m > inner_->Min()) {
53 solver()->GetPropagationMonitor()->SetMin(inner_, m);
58 int64 Max()
const override {
return inner_->Max(); }
60 void SetMax(
int64 m)
override {
61 if (m < inner_->Max()) {
62 solver()->GetPropagationMonitor()->SetMax(inner_, m);
67 void Range(
int64* l,
int64* u)
override { inner_->Range(l, u); }
70 if (l > inner_->Min() || u < inner_->Max()) {
72 solver()->GetPropagationMonitor()->SetValue(inner_, l);
75 solver()->GetPropagationMonitor()->SetRange(inner_, l, u);
76 inner_->SetRange(l, u);
81 bool Bound()
const override {
return inner_->Bound(); }
83 bool IsVar()
const override {
return true; }
85 IntVar* Var()
override {
return this; }
87 int64 Value()
const override {
return inner_->Value(); }
89 void RemoveValue(
int64 v)
override {
90 if (inner_->Contains(v)) {
91 solver()->GetPropagationMonitor()->RemoveValue(inner_, v);
92 inner_->RemoveValue(v);
96 void SetValue(
int64 v)
override {
97 solver()->GetPropagationMonitor()->SetValue(inner_, v);
101 void RemoveInterval(
int64 l,
int64 u)
override {
102 solver()->GetPropagationMonitor()->RemoveInterval(inner_, l, u);
103 inner_->RemoveInterval(l, u);
106 void RemoveValues(
const std::vector<int64>& values)
override {
107 solver()->GetPropagationMonitor()->RemoveValues(inner_, values);
108 inner_->RemoveValues(values);
111 void SetValues(
const std::vector<int64>& values)
override {
112 solver()->GetPropagationMonitor()->SetValues(inner_, values);
113 inner_->SetValues(values);
116 void WhenRange(Demon* d)
override { inner_->WhenRange(d); }
118 void WhenBound(Demon* d)
override { inner_->WhenBound(d); }
120 void WhenDomain(Demon* d)
override { inner_->WhenDomain(d); }
122 uint64 Size()
const override {
return inner_->Size(); }
124 bool Contains(
int64 v)
const override {
return inner_->Contains(v); }
126 IntVarIterator* MakeHoleIterator(
bool reversible)
const override {
127 return inner_->MakeHoleIterator(reversible);
130 IntVarIterator* MakeDomainIterator(
bool reversible)
const override {
131 return inner_->MakeDomainIterator(reversible);
134 int64 OldMin()
const override {
return inner_->OldMin(); }
136 int64 OldMax()
const override {
return inner_->OldMax(); }
138 int VarType()
const override {
return TRACE_VAR; }
140 void Accept(ModelVisitor*
const visitor)
const override {
141 IntExpr*
const cast_expr =
142 solver()->CastExpression(
const_cast<TraceIntVar*
>(
this));
143 if (cast_expr !=
nullptr) {
144 visitor->VisitIntegerVariable(
this, cast_expr);
146 visitor->VisitIntegerVariable(
this, ModelVisitor::kTraceOperation, 0,
151 std::string DebugString()
const override {
return inner_->DebugString(); }
153 IntVar* IsEqual(
int64 constant)
override {
return inner_->IsEqual(constant); }
155 IntVar* IsDifferent(
int64 constant)
override {
156 return inner_->IsDifferent(constant);
159 IntVar* IsGreaterOrEqual(
int64 constant)
override {
160 return inner_->IsGreaterOrEqual(constant);
163 IntVar* IsLessOrEqual(
int64 constant)
override {
164 return inner_->IsLessOrEqual(constant);
168 IntVar*
const inner_;
171 class TraceIntExpr :
public IntExpr {
173 TraceIntExpr(Solver*
const solver, IntExpr*
const inner)
174 : IntExpr(solver), inner_(inner) {
175 CHECK(!inner->IsVar());
176 if (inner->HasName()) {
177 set_name(inner->name());
181 ~TraceIntExpr()
override {}
183 int64 Min()
const override {
return inner_->Min(); }
185 void SetMin(
int64 m)
override {
186 solver()->GetPropagationMonitor()->SetMin(inner_, m);
190 int64 Max()
const override {
return inner_->Max(); }
192 void SetMax(
int64 m)
override {
193 solver()->GetPropagationMonitor()->SetMax(inner_, m);
197 void Range(
int64* l,
int64* u)
override { inner_->Range(l, u); }
200 if (l > inner_->Min() || u < inner_->Max()) {
201 solver()->GetPropagationMonitor()->SetRange(inner_, l, u);
202 inner_->SetRange(l, u);
206 bool Bound()
const override {
return inner_->Bound(); }
208 bool IsVar()
const override {
209 DCHECK(!inner_->IsVar());
213 IntVar* Var()
override {
return solver()->RegisterIntVar(inner_->Var()); }
215 void WhenRange(Demon* d)
override { inner_->WhenRange(d); }
217 void Accept(ModelVisitor*
const visitor)
const override {
218 visitor->BeginVisitIntegerExpression(ModelVisitor::kTrace,
this);
219 visitor->VisitIntegerExpressionArgument(ModelVisitor::kExpressionArgument,
221 visitor->EndVisitIntegerExpression(ModelVisitor::kTrace,
this);
224 std::string DebugString()
const override {
return inner_->DebugString(); }
227 IntExpr*
const inner_;
230 class TraceIntervalVar :
public IntervalVar {
232 TraceIntervalVar(Solver*
const solver, IntervalVar*
const inner)
233 : IntervalVar(solver,
""), inner_(inner) {
234 if (inner->HasName()) {
235 set_name(inner->name());
238 ~TraceIntervalVar()
override {}
240 int64 StartMin()
const override {
return inner_->StartMin(); }
242 int64 StartMax()
const override {
return inner_->StartMax(); }
244 void SetStartMin(
int64 m)
override {
245 if (inner_->MayBePerformed() && (m > inner_->StartMin())) {
246 solver()->GetPropagationMonitor()->SetStartMin(inner_, m);
247 inner_->SetStartMin(m);
251 void SetStartMax(
int64 m)
override {
252 if (inner_->MayBePerformed() && (m < inner_->StartMax())) {
253 solver()->GetPropagationMonitor()->SetStartMax(inner_, m);
254 inner_->SetStartMax(m);
258 void SetStartRange(
int64 mi,
int64 ma)
override {
259 if (inner_->MayBePerformed() &&
260 (mi > inner_->StartMin() || ma < inner_->StartMax())) {
261 solver()->GetPropagationMonitor()->SetStartRange(inner_, mi, ma);
262 inner_->SetStartRange(mi, ma);
266 int64 OldStartMin()
const override {
return inner_->OldStartMin(); }
268 int64 OldStartMax()
const override {
return inner_->OldStartMax(); }
270 void WhenStartRange(Demon*
const d)
override { inner_->WhenStartRange(d); }
272 void WhenStartBound(Demon*
const d)
override { inner_->WhenStartBound(d); }
274 int64 EndMin()
const override {
return inner_->EndMin(); }
276 int64 EndMax()
const override {
return inner_->EndMax(); }
278 void SetEndMin(
int64 m)
override {
279 if (inner_->MayBePerformed() && (m > inner_->EndMin())) {
280 solver()->GetPropagationMonitor()->SetEndMin(inner_, m);
281 inner_->SetEndMin(m);
285 void SetEndMax(
int64 m)
override {
286 if (inner_->MayBePerformed() && (m < inner_->EndMax())) {
287 solver()->GetPropagationMonitor()->SetEndMax(inner_, m);
288 inner_->SetEndMax(m);
292 void SetEndRange(
int64 mi,
int64 ma)
override {
293 if (inner_->MayBePerformed() &&
294 (mi > inner_->EndMin() || ma < inner_->EndMax())) {
295 solver()->GetPropagationMonitor()->SetEndRange(inner_, mi, ma);
296 inner_->SetEndRange(mi, ma);
300 int64 OldEndMin()
const override {
return inner_->OldEndMin(); }
302 int64 OldEndMax()
const override {
return inner_->OldEndMax(); }
304 void WhenEndRange(Demon*
const d)
override { inner_->WhenEndRange(d); }
306 void WhenEndBound(Demon*
const d)
override { inner_->WhenStartBound(d); }
308 int64 DurationMin()
const override {
return inner_->DurationMin(); }
310 int64 DurationMax()
const override {
return inner_->DurationMax(); }
312 void SetDurationMin(
int64 m)
override {
313 if (inner_->MayBePerformed() && (m > inner_->DurationMin())) {
314 solver()->GetPropagationMonitor()->SetDurationMin(inner_, m);
315 inner_->SetDurationMin(m);
319 void SetDurationMax(
int64 m)
override {
320 if (inner_->MayBePerformed() && (m < inner_->DurationMax())) {
321 solver()->GetPropagationMonitor()->SetDurationMax(inner_, m);
322 inner_->SetDurationMax(m);
326 void SetDurationRange(
int64 mi,
int64 ma)
override {
327 if (inner_->MayBePerformed() &&
328 (mi > inner_->DurationMin() || ma < inner_->DurationMax())) {
329 solver()->GetPropagationMonitor()->SetDurationRange(inner_, mi, ma);
330 inner_->SetDurationRange(mi, ma);
334 int64 OldDurationMin()
const override {
return inner_->OldDurationMin(); }
336 int64 OldDurationMax()
const override {
return inner_->OldDurationMax(); }
338 void WhenDurationRange(Demon*
const d)
override {
339 inner_->WhenDurationRange(d);
342 void WhenDurationBound(Demon*
const d)
override {
343 inner_->WhenDurationBound(d);
346 bool MustBePerformed()
const override {
return inner_->MustBePerformed(); }
348 bool MayBePerformed()
const override {
return inner_->MayBePerformed(); }
350 void SetPerformed(
bool value)
override {
351 if ((
value && !inner_->MustBePerformed()) ||
352 (!
value && inner_->MayBePerformed())) {
353 solver()->GetPropagationMonitor()->SetPerformed(inner_,
value);
354 inner_->SetPerformed(
value);
358 bool WasPerformedBound()
const override {
359 return inner_->WasPerformedBound();
362 void WhenPerformedBound(Demon*
const d)
override {
363 inner_->WhenPerformedBound(d);
366 IntExpr* StartExpr()
override {
return inner_->StartExpr(); }
367 IntExpr* DurationExpr()
override {
return inner_->DurationExpr(); }
368 IntExpr* EndExpr()
override {
return inner_->EndExpr(); }
369 IntExpr* PerformedExpr()
override {
return inner_->PerformedExpr(); }
370 IntExpr* SafeStartExpr(
int64 unperformed_value)
override {
371 return inner_->SafeStartExpr(unperformed_value);
373 IntExpr* SafeDurationExpr(
int64 unperformed_value)
override {
374 return inner_->SafeDurationExpr(unperformed_value);
376 IntExpr* SafeEndExpr(
int64 unperformed_value)
override {
377 return inner_->SafeEndExpr(unperformed_value);
380 void Accept(ModelVisitor*
const visitor)
const override {
381 inner_->Accept(visitor);
384 std::string DebugString()
const override {
return inner_->DebugString(); }
387 IntervalVar*
const inner_;
392 class PrintTrace :
public PropagationMonitor {
410 explicit Context(
int start_indent)
441 explicit PrintTrace(Solver*
const s) : PropagationMonitor(s) {
442 contexes_.push(Context());
445 ~PrintTrace()
override {}
449 void BeginInitialPropagation()
override {
451 DisplaySearch(
"Root Node Propagation");
454 void EndInitialPropagation()
override {
456 DisplaySearch(
"Starting Tree Search");
459 void BeginNextDecision(DecisionBuilder*
const b)
override {
460 DisplaySearch(absl::StrFormat(
"DecisionBuilder(%s)",
b->DebugString()));
462 contexes_.top().in_decision_builder =
true;
466 void EndNextDecision(DecisionBuilder*
const b, Decision*
const d)
override {
467 contexes_.top().in_decision_builder =
false;
471 void BeginFail()
override {
472 contexes_.top().Clear();
473 while (!contexes_.top().TopLevel()) {
475 LOG(INFO) << Indent() <<
"}";
478 absl::StrFormat(
"Failure at depth %d", solver()->SearchDepth()));
481 bool AtSolution()
override {
483 absl::StrFormat(
"Solution found at depth %d", solver()->SearchDepth()));
487 void ApplyDecision(Decision*
const decision)
override {
489 absl::StrFormat(
"ApplyDecision(%s)", decision->DebugString()));
491 contexes_.top().in_decision =
true;
494 void RefuteDecision(Decision*
const decision)
override {
495 if (contexes_.top().in_objective) {
497 contexes_.top().in_objective =
false;
500 absl::StrFormat(
"RefuteDecision(%s)", decision->DebugString()));
502 contexes_.top().in_decision =
true;
505 void AfterDecision(Decision*
const decision,
bool direction)
override {
507 contexes_.top().in_decision =
false;
510 void EnterSearch()
override {
511 if (solver()->SolveDepth() == 0) {
512 CHECK_EQ(1, contexes_.size());
513 contexes_.top().Clear();
515 PrintDelayedString();
518 DisplaySearch(
"Enter Search");
521 void ExitSearch()
override {
522 DisplaySearch(
"Exit Search");
523 CHECK(contexes_.top().TopLevel());
524 if (solver()->SolveDepth() > 1) {
529 void RestartSearch()
override { CHECK(contexes_.top().TopLevel()); }
533 void BeginConstraintInitialPropagation(
534 Constraint*
const constraint)
override {
536 absl::StrFormat(
"Constraint(%s)", constraint->DebugString()));
537 contexes_.top().in_constraint =
true;
540 void EndConstraintInitialPropagation(Constraint*
const constraint)
override {
542 contexes_.top().in_constraint =
false;
545 void BeginNestedConstraintInitialPropagation(
546 Constraint*
const parent, Constraint*
const nested)
override {
547 PushDelayedInfo(absl::StrFormat(
"Constraint(%s)", nested->DebugString()));
548 contexes_.top().in_constraint =
true;
550 void EndNestedConstraintInitialPropagation(Constraint*
const,
551 Constraint*
const)
override {
553 contexes_.top().in_constraint =
false;
558 void BeginDemonRun(Demon*
const demon)
override {
559 if (demon->priority() != Solver::VAR_PRIORITY) {
560 contexes_.top().in_demon =
true;
561 PushDelayedInfo(absl::StrFormat(
"Demon(%s)", demon->DebugString()));
565 void EndDemonRun(Demon*
const demon)
override {
566 if (demon->priority() != Solver::VAR_PRIORITY) {
567 contexes_.top().in_demon =
false;
572 void StartProcessingIntegerVariable(IntVar*
const var)
override {
573 PushDelayedInfo(absl::StrFormat(
"StartProcessing(%s)",
var->DebugString()));
576 void EndProcessingIntegerVariable(IntVar*
const var)
override {
580 void PushContext(
const std::string&
context)
override {
584 void PopContext()
override { PopDelayedInfo(); }
588 void SetMin(IntExpr*
const expr,
int64 new_min)
override {
590 absl::StrFormat(
"SetMin(%s, %d)", expr->DebugString(), new_min));
593 void SetMax(IntExpr*
const expr,
int64 new_max)
override {
595 absl::StrFormat(
"SetMax(%s, %d)", expr->DebugString(), new_max));
598 void SetRange(IntExpr*
const expr,
int64 new_min,
int64 new_max)
override {
599 DisplayModification(absl::StrFormat(
"SetRange(%s, [%d .. %d])",
600 expr->DebugString(), new_min, new_max));
605 void SetMin(IntVar*
const var,
int64 new_min)
override {
607 absl::StrFormat(
"SetMin(%s, %d)",
var->DebugString(), new_min));
610 void SetMax(IntVar*
const var,
int64 new_max)
override {
612 absl::StrFormat(
"SetMax(%s, %d)",
var->DebugString(), new_max));
615 void SetRange(IntVar*
const var,
int64 new_min,
int64 new_max)
override {
616 DisplayModification(absl::StrFormat(
"SetRange(%s, [%d .. %d])",
617 var->DebugString(), new_min, new_max));
622 absl::StrFormat(
"RemoveValue(%s, %d)",
var->DebugString(),
value));
627 absl::StrFormat(
"SetValue(%s, %d)",
var->DebugString(),
value));
630 void RemoveInterval(IntVar*
const var,
int64 imin,
int64 imax)
override {
631 DisplayModification(absl::StrFormat(
"RemoveInterval(%s, [%d .. %d])",
632 var->DebugString(), imin, imax));
635 void SetValues(IntVar*
const var,
const std::vector<int64>& values)
override {
636 DisplayModification(absl::StrFormat(
"SetValues(%s, %s)",
var->DebugString(),
637 absl::StrJoin(values,
", ")));
640 void RemoveValues(IntVar*
const var,
641 const std::vector<int64>& values)
override {
642 DisplayModification(absl::StrFormat(
"RemoveValues(%s, %s)",
644 absl::StrJoin(values,
", ")));
649 void SetStartMin(IntervalVar*
const var,
int64 new_min)
override {
651 absl::StrFormat(
"SetStartMin(%s, %d)",
var->DebugString(), new_min));
654 void SetStartMax(IntervalVar*
const var,
int64 new_max)
override {
656 absl::StrFormat(
"SetStartMax(%s, %d)",
var->DebugString(), new_max));
659 void SetStartRange(IntervalVar*
const var,
int64 new_min,
660 int64 new_max)
override {
661 DisplayModification(absl::StrFormat(
"SetStartRange(%s, [%d .. %d])",
662 var->DebugString(), new_min, new_max));
665 void SetEndMin(IntervalVar*
const var,
int64 new_min)
override {
667 absl::StrFormat(
"SetEndMin(%s, %d)",
var->DebugString(), new_min));
670 void SetEndMax(IntervalVar*
const var,
int64 new_max)
override {
672 absl::StrFormat(
"SetEndMax(%s, %d)",
var->DebugString(), new_max));
675 void SetEndRange(IntervalVar*
const var,
int64 new_min,
676 int64 new_max)
override {
677 DisplayModification(absl::StrFormat(
"SetEndRange(%s, [%d .. %d])",
678 var->DebugString(), new_min, new_max));
681 void SetDurationMin(IntervalVar*
const var,
int64 new_min)
override {
683 absl::StrFormat(
"SetDurationMin(%s, %d)",
var->DebugString(), new_min));
686 void SetDurationMax(IntervalVar*
const var,
int64 new_max)
override {
688 absl::StrFormat(
"SetDurationMax(%s, %d)",
var->DebugString(), new_max));
691 void SetDurationRange(IntervalVar*
const var,
int64 new_min,
692 int64 new_max)
override {
693 DisplayModification(absl::StrFormat(
"SetDurationRange(%s, [%d .. %d])",
694 var->DebugString(), new_min, new_max));
697 void SetPerformed(IntervalVar*
const var,
bool value)
override {
699 absl::StrFormat(
"SetPerformed(%s, %d)",
var->DebugString(),
value));
702 void RankFirst(SequenceVar*
const var,
int index)
override {
704 absl::StrFormat(
"RankFirst(%s, %d)",
var->DebugString(),
index));
707 void RankNotFirst(SequenceVar*
const var,
int index)
override {
709 absl::StrFormat(
"RankNotFirst(%s, %d)",
var->DebugString(),
index));
712 void RankLast(SequenceVar*
const var,
int index)
override {
714 absl::StrFormat(
"RankLast(%s, %d)",
var->DebugString(),
index));
717 void RankNotLast(SequenceVar*
const var,
int index)
override {
719 absl::StrFormat(
"RankNotLast(%s, %d)",
var->DebugString(),
index));
722 void RankSequence(SequenceVar*
const var,
const std::vector<int>& rank_first,
723 const std::vector<int>& rank_last,
724 const std::vector<int>& unperformed)
override {
725 DisplayModification(absl::StrFormat(
726 "RankSequence(%s, forward [%s], backward[%s], unperformed[%s])",
727 var->DebugString(), absl::StrJoin(rank_first,
", "),
728 absl::StrJoin(rank_last,
", "), absl::StrJoin(unperformed,
", ")));
731 void Install()
override {
732 SearchMonitor::Install();
733 if (solver()->SolveDepth() <= 1) {
734 solver()->AddPropagationMonitor(
this);
738 std::string DebugString()
const override {
return "PrintTrace"; }
741 void PushDelayedInfo(
const std::string& delayed) {
742 if (FLAGS_cp_full_trace) {
743 LOG(INFO) << Indent() << delayed <<
" {";
746 contexes_.top().delayed_info.push_back(Info(delayed));
750 void PopDelayedInfo() {
751 if (FLAGS_cp_full_trace) {
753 LOG(INFO) << Indent() <<
"}";
755 CHECK(!contexes_.top().delayed_info.empty());
756 if (contexes_.top().delayed_info.back().displayed &&
757 !contexes_.top().TopLevel()) {
759 LOG(INFO) << Indent() <<
"}";
761 contexes_.top().delayed_info.pop_back();
766 void CheckNoDelayed() { CHECK(contexes_.top().delayed_info.empty()); }
768 void PrintDelayedString() {
769 const std::vector<Info>& infos = contexes_.top().delayed_info;
770 for (
int i = 0; i < infos.size(); ++i) {
771 const Info& info = infos[i];
772 if (!info.displayed) {
773 LOG(INFO) << Indent() << info.message <<
" {";
776 contexes_.top().delayed_info[i].displayed =
true;
781 void DisplayModification(
const std::string& to_print) {
782 if (FLAGS_cp_full_trace) {
783 LOG(INFO) << Indent() << to_print;
785 PrintDelayedString();
786 if (contexes_.top().in_demon || contexes_.top().in_constraint ||
787 contexes_.top().in_decision_builder || contexes_.top().in_decision ||
788 contexes_.top().in_objective) {
790 LOG(INFO) << Indent() << to_print;
801 CHECK(contexes_.top().TopLevel());
802 DisplaySearch(absl::StrFormat(
"Objective -> %s", to_print));
804 contexes_.top().in_objective =
true;
809 void DisplaySearch(
const std::string& to_print) {
810 const int solve_depth = solver()->SolveDepth();
811 if (solve_depth <= 1) {
812 LOG(INFO) << Indent() <<
"######## Top Level Search: " << to_print;
814 LOG(INFO) << Indent() <<
"######## Nested Search(" << solve_depth - 1
815 <<
"): " << to_print;
819 std::string Indent() {
820 CHECK_GE(contexes_.top().indent, 0);
821 std::string output =
" @ ";
822 for (
int i = 0; i < contexes_.top().
indent; ++i) {
828 void IncreaseIndent() { contexes_.top().indent++; }
830 void DecreaseIndent() {
831 if (contexes_.top().indent > 0) {
832 contexes_.top().indent--;
836 void PushNestedContext() {
841 std::stack<Context> contexes_;
845 IntExpr* Solver::RegisterIntExpr(IntExpr*
const expr) {
846 if (InstrumentsVariables()) {
848 return RegisterIntVar(expr->Var());
850 return RevAlloc(
new TraceIntExpr(
this, expr));
857 IntVar* Solver::RegisterIntVar(IntVar*
const var) {
858 if (InstrumentsVariables() &&
var->VarType() !=
TRACE_VAR) {
860 return RevAlloc(
new TraceIntVar(
this,
var));
866 IntervalVar* Solver::RegisterIntervalVar(IntervalVar*
const var) {
867 if (InstrumentsVariables()) {
868 return RevAlloc(
new TraceIntervalVar(
this,
var));
875 return s->RevAlloc(
new PrintTrace(s));