Google OR-Tools: ortools/util/time_limit.h Source File
14#ifndef ORTOOLS_UTIL_TIME_LIMIT_H_
15#define ORTOOLS_UTIL_TIME_LIMIT_H_
25#include "absl/base/thread_annotations.h"
26#include "absl/container/flat_hash_map.h"
27#include "absl/flags/declare.h"
28#include "absl/flags/flag.h"
30#include "absl/synchronization/mutex.h"
31#include "absl/time/clock.h"
112 double deterministic_limit = std::numeric_limits<double>::infinity());
122 static std::unique_ptr<TimeLimit> Infinite() {
123 return std::make_unique<TimeLimit>(std::numeric_limits<double>::infinity(),
131 double deterministic_limit) {
132 return std::make_unique<TimeLimit>(std::numeric_limits<double>::infinity(),
142 template <typename Parameters>
144 const Parameters& parameters) {
145 return std::make_unique<TimeLimit>(parameters.max_time_in_seconds(),
169 double GetTimeLeft() const;
187 DCHECK_LE(0.0, deterministic_duration);
201 const char* counter_name) {
204 deterministic_counters_[counter_name] += deterministic_duration;
234 std::atomic<bool>* external_boolean_as_limit) {
247 std::atomic<bool>* external_boolean_as_limit) {
248 secondary_external_boolean_as_limit_ = external_boolean_as_limit;
262 template <typename Parameters>
263 void ResetLimitFromParameters(const Parameters& parameters);
270 void MergeWithGlobalTimeLimit(const TimeLimit* other);
295 std::string DebugString() const;
298 void ResetTimers(double limit_in_seconds, double deterministic_limit);
300 mutable int64_t start_ns_;
304 const int64_t safety_buffer_ns_;
311 double deterministic_limit_;
312 double elapsed_deterministic_time_;
314 std::atomic<bool>* external_boolean_as_limit_ = nullptr;
315 std::atomic<bool>* secondary_external_boolean_as_limit_ = nullptr;
319 absl::flat_hash_map<std::string, double> deterministic_counters_;
330 : time_limit_(time_limit), stopped_boolean_(false) {
333 if (stopped_ == nullptr) {
363 absl::MutexLock lock(mutex_);
364 time_limit_->AdvanceDeterministicTime(deterministic_duration);
385 mutable absl::Mutex mutex_;
386 TimeLimit* time_limit_ ABSL_GUARDED_BY(mutex_);
387 std::atomic<bool> stopped_boolean_ ABSL_GUARDED_BY(mutex_);
428 double deterministic_limit);
446 template <typename Parameters>
448 TimeLimit* time_limit, const Parameters& parameters) {
449 return std::make_unique<NestedTimeLimit>(
450 time_limit, parameters.max_time_in_seconds(),
463 TimeLimit* const base_time_limit_;
492inline void TimeLimit::ResetTimers(double limit_in_seconds,
493 double deterministic_limit) {
494 elapsed_deterministic_time_ = 0.0;
495 deterministic_limit_ = deterministic_limit;
497 if (absl::GetFlag(FLAGS_time_limit_use_usertime)) {
498 user_timer_.Start();
499 limit_in_seconds_ = limit_in_seconds;
501 start_ns_ = absl::GetCurrentTimeNanos();
504 limit_ns_ = (absl::Seconds(limit_in_seconds) + absl::Nanoseconds(start_ns_)) /
508template <typename Parameters>
525 if (external_boolean_as_limit_ != nullptr &&
526 external_boolean_as_limit_->load()) {
529 if (secondary_external_boolean_as_limit_ != nullptr &&
530 secondary_external_boolean_as_limit_->load()) {
538 const int64_t current_ns = absl::GetCurrentTimeNanos();
539 running_max_.Add(std::max(safety_buffer_ns_, current_ns - last_ns_));
541 if (current_ns + running_max_.GetCurrentMax() >= limit_ns_) {
542 if (absl::GetFlag(FLAGS_time_limit_use_usertime)) {
546 const double time_left_s = limit_in_seconds_ - user_timer_.Get();
548 limit_ns_ = static_cast<int64_t>(time_left_s * 1e9) + last_ns_;
561 if (limit_ns_ == kint64max) return std::numeric_limits<double>::infinity();
562 const int64_t delta_ns = limit_ns_ - absl::GetCurrentTimeNanos();
563 if (delta_ns < 0) return 0.0;
564 if (absl::GetFlag(FLAGS_time_limit_use_usertime)) {
565 return std::max(limit_in_seconds_ - user_timer_.Get(), 0.0);
static std::unique_ptr< NestedTimeLimit > FromBaseTimeLimitAndParameters(TimeLimit *time_limit, const Parameters ¶meters)
Definition time_limit.h:447
NestedTimeLimit(const NestedTimeLimit &)=delete
NestedTimeLimit(TimeLimit *base_time_limit, double limit_in_seconds, double deterministic_limit)
TimeLimit * GetTimeLimit()
Definition time_limit.h:460
NestedTimeLimit & operator=(const NestedTimeLimit &)=delete
bool LimitReached()
Definition time_limit.h:472
TimeLimitCheckEveryNCalls(int N, TimeLimit *time_limit)
Definition time_limit.h:469
Definition time_limit.h:97
TimeLimit & operator=(const TimeLimit &)=delete
TimeLimit()
Definition time_limit.h:114
static std::unique_ptr< TimeLimit > FromParameters(const Parameters ¶meters)
Definition time_limit.h:143
bool LimitReached()
Definition time_limit.h:524
double GetTimeLeft() const
Definition time_limit.h:560
TimeLimit(const TimeLimit &)=delete
TimeLimit(double limit_in_seconds, double deterministic_limit=std::numeric_limits< double >::infinity())
void MergeWithGlobalTimeLimit(const TimeLimit *other)
Definition time_limit.h:514
friend class ParallelTimeLimit
Definition time_limit.h:323
double GetDeterministicLimit() const
Definition time_limit.h:282
void ResetHistory()
Definition time_limit.h:290
void AdvanceDeterministicTime(double deterministic_duration)
Definition time_limit.h:186
friend class NestedTimeLimit
Definition time_limit.h:322
std::atomic< bool > * ExternalBooleanAsLimit() const
Definition time_limit.h:254
double GetElapsedDeterministicTime() const
Definition time_limit.h:220
static std::unique_ptr< TimeLimit > Infinite()
Definition time_limit.h:122
void AdvanceDeterministicTime(double deterministic_duration, const char *counter_name)
Definition time_limit.h:200
void RegisterExternalBooleanAsLimit(std::atomic< bool > *external_boolean_as_limit)
Definition time_limit.h:233
void RegisterSecondaryExternalBooleanAsLimit(std::atomic< bool > *external_boolean_as_limit)
Definition time_limit.h:246
double GetDeterministicTimeLeft() const
Definition time_limit.h:177
static const int kHistorySize
Definition time_limit.h:100
static std::unique_ptr< TimeLimit > FromDeterministicTime(double deterministic_limit)
Definition time_limit.h:130
static const double kSafetyBufferSeconds
Definition time_limit.h:99
void ResetLimitFromParameters(const Parameters ¶meters)
Definition time_limit.h:509
void ChangeDeterministicLimit(double new_limit)
Definition time_limit.h:275
double GetElapsedTime() const
Definition time_limit.h:211
OR_DLL ABSL_DECLARE_FLAG(bool, time_limit_use_usertime)
static const int64_t kint64max