// Copyright 2017 The Abseil Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Benchmarks for absl random distributions as well as a selection of the
// C++ standard library random distributions.

#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <initializer_list>
#include <iterator>
#include <limits>
#include <random>
#include <type_traits>
#include <vector>

#include "absl/base/macros.h"
#include "absl/random/bernoulli_distribution.h"
#include "absl/random/beta_distribution.h"
#include "absl/random/exponential_distribution.h"
#include "absl/random/gaussian_distribution.h"
#include "absl/random/internal/fast_uniform_bits.h"
#include "absl/random/internal/randen_engine.h"
#include "absl/random/log_uniform_int_distribution.h"
#include "absl/random/poisson_distribution.h"
#include "absl/random/random.h"
#include "absl/random/uniform_int_distribution.h"
#include "absl/random/uniform_real_distribution.h"
#include "absl/random/zipf_distribution.h"
#include "benchmark/benchmark.h"

namespace {

// Seed data to avoid reading random_device() for benchmarks.
uint32_t kSeedData[] = {
    0x1B510052, 0x9A532915, 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
    0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6,
    0xFF34052E, 0xC5855664, 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A,
    0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D,
    0x9CEE60B8, 0x8FEDB266, 0xECAA8C71, 0x699A18FF, 0x5664526C, 0xC2B19EE1,
    0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65,
    0x6B8FE4D6, 0x99F73FD6, 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
    0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, 0x09686B3F, 0x3EBAEFC9,
    0x3C971814, 0x6B6A70A1, 0x687F3584, 0x52A0E286, 0x13198A2E, 0x03707344,
};

// PrecompiledSeedSeq provides kSeedData to a conforming
// random engine to speed initialization in the benchmarks.
class PrecompiledSeedSeq {
 public:
  using result_type = uint32_t;

  PrecompiledSeedSeq() = default;

  template <typename Iterator>
  PrecompiledSeedSeq(Iterator, Iterator) {}

  template <typename T>
  PrecompiledSeedSeq(std::initializer_list<T>) {}

  template <typename OutIterator>
  void generate(OutIterator begin, OutIterator end) {
    static size_t idx = 0;
    for (; begin != end; begin++) {
      *begin = kSeedData[idx++];
      if (idx >= std::size(kSeedData)) {
        idx = 0;
      }
    }
  }

  size_t size() const { return std::size(kSeedData); }

