 |
Version: SMASH-2.0
|
|
Go to the documentation of this file.
19 std::random_device rd;
20 static_assert(std::is_same<decltype(rd()), uint32_t>::value,
21 "random_device is assumed to generate uint32_t");
22 uint64_t unsigned_seed =
23 (static_cast<uint64_t>(rd()) << 32) | static_cast<uint64_t>(rd());
25 const int64_t seed = static_cast<int64_t>(unsigned_seed >> 1);
30 const double poisson_mean2,
31 const int fixed_difference)
32 : a_(2.0 * std::sqrt(poisson_mean1 * poisson_mean2)),
33 N_(std::abs(fixed_difference)),
34 N_is_positive_(fixed_difference >= 0) {
35 assert(poisson_mean1 >= 0.0);
36 assert(poisson_mean2 >= 0.0);
38 ": Poisson mean N1 = ", poisson_mean1,
39 ", Poisson mean N2 = ", poisson_mean2,
40 ", N1 - N2 fixed to ", fixed_difference);
44 const double mean_sqr =
mu_ * (1.0 + 0.5 *
a_ *
r_(
N_ + 1,
a_));
47 "m = ",
m_,
" -> using gaussian sampling with mean = ",
mu_,
51 " -> using direct sampling method");
52 std::vector<double> probabilities;
53 double wi = 1.0, sum = 0.0;
57 probabilities.push_back(wi);
58 wi *= 0.25 *
a_ *
a_ / (i + 1) / (
N_ + i + 1);
62 for (
double p : probabilities) {
72 const int N_smaller = (m_ >= m_switch_method_)
75 return N_is_positive_ ? std::make_pair(N_smaller + N_, N_smaller)
76 : std::make_pair(N_smaller, N_smaller + N_);
80 const double a_inv = 1.0 / a;
88 res = 1.0 / (a_inv * 2 * (
n + i) + res);
91 assert(a / (std::sqrt(a * a + (
n + 1) * (
n + 1)) +
n + 1) <= res);
92 assert(res <= a / (std::sqrt(a * a +
n *
n) +
n));
double normal(const T &mean, const T &sigma)
Returns a random number drawn from a normal distribution.
static constexpr double negligible_probability_
Probabilities smaller than negligibly_probability are neglected.
double mu_
Mean of the Bessel distribution.
double m_
Mode of the Bessel function, see for details.
std::mt19937_64 Engine
The random number engine used is the Mersenne Twister.
BesselSampler(const double poisson_mean1, const double poisson_mean2, const int fixed_difference)
Construct a BesselSampler.
const int N_
First parameter of Bessel distribution (= in ).
int64_t generate_63bit_seed()
Generates a seed with a truly random 63-bit value, if possible.
void reset_weights(const std::vector< T > &plist)
Reset the discrete distribution from a new probability list.
random::discrete_dist< double > dist_
Vector to store tabulated values of probabilities for small m case (m <6).
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
std::pair< int, int > sample()
Sample two numbers from given Poissonians with a fixed difference.
Engine engine
The engine that is used commonly by all distributions.
static constexpr double m_switch_method_
Switching mode to normal approximation.
const double a_
Second parameter of Bessel distribution, see for details.
static double r_(int n, double a)
Compute the ratio of two Bessel functions r(n,a) = bessel_I(n+1,a)/bessel_I(n,a) using the continued ...
double sigma_
Standard deviation of the Bessel distribution.
static constexpr int LGrandcanThermalizer