diff --git a/constraint_solver/constraint_solver.cc b/constraint_solver/constraint_solver.cc index c52cd9443f..a6b53cc3df 100644 --- a/constraint_solver/constraint_solver.cc +++ b/constraint_solver/constraint_solver.cc @@ -75,6 +75,15 @@ extern void DemonMonitorStartInitialPropagation( DemonMonitor* const monitor, const Constraint* const constraint); extern void DemonMonitorEndInitialPropagation( DemonMonitor* const monitor, const Constraint* const constraint); +void DemonMonitorStartInitialDelayedPropagation( + DemonMonitor* const monitor, + const Constraint* const constraint, + const Constraint* const delayed); +void DemonMonitorEndInitialDelayedPropagation( + DemonMonitor* const monitor, + const Constraint* const constraint, + const Constraint* const delayed); + extern void DemonMonitorRestartSearch(DemonMonitor* const monitor); bool Solver::Profile() const { @@ -1693,12 +1702,19 @@ void Solver::ProcessConstraints() { ++additional_constraint_index_) { Constraint* const constraint = additional_constraints_list_[additional_constraint_index_]; + const int parent_index = + additional_constraints_parent_list_[additional_constraint_index_]; + Constraint* const parent = constraints_list_[parent_index]; if (profile) { - DemonMonitorStartInitialPropagation(demon_monitor_, constraint); + DemonMonitorStartInitialDelayedPropagation(demon_monitor_, + parent, + constraint); } constraint->PostAndPropagate(); if (profile) { - DemonMonitorEndInitialPropagation(demon_monitor_, constraint); + DemonMonitorEndInitialDelayedPropagation(demon_monitor_, + parent, + constraint); } } } diff --git a/constraint_solver/demon_profiler.cc b/constraint_solver/demon_profiler.cc index 8dd7bd72ad..95742d30f4 100644 --- a/constraint_solver/demon_profiler.cc +++ b/constraint_solver/demon_profiler.cc @@ -51,7 +51,7 @@ return WallTimer::GetTimeInMicroSeconds() - start_time_; CHECK_NOTNULL(constraint); ConstraintRuns* const ct_run = new ConstraintRuns; ct_run->set_constraint_id(constraint->DebugString()); - ct_run->set_initial_propagation_start_time(CurrentTime()); + ct_run->add_initial_propagation_start_time(CurrentTime()); active_constraint_ = constraint; constraint_map_[constraint] = ct_run; } @@ -63,7 +63,32 @@ return WallTimer::GetTimeInMicroSeconds() - start_time_; CHECK_EQ(constraint, active_constraint_); ConstraintRuns* const ct_run = constraint_map_[constraint]; CHECK_NOTNULL(ct_run); - ct_run->set_initial_propagation_end_time(CurrentTime()); + ct_run->add_initial_propagation_end_time(CurrentTime()); + ct_run->set_failures(0); + active_constraint_ = NULL; + } + + void StartInitialDelayedPropagation(const Constraint* const constraint, + const Constraint* const delayed) { + CHECK(active_constraint_ == NULL); + CHECK(active_demon_ == NULL); + CHECK_NOTNULL(constraint); + CHECK_NOTNULL(delayed); + ConstraintRuns* const ct_run = constraint_map_[constraint]; + ct_run->add_initial_propagation_start_time(CurrentTime()); + active_constraint_ = constraint; + } + + void EndInitialDelayedPropagation(const Constraint* const constraint, + const Constraint* const delayed) { + CHECK_NOTNULL(active_constraint_); + CHECK(active_demon_ == NULL); + CHECK_NOTNULL(constraint); + CHECK_NOTNULL(delayed); + CHECK_EQ(constraint, active_constraint_); + ConstraintRuns* const ct_run = constraint_map_[constraint]; + CHECK_NOTNULL(ct_run); + ct_run->add_initial_propagation_end_time(CurrentTime()); ct_run->set_failures(0); active_constraint_ = NULL; } @@ -110,7 +135,7 @@ return WallTimer::GetTimeInMicroSeconds() - start_time_; } else if (active_constraint_ != NULL) { ConstraintRuns* const ct_run = constraint_map_[active_constraint_]; CHECK_NOTNULL(ct_run); - ct_run->set_initial_propagation_end_time(CurrentTime()); + ct_run->add_initial_propagation_end_time(CurrentTime()); ct_run->set_failures(1); active_constraint_ = NULL; } @@ -139,7 +164,7 @@ return WallTimer::GetTimeInMicroSeconds() - start_time_; "d us, demons=%d, demon invocations=%" GG_LL_FORMAT "d, total demon runtime=%" GG_LL_FORMAT "d us\n"; const char* const kDemonFormat = - " - Demon: %s\n invocations=%" GG_LL_FORMAT + " --- Demon: %s\n invocations=%" GG_LL_FORMAT "d, failures=%" GG_LL_FORMAT "d, total runtime=%" GG_LL_FORMAT "d us, [average=%.2lf, median=%.2lf, stddev=%.2lf]\n"; File* const file = File::Open(filename, "w"); @@ -151,12 +176,13 @@ return WallTimer::GetTimeInMicroSeconds() - start_time_; constraint_map_.begin(); it != constraint_map_.end(); ++it) { + const Constraint* const ct = it->first; int64 fails = 0; int64 demon_invocations = 0; int64 initial_propagation_runtime = 0; int64 total_demon_runtime = 0; int demon_count = 0; - ExportInformation(it->first, + ExportInformation(ct, &fails, &initial_propagation_runtime, &demon_invocations, @@ -164,14 +190,14 @@ return WallTimer::GetTimeInMicroSeconds() - start_time_; &demon_count); const string constraint_message = StringPrintf(kConstraintFormat, - it->first->DebugString().c_str(), + ct->DebugString().c_str(), fails, initial_propagation_runtime, demon_count, demon_invocations, total_demon_runtime); file->Write(constraint_message.c_str(), constraint_message.length()); - const std::vector& demons = demons_per_constraint_[it->first]; + const std::vector& demons = demons_per_constraint_[ct]; const int demon_size = demons.size(); for (int demon_index = 0; demon_index < demon_size; ++demon_index) { DemonRuns* const demon_runs = demons[demon_index]; @@ -224,8 +250,12 @@ return WallTimer::GetTimeInMicroSeconds() - start_time_; CHECK_NOTNULL(ct_run); *demon_invocations = 0; *fails = ct_run->failures(); - *initial_propagation_runtime = ct_run->initial_propagation_end_time() - - ct_run->initial_propagation_start_time(); + *initial_propagation_runtime = 0; + for (int i = 0; i < ct_run->initial_propagation_start_time_size(); ++i) { + *initial_propagation_runtime += + ct_run->initial_propagation_end_time(i) - + ct_run->initial_propagation_start_time(i); + } *total_demon_runtime = 0; // Gather information. @@ -390,6 +420,20 @@ void DemonMonitorEndInitialPropagation(DemonMonitor* const monitor, monitor->EndInitialPropagation(constraint); } +void DemonMonitorStartInitialDelayedPropagation( + DemonMonitor* const monitor, + const Constraint* const constraint, + const Constraint* const delayed) { + monitor->StartInitialDelayedPropagation(constraint, delayed); +} + +void DemonMonitorEndInitialDelayedPropagation( + DemonMonitor* const monitor, + const Constraint* const constraint, + const Constraint* const delayed) { + monitor->EndInitialDelayedPropagation(constraint, delayed); +} + void DemonMonitorRestartSearch(DemonMonitor* const monitor) { monitor->RestartSearch(); } diff --git a/constraint_solver/demon_profiler.proto b/constraint_solver/demon_profiler.proto index 8fe3ae3fc7..1420c9114c 100644 --- a/constraint_solver/demon_profiler.proto +++ b/constraint_solver/demon_profiler.proto @@ -24,8 +24,8 @@ message DemonRuns { message ConstraintRuns { required string constraint_id = 1; - required int64 initial_propagation_start_time = 2; - required int64 initial_propagation_end_time = 3; + repeated int64 initial_propagation_start_time = 2; + repeated int64 initial_propagation_end_time = 3; required int64 failures = 4; repeated DemonRuns demons = 5; }