  template <typename OutIterator>
  void param(OutIterator out) const {
    std::copy(std::begin(kSeedData), std::end(kSeedData), out);
  }
};

// Triggers default constructor initialization.
class DefaultConstructorSeedSeq {};

// make_engine<T, SSeq> returns a random_engine which is initialized,
// either via the default constructor, when use_default_initialization<T>
// is true, or via the indicated seed sequence, SSeq.
template <typename Engine, typename SSeq = DefaultConstructorSeedSeq>
Engine make_engine() {
  constexpr bool use_default_initialization =
      std::is_same_v<SSeq, DefaultConstructorSeedSeq>;
  if constexpr (use_default_initialization) {
    return Engine();
  } else {
    // Otherwise, use the provided seed sequence.
    SSeq seq(std::begin(kSeedData), std::end(kSeedData));
    return Engine(seq);
  }
}

template <typename Engine, typename SSeq>
void BM_Construct(benchmark::State& state) {
  for (auto _ : state) {
    auto rng = make_engine<Engine, SSeq>();
    benchmark::DoNotOptimize(rng());
  }
}

template <typename Engine>
void BM_Direct(benchmark::State& state) {
  using value_type = typename Engine::result_type;
  // Direct use of the URBG.
  auto rng = make_engine<Engine>();
  for (auto _ : state) {
    benchmark::DoNotOptimize(rng());
  }
  state.SetBytesProcessed(sizeof(value_type) * state.iterations());
}

template <typename Engine>
void BM_Generate(benchmark::State& state) {
  // std::generate makes a copy of the RNG; thus this tests the
  // copy-constructor efficiency.
  using value_type = typename Engine::result_type;
  std::vector<value_type> v(64);
  auto rng = make_engine<Engine>();
  while (state.KeepRunningBatch(64)) {
    std::generate(std::begin(v), std::end(v), rng);
  }
}

template <typename Engine, size_t elems>
void BM_Shuffle(benchmark::State& state) {
  // Direct use of the Engine.
  std::vector<uint32_t> v(elems);
  while (state.KeepRunningBatch(elems)) {
    auto rng = make_engine<Engine>();
    std::shuffle(std::begin(v), std::end(v), rng);
  }
}

template <typename Engine, size_t elems>
void BM_ShuffleReuse(benchmark::State& state) {
  // Direct use of the Engine.
  std::vector<uint32_t> v(elems);
  auto rng = make_engine<Engine>();
  while (state.KeepRunningBatch(elems)) {
    std::shuffle(std::begin(v), std::end(v), rng);
  }
}

template <typename Engine, typename Dist, typename... Args>
void BM_Dist(benchmark::State& state, Args&&... args) {
  using value_type = typename Dist::result_type;
  auto rng = make_engine<Engine>();
  Dist dis{std::forward<Args>(args)...};
  // Compare the following loop performance:
  for (auto _ : state) {
    benchmark::DoNotOptimize(dis(rng));
  }
  state.SetBytesProcessed(sizeof(value_type) * state.iterations());
}

template <typename Engine, typename Dist>
void BM_Large(benchmark::State& state) {
  using value_type = typename Dist::result_type;
  volatile value_type kMin = 0;
  volatile value_type kMax = std::numeric_limits<value_type>::max() / 2 + 1;
  BM_Dist<Engine, Dist>(state, kMin, kMax);
}

template <typename Engine, typename Dist>
void BM_Small(benchmark::State& state) {
  using value_type = typename Dist::result_type;
  volatile value_type kMin = 0;
  volatile value_type kMax = std::numeric_limits<value_type>::max() / 64 + 1;
  BM_Dist<Engine, Dist>(state, kMin, kMax);
}

template <typename Engine, typename Dist, int A>
void BM_Bernoulli(benchmark::State& state) {
  volatile double a = static_cast<double>(A) / 1000000;
  BM_Dist<Engine, Dist>(state, a);
}

template <typename Engine, typename Dist, int A, int B>
void BM_Beta(benchmark::State& state) {
  using value_type = typename Dist::result_type;
  volatile value_type a = static_cast<value_type>(A) / 100;
  volatile value_type b = static_cast<value_type>(B) / 100;
  BM_Dist<Engine, Dist>(state, a, b);
}

template <typename Engine, typename Dist, int A>
void BM_Gamma(benchmark::State& state) {
  using value_type = typename Dist::result_type;
  volatile value_type a = static_cast<value_type>(A) / 100;
  BM_Dist<Engine, Dist>(state, a);
}

template <typename Engine, typename Dist, int A = 100>
void BM_Poisson(benchmark::State& state) {
  volatile double a = static_cast<double>(A) / 100;
  BM_Dist<Engine, Dist>(state, a);
}

template <typename Engine, typename Dist, int Q = 2, int V = 1>
void BM_Zipf(benchmark::State& state) {
  using value_type = typename Dist::result_type;
  volatile double q = Q;
  volatile double v = V;
  BM_Dist<Engine, Dist>(state, std::numeric_limits<value_type>::max(), q, v);
}

template <typename Engine, typename Dist>
void BM_Thread(benchmark::State& state) {
  using value_type = typename Dist::result_type;
  auto rng = make_engine<Engine>();
  Dist dis{};
  for (auto _ : state) {
    benchmark::DoNotOptimize(dis(rng));
  }
  state.SetBytesProcessed(sizeof(value_type) * state.iterations());
}

// NOTES:
//
// std::geometric_distribution is similar to the zipf distributions.
// The algorithm for the geometric_distribution is, basically,
// floor(log(1-X) / log(1-p))

// Normal benchmark suite
#define BM_BASIC(Engine)                                                       \
  BENCHMARK_TEMPLATE(BM_Construct, Engine, DefaultConstructorSeedSeq);         \
  BENCHMARK_TEMPLATE(BM_Construct, Engine, PrecompiledSeedSeq);                \
  BENCHMARK_TEMPLATE(BM_Construct, Engine, std::seed_seq);                     \
  BENCHMARK_TEMPLATE(BM_Direct, Engine);                                       \
  BENCHMARK_TEMPLATE(BM_Shuffle, Engine, 10);                                  \
  BENCHMARK_TEMPLATE(BM_Shuffle, Engine, 100);                                 \
  BENCHMARK_TEMPLATE(BM_Shuffle, Engine, 1000);                                \
  BENCHMARK_TEMPLATE(BM_ShuffleReuse, Engine, 100);                            \
  BENCHMARK_TEMPLATE(BM_ShuffleReuse, Engine, 1000);                           \
  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
                     absl::random_internal::FastUniformBits<uint32_t>);        \
  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
                     absl::random_internal::FastUniformBits<uint64_t>);        \
  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::uniform_int_distribution<int32_t>); \
  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::uniform_int_distribution<int64_t>); \
  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
                     absl::uniform_int_distribution<int32_t>);                 \
  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
                     absl::uniform_int_distribution<int64_t>);                 \
  BENCHMARK_TEMPLATE(BM_Large, Engine,                                         \
                     std::uniform_int_distribution<int32_t>);                  \
  BENCHMARK_TEMPLATE(BM_Large, Engine,                                         \
                     std::uniform_int_distribution<int64_t>);                  \
  BENCHMARK_TEMPLATE(BM_Large, Engine,                                         \
                     absl::uniform_int_distribution<int32_t>);                 \
  BENCHMARK_TEMPLATE(BM_Large, Engine,                                         \
                     absl::uniform_int_distribution<int64_t>);                 \
  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::uniform_real_distribution<float>);  \
  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::uniform_real_distribution<double>); \
  BENCHMARK_TEMPLATE(BM_Dist, Engine, absl::uniform_real_distribution<float>); \
  BENCHMARK_TEMPLATE(BM_Dist, Engine, absl::uniform_real_distribution<double>)

