Google OR-Tools: ortools/constraint_solver/demon_profiler.cc Source File
22#include "absl/container/flat_hash_map.h"
23#include "absl/status/status.h"
24#include "absl/strings/str_format.h"
25#include "absl/strings/string_view.h"
26#include "absl/time/clock.h"
42 Container(const Constraint* ct_, int64_t value_) : ct(ct_), value(value_) {}
43 bool operator<(const Container& c) const { return value > c.value; }
57 active_constraint_(nullptr),
59 start_time_ns_(absl::GetCurrentTimeNanos()) {}
73 Constraint* const constraint) override {
78 CHECK(active_constraint_ == nullptr);
79 CHECK(active_demon_ == nullptr);
80 CHECK(constraint != nullptr);
84 active_constraint_ = constraint;
89 CHECK(active_constraint_ != nullptr);
90 CHECK(active_demon_ == nullptr);
91 CHECK(constraint != nullptr);
92 CHECK_EQ(constraint, active_constraint_);
93 ConstraintRuns* const ct_run = constraint_map_[constraint];
107 CHECK(active_constraint_ == nullptr);
108 CHECK(active_demon_ == nullptr);
109 CHECK(constraint != nullptr);
110 CHECK(delayed != nullptr);
111 ConstraintRuns* const ct_run = constraint_map_[constraint];
118 CHECK(active_constraint_ != nullptr);
119 CHECK(active_demon_ == nullptr);
120 CHECK(constraint != nullptr);
121 CHECK(delayed != nullptr);
122 CHECK_EQ(constraint, active_constraint_);
123 ConstraintRuns* const ct_run = constraint_map_[constraint];
136 if (demon_map_.find(demon) == demon_map_.end()) {
137 CHECK(active_constraint_ != nullptr);
138 CHECK(active_demon_ == nullptr);
140 ConstraintRuns* const ct_run = constraint_map_[active_constraint_];
144 demon_map_[demon] = demon_run;
145 demons_per_constraint_[active_constraint_].push_back(demon_run);
154 CHECK(active_demon_ == nullptr);
156 DemonRuns* const demon_run = demon_map_[active_demon_];
167 CHECK_EQ(active_demon_, demon);
168 DemonRuns* const demon_run = demon_map_[active_demon_];
177 void PushContext(const std::string& context) override {}
181 if (active_demon_ != nullptr) {
182 DemonRuns* const demon_run = demon_map_[active_demon_];
183 if (demon_run != nullptr) {
189 active_constraint_ = nullptr;
190 } else if (active_constraint_ != nullptr) {
191 ConstraintRuns* const ct_run = constraint_map_[active_constraint_];
210 void SetMin(IntExpr* const expr, int64_t new_min) override {}
211 void SetMax(IntExpr* const expr, int64_t new_max) override {}
215 void SetMin(IntVar* const var, int64_t new_min) override {}
216 void SetMax(IntVar* const var, int64_t new_max) override {}
217 void SetRange(IntVar* const var, int64_t new_min, int64_t new_max) override {}
248 void AddFakeRun(Demon* const demon, int64_t start_time, int64_t end_time,
251 DemonRuns* const demon_run = demon_map_[demon];
262 const char* const kConstraintFormat =
263 " - Constraint: %s\n failures=%d, initial propagation "
264 "runtime=%d us, demons=%d, demon invocations=%d, total demon "
266 const char* const kDemonFormat =
267 " --- Demon: %s\n invocations=%d, failures=%d, total "
268 "runtime=%d us, [average=%.2lf, median=%.2lf, stddev=%.2lf]\n";
271 absl::StrFormat("Model %s:\n", solver->model_name());
274 std::vector<Container> to_sort;
275 for (absl::flat_hash_map<const Constraint*,
278 it != constraint_map_.end(); ++it) {
279 const Constraint* const ct = it->first;
281 int64_t demon_invocations = 0;
282 int64_t initial_propagation_runtime = 0;
283 int64_t total_demon_runtime = 0;
286 &demon_invocations, &total_demon_runtime,
289 Container(ct, total_demon_runtime + initial_propagation_runtime));
291 std::sort(to_sort.begin(), to_sort.end());
293 for (int i = 0; i < to_sort.size(); ++i) {
294 const Constraint* const ct = to_sort[i].ct;
296 int64_t demon_invocations = 0;
297 int64_t initial_propagation_runtime = 0;
298 int64_t total_demon_runtime = 0;
301 &demon_invocations, &total_demon_runtime,
303 const std::string constraint_message =
304 absl::StrFormat(kConstraintFormat, ct->DebugString(), fails,
305 initial_propagation_runtime, demon_count,
306 demon_invocations, total_demon_runtime);
309 const std::vector<DemonRuns*>& demons = demons_per_constraint_[ct];
310 const int demon_size = demons.size();
311 for (int demon_index = 0; demon_index < demon_size; ++demon_index) {
312 DemonRuns* const demon_runs = demons[demon_index];
317 double median_runtime = 0;
318 double standard_deviation = 0.0;
320 &mean_runtime, &median_runtime,
322 const std::string runs = absl::StrFormat(
323 kDemonFormat, demon_runs->demon_id(), invocations, fails, runtime,
335 int64_t* const initial_propagation_runtime,
336 int64_t* const demon_invocations,
337 int64_t* const total_demon_runtime, int* demons) {
338 CHECK(constraint != nullptr);
339 ConstraintRuns* const ct_run = constraint_map_[constraint];
343 *initial_propagation_runtime = 0;
352 CHECK_EQ(*demons, demons_per_constraint_[constraint].size());
353 for (int demon_index = 0; demon_index < *demons; ++demon_index) {
354 const DemonRuns& demon_runs = ct_run->demons(demon_index);
355 *fails += demon_runs.failures();
358 *demon_invocations += runs;
359 for (int run_index = 0; run_index < runs; ++run_index) {
360 const int64_t demon_time =
368 int64_t* const demon_invocations, int64_t* const fails,
369 int64_t* const total_demon_runtime,
370 double* const mean_demon_runtime,
371 double* const median_demon_runtime,
372 double* const stddev_demon_runtime) {
373 CHECK(demon_runs != nullptr);
377 *demon_invocations = runs;
378 *fails = demon_runs->failures();
380 *mean_demon_runtime = 0.0;
381 *median_demon_runtime = 0.0;
382 *stddev_demon_runtime = 0.0;
383 std::vector<double> runtimes;
384 for (int run_index = 0; run_index < runs; ++run_index) {
385 const int64_t demon_time =
387 *total_demon_runtime += demon_time;
388 runtimes.push_back(demon_time);
392 *mean_demon_runtime = (1.0L * *total_demon_runtime) / runtimes.size();
395 std::sort(runtimes.begin(), runtimes.end());
396 const int pivot = runtimes.size() / 2;
398 if (runtimes.size() == 1) {
399 *median_demon_runtime = runtimes[0];
404 : (runtimes[pivot - 1] + runtimes[pivot]) / 2.0;
408 double total_deviation = 0.0f;
410 for (int i = 0; i < runtimes.size(); ++i) {
411 total_deviation += pow(runtimes[i] - *mean_demon_runtime, 2);
414 *stddev_demon_runtime = sqrt(total_deviation / runtimes.size());
423 std::string DebugString() const override { return "DemonProfiler"; }
427 Demon* active_demon_;
428 const int64_t start_time_ns_;
429 absl::flat_hash_map<const Constraint*, ConstraintRuns*> constraint_map_;
430 absl::flat_hash_map<const Demon*, DemonRuns*> demon_map_;
431 absl::flat_hash_map<const Constraint*, std::vector<DemonRuns*> >
471 int64_t start_time, int64_t end_time,
473 monitor->AddFakeRun(demon, start_time, end_time, is_fail);
479 int64_t* const initial_propagation_runtime,
480 int64_t* const demon_invocations,
481 int64_t* const total_demon_runtime,
483 monitor->ExportInformation(constraint, fails, initial_propagation_runtime,
::int64_t initial_propagation_end_time(int index) const
::operations_research::DemonRuns *PROTOBUF_NONNULL add_demons()
void set_failures(::int64_t value)
::int64_t failures() const
const ::operations_research::DemonRuns & demons(int index) const
void add_initial_propagation_end_time(::int64_t value)
void set_constraint_id(Arg_ &&arg, Args_... args)
int initial_propagation_start_time_size() const
void add_initial_propagation_start_time(::int64_t value)
::int64_t initial_propagation_start_time(int index) const
std::string DebugString() const override
Definition demon_profiler.cc:53
void RemoveValues(IntVar *const var, const std::vector< int64_t > &values) override
Definition demon_profiler.cc:223
void PrintOverview(Solver *const solver, absl::string_view filename)
Definition demon_profiler.cc:261
void SetEndRange(IntervalVar *const var, int64_t new_min, int64_t new_max) override
Definition demon_profiler.cc:232
void SetMax(IntVar *const var, int64_t new_max) override
Definition demon_profiler.cc:216
void Install() override
Definition demon_profiler.cc:421
void AddFakeRun(Demon *const demon, int64_t start_time, int64_t end_time, bool is_fail)
Definition demon_profiler.cc:248
void EndProcessingIntegerVariable(IntVar *const var) override
Definition demon_profiler.cc:176
void RankNotLast(SequenceVar *const var, int index) override
Definition demon_profiler.cc:242
void PopContext() override
Definition demon_profiler.cc:178
DemonProfiler(Solver *const solver)
Definition demon_profiler.cc:55
void SetStartRange(IntervalVar *const var, int64_t new_min, int64_t new_max) override
Definition demon_profiler.cc:228
void RankSequence(SequenceVar *const var, const std::vector< int > &rank_first, const std::vector< int > &rank_last, const std::vector< int > &unperformed) override
Definition demon_profiler.cc:243
void SetEndMax(IntervalVar *const var, int64_t new_max) override
Definition demon_profiler.cc:231
void SetPerformed(IntervalVar *const var, bool value) override
Definition demon_profiler.cc:238
void ExportInformation(const DemonRuns *const demon_runs, int64_t *const demon_invocations, int64_t *const fails, int64_t *const total_demon_runtime, double *const mean_demon_runtime, double *const median_demon_runtime, double *const stddev_demon_runtime)
Definition demon_profiler.cc:367
~DemonProfiler() override
Definition demon_profiler.cc:61
void SetDurationMin(IntervalVar *const var, int64_t new_min) override
Definition demon_profiler.cc:234
void EndConstraintInitialPropagation(Constraint *const constraint) override
Definition demon_profiler.cc:88
int64_t CurrentTime() const
Definition demon_profiler.cc:68
void ExportInformation(const Constraint *const constraint, int64_t *const fails, int64_t *const initial_propagation_runtime, int64_t *const demon_invocations, int64_t *const total_demon_runtime, int *demons)
Definition demon_profiler.cc:333
void SetValue(IntVar *const var, int64_t value) override
Definition demon_profiler.cc:219
void SetMin(IntVar *const var, int64_t new_min) override
IntVar modifiers.
Definition demon_profiler.cc:215
void RankNotFirst(SequenceVar *const var, int index) override
Definition demon_profiler.cc:240
void SetEndMin(IntervalVar *const var, int64_t new_min) override
Definition demon_profiler.cc:230
void SetDurationRange(IntervalVar *const var, int64_t new_min, int64_t new_max) override
Definition demon_profiler.cc:236
void BeginNestedConstraintInitialPropagation(Constraint *const constraint, Constraint *const delayed) override
Definition demon_profiler.cc:101
void SetMax(IntExpr *const expr, int64_t new_max) override
Definition demon_profiler.cc:211
void SetStartMax(IntervalVar *const var, int64_t new_max) override
Definition demon_profiler.cc:227
void BeginConstraintInitialPropagation(Constraint *const constraint) override
Propagation events.
Definition demon_profiler.cc:72
void RankLast(SequenceVar *const var, int index) override
Definition demon_profiler.cc:241
void EndDemonRun(Demon *const demon) override
Definition demon_profiler.cc:162
void SetRange(IntVar *const var, int64_t new_min, int64_t new_max) override
Definition demon_profiler.cc:217
void BeginDemonRun(Demon *const demon) override
Definition demon_profiler.cc:149
void StartProcessingIntegerVariable(IntVar *const var) override
Definition demon_profiler.cc:175
void SetDurationMax(IntervalVar *const var, int64_t new_max) override
Definition demon_profiler.cc:235
void SetMin(IntExpr *const expr, int64_t new_min) override
IntExpr modifiers.
Definition demon_profiler.cc:210
std::string DebugString() const override
Definition demon_profiler.cc:423
void RankFirst(SequenceVar *const var, int index) override
SequenceVar modifiers.
Definition demon_profiler.cc:239
void RegisterDemon(Demon *const demon) override
Definition demon_profiler.cc:131
void SetStartMin(IntervalVar *const var, int64_t new_min) override
IntervalVar modifiers.
Definition demon_profiler.cc:226
void SetRange(IntExpr *const expr, int64_t new_min, int64_t new_max) override
Definition demon_profiler.cc:212
void SetValues(IntVar *const var, const std::vector< int64_t > &values) override
Definition demon_profiler.cc:221
void RemoveInterval(IntVar *const var, int64_t imin, int64_t imax) override
Definition demon_profiler.cc:220
void RemoveValue(IntVar *const var, int64_t value) override
Definition demon_profiler.cc:218
void PushContext(const std::string &context) override
Definition demon_profiler.cc:177
void EndNestedConstraintInitialPropagation(Constraint *const constraint, Constraint *const delayed) override
Definition demon_profiler.cc:116
void add_start_time(::int64_t value)
int start_time_size() const
void set_failures(::int64_t value)
void set_demon_id(Arg_ &&arg, Args_... args)
::int64_t end_time(int index) const
int end_time_size() const
::int64_t failures() const
::int64_t start_time(int index) const
void add_end_time(::int64_t value)
const ::std::string & demon_id() const
virtual Solver::DemonPriority priority() const
std::string DebugString() const override
PropagationMonitor(Solver *solver)
Demon * RegisterDemon(Demon *demon)
Adds a new demon and wraps it inside a DemonProfiler if necessary.
Definition demon_profiler.cc:455
void ExportProfilingOverview(const std::string &filename)
Definition demon_profiler.cc:435
@ VAR_PRIORITY
VAR_PRIORITY is between DELAYED_PRIORITY and NORMAL_PRIORITY.
@ IN_SEARCH
Executing the search code.
bool IsProfilingEnabled() const
Returns whether we are profiling the solver.
bool InstrumentsDemons() const
Returns whether we are instrumenting demons.
absl::Status WriteString(File *file, absl::string_view contents, Options options)
absl::Status Open(absl::string_view file_name, absl::string_view mode, File **f, Options options)
void STLDeleteContainerPairSecondPointers(ForwardIterator begin, ForwardIterator end)
void DeleteDemonProfiler(DemonProfiler *monitor)
Definition demon_profiler.cc:453
void DemonProfilerEndInitialPropagation(DemonProfiler *const monitor, Constraint *const constraint)
Definition demon_profiler.cc:493
DemonProfiler * BuildDemonProfiler(Solver *solver)
Definition demon_profiler.cc:445
void DemonProfilerExportInformation(DemonProfiler *const monitor, const Constraint *const constraint, int64_t *const fails, int64_t *const initial_propagation_runtime, int64_t *const demon_invocations, int64_t *const total_demon_runtime, int *const demon_count)
Definition demon_profiler.cc:476
void RegisterDemon(Solver *const solver, Demon *const demon, DemonProfiler *const monitor)
Definition demon_profiler.cc:465
void DemonProfilerBeginInitialPropagation(DemonProfiler *const monitor, Constraint *const constraint)
Definition demon_profiler.cc:488
void DemonProfilerAddFakeRun(DemonProfiler *const monitor, Demon *const demon, int64_t start_time, int64_t end_time, bool is_fail)
Definition demon_profiler.cc:470
void InstallDemonProfiler(DemonProfiler *monitor)
Definition demon_profiler.cc:443