From a9ab69df0abe5e730d23a200f84ddf671bd4961b Mon Sep 17 00:00:00 2001 From: bolero-MURAKAMI Date: Mon, 12 Nov 2012 17:11:48 +0900 Subject: [PATCH] workaround for clang3.2 (binomial_distribution) --- sprout/math/ceil.hpp | 2 +- sprout/math/floor.hpp | 2 +- sprout/math/gcd.hpp | 4 +- sprout/math/llround.hpp | 2 +- sprout/math/lround.hpp | 2 +- sprout/math/round.hpp | 2 +- sprout/math/trunc.hpp | 2 +- sprout/random/binomial_distribution.hpp | 370 +++++++++++++++++++++--- sprout/random/uniform_01.hpp | 4 +- 9 files changed, 338 insertions(+), 52 deletions(-) diff --git a/sprout/math/ceil.hpp b/sprout/math/ceil.hpp index d0468b7d..523f889f 100644 --- a/sprout/math/ceil.hpp +++ b/sprout/math/ceil.hpp @@ -43,7 +43,7 @@ namespace sprout { ceil(IntType x) { return sprout::math::detail::ceil(static_cast(x)); } - } // namespacedetailmath + } // namespace detail using NS_SPROUT_MATH_DETAIL::ceil; } // namespace math diff --git a/sprout/math/floor.hpp b/sprout/math/floor.hpp index 3d298fa6..178c46bf 100644 --- a/sprout/math/floor.hpp +++ b/sprout/math/floor.hpp @@ -43,7 +43,7 @@ namespace sprout { floor(IntType x) { return sprout::math::detail::floor(static_cast(x)); } - } // namespacedetailmath + } // namespace detail using NS_SPROUT_MATH_DETAIL::floor; } // namespace math diff --git a/sprout/math/gcd.hpp b/sprout/math/gcd.hpp index 83b16690..ca4f646a 100644 --- a/sprout/math/gcd.hpp +++ b/sprout/math/gcd.hpp @@ -36,10 +36,10 @@ namespace sprout { ); } #ifdef SPROUT_WORKAROUND_NOT_TERMINATE_RECURSIVE_CONSTEXPR_FUNCTION_TEMPLATE - template + template inline SPROUT_CONSTEXPR BuiltInUnsigned gcd_binary_2_1(unsigned shifts, sprout::array const& r, unsigned which); - template + template inline SPROUT_CONSTEXPR BuiltInUnsigned gcd_binary_2_1(unsigned shifts, sprout::array const& r, unsigned which); template diff --git a/sprout/math/llround.hpp b/sprout/math/llround.hpp index fc92734b..a890ea29 100644 --- a/sprout/math/llround.hpp +++ b/sprout/math/llround.hpp @@ -44,7 +44,7 @@ namespace sprout { llround(IntType x) { return static_cast(x); } - } // namespacedetailmath + } // namespace detail using NS_SPROUT_MATH_DETAIL::llround; } // namespace math diff --git a/sprout/math/lround.hpp b/sprout/math/lround.hpp index a9528a14..c073d584 100644 --- a/sprout/math/lround.hpp +++ b/sprout/math/lround.hpp @@ -44,7 +44,7 @@ namespace sprout { lround(IntType x) { return static_cast(x); } - } // namespacedetailmath + } // namespace detail using NS_SPROUT_MATH_DETAIL::lround; } // namespace math diff --git a/sprout/math/round.hpp b/sprout/math/round.hpp index aa5eb84b..13748ce1 100644 --- a/sprout/math/round.hpp +++ b/sprout/math/round.hpp @@ -49,7 +49,7 @@ namespace sprout { round(IntType x) { return sprout::math::detail::round(static_cast(x)); } - } // namespacedetailmath + } // namespace detail using NS_SPROUT_MATH_DETAIL::round; } // namespace math diff --git a/sprout/math/trunc.hpp b/sprout/math/trunc.hpp index 9334f703..898dfa17 100644 --- a/sprout/math/trunc.hpp +++ b/sprout/math/trunc.hpp @@ -35,7 +35,7 @@ namespace sprout { trunc(IntType x) { return sprout::math::detail::trunc(static_cast(x)); } - } // namespacedetailmath + } // namespace detail using NS_SPROUT_MATH_DETAIL::trunc; } // namespace math diff --git a/sprout/random/binomial_distribution.hpp b/sprout/random/binomial_distribution.hpp index 20de76d7..3379dca3 100644 --- a/sprout/random/binomial_distribution.hpp +++ b/sprout/random/binomial_distribution.hpp @@ -14,6 +14,10 @@ #include #include #include +#ifdef SPROUT_WORKAROUND_NOT_TERMINATE_RECURSIVE_CONSTEXPR_FUNCTION_TEMPLATE +# include +# include +#endif namespace sprout { namespace random { @@ -148,21 +152,30 @@ namespace sprout { static SPROUT_CONSTEXPR IntType init_m(IntType t, RealType p) { return static_cast((init_t(t) + 1) * init_p(p)); } - static SPROUT_CONSTEXPR btrd_type init_btrd_6(IntType t, RealType p, RealType r, RealType nr, RealType npq, RealType b, RealType a, RealType c, RealType alpha, RealType v_r) { - return btrd_type { - r, - nr, - npq, - b, - a, - c, - alpha, - v_r, + static SPROUT_CONSTEXPR btrd_type + init_btrd_6( + IntType t, RealType p, RealType r, RealType nr, RealType npq, + RealType b, RealType a, RealType c, RealType alpha, RealType v_r + ) + { + return btrd_type{ + r, nr, npq, + b, a, c, alpha, v_r, RealType(0.86) * v_r }; } - static SPROUT_CONSTEXPR btrd_type init_btrd_5(IntType t, RealType p, RealType r, RealType nr, RealType npq, RealType sqrt_npq, RealType b) { - return init_btrd_6(t, p, r, nr, npq, b, RealType(-0.0873) + RealType(0.0248) * b + RealType(0.01) * p, t * p + RealType(0.5), (RealType(2.83) + RealType(5.1) / b) * sqrt_npq, RealType(0.92) - RealType(4.2) / b); + static SPROUT_CONSTEXPR btrd_type + init_btrd_5( + IntType t, RealType p, RealType r, RealType nr, RealType npq, + RealType sqrt_npq, RealType b + ) + { + return init_btrd_6( + t, p, r, nr, npq, b, + RealType(-0.0873) + RealType(0.0248) * b + RealType(0.01) * p, + t * p + RealType(0.5), + (RealType(2.83) + RealType(5.1) / b) * sqrt_npq, RealType(0.92) - RealType(4.2) / b + ); } static SPROUT_CONSTEXPR btrd_type init_btrd_4(IntType t, RealType p, RealType r, RealType nr, RealType npq, RealType sqrt_npq) { return init_btrd_5(t, p, r, nr, npq, sqrt_npq, RealType(1.15) + RealType(2.53) * sqrt_npq); @@ -205,110 +218,375 @@ namespace sprout { return m_ < 11; } template - SPROUT_CONSTEXPR sprout::random::random_result invert_4(Engine const& eng, RealType u, RealType q, RealType s, RealType a, RealType r, IntType x = 0) const { + SPROUT_CONSTEXPR sprout::random::random_result + invert_4(Engine const& eng, RealType u, RealType q, RealType s, RealType a, RealType r, IntType x = 0) const { return u > r ? invert_4(eng, u - r, q, s, a, ((a / (x + 1)) - s) * r, x + 1) : sprout::random::random_result(x, eng, *this) ; } template - SPROUT_CONSTEXPR sprout::random::random_result invert_3(IntType t, Engine const& eng, RealType u, RealType q, RealType s) const { + SPROUT_CONSTEXPR sprout::random::random_result + invert_3(IntType t, Engine const& eng, RealType u, RealType q, RealType s) const { return invert_4(eng, u, q, s, (t + 1) * s, q_n_); } template - SPROUT_CONSTEXPR sprout::random::random_result invert_2(IntType t, RealType p, Engine const& eng, RealType u, RealType q) const { + SPROUT_CONSTEXPR sprout::random::random_result + invert_2(IntType t, RealType p, Engine const& eng, RealType u, RealType q) const { return invert_3(t, eng, u, q, p / q); } template - SPROUT_CONSTEXPR sprout::random::random_result invert_1(IntType t, RealType p, Engine const& eng, RealType u) const { + SPROUT_CONSTEXPR sprout::random::random_result + invert_1(IntType t, RealType p, Engine const& eng, RealType u) const { return invert_2(t, p, eng, u, 1 - p); } template - SPROUT_CONSTEXPR sprout::random::random_result invert_0(IntType t, RealType p, Random const& rnd) const { + SPROUT_CONSTEXPR sprout::random::random_result + invert_0(IntType t, RealType p, Random const& rnd) const { return invert_1(t, p, rnd.engine(), rnd.result()); } template - SPROUT_CONSTEXPR sprout::random::random_result invert(IntType t, RealType p, Engine const& eng) const { + SPROUT_CONSTEXPR sprout::random::random_result + invert(IntType t, RealType p, Engine const& eng) const { return invert_0(t, p, sprout::random::uniform_01()(eng)); } template - SPROUT_CONSTEXPR sprout::random::random_result invert2_0(IntType t, sprout::random::random_result const& rnd) const { + SPROUT_CONSTEXPR sprout::random::random_result + invert2_0(IntType t, sprout::random::random_result const& rnd) const { return sprout::random::random_result(t - rnd.result(), rnd.engine(), rnd.distribution()); } template - SPROUT_CONSTEXPR sprout::random::random_result invert2(IntType t, RealType p, Engine const& eng) const { + SPROUT_CONSTEXPR sprout::random::random_result + invert2(IntType t, RealType p, Engine const& eng) const { return invert2_0(t, invert(t, p, eng)); } +#ifdef SPROUT_WORKAROUND_NOT_TERMINATE_RECURSIVE_CONSTEXPR_FUNCTION_TEMPLATE + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_10(Engine const& eng, RealType v, IntType k, IntType nm, RealType h, IntType nk) const { + return v <= h + (t_ + 1) * sprout::log(static_cast(nm) / nk) + + (k + RealType(0.5)) * sprout::log(nk * btrd_.r / (k + 1)) - fc(k) - fc(t_ - k) + ? sprout::random::random_result(k, eng, *this) + : generate(eng) + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_10(Engine const& eng, RealType v, IntType k, IntType nm, RealType h, IntType nk) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_9(Engine const& eng, RealType v, IntType k, IntType nm) const { + return generate_10( + eng, v, k, nm, (m_ + RealType(0.5)) * sprout::log((m_ + 1) / (btrd_.r * nm)) + fc(m_) + fc(t_ - m_), t_ - k + 1 + ); + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_9(Engine const& eng, RealType v, IntType k, IntType nm) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_8(Engine const& eng, RealType v, IntType k, RealType rho, RealType t) const { + return v < t - rho ? sprout::random::random_result(k, eng, *this) + : v > t + rho ? generate(eng) + : generate_9(eng, v, k, t_ - m_ + 1) + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_8(Engine const& eng, RealType v, IntType k, RealType rho, RealType t) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_7_3(Engine const& eng, RealType v, IntType k, RealType f) const { + return v <= f + ? sprout::random::random_result(k, eng, *this) + : generate(eng) + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_7_3(Engine const& eng, RealType v, IntType k, RealType f) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_7_2(Engine const& eng, RealType v, IntType k, RealType f, IntType i) const { + return i != k + ? generate_7_2(eng, v * (btrd_.nr / (i + 1) - btrd_.r), k, f, i + 1) + : generate_7_3(eng, v, k, f) + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_7_2(Engine const& eng, RealType v, IntType k, RealType f, IntType i) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_7_1(Engine const& eng, RealType v, IntType k, RealType f, IntType i) const { + return i != k + ? generate_7_1(eng, v, k, f * (btrd_.nr / (i + 1) - btrd_.r), i + 1) + : generate_7_3(eng, v, k, f) + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_7_1(Engine const& eng, RealType v, IntType k, RealType f, IntType i) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_7(Engine const& eng, RealType v, IntType k, RealType f = RealType(1)) const { + return m_ < k ? generate_7_1(eng, v, k, f * (btrd_.nr / (m_ + 1) - btrd_.r), m_ + 1) + : m_ > k ? generate_7_2(eng, v * (btrd_.nr / (k + 1) - btrd_.r), k, f, k + 1) + : generate_7_3(eng, v, k, f) + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_7(Engine const& eng, RealType v, IntType k, RealType f = RealType(1)) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_6(Engine const& eng, RealType v, IntType k, RealType km) const { + return km <= 15 + ? generate_7(eng, v, k) + : generate_8( + eng, sprout::log(v), k, + (km / btrd_.npq) * (((km / RealType(3.0) + RealType(0.625)) * km + RealType(1.0) / 6) / btrd_.npq + RealType(0.5)), + -km * km / (2 * btrd_.npq)) + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_6(Engine const& eng, RealType v, IntType k, RealType km) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_5(Engine const& eng, RealType v, RealType u, RealType us, IntType k) const { + return k < 0 || k > t_ + ? generate(eng) + : generate_6(eng, v * btrd_.alpha / (btrd_.a / (us * us) + btrd_.b), k, sprout::abs(k - m_)) + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_5(Engine const& eng, RealType v, RealType u, RealType us, IntType k) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_4(Engine const& eng, RealType v, RealType u, RealType us) const { + return generate_5(eng, v, u, us, static_cast(sprout::floor((2 * btrd_.a / us + btrd_.b) * u + btrd_.c))); + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_4(Engine const& eng, RealType v, RealType u, RealType us) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_3(Engine const& eng, RealType v, RealType u) const { + return generate_4(eng, v, u, 0.5 - sprout::abs(u)); + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_3(Engine const& eng, RealType v, RealType u) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_2(Random const& rnd, RealType v) const { + return v >= btrd_.v_r + ? generate_3( + rnd.engine(), v, + rnd.result() - RealType(0.5) + ) + : generate_3( + rnd.engine(), rnd.result() * btrd_.v_r, + ((v / btrd_.v_r - RealType(0.93)) < 0 ? RealType(-0.5) : RealType(0.5)) - (v / btrd_.v_r - RealType(0.93)) + ) + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_2(Random const& rnd, RealType v) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_1_1(Engine const& eng, RealType u) const { + return sprout::random::random_result( + static_cast(sprout::floor((2 * btrd_.a / (RealType(0.5) - sprout::abs(u)) + btrd_.b) * u + btrd_.c)), + eng, *this + ); + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_1_1(Engine const& eng, RealType u) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_1(Engine const& eng, RealType v) const { + return v <= btrd_.u_rv_r + ? generate_1_1(eng, v / btrd_.v_r - RealType(0.43)) + : generate_2(sprout::random::uniform_01()(eng), v) + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_1(Engine const& eng, RealType v) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_0(Random const& rnd) const { + return generate_1(rnd.engine(), rnd.result()); + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate_0(Random const& rnd) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate(Engine const& eng) const { + return generate_0(sprout::random::uniform_01()(eng)); + } + template + SPROUT_CONSTEXPR sprout::random::random_result + generate(Engine const& eng) const { + return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE), + sprout::random::random_result() + ; + } +#else template - SPROUT_CONSTEXPR sprout::random::random_result generate_10(Engine const& eng, RealType v, IntType k, IntType nm, RealType h, IntType nk) const { - return v <= h + (t_ + 1) * sprout::log(static_cast(nm) / nk) + (k + RealType(0.5)) * sprout::log(nk * btrd_.r / (k + 1)) - fc(k) - fc(t_ - k) + SPROUT_CONSTEXPR sprout::random::random_result + generate_10(Engine const& eng, RealType v, IntType k, IntType nm, RealType h, IntType nk) const { + return v <= h + (t_ + 1) * sprout::log(static_cast(nm) / nk) + + (k + RealType(0.5)) * sprout::log(nk * btrd_.r / (k + 1)) - fc(k) - fc(t_ - k) ? sprout::random::random_result(k, eng, *this) : generate(eng) ; } template - SPROUT_CONSTEXPR sprout::random::random_result generate_9(Engine const& eng, RealType v, IntType k, IntType nm) const { - return generate_10(eng, v, k, nm, (m_ + RealType(0.5)) * sprout::log((m_ + 1) / (btrd_.r * nm)) + fc(m_) + fc(t_ - m_), t_ - k + 1); + SPROUT_CONSTEXPR sprout::random::random_result + generate_9(Engine const& eng, RealType v, IntType k, IntType nm) const { + return generate_10( + eng, v, k, nm, (m_ + RealType(0.5)) * sprout::log((m_ + 1) / (btrd_.r * nm)) + fc(m_) + fc(t_ - m_), t_ - k + 1 + ); } template - SPROUT_CONSTEXPR sprout::random::random_result generate_8(Engine const& eng, RealType v, IntType k, RealType rho, RealType t) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_8(Engine const& eng, RealType v, IntType k, RealType rho, RealType t) const { return v < t - rho ? sprout::random::random_result(k, eng, *this) : v > t + rho ? generate(eng) : generate_9(eng, v, k, t_ - m_ + 1) ; } template - SPROUT_CONSTEXPR sprout::random::random_result generate_7_3(Engine const& eng, RealType v, IntType k, RealType f) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_7_3(Engine const& eng, RealType v, IntType k, RealType f) const { return v <= f ? sprout::random::random_result(k, eng, *this) : generate(eng) ; } template - SPROUT_CONSTEXPR sprout::random::random_result generate_7_2(Engine const& eng, RealType v, IntType k, RealType f, IntType i) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_7_2(Engine const& eng, RealType v, IntType k, RealType f, IntType i) const { return i != k ? generate_7_2(eng, v * (btrd_.nr / (i + 1) - btrd_.r), k, f, i + 1) : generate_7_3(eng, v, k, f) ; } template - SPROUT_CONSTEXPR sprout::random::random_result generate_7_1(Engine const& eng, RealType v, IntType k, RealType f, IntType i) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_7_1(Engine const& eng, RealType v, IntType k, RealType f, IntType i) const { return i != k ? generate_7_1(eng, v, k, f * (btrd_.nr / (i + 1) - btrd_.r), i + 1) : generate_7_3(eng, v, k, f) ; } template - SPROUT_CONSTEXPR sprout::random::random_result generate_7(Engine const& eng, RealType v, IntType k, RealType f = RealType(1)) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_7(Engine const& eng, RealType v, IntType k, RealType f = RealType(1)) const { return m_ < k ? generate_7_1(eng, v, k, f * (btrd_.nr / (m_ + 1) - btrd_.r), m_ + 1) : m_ > k ? generate_7_2(eng, v * (btrd_.nr / (k + 1) - btrd_.r), k, f, k + 1) : generate_7_3(eng, v, k, f) ; } template - SPROUT_CONSTEXPR sprout::random::random_result generate_6(Engine const& eng, RealType v, IntType k, RealType km) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_6(Engine const& eng, RealType v, IntType k, RealType km) const { return km <= 15 ? generate_7(eng, v, k) - : generate_8(eng, sprout::log(v), k, (km / btrd_.npq) * (((km / RealType(3.0) + RealType(0.625)) * km + RealType(1.0) / 6) / btrd_.npq + RealType(0.5)), -km * km / (2 * btrd_.npq)) + : generate_8( + eng, sprout::log(v), k, + (km / btrd_.npq) * (((km / RealType(3.0) + RealType(0.625)) * km + RealType(1.0) / 6) / btrd_.npq + RealType(0.5)), + -km * km / (2 * btrd_.npq)) ; } template - SPROUT_CONSTEXPR sprout::random::random_result generate_5(Engine const& eng, RealType v, RealType u, RealType us, IntType k) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_5(Engine const& eng, RealType v, RealType u, RealType us, IntType k) const { return k < 0 || k > t_ ? generate(eng) : generate_6(eng, v * btrd_.alpha / (btrd_.a / (us * us) + btrd_.b), k, sprout::abs(k - m_)) ; } template - SPROUT_CONSTEXPR sprout::random::random_result generate_4(Engine const& eng, RealType v, RealType u, RealType us) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_4(Engine const& eng, RealType v, RealType u, RealType us) const { return generate_5(eng, v, u, us, static_cast(sprout::floor((2 * btrd_.a / us + btrd_.b) * u + btrd_.c))); } template - SPROUT_CONSTEXPR sprout::random::random_result generate_3(Engine const& eng, RealType v, RealType u) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_3(Engine const& eng, RealType v, RealType u) const { return generate_4(eng, v, u, 0.5 - sprout::abs(u)); } template - SPROUT_CONSTEXPR sprout::random::random_result generate_2(Random const& rnd, RealType v) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_2(Random const& rnd, RealType v) const { return v >= btrd_.v_r ? generate_3( rnd.engine(), @@ -323,7 +601,8 @@ namespace sprout { ; } template - SPROUT_CONSTEXPR sprout::random::random_result generate_1_1(Engine const& eng, RealType u) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_1_1(Engine const& eng, RealType u) const { return sprout::random::random_result( static_cast(sprout::floor((2 * btrd_.a / (RealType(0.5) - sprout::abs(u)) + btrd_.b) * u + btrd_.c)), eng, @@ -331,26 +610,32 @@ namespace sprout { ); } template - SPROUT_CONSTEXPR sprout::random::random_result generate_1(Engine const& eng, RealType v) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_1(Engine const& eng, RealType v) const { return v <= btrd_.u_rv_r ? generate_1_1(eng, v / btrd_.v_r - RealType(0.43)) : generate_2(sprout::random::uniform_01()(eng), v) ; } template - SPROUT_CONSTEXPR sprout::random::random_result generate_0(Random const& rnd) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate_0(Random const& rnd) const { return generate_1(rnd.engine(), rnd.result()); } template - SPROUT_CONSTEXPR sprout::random::random_result generate(Engine const& eng) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate(Engine const& eng) const { return generate_0(sprout::random::uniform_01()(eng)); } +#endif template - SPROUT_CONSTEXPR sprout::random::random_result generate2_0(IntType t, sprout::random::random_result const& rnd) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate2_0(IntType t, sprout::random::random_result const& rnd) const { return sprout::random::random_result(t - rnd.result(), rnd.engine(), rnd.distribution()); } template - SPROUT_CONSTEXPR sprout::random::random_result generate2(IntType t, Engine const& eng) const { + SPROUT_CONSTEXPR sprout::random::random_result + generate2(IntType t, Engine const& eng) const { return generate2_0(t, generate(eng)); } void init() { @@ -404,7 +689,8 @@ namespace sprout { init(); } template - SPROUT_CONSTEXPR sprout::random::random_result operator()(Engine const& eng) const { + SPROUT_CONSTEXPR sprout::random::random_result + operator()(Engine const& eng) const { return use_inversion() ? RealType(0.5) < p_ ? invert2(t_, 1 - p_, eng) : invert(t_, p_, eng) diff --git a/sprout/random/uniform_01.hpp b/sprout/random/uniform_01.hpp index 6e739c2c..b60d64fc 100644 --- a/sprout/random/uniform_01.hpp +++ b/sprout/random/uniform_01.hpp @@ -69,7 +69,7 @@ namespace sprout { sprout::random::random_result() ; } - template + template SPROUT_CONSTEXPR sprout::random::random_result generate(Engine const& eng, sprout::random::random_result const& rnd) const { typedef typename Engine::result_type base_result; @@ -85,7 +85,7 @@ namespace sprout { ) ); } - template + template SPROUT_CONSTEXPR sprout::random::random_result generate(Engine const& eng, sprout::random::random_result const& rnd) const { return throw std::runtime_error(SPROUT_RECURSIVE_FUNCTION_TEMPLATE_INSTANTIATION_EXCEEDED_MESSAGE),