make profiling robust to nested constraints

This commit is contained in:
lperron@google.com
2011-09-14 08:15:08 +00:00
parent a2d9418383
commit 6b041a66eb
3 changed files with 73 additions and 13 deletions

View File

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

View File

@@ -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<DemonRuns*>& demons = demons_per_constraint_[it->first];
const std::vector<DemonRuns*>& 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();
}

View File

@@ -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;
}