| //===-- Utils/ExponentialBackoff.h - Heuristic helper class ------*- C++ -*===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // Implement exponential backoff counting. | |
| // Linearly increments until given maximum, exponentially decrements based on | |
| // given backoff factor. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef OMPTARGET_UTILS_EXPONENTIAL_BACKOFF_H | |
| #define OMPTARGET_UTILS_EXPONENTIAL_BACKOFF_H | |
| #include <cassert> | |
| #include <cmath> | |
| #include <cstdint> | |
| namespace utils { | |
| class ExponentialBackoff { | |
| int64_t Count = 0; | |
| const int64_t MaxCount = 0; | |
| const int64_t CountThreshold = 0; | |
| const double BackoffFactor = 0; | |
| public: | |
| ExponentialBackoff(int64_t MaxCount, int64_t CountThreshold, | |
| double BackoffFactor) | |
| : MaxCount(MaxCount), CountThreshold(CountThreshold), | |
| BackoffFactor(BackoffFactor) { | |
| assert(MaxCount >= 0 && | |
| "ExponentialBackoff: maximum count value should be non-negative"); | |
| assert(CountThreshold >= 0 && | |
| "ExponentialBackoff: count threshold value should be non-negative"); | |
| assert(BackoffFactor >= 0 && BackoffFactor < 1 && | |
| "ExponentialBackoff: backoff factor should be in [0, 1) interval"); | |
| } | |
| void increment() { Count = std::min(Count + 1, MaxCount); } | |
| void decrement() { Count *= BackoffFactor; } | |
| bool isAboveThreshold() const { return Count > CountThreshold; } | |
| }; | |
| } // namespace utils | |
| #endif // OMPTARGET_UTILS_EXPONENTIAL_BACKOFF_H |