#define BM_COPY(Engine) BENCHMARK_TEMPLATE(BM_Generate, Engine)

#define BM_THREAD(Engine)                                           \
  BENCHMARK_TEMPLATE(BM_Thread, Engine,                             \
                     absl::uniform_int_distribution<int64_t>)       \
      ->ThreadPerCpu();                                             \
  BENCHMARK_TEMPLATE(BM_Thread, Engine,                             \
                     absl::uniform_real_distribution<double>)       \
      ->ThreadPerCpu();                                             \
  BENCHMARK_TEMPLATE(BM_Shuffle, Engine, 100)->ThreadPerCpu();      \
  BENCHMARK_TEMPLATE(BM_Shuffle, Engine, 1000)->ThreadPerCpu();     \
  BENCHMARK_TEMPLATE(BM_ShuffleReuse, Engine, 100)->ThreadPerCpu(); \
  BENCHMARK_TEMPLATE(BM_ShuffleReuse, Engine, 1000)->ThreadPerCpu()

#define BM_EXTENDED(Engine)                                                    \
  /* -------------- Extended Uniform -----------------------*/                 \
  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
                     std::uniform_int_distribution<int32_t>);                  \
  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
                     std::uniform_int_distribution<int64_t>);                  \
  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
                     absl::uniform_int_distribution<int32_t>);                 \
  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
                     absl::uniform_int_distribution<int64_t>);                 \
  BENCHMARK_TEMPLATE(BM_Small, Engine, std::uniform_real_distribution<float>); \
  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
                     std::uniform_real_distribution<double>);                  \
  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
                     absl::uniform_real_distribution<float>);                  \
  BENCHMARK_TEMPLATE(BM_Small, Engine,                                         \
                     absl::uniform_real_distribution<double>);                 \
  /* -------------- Other -----------------------*/                            \
  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::normal_distribution<double>);       \
  BENCHMARK_TEMPLATE(BM_Dist, Engine, absl::gaussian_distribution<double>);    \
  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::exponential_distribution<double>);  \
  BENCHMARK_TEMPLATE(BM_Dist, Engine, absl::exponential_distribution<double>); \
  BENCHMARK_TEMPLATE(BM_Poisson, Engine, std::poisson_distribution<int64_t>,   \
                     100);                                                     \
  BENCHMARK_TEMPLATE(BM_Poisson, Engine, absl::poisson_distribution<int64_t>,  \
                     100);                                                     \
  BENCHMARK_TEMPLATE(BM_Poisson, Engine, std::poisson_distribution<int64_t>,   \
                     10 * 100);                                                \
  BENCHMARK_TEMPLATE(BM_Poisson, Engine, absl::poisson_distribution<int64_t>,  \
                     10 * 100);                                                \
  BENCHMARK_TEMPLATE(BM_Poisson, Engine, std::poisson_distribution<int64_t>,   \
                     13 * 100);                                                \
  BENCHMARK_TEMPLATE(BM_Poisson, Engine, absl::poisson_distribution<int64_t>,  \
                     13 * 100);                                                \
  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
                     absl::log_uniform_int_distribution<int32_t>);             \
  BENCHMARK_TEMPLATE(BM_Dist, Engine,                                          \
                     absl::log_uniform_int_distribution<int64_t>);             \
  BENCHMARK_TEMPLATE(BM_Dist, Engine, std::geometric_distribution<int64_t>);   \
  BENCHMARK_TEMPLATE(BM_Zipf, Engine, absl::zipf_distribution<uint64_t>);      \
  BENCHMARK_TEMPLATE(BM_Zipf, Engine, absl::zipf_distribution<uint64_t>, 2,    \
                     3);                                                       \
  BENCHMARK_TEMPLATE(BM_Bernoulli, Engine, std::bernoulli_distribution,        \
                     257305);                                                  \
  BENCHMARK_TEMPLATE(BM_Bernoulli, Engine, absl::bernoulli_distribution,       \
                     257305);                                                  \
  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<double>, 65,     \
                     41);                                                      \
  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<double>, 99,     \
                     330);                                                     \
  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<double>, 150,    \
                     150);                                                     \
  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<double>, 410,    \
                     580);                                                     \
  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<float>, 65, 41); \
  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<float>, 99,      \
                     330);                                                     \
  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<float>, 150,     \
                     150);                                                     \
  BENCHMARK_TEMPLATE(BM_Beta, Engine, absl::beta_distribution<float>, 410,     \
                     580);                                                     \
  BENCHMARK_TEMPLATE(BM_Gamma, Engine, std::gamma_distribution<float>, 199);   \
  BENCHMARK_TEMPLATE(BM_Gamma, Engine, std::gamma_distribution<double>, 199)

// ABSL Recommended interfaces.
BM_BASIC(absl::InsecureBitGen);  // === pcg64_2018_engine
BM_BASIC(absl::BitGen);          // === randen_engine<uint64_t>.
BM_THREAD(absl::BitGen);
BM_EXTENDED(absl::BitGen);

// Instantiate benchmarks for multiple engines.
using randen_engine_64 = absl::random_internal::randen_engine<uint64_t>;
using randen_engine_32 = absl::random_internal::randen_engine<uint32_t>;

// Comparison interfaces.
BM_BASIC(std::mt19937_64);
BM_COPY(std::mt19937_64);
BM_EXTENDED(std::mt19937_64);
BM_BASIC(randen_engine_64);
BM_COPY(randen_engine_64);
BM_EXTENDED(randen_engine_64);

BM_BASIC(std::mt19937);
BM_COPY(std::mt19937);
BM_BASIC(randen_engine_32);
BM_COPY(randen_engine_32);

}  // namespace
