137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// random number generation -*- C++ -*- 237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc. 437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// 537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// This file is part of the GNU ISO C++ Library. This library is free 637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// software; you can redistribute it and/or modify it under the 737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// terms of the GNU General Public License as published by the 837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Free Software Foundation; either version 3, or (at your option) 937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// any later version. 1037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 1137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// This library is distributed in the hope that it will be useful, 1237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// but WITHOUT ANY WARRANTY; without even the implied warranty of 1337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// GNU General Public License for more details. 1537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 1637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Under Section 7 of GPL version 3, you are granted additional 1737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// permissions described in the GCC Runtime Library Exception, version 1837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// 3.1, as published by the Free Software Foundation. 1937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 2037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// You should have received a copy of the GNU General Public License and 2137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// a copy of the GCC Runtime Library Exception along with this program; 2237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// <http://www.gnu.org/licenses/>. 2437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 2537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh/** 2637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @file bits/random.h 2737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * This is an internal header file, included by other library headers. 2837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Do not attempt to use it directly. @headername{random} 2937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 3037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 3137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifndef _RANDOM_H 3237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#define _RANDOM_H 1 3337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 3437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#include <vector> 3537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 3637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehnamespace std _GLIBCXX_VISIBILITY(default) 3737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh{ 3837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_GLIBCXX_BEGIN_NAMESPACE_VERSION 3937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 4037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // [26.4] Random number generation 4137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 4237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 4337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @defgroup random Random Number Generation 4437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup numerics 4537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 4637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A facility for generating random numbers on selected distributions. 4737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 4837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 4937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 5037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 5137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A function template for converting the output of a (integral) 5237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * uniform random number generator to a floatng point result in the range 5337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * [0-1). 5437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 5537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, size_t __bits, 5637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _UniformRandomNumberGenerator> 5737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 5837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh generate_canonical(_UniformRandomNumberGenerator& __g); 5937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 6037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_GLIBCXX_END_NAMESPACE_VERSION 6137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 6237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* 6337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Implementation-space details. 6437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 6537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh namespace __detail 6637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 6737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_BEGIN_NAMESPACE_VERSION 6837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 6937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType, size_t __w, 7037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh bool = __w < static_cast<size_t> 7137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh (std::numeric_limits<_UIntType>::digits)> 7237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct _Shift 7337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { static const _UIntType __value = 0; }; 7437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 7537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType, size_t __w> 7637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct _Shift<_UIntType, __w, true> 7737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { static const _UIntType __value = _UIntType(1) << __w; }; 7837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 7937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, bool> 8037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct _Mod; 8137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 8237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // Dispatch based on modulus value to prevent divide-by-zero compile-time 8337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // errors when m == 0. 8437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Tp, _Tp __m, _Tp __a = 1, _Tp __c = 0> 8537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline _Tp 8637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __mod(_Tp __x) 8737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _Mod<_Tp, __m, __a, __c, __m == 0>::__calc(__x); } 8837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 8937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* 9037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * An adaptor class for converting the output of any Generator into 9137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the input for a specific Distribution. 9237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 9337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Engine, typename _DInputType> 9437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct _Adaptor 9537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 9637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 9737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 9837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Adaptor(_Engine& __g) 9937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_g(__g) { } 10037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 10137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _DInputType 10237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 10337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _DInputType(0); } 10437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 10537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _DInputType 10637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 10737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _DInputType(1); } 10837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 10937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* 11037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Converts a value generated by the adapted random number generator 11137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * into a value in the input domain for the dependent random number 11237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution. 11337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 11437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _DInputType 11537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()() 11637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 11737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return std::generate_canonical<_DInputType, 11837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::numeric_limits<_DInputType>::digits, 11937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Engine>(_M_g); 12037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 12137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 12237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 12337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Engine& _M_g; 12437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 12537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 12637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_END_NAMESPACE_VERSION 12737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } // namespace __detail 12837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 12937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_GLIBCXX_BEGIN_NAMESPACE_VERSION 13037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 13137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 13237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup random_generators Random Number Generators 13337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup random 13437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 13537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * These classes define objects which provide random or pseudorandom 13637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * numbers, either from a discrete or a continuous interval. The 13737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator supplied as a part of this library are 13837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * all uniform random number generators which provide a sequence of 13937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number uniformly distributed over their range. 14037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 14137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A number generator is a function object with an operator() that 14237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * takes zero arguments and returns a number. 14337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 14437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A compliant random number generator must satisfy the following 14537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * requirements. <table border=1 cellpadding=10 cellspacing=0> 14637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <caption align=top>Random Number Generator Requirements</caption> 14737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>To be documented.</td></tr> </table> 14837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 14937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 15037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 15137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 15237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 15337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A model of a linear congruential random number generator. 15437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 15537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A random number generator that produces pseudorandom numbers via 15637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * linear function: 15737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f[ 15837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * x_{i+1}\leftarrow(ax_{i} + c) \bmod m 15937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f] 16037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 16137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The template parameter @p _UIntType must be an unsigned integral type 16237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * large enough to store values up to (__m-1). If the template parameter 16337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __m is 0, the modulus @p __m used is 16437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * std::numeric_limits<_UIntType>::max() plus 1. Otherwise, the template 16537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters @p __a and @p __c must be less than @p __m. 16637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 16737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The size of the state is @f$1@f$. 16837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 16937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 17037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class linear_congruential_engine 17137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 17237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_unsigned<_UIntType>::value, "template argument " 17337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "substituting _UIntType not an unsigned integral type"); 17437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__m == 0u || (__a < __m && __c < __m), 17537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __m out of bounds"); 17637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 17737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // XXX FIXME: 17837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // _Mod::__calc should handle correctly __m % __a >= __m / __a too. 17937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__m % __a < __m / __a, 18037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "sorry, not implemented yet: try a smaller 'a' constant"); 18137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 18237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 18337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 18437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _UIntType result_type; 18537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 18637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The multiplier. */ 18737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type multiplier = __a; 18837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** An increment. */ 18937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type increment = __c; 19037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The modulus. */ 19137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type modulus = __m; 19237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type default_seed = 1u; 19337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 19437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 19537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs a %linear_congruential_engine random number 19637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine with seed @p __s. The default seed value 19737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * is 1. 19837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 19937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __s The initial seed value. 20037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 20137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 20237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh linear_congruential_engine(result_type __s = default_seed) 20337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__s); } 20437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 20537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 20637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs a %linear_congruential_engine random number 20737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine seeded from the seed sequence @p __q. 20837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 20937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __q the seed sequence. 21037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 21137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq, typename = typename 21237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::enable_if<!std::is_same<_Sseq, linear_congruential_engine>::value> 21337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ::type> 21437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 21537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh linear_congruential_engine(_Sseq& __q) 21637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__q); } 21737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 21837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 21937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Reseeds the %linear_congruential_engine random number generator 22037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * engine sequence to the seed @p __s. 22137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 22237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __s The new seed. 22337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 22437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 22537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(result_type __s = default_seed); 22637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 22737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 22837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Reseeds the %linear_congruential_engine random number generator 22937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * engine 23037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * sequence using values from the seed sequence @p __q. 23137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 23237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __q the seed sequence. 23337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 23437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq> 23537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename std::enable_if<std::is_class<_Sseq>::value>::type 23637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Sseq& __q); 23737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 23837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 23937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the smallest possible value in the output range. 24037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 24137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The minimum depends on the @p __c parameter: if it is zero, the 24237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * minimum generated must be > 0, otherwise 0 is allowed. 24337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 24437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 24537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() 24637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __c == 0u ? 1u : 0u; } 24737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 24837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 24937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the largest possible value in the output range. 25037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 25137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 25237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() 25337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __m - 1u; } 25437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 25537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 25637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Discard a sequence of random numbers. 25737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 25837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 25937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard(unsigned long long __z) 26037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 26137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh for (; __z != 0ULL; --__z) 26237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh (*this)(); 26337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 26437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 26537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 26637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the next random number in the sequence. 26737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 26837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 26937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()() 27037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 27137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_x = __detail::__mod<_UIntType, __m, __a, __c>(_M_x); 27237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_x; 27337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 27437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 27537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 27637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Compares two linear congruential random number generator 27737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * objects of the same type for equality. 27837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 27937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A linear congruential random number generator object. 28037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another linear congruential random number generator 28137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 28237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 28337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 28437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be equal, false otherwise. 28537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 28637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 28737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const linear_congruential_engine& __lhs, 28837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const linear_congruential_engine& __rhs) 28937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __lhs._M_x == __rhs._M_x; } 29037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 29137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 29237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Writes the textual representation of the state x(i) of x to 29337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __os. 29437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 29537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os The output stream. 29637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lcr A % linear_congruential_engine random number generator. 29737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns __os. 29837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 29937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1, 30037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __m1, typename _CharT, typename _Traits> 30137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 30237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 30337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::linear_congruential_engine<_UIntType1, 30437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __a1, __c1, __m1>& __lcr); 30537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 30637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 30737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the state of the engine by reading its textual 30837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * representation from @p __is. 30937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 31037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The textual representation must have been previously written using 31137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an output stream whose imbued locale and whose type's template 31237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * specialization arguments _CharT and _Traits were the same as those 31337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * of @p __is. 31437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 31537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is The input stream. 31637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lcr A % linear_congruential_engine random number generator. 31737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns __is. 31837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 31937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1, 32037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __m1, typename _CharT, typename _Traits> 32137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 32237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 32337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::linear_congruential_engine<_UIntType1, __a1, 32437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __c1, __m1>& __lcr); 32537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 32637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 32737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType _M_x; 32837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 32937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 33037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 33137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Compares two linear congruential random number generator 33237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * objects of the same type for inequality. 33337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 33437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A linear congruential random number generator object. 33537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another linear congruential random number generator 33637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 33737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 33837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 33937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be different, false otherwise. 34037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 34137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 34237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 34337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::linear_congruential_engine<_UIntType, __a, 34437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __c, __m>& __lhs, 34537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::linear_congruential_engine<_UIntType, __a, 34637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __c, __m>& __rhs) 34737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 34837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 34937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 35037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 35137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A generalized feedback shift register discrete random number generator. 35237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 35337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * This algorithm avoids multiplication and division and is designed to be 35437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * friendly to a pipelined architecture. If the parameters are chosen 35537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * correctly, this generator will produce numbers with a very long period and 35637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * fairly good apparent entropy, although still not cryptographically strong. 35737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 35837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The best way to use this generator is with the predefined mt19937 class. 35937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 36037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * This algorithm was originally invented by Makoto Matsumoto and 36137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Takuji Nishimura. 36237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 36337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __w Word size, the number of bits in each element of 36437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the state vector. 36537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __n The degree of recursion. 36637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __m The period parameter. 36737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __r The separation point bit index. 36837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __a The last row of the twist matrix. 36937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __u The first right-shift tempering matrix parameter. 37037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __d The first right-shift tempering matrix mask. 37137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __s The first left-shift tempering matrix parameter. 37237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __b The first left-shift tempering matrix mask. 37337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __t The second left-shift tempering matrix parameter. 37437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __c The second left-shift tempering matrix mask. 37537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __l The second right-shift tempering matrix parameter. 37637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @tparam __f Initialization multiplier. 37737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 37837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType, size_t __w, 37937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh size_t __n, size_t __m, size_t __r, 38037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType __a, size_t __u, _UIntType __d, size_t __s, 38137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType __b, size_t __t, 38237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType __c, size_t __l, _UIntType __f> 38337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class mersenne_twister_engine 38437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 38537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_unsigned<_UIntType>::value, "template argument " 38637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "substituting _UIntType not an unsigned integral type"); 38737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(1u <= __m && __m <= __n, 38837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __m out of bounds"); 38937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__r <= __w, "template argument substituting " 39037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "__r out of bound"); 39137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__u <= __w, "template argument substituting " 39237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "__u out of bound"); 39337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__s <= __w, "template argument substituting " 39437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "__s out of bound"); 39537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__t <= __w, "template argument substituting " 39637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "__t out of bound"); 39737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__l <= __w, "template argument substituting " 39837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "__l out of bound"); 39937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__w <= std::numeric_limits<_UIntType>::digits, 40037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __w out of bound"); 40137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__a <= (__detail::_Shift<_UIntType, __w>::__value - 1), 40237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __a out of bound"); 40337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__b <= (__detail::_Shift<_UIntType, __w>::__value - 1), 40437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __b out of bound"); 40537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__c <= (__detail::_Shift<_UIntType, __w>::__value - 1), 40637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __c out of bound"); 40737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__d <= (__detail::_Shift<_UIntType, __w>::__value - 1), 40837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __d out of bound"); 40937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(__f <= (__detail::_Shift<_UIntType, __w>::__value - 1), 41037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __f out of bound"); 41137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 41237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 41337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 41437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _UIntType result_type; 41537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 41637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // parameter values 41737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t word_size = __w; 41837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t state_size = __n; 41937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t shift_size = __m; 42037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t mask_bits = __r; 42137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type xor_mask = __a; 42237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t tempering_u = __u; 42337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type tempering_d = __d; 42437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t tempering_s = __s; 42537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type tempering_b = __b; 42637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t tempering_t = __t; 42737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type tempering_c = __c; 42837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t tempering_l = __l; 42937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type initialization_multiplier = __f; 43037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type default_seed = 5489u; 43137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 43237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // constructors and member function 43337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 43437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mersenne_twister_engine(result_type __sd = default_seed) 43537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__sd); } 43637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 43737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 43837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs a %mersenne_twister_engine random number generator 43937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * engine seeded from the seed sequence @p __q. 44037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 44137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __q the seed sequence. 44237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 44337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq, typename = typename 44437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::enable_if<!std::is_same<_Sseq, mersenne_twister_engine>::value> 44537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ::type> 44637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 44737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mersenne_twister_engine(_Sseq& __q) 44837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__q); } 44937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 45037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 45137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(result_type __sd = default_seed); 45237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 45337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq> 45437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename std::enable_if<std::is_class<_Sseq>::value>::type 45537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Sseq& __q); 45637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 45737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 45837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the smallest possible value in the output range. 45937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 46037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 46137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() 46237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0; }; 46337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 46437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 46537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the largest possible value in the output range. 46637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 46737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 46837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() 46937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __detail::_Shift<_UIntType, __w>::__value - 1; } 47037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 47137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 47237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Discard a sequence of random numbers. 47337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 47437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 47537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard(unsigned long long __z) 47637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 47737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh for (; __z != 0ULL; --__z) 47837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh (*this)(); 47937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 48037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 48137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 48237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(); 48337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 48437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 48537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Compares two % mersenne_twister_engine random number generator 48637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * objects of the same type for equality. 48737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 48837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A % mersenne_twister_engine random number generator 48937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 49037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another % mersenne_twister_engine random number 49137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator object. 49237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 49337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 49437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be equal, false otherwise. 49537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 49637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 49737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const mersenne_twister_engine& __lhs, 49837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const mersenne_twister_engine& __rhs) 49937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x) 50037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __lhs._M_p == __rhs._M_p); } 50137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 50237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 50337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts the current state of a % mersenne_twister_engine 50437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator engine @p __x into the output stream 50537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __os. 50637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 50737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 50837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A % mersenne_twister_engine random number generator 50937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * engine. 51037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 51137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 51237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 51337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 51437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType1, 51537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh size_t __w1, size_t __n1, 51637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh size_t __m1, size_t __r1, 51737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __a1, size_t __u1, 51837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __d1, size_t __s1, 51937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __b1, size_t __t1, 52037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __c1, size_t __l1, _UIntType1 __f1, 52137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 52237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 52337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 52437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::mersenne_twister_engine<_UIntType1, __w1, __n1, 52537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __m1, __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1, 52637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __l1, __f1>& __x); 52737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 52837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 52937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts the current state of a % mersenne_twister_engine 53037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator engine @p __x from the input stream 53137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __is. 53237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 53337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 53437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A % mersenne_twister_engine random number generator 53537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * engine. 53637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 53737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with the state of @p __x extracted or in 53837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 53937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 54037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType1, 54137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh size_t __w1, size_t __n1, 54237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh size_t __m1, size_t __r1, 54337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __a1, size_t __u1, 54437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __d1, size_t __s1, 54537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __b1, size_t __t1, 54637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __c1, size_t __l1, _UIntType1 __f1, 54737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 54837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 54937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 55037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::mersenne_twister_engine<_UIntType1, __w1, __n1, __m1, 55137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1, 55237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __l1, __f1>& __x); 55337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 55437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 55537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType _M_x[state_size]; 55637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh size_t _M_p; 55737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 55837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 55937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 56037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Compares two % mersenne_twister_engine random number generator 56137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * objects of the same type for inequality. 56237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 56337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A % mersenne_twister_engine random number generator 56437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 56537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another % mersenne_twister_engine random number 56637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator object. 56737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 56837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 56937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be different, false otherwise. 57037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 57137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType, size_t __w, 57237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh size_t __n, size_t __m, size_t __r, 57337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType __a, size_t __u, _UIntType __d, size_t __s, 57437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType __b, size_t __t, 57537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType __c, size_t __l, _UIntType __f> 57637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 57737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::mersenne_twister_engine<_UIntType, __w, __n, __m, 57837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __lhs, 57937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::mersenne_twister_engine<_UIntType, __w, __n, __m, 58037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __rhs) 58137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 58237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 58337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 58437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 58537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief The Marsaglia-Zaman generator. 58637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 58737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * This is a model of a Generalized Fibonacci discrete random number 58837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator, sometimes referred to as the SWC generator. 58937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 59037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A discrete random number generator that produces pseudorandom 59137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * numbers using: 59237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f[ 59337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * x_{i}\leftarrow(x_{i - s} - x_{i - r} - carry_{i-1}) \bmod m 59437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f] 59537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 59637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The size of the state is @f$r@f$ 59737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * and the maximum period of the generator is @f$(m^r - m^s - 1)@f$. 59837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 59937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var _M_x The state of the generator. This is a ring buffer. 60037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var _M_carry The carry. 60137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var _M_p Current index of x(i - r). 60237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 60337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType, size_t __w, size_t __s, size_t __r> 60437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class subtract_with_carry_engine 60537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 60637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_unsigned<_UIntType>::value, "template argument " 60737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "substituting _UIntType not an unsigned integral type"); 60837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(0u < __s && __s < __r, 60937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __s out of bounds"); 61037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits, 61137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __w out of bounds"); 61237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 61337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 61437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 61537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _UIntType result_type; 61637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 61737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // parameter values 61837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t word_size = __w; 61937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t short_lag = __s; 62037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t long_lag = __r; 62137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type default_seed = 19780503u; 62237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 62337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 62437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs an explicitly seeded % subtract_with_carry_engine 62537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator. 62637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 62737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 62837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry_engine(result_type __sd = default_seed) 62937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__sd); } 63037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 63137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 63237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs a %subtract_with_carry_engine random number engine 63337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * seeded from the seed sequence @p __q. 63437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 63537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __q the seed sequence. 63637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 63737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq, typename = typename 63837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::enable_if<!std::is_same<_Sseq, subtract_with_carry_engine>::value> 63937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ::type> 64037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 64137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry_engine(_Sseq& __q) 64237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__q); } 64337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 64437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 64537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Seeds the initial state @f$x_0@f$ of the random number 64637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator. 64737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 64837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * N1688[4.19] modifies this as follows. If @p __value == 0, 64937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * sets value to 19780503. In any case, with a linear 65037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * congruential generator lcg(i) having parameters @f$ m_{lcg} = 65137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 2147483563, a_{lcg} = 40014, c_{lcg} = 0, and lcg(0) = value 65237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$, sets @f$ x_{-r} \dots x_{-1} @f$ to @f$ lcg(1) \bmod m 65337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * \dots lcg(r) \bmod m @f$ respectively. If @f$ x_{-1} = 0 @f$ 65437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * set carry to 1, otherwise sets carry to 0. 65537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 65637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 65737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(result_type __sd = default_seed); 65837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 65937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 66037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Seeds the initial state @f$x_0@f$ of the 66137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * % subtract_with_carry_engine random number generator. 66237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 66337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq> 66437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename std::enable_if<std::is_class<_Sseq>::value>::type 66537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Sseq& __q); 66637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 66737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 66837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the inclusive minimum value of the range of random 66937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * integers returned by this generator. 67037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 67137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 67237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() 67337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0; } 67437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 67537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 67637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the inclusive maximum value of the range of random 67737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * integers returned by this generator. 67837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 67937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 68037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() 68137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __detail::_Shift<_UIntType, __w>::__value - 1; } 68237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 68337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 68437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Discard a sequence of random numbers. 68537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 68637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 68737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard(unsigned long long __z) 68837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 68937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh for (; __z != 0ULL; --__z) 69037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh (*this)(); 69137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 69237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 69337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 69437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the next random number in the sequence. 69537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 69637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 69737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(); 69837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 69937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 70037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Compares two % subtract_with_carry_engine random number 70137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator objects of the same type for equality. 70237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 70337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A % subtract_with_carry_engine random number generator 70437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 70537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another % subtract_with_carry_engine random number 70637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator object. 70737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 70837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 70937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be equal, false otherwise. 71037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 71137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 71237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const subtract_with_carry_engine& __lhs, 71337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const subtract_with_carry_engine& __rhs) 71437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (std::equal(__lhs._M_x, __lhs._M_x + long_lag, __rhs._M_x) 71537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __lhs._M_carry == __rhs._M_carry 71637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __lhs._M_p == __rhs._M_p); } 71737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 71837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 71937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts the current state of a % subtract_with_carry_engine 72037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator engine @p __x into the output stream 72137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __os. 72237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 72337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 72437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A % subtract_with_carry_engine random number generator 72537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * engine. 72637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 72737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 72837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 72937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 73037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1, 73137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 73237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 73337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>&, 73437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::subtract_with_carry_engine<_UIntType1, __w1, 73537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __s1, __r1>&); 73637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 73737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 73837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts the current state of a % subtract_with_carry_engine 73937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator engine @p __x from the input stream 74037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __is. 74137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 74237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 74337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A % subtract_with_carry_engine random number generator 74437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * engine. 74537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 74637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with the state of @p __x extracted or in 74737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 74837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 74937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1, 75037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 75137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 75237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>&, 75337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::subtract_with_carry_engine<_UIntType1, __w1, 75437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __s1, __r1>&); 75537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 75637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 75737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType _M_x[long_lag]; 75837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType _M_carry; 75937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh size_t _M_p; 76037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 76137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 76237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 76337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Compares two % subtract_with_carry_engine random number 76437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator objects of the same type for inequality. 76537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 76637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A % subtract_with_carry_engine random number generator 76737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 76837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another % subtract_with_carry_engine random number 76937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator object. 77037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 77137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 77237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be different, false otherwise. 77337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 77437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType, size_t __w, size_t __s, size_t __r> 77537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 77637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::subtract_with_carry_engine<_UIntType, __w, 77737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __s, __r>& __lhs, 77837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::subtract_with_carry_engine<_UIntType, __w, 77937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __s, __r>& __rhs) 78037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 78137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 78237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 78337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 78437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Produces random numbers from some base engine by discarding blocks of 78537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * data. 78637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 78737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 0 <= @p __r <= @p __p 78837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 78937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomNumberEngine, size_t __p, size_t __r> 79037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class discard_block_engine 79137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 79237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(1 <= __r && __r <= __p, 79337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __r out of bounds"); 79437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 79537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 79637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 79737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename _RandomNumberEngine::result_type result_type; 79837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 79937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // parameter values 80037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t block_size = __p; 80137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t used_block = __r; 80237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 80337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 80437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs a default %discard_block_engine engine. 80537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 80637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The underlying engine is default constructed as well. 80737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 80837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard_block_engine() 80937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(), _M_n(0) { } 81037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 81137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 81237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Copy constructs a %discard_block_engine engine. 81337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 81437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Copies an existing base class random number generator. 81537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rng An existing (base class) engine object. 81637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 81737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 81837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard_block_engine(const _RandomNumberEngine& __rng) 81937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__rng), _M_n(0) { } 82037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 82137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 82237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Move constructs a %discard_block_engine engine. 82337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 82437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Copies an existing base class random number generator. 82537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rng An existing (base class) engine object. 82637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 82737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 82837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard_block_engine(_RandomNumberEngine&& __rng) 82937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(std::move(__rng)), _M_n(0) { } 83037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 83137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 83237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Seed constructs a %discard_block_engine engine. 83337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 83437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs the underlying generator engine seeded with @p __s. 83537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __s A seed value for the base class engine. 83637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 83737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 83837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard_block_engine(result_type __s) 83937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__s), _M_n(0) { } 84037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 84137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 84237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generator construct a %discard_block_engine engine. 84337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 84437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __q A seed sequence. 84537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 84637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq, typename = typename 84737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::enable_if<!std::is_same<_Sseq, discard_block_engine>::value 84837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && !std::is_same<_Sseq, _RandomNumberEngine>::value> 84937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ::type> 85037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 85137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard_block_engine(_Sseq& __q) 85237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__q), _M_n(0) 85337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 85437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 85537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 85637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Reseeds the %discard_block_engine object with the default 85737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * seed for the underlying base class generator engine. 85837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 85937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 86037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed() 86137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 86237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b.seed(); 86337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_n = 0; 86437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 86537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 86637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 86737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Reseeds the %discard_block_engine object with the default 86837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * seed for the underlying base class generator engine. 86937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 87037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 87137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(result_type __s) 87237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 87337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b.seed(__s); 87437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_n = 0; 87537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 87637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 87737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 87837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Reseeds the %discard_block_engine object with the given seed 87937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * sequence. 88037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __q A seed generator function. 88137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 88237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq> 88337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 88437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Sseq& __q) 88537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 88637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b.seed(__q); 88737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_n = 0; 88837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 88937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 89037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 89137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets a const reference to the underlying generator engine 89237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 89337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 89437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const _RandomNumberEngine& 89537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh base() const noexcept 89637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b; } 89737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 89837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 89937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the minimum value in the generated random number range. 90037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 90137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 90237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() 90337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _RandomNumberEngine::min(); } 90437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 90537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 90637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the maximum value in the generated random number range. 90737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 90837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 90937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() 91037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _RandomNumberEngine::max(); } 91137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 91237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 91337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Discard a sequence of random numbers. 91437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 91537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 91637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard(unsigned long long __z) 91737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 91837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh for (; __z != 0ULL; --__z) 91937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh (*this)(); 92037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 92137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 92237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 92337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the next value in the generated random number sequence. 92437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 92537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 92637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(); 92737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 92837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 92937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Compares two %discard_block_engine random number generator 93037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * objects of the same type for equality. 93137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 93237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A %discard_block_engine random number generator object. 93337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another %discard_block_engine random number generator 93437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 93537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 93637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 93737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be equal, false otherwise. 93837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 93937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 94037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const discard_block_engine& __lhs, 94137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const discard_block_engine& __rhs) 94237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __lhs._M_b == __rhs._M_b && __lhs._M_n == __rhs._M_n; } 94337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 94437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 94537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts the current state of a %discard_block_engine random 94637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * number generator engine @p __x into the output stream 94737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __os. 94837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 94937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 95037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %discard_block_engine random number generator engine. 95137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 95237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 95337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 95437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 95537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomNumberEngine1, size_t __p1, size_t __r1, 95637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 95737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 95837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 95937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::discard_block_engine<_RandomNumberEngine1, 96037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __p1, __r1>& __x); 96137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 96237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 96337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts the current state of a % subtract_with_carry_engine 96437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator engine @p __x from the input stream 96537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __is. 96637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 96737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 96837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %discard_block_engine random number generator engine. 96937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 97037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with the state of @p __x extracted or in 97137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 97237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 97337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomNumberEngine1, size_t __p1, size_t __r1, 97437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 97537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 97637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 97737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::discard_block_engine<_RandomNumberEngine1, 97837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __p1, __r1>& __x); 97937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 98037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 98137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RandomNumberEngine _M_b; 98237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh size_t _M_n; 98337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 98437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 98537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 98637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Compares two %discard_block_engine random number generator 98737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * objects of the same type for inequality. 98837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 98937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A %discard_block_engine random number generator object. 99037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another %discard_block_engine random number generator 99137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 99237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 99337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 99437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be different, false otherwise. 99537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 99637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomNumberEngine, size_t __p, size_t __r> 99737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 99837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::discard_block_engine<_RandomNumberEngine, __p, 99937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __r>& __lhs, 100037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::discard_block_engine<_RandomNumberEngine, __p, 100137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __r>& __rhs) 100237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 100337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 100437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 100537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 100637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Produces random numbers by combining random numbers from some base 100737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * engine to produce random numbers with a specifies number of bits @p __w. 100837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 100937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomNumberEngine, size_t __w, typename _UIntType> 101037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class independent_bits_engine 101137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 101237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_unsigned<_UIntType>::value, "template argument " 101337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "substituting _UIntType not an unsigned integral type"); 101437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits, 101537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument substituting __w out of bounds"); 101637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 101737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 101837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 101937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _UIntType result_type; 102037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 102137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 102237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs a default %independent_bits_engine engine. 102337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 102437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The underlying engine is default constructed as well. 102537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 102637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh independent_bits_engine() 102737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b() { } 102837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 102937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 103037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Copy constructs a %independent_bits_engine engine. 103137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 103237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Copies an existing base class random number generator. 103337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rng An existing (base class) engine object. 103437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 103537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 103637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh independent_bits_engine(const _RandomNumberEngine& __rng) 103737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__rng) { } 103837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 103937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 104037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Move constructs a %independent_bits_engine engine. 104137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 104237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Copies an existing base class random number generator. 104337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rng An existing (base class) engine object. 104437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 104537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 104637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh independent_bits_engine(_RandomNumberEngine&& __rng) 104737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(std::move(__rng)) { } 104837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 104937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 105037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Seed constructs a %independent_bits_engine engine. 105137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 105237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs the underlying generator engine seeded with @p __s. 105337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __s A seed value for the base class engine. 105437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 105537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 105637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh independent_bits_engine(result_type __s) 105737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__s) { } 105837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 105937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 106037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generator construct a %independent_bits_engine engine. 106137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 106237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __q A seed sequence. 106337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 106437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq, typename = typename 106537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::enable_if<!std::is_same<_Sseq, independent_bits_engine>::value 106637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && !std::is_same<_Sseq, _RandomNumberEngine>::value> 106737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ::type> 106837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 106937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh independent_bits_engine(_Sseq& __q) 107037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__q) 107137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 107237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 107337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 107437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Reseeds the %independent_bits_engine object with the default 107537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * seed for the underlying base class generator engine. 107637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 107737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 107837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed() 107937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_b.seed(); } 108037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 108137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 108237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Reseeds the %independent_bits_engine object with the default 108337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * seed for the underlying base class generator engine. 108437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 108537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 108637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(result_type __s) 108737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_b.seed(__s); } 108837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 108937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 109037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Reseeds the %independent_bits_engine object with the given 109137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * seed sequence. 109237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __q A seed generator function. 109337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 109437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq> 109537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 109637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Sseq& __q) 109737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_b.seed(__q); } 109837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 109937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 110037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets a const reference to the underlying generator engine 110137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 110237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 110337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const _RandomNumberEngine& 110437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh base() const noexcept 110537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b; } 110637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 110737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 110837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the minimum value in the generated random number range. 110937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 111037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 111137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() 111237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0U; } 111337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 111437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 111537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the maximum value in the generated random number range. 111637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 111737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 111837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() 111937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __detail::_Shift<_UIntType, __w>::__value - 1; } 112037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 112137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 112237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Discard a sequence of random numbers. 112337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 112437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 112537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard(unsigned long long __z) 112637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 112737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh for (; __z != 0ULL; --__z) 112837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh (*this)(); 112937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 113037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 113137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 113237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Gets the next value in the generated random number sequence. 113337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 113437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 113537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(); 113637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 113737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 113837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Compares two %independent_bits_engine random number generator 113937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * objects of the same type for equality. 114037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 114137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A %independent_bits_engine random number generator 114237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 114337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another %independent_bits_engine random number generator 114437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 114537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 114637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 114737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be equal, false otherwise. 114837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 114937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 115037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const independent_bits_engine& __lhs, 115137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const independent_bits_engine& __rhs) 115237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __lhs._M_b == __rhs._M_b; } 115337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 115437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 115537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts the current state of a % subtract_with_carry_engine 115637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator engine @p __x from the input stream 115737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __is. 115837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 115937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 116037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %independent_bits_engine random number generator 116137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * engine. 116237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 116337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with the state of @p __x extracted or in 116437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 116537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 116637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _CharT, typename _Traits> 116737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 116837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 116937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::independent_bits_engine<_RandomNumberEngine, 117037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __w, _UIntType>& __x) 117137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 117237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __is >> __x._M_b; 117337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __is; 117437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 117537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 117637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 117737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RandomNumberEngine _M_b; 117837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 117937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 118037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 118137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Compares two %independent_bits_engine random number generator 118237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * objects of the same type for inequality. 118337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 118437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A %independent_bits_engine random number generator 118537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 118637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another %independent_bits_engine random number generator 118737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 118837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 118937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 119037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be different, false otherwise. 119137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 119237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomNumberEngine, size_t __w, typename _UIntType> 119337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 119437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::independent_bits_engine<_RandomNumberEngine, __w, 119537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType>& __lhs, 119637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::independent_bits_engine<_RandomNumberEngine, __w, 119737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType>& __rhs) 119837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 119937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 120037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 120137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts the current state of a %independent_bits_engine random 120237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * number generator engine @p __x into the output stream @p __os. 120337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 120437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 120537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %independent_bits_engine random number generator engine. 120637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 120737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 120837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 120937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 121037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomNumberEngine, size_t __w, typename _UIntType, 121137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 121237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_ostream<_CharT, _Traits>& 121337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 121437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::independent_bits_engine<_RandomNumberEngine, 121537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __w, _UIntType>& __x) 121637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 121737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __os << __x.base(); 121837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __os; 121937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 122037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 122137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 122237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 122337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Produces random numbers by combining random numbers from some 122437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * base engine to produce random numbers with a specifies number of bits 122537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __w. 122637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 122737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomNumberEngine, size_t __k> 122837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class shuffle_order_engine 122937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 123037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(1u <= __k, "template argument substituting " 123137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "__k out of bound"); 123237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 123337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 123437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 123537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename _RandomNumberEngine::result_type result_type; 123637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 123737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr size_t table_size = __k; 123837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 123937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 124037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs a default %shuffle_order_engine engine. 124137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 124237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The underlying engine is default constructed as well. 124337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 124437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh shuffle_order_engine() 124537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b() 124637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_initialize(); } 124737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 124837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 124937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Copy constructs a %shuffle_order_engine engine. 125037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 125137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Copies an existing base class random number generator. 125237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rng An existing (base class) engine object. 125337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 125437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 125537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh shuffle_order_engine(const _RandomNumberEngine& __rng) 125637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__rng) 125737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_initialize(); } 125837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 125937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 126037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Move constructs a %shuffle_order_engine engine. 126137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 126237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Copies an existing base class random number generator. 126337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rng An existing (base class) engine object. 126437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 126537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 126637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh shuffle_order_engine(_RandomNumberEngine&& __rng) 126737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(std::move(__rng)) 126837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_initialize(); } 126937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 127037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 127137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Seed constructs a %shuffle_order_engine engine. 127237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 127337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs the underlying generator engine seeded with @p __s. 127437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __s A seed value for the base class engine. 127537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 127637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 127737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh shuffle_order_engine(result_type __s) 127837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__s) 127937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_initialize(); } 128037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 128137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 128237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generator construct a %shuffle_order_engine engine. 128337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 128437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __q A seed sequence. 128537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 128637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq, typename = typename 128737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::enable_if<!std::is_same<_Sseq, shuffle_order_engine>::value 128837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && !std::is_same<_Sseq, _RandomNumberEngine>::value> 128937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ::type> 129037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 129137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh shuffle_order_engine(_Sseq& __q) 129237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__q) 129337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_initialize(); } 129437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 129537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 129637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Reseeds the %shuffle_order_engine object with the default seed 129737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh for the underlying base class generator engine. 129837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 129937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 130037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed() 130137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 130237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b.seed(); 130337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 130437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 130537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 130637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 130737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Reseeds the %shuffle_order_engine object with the default seed 130837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * for the underlying base class generator engine. 130937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 131037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 131137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(result_type __s) 131237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 131337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b.seed(__s); 131437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 131537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 131637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 131737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 131837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Reseeds the %shuffle_order_engine object with the given seed 131937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * sequence. 132037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __q A seed generator function. 132137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 132237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Sseq> 132337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 132437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Sseq& __q) 132537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 132637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b.seed(__q); 132737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 132837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 132937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 133037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 133137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets a const reference to the underlying generator engine object. 133237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 133337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const _RandomNumberEngine& 133437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh base() const noexcept 133537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b; } 133637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 133737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 133837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the minimum value in the generated random number range. 133937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 134037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 134137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() 134237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _RandomNumberEngine::min(); } 134337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 134437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 134537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the maximum value in the generated random number range. 134637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 134737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 134837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() 134937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _RandomNumberEngine::max(); } 135037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 135137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 135237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Discard a sequence of random numbers. 135337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 135437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 135537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard(unsigned long long __z) 135637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 135737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh for (; __z != 0ULL; --__z) 135837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh (*this)(); 135937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 136037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 136137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 136237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the next value in the generated random number sequence. 136337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 136437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 136537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(); 136637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 136737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 136837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two %shuffle_order_engine random number generator objects 136937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * of the same type for equality. 137037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 137137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A %shuffle_order_engine random number generator object. 137237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another %shuffle_order_engine random number generator 137337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 137437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 137537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 137637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be equal, false otherwise. 137737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 137837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 137937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const shuffle_order_engine& __lhs, 138037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const shuffle_order_engine& __rhs) 138137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (__lhs._M_b == __rhs._M_b 138237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && std::equal(__lhs._M_v, __lhs._M_v + __k, __rhs._M_v) 138337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __lhs._M_y == __rhs._M_y); } 138437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 138537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 138637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts the current state of a %shuffle_order_engine random 138737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * number generator engine @p __x into the output stream 138837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh @p __os. 138937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 139037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 139137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %shuffle_order_engine random number generator engine. 139237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 139337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 139437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 139537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 139637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomNumberEngine1, size_t __k1, 139737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 139837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 139937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 140037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::shuffle_order_engine<_RandomNumberEngine1, 140137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __k1>& __x); 140237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 140337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 140437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts the current state of a % subtract_with_carry_engine 140537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator engine @p __x from the input stream 140637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __is. 140737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 140837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 140937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %shuffle_order_engine random number generator engine. 141037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 141137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with the state of @p __x extracted or in 141237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 141337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 141437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomNumberEngine1, size_t __k1, 141537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 141637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 141737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 141837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::shuffle_order_engine<_RandomNumberEngine1, __k1>& __x); 141937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 142037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 142137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void _M_initialize() 142237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 142337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh for (size_t __i = 0; __i < __k; ++__i) 142437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_v[__i] = _M_b(); 142537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_y = _M_b(); 142637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 142737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 142837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RandomNumberEngine _M_b; 142937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type _M_v[__k]; 143037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type _M_y; 143137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 143237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 143337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 143437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two %shuffle_order_engine random number generator objects 143537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * of the same type for inequality. 143637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 143737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A %shuffle_order_engine random number generator object. 143837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another %shuffle_order_engine random number generator 143937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 144037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 144137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the infinite sequences of generated values 144237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * would be different, false otherwise. 144337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 144437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomNumberEngine, size_t __k> 144537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 144637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::shuffle_order_engine<_RandomNumberEngine, 144737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __k>& __lhs, 144837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::shuffle_order_engine<_RandomNumberEngine, 144937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __k>& __rhs) 145037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 145137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 145237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 145337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 145437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller. 145537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 145637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef linear_congruential_engine<uint_fast32_t, 16807UL, 0UL, 2147483647UL> 145737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh minstd_rand0; 145837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 145937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 146037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * An alternative LCR (Lehmer Generator function). 146137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 146237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef linear_congruential_engine<uint_fast32_t, 48271UL, 0UL, 2147483647UL> 146337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh minstd_rand; 146437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 146537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 146637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The classic Mersenne Twister. 146737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 146837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Reference: 146937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * M. Matsumoto and T. Nishimura, Mersenne Twister: A 623-Dimensionally 147037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Equidistributed Uniform Pseudo-Random Number Generator, ACM Transactions 147137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30. 147237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 147337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef mersenne_twister_engine< 147437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh uint_fast32_t, 147537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 32, 624, 397, 31, 147637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 0x9908b0dfUL, 11, 147737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 0xffffffffUL, 7, 147837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 0x9d2c5680UL, 15, 147937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 0xefc60000UL, 18, 1812433253UL> mt19937; 148037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 148137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 148237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * An alternative Mersenne Twister. 148337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 148437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef mersenne_twister_engine< 148537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh uint_fast64_t, 148637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 64, 312, 156, 31, 148737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 0xb5026f5aa96619e9ULL, 29, 148837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 0x5555555555555555ULL, 17, 148937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 0x71d67fffeda60000ULL, 37, 149037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 0xfff7eee000000000ULL, 43, 149137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 6364136223846793005ULL> mt19937_64; 149237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 149337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> 149437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ranlux24_base; 149537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 149637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> 149737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ranlux48_base; 149837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 149937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; 150037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 150137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; 150237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 150337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef shuffle_order_engine<minstd_rand0, 256> knuth_b; 150437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 150537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef minstd_rand0 default_random_engine; 150637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 150737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 150837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A standard interface to a platform-specific non-deterministic 150937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator (if any are available). 151037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 151137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class random_device 151237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 151337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 151437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 151537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef unsigned int result_type; 151637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 151737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // constructors, destructors and member functions 151837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 151937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1 152037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 152137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 152237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh random_device(const std::string& __token = "/dev/urandom") 152337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 152437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if ((__token != "/dev/urandom" && __token != "/dev/random") 152537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh || !(_M_file = std::fopen(__token.c_str(), "rb"))) 152637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::__throw_runtime_error(__N("random_device::" 152737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "random_device(const std::string&)")); 152837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 152937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 153037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ~random_device() 153137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { std::fclose(_M_file); } 153237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 153337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else 153437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 153537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 153637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh random_device(const std::string& __token = "mt19937") 153737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_mt(_M_strtoul(__token)) { } 153837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 153937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 154037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static unsigned long 154137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_strtoul(const std::string& __str) 154237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 154337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh unsigned long __ret = 5489UL; 154437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (__str != "mt19937") 154537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 154637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const char* __nptr = __str.c_str(); 154737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh char* __endptr; 154837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __ret = std::strtoul(__nptr, &__endptr, 0); 154937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (*__nptr == '\0' || *__endptr != '\0') 155037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::__throw_runtime_error(__N("random_device::_M_strtoul" 155137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "(const std::string&)")); 155237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 155337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __ret; 155437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 155537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 155637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 155737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 155837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 155937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 156037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 156137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() 156237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::min(); } 156337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 156437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static constexpr result_type 156537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() 156637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 156737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 156837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 156937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh entropy() const noexcept 157037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0.0; } 157137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 157237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 157337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()() 157437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 157537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1 157637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type __ret; 157737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type), 157837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 1, _M_file); 157937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __ret; 158037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else 158137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_mt(); 158237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 158337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 158437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 158537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // No copy functions. 158637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh random_device(const random_device&) = delete; 158737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void operator=(const random_device&) = delete; 158837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 158937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 159037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 159137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1 159237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh FILE* _M_file; 159337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else 159437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mt19937 _M_mt; 159537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 159637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 159737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 159837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group random_generators 159937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 160037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 160137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup random_distributions Random Number Distributions 160237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup random 160337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 160437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 160537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 160637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 160737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup random_distributions_uniform Uniform Distributions 160837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup random_distributions 160937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 161037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 161137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 161237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 161337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Uniform discrete distribution for random numbers. 161437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A discrete random distribution on the range @f$[min, max]@f$ with equal 161537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * probability throughout the range. 161637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 161737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType = int> 161837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class uniform_int_distribution 161937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 162037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_integral<_IntType>::value, 162137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not an integral type"); 162237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 162337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 162437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 162537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType result_type; 162637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 162737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 162837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 162937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef uniform_int_distribution<_IntType> distribution_type; 163037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 163137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 163237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_IntType __a = 0, 163337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType __b = std::numeric_limits<_IntType>::max()) 163437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_a(__a), _M_b(__b) 163537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 163637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b); 163737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 163837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 163937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 164037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh a() const 164137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_a; } 164237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 164337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 164437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh b() const 164537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b; } 164637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 164737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 164837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 164937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 165037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 165137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 165237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType _M_a; 165337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType _M_b; 165437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 165537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 165637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 165737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 165837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs a uniform distribution object. 165937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 166037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 166137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh uniform_int_distribution(_IntType __a = 0, 166237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType __b = std::numeric_limits<_IntType>::max()) 166337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__a, __b) 166437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 166537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 166637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 166737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh uniform_int_distribution(const param_type& __p) 166837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 166937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 167037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 167137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 167237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 167337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 167437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Does nothing for the uniform integer distribution. 167537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 167637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 167737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() { } 167837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 167937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 168037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh a() const 168137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.a(); } 168237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 168337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 168437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh b() const 168537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.b(); } 168637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 168737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 168837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 168937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 169037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 169137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 169237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 169337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 169437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 169537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 169637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 169737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 169837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 169937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 170037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 170137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 170237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 170337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the inclusive lower bound of the distribution range. 170437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 170537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 170637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 170737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->a(); } 170837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 170937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 171037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the inclusive upper bound of the distribution range. 171137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 171237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 171337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 171437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->b(); } 171537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 171637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 171737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 171837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 171937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 172037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 172137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 172237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 172337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 172437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 172537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 172637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 172737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 172837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 172937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 173037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 173137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 173237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 173337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two uniform integer distributions have 173437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters. 173537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 173637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 173737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 173837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::uniform_int_distribution<_IntType>& __d1, 173937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::uniform_int_distribution<_IntType>& __d2) 174037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 174137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 174237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 174337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two uniform integer distributions have 174437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * different parameters. 174537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 174637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 174737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 174837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::uniform_int_distribution<_IntType>& __d1, 174937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::uniform_int_distribution<_IntType>& __d2) 175037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 175137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 175237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 175337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %uniform_int_distribution random number 175437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution @p __x into the output stream @p os. 175537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 175637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 175737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %uniform_int_distribution random number distribution. 175837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 175937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 176037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 176137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 176237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType, typename _CharT, typename _Traits> 176337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_ostream<_CharT, _Traits>& 176437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>&, 176537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::uniform_int_distribution<_IntType>&); 176637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 176737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 176837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %uniform_int_distribution random number distribution 176937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 177037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 177137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 177237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %uniform_int_distribution random number generator engine. 177337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 177437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 177537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 177637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType, typename _CharT, typename _Traits> 177737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_istream<_CharT, _Traits>& 177837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>&, 177937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::uniform_int_distribution<_IntType>&); 178037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 178137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 178237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 178337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Uniform continuous distribution for random numbers. 178437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 178537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A continuous random distribution on the range [min, max) with equal 178637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * probability throughout the range. The URNG should be real-valued and 178737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * deliver number in the range [0, 1). 178837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 178937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 179037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class uniform_real_distribution 179137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 179237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 179337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 179437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 179537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 179637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 179737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 179837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 179937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 180037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 180137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef uniform_real_distribution<_RealType> distribution_type; 180237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 180337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 180437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_RealType __a = _RealType(0), 180537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __b = _RealType(1)) 180637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_a(__a), _M_b(__b) 180737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 180837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b); 180937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 181037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 181137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 181237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh a() const 181337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_a; } 181437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 181537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 181637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh b() const 181737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b; } 181837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 181937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 182037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 182137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 182237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 182337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 182437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_a; 182537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_b; 182637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 182737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 182837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 182937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 183037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs a uniform_real_distribution object. 183137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 183237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __a [IN] The lower bound of the distribution. 183337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __b [IN] The upper bound of the distribution. 183437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 183537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 183637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh uniform_real_distribution(_RealType __a = _RealType(0), 183737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __b = _RealType(1)) 183837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__a, __b) 183937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 184037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 184137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 184237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh uniform_real_distribution(const param_type& __p) 184337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 184437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 184537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 184637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 184737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 184837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 184937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Does nothing for the uniform real distribution. 185037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 185137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 185237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() { } 185337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 185437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 185537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh a() const 185637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.a(); } 185737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 185837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 185937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh b() const 186037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.b(); } 186137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 186237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 186337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 186437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 186537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 186637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 186737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 186837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 186937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 187037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 187137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 187237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 187337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 187437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 187537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 187637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 187737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 187837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the inclusive lower bound of the distribution range. 187937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 188037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 188137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 188237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->a(); } 188337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 188437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 188537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the inclusive upper bound of the distribution range. 188637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 188737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 188837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 188937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->b(); } 189037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 189137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 189237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 189337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 189437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 189537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 189637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 189737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 189837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 189937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 190037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 190137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 190237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p) 190337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 190437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> 190537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __aurng(__urng); 190637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return (__aurng() * (__p.b() - __p.a())) + __p.a(); 190737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 190837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 190937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 191037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 191137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 191237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 191337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 191437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two uniform real distributions have 191537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters. 191637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 191737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 191837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 191937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::uniform_real_distribution<_IntType>& __d1, 192037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::uniform_real_distribution<_IntType>& __d2) 192137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 192237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 192337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 192437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two uniform real distributions have 192537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * different parameters. 192637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 192737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 192837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 192937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::uniform_real_distribution<_IntType>& __d1, 193037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::uniform_real_distribution<_IntType>& __d2) 193137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 193237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 193337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 193437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %uniform_real_distribution random number 193537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution @p __x into the output stream @p __os. 193637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 193737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 193837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %uniform_real_distribution random number distribution. 193937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 194037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 194137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 194237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 194337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 194437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_ostream<_CharT, _Traits>& 194537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>&, 194637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::uniform_real_distribution<_RealType>&); 194737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 194837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 194937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %uniform_real_distribution random number distribution 195037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 195137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 195237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 195337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %uniform_real_distribution random number generator engine. 195437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 195537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 195637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 195737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 195837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_istream<_CharT, _Traits>& 195937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>&, 196037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::uniform_real_distribution<_RealType>&); 196137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 196237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group random_distributions_uniform 196337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 196437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 196537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup random_distributions_normal Normal Distributions 196637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup random_distributions 196737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 196837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 196937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 197037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 197137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A normal continuous distribution for random numbers. 197237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 197337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the normal probability density function is 197437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f[ 197537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * p(x|\mu,\sigma) = \frac{1}{\sigma \sqrt{2 \pi}} 197637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * e^{- \frac{{x - \mu}^ {2}}{2 \sigma ^ {2}} } 197737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f] 197837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 197937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 198037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class normal_distribution 198137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 198237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 198337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 198437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 198537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 198637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 198737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 198837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 198937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 199037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 199137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef normal_distribution<_RealType> distribution_type; 199237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 199337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 199437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_RealType __mean = _RealType(0), 199537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __stddev = _RealType(1)) 199637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_mean(__mean), _M_stddev(__stddev) 199737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 199837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_stddev > _RealType(0)); 199937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 200037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 200137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 200237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mean() const 200337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_mean; } 200437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 200537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 200637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh stddev() const 200737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_stddev; } 200837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 200937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 201037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 201137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (__p1._M_mean == __p2._M_mean 201237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __p1._M_stddev == __p2._M_stddev); } 201337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 201437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 201537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_mean; 201637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_stddev; 201737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 201837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 201937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 202037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 202137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a normal distribution with parameters @f$mean@f$ and 202237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * standard deviation. 202337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 202437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 202537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh normal_distribution(result_type __mean = result_type(0), 202637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type __stddev = result_type(1)) 202737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__mean, __stddev), _M_saved_available(false) 202837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 202937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 203037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 203137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh normal_distribution(const param_type& __p) 203237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p), _M_saved_available(false) 203337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 203437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 203537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 203637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 203737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 203837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 203937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 204037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_saved_available = false; } 204137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 204237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 204337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the mean of the distribution. 204437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 204537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 204637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mean() const 204737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.mean(); } 204837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 204937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 205037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the standard deviation of the distribution. 205137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 205237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 205337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh stddev() const 205437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.stddev(); } 205537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 205637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 205737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 205837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 205937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 206037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 206137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 206237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 206337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 206437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 206537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 206637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 206737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 206837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 206937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 207037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 207137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 207237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 207337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 207437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 207537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 207637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::min(); } 207737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 207837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 207937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 208037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 208137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 208237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 208337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 208437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 208537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 208637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 208737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 208837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 208937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 209037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 209137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 209237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 209337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 209437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 209537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 209637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 209737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 209837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 209937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two normal distributions have 210037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters and the sequences that would 210137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * be generated are equal. 210237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 210337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1> 210437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 210537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::normal_distribution<_RealType1>& __d1, 210637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::normal_distribution<_RealType1>& __d2); 210737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 210837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 210937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %normal_distribution random number distribution 211037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 211137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 211237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 211337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %normal_distribution random number distribution. 211437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 211537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 211637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 211737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 211837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 211937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 212037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 212137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::normal_distribution<_RealType1>& __x); 212237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 212337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 212437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %normal_distribution random number distribution 212537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 212637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 212737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 212837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %normal_distribution random number generator engine. 212937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 213037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error 213137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * state. 213237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 213337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 213437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 213537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 213637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::normal_distribution<_RealType1>& __x); 213737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 213837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 213937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 214037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type _M_saved; 214137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh bool _M_saved_available; 214237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 214337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 214437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 214537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two normal distributions are different. 214637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 214737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 214837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 214937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::normal_distribution<_RealType>& __d1, 215037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::normal_distribution<_RealType>& __d2) 215137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 215237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 215337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 215437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 215537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A lognormal_distribution random number distribution. 215637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 215737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the normal probability mass function is 215837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f[ 215937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * p(x|m,s) = \frac{1}{sx\sqrt{2\pi}} 216037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * \exp{-\frac{(\ln{x} - m)^2}{2s^2}} 216137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f] 216237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 216337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 216437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class lognormal_distribution 216537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 216637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 216737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 216837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 216937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 217037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 217137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 217237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 217337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 217437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 217537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef lognormal_distribution<_RealType> distribution_type; 217637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 217737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 217837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_RealType __m = _RealType(0), 217937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __s = _RealType(1)) 218037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_m(__m), _M_s(__s) 218137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 218237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 218337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 218437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh m() const 218537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_m; } 218637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 218737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 218837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh s() const 218937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_s; } 219037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 219137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 219237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 219337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_m == __p2._M_m && __p1._M_s == __p2._M_s; } 219437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 219537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 219637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_m; 219737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_s; 219837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 219937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 220037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 220137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh lognormal_distribution(_RealType __m = _RealType(0), 220237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __s = _RealType(1)) 220337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__m, __s), _M_nd() 220437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 220537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 220637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 220737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh lognormal_distribution(const param_type& __p) 220837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p), _M_nd() 220937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 221037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 221137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 221237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Resets the distribution state. 221337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 221437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 221537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 221637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_nd.reset(); } 221737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 221837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 221937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 222037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 222137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 222237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh m() const 222337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.m(); } 222437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 222537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 222637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh s() const 222737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.s(); } 222837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 222937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 223037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 223137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 223237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 223337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 223437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 223537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 223637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 223737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 223837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 223937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 224037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 224137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 224237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 224337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 224437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 224537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 224637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 224737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 224837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 224937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return result_type(0); } 225037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 225137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 225237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 225337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 225437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 225537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 225637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 225737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 225837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 225937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 226037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 226137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 226237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 226337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 226437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 226537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 226637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 226737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 226837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 226937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p) 227037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::exp(__p.s() * _M_nd(__urng) + __p.m()); } 227137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 227237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 227337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two lognormal distributions have 227437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters and the sequences that would 227537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * be generated are equal. 227637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 227737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 227837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const lognormal_distribution& __d1, 227937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const lognormal_distribution& __d2) 228037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (__d1.param() == __d2.param() 228137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __d1._M_nd == __d2._M_nd); } 228237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 228337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 228437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %lognormal_distribution random number distribution 228537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 228637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 228737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 228837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %lognormal_distribution random number distribution. 228937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 229037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 229137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 229237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 229337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 229437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 229537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 229637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::lognormal_distribution<_RealType1>& __x); 229737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 229837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 229937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %lognormal_distribution random number distribution 230037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 230137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 230237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 230337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %lognormal_distribution random number 230437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 230537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 230637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 230737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 230837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 230937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 231037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 231137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::lognormal_distribution<_RealType1>& __x); 231237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 231337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 231437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 231537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 231637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::normal_distribution<result_type> _M_nd; 231737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 231837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 231937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 232037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two lognormal distributions are different. 232137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 232237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 232337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 232437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::lognormal_distribution<_RealType>& __d1, 232537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::lognormal_distribution<_RealType>& __d2) 232637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 232737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 232837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 232937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 233037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A gamma continuous distribution for random numbers. 233137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 233237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the gamma probability density function is: 233337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f[ 233437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * p(x|\alpha,\beta) = \frac{1}{\beta\Gamma(\alpha)} 233537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * (x/\beta)^{\alpha - 1} e^{-x/\beta} 233637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f] 233737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 233837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 233937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class gamma_distribution 234037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 234137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 234237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 234337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 234437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 234537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 234637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 234737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 234837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 234937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 235037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef gamma_distribution<_RealType> distribution_type; 235137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend class gamma_distribution<_RealType>; 235237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 235337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 235437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_RealType __alpha_val = _RealType(1), 235537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __beta_val = _RealType(1)) 235637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_alpha(__alpha_val), _M_beta(__beta_val) 235737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 235837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_alpha > _RealType(0)); 235937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 236037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 236137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 236237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 236337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh alpha() const 236437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_alpha; } 236537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 236637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 236737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh beta() const 236837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_beta; } 236937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 237037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 237137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 237237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (__p1._M_alpha == __p2._M_alpha 237337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __p1._M_beta == __p2._M_beta); } 237437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 237537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 237637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 237737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 237837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 237937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_alpha; 238037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_beta; 238137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 238237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_malpha, _M_a2; 238337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 238437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 238537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 238637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 238737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs a gamma distribution with parameters 238837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$\alpha@f$ and @f$\beta@f$. 238937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 239037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 239137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh gamma_distribution(_RealType __alpha_val = _RealType(1), 239237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __beta_val = _RealType(1)) 239337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__alpha_val, __beta_val), _M_nd() 239437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 239537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 239637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 239737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh gamma_distribution(const param_type& __p) 239837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p), _M_nd() 239937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 240037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 240137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 240237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 240337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 240437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 240537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 240637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_nd.reset(); } 240737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 240837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 240937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the @f$\alpha@f$ of the distribution. 241037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 241137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 241237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh alpha() const 241337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.alpha(); } 241437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 241537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 241637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the @f$\beta@f$ of the distribution. 241737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 241837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 241937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh beta() const 242037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.beta(); } 242137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 242237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 242337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 242437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 242537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 242637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 242737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 242837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 242937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 243037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 243137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 243237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 243337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 243437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 243537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 243637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 243737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 243837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 243937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 244037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 244137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 244237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return result_type(0); } 244337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 244437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 244537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 244637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 244737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 244837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 244937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 245037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 245137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 245237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 245337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 245437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 245537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 245637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 245737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 245837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 245937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 246037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 246137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 246237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 246337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 246437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 246537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two gamma distributions have the same 246637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters and the sequences that would be generated 246737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * are equal. 246837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 246937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 247037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const gamma_distribution& __d1, 247137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const gamma_distribution& __d2) 247237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (__d1.param() == __d2.param() 247337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __d1._M_nd == __d2._M_nd); } 247437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 247537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 247637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %gamma_distribution random number distribution 247737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 247837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 247937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 248037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %gamma_distribution random number distribution. 248137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 248237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 248337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 248437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 248537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 248637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 248737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 248837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::gamma_distribution<_RealType1>& __x); 248937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 249037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 249137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %gamma_distribution random number distribution 249237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 249337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 249437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 249537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %gamma_distribution random number generator engine. 249637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 249737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 249837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 249937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 250037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 250137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 250237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::gamma_distribution<_RealType1>& __x); 250337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 250437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 250537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 250637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 250737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::normal_distribution<result_type> _M_nd; 250837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 250937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 251037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 251137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two gamma distributions are different. 251237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 251337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 251437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 251537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::gamma_distribution<_RealType>& __d1, 251637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::gamma_distribution<_RealType>& __d2) 251737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 251837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 251937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 252037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 252137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A chi_squared_distribution random number distribution. 252237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 252337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the normal probability mass function is 252437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$p(x|n) = \frac{x^{(n/2) - 1}e^{-x/2}}{\Gamma(n/2) 2^{n/2}}@f$ 252537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 252637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 252737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class chi_squared_distribution 252837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 252937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 253037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 253137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 253237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 253337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 253437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 253537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 253637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 253737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 253837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef chi_squared_distribution<_RealType> distribution_type; 253937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 254037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 254137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_RealType __n = _RealType(1)) 254237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_n(__n) 254337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 254437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 254537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 254637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh n() const 254737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_n; } 254837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 254937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 255037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 255137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_n == __p2._M_n; } 255237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 255337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 255437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_n; 255537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 255637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 255737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 255837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh chi_squared_distribution(_RealType __n = _RealType(1)) 255937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__n), _M_gd(__n / 2) 256037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 256137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 256237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 256337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh chi_squared_distribution(const param_type& __p) 256437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p), _M_gd(__p.n() / 2) 256537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 256637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 256737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 256837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 256937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 257037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 257137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 257237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_gd.reset(); } 257337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 257437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 257537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 257637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 257737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 257837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh n() const 257937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.n(); } 258037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 258137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 258237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 258337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 258437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 258537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 258637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 258737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 258837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 258937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 259037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 259137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 259237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 259337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 259437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 259537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 259637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 259737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 259837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 259937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 260037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 260137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return result_type(0); } 260237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 260337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 260437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 260537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 260637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 260737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 260837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 260937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 261037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 261137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 261237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 261337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 261437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 261537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 261637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 2 * _M_gd(__urng); } 261737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 261837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 261937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 262037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 262137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p) 262237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 262337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename std::gamma_distribution<result_type>::param_type 262437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type; 262537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return 2 * _M_gd(__urng, param_type(__p.n() / 2)); 262637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 262737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 262837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 262937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Chi-squared distributions have 263037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters and the sequences that would be 263137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generated are equal. 263237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 263337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 263437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const chi_squared_distribution& __d1, 263537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const chi_squared_distribution& __d2) 263637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param() && __d1._M_gd == __d2._M_gd; } 263737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 263837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 263937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %chi_squared_distribution random number distribution 264037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 264137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 264237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 264337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %chi_squared_distribution random number distribution. 264437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 264537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 264637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 264737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 264837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 264937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 265037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 265137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::chi_squared_distribution<_RealType1>& __x); 265237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 265337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 265437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %chi_squared_distribution random number distribution 265537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 265637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 265737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 265837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %chi_squared_distribution random number 265937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 266037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 266137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 266237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 266337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 266437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 266537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 266637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::chi_squared_distribution<_RealType1>& __x); 266737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 266837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 266937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 267037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 267137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::gamma_distribution<result_type> _M_gd; 267237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 267337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 267437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 267537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Chi-squared distributions are different. 267637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 267737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 267837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 267937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::chi_squared_distribution<_RealType>& __d1, 268037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::chi_squared_distribution<_RealType>& __d2) 268137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 268237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 268337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 268437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 268537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A cauchy_distribution random number distribution. 268637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 268737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the normal probability mass function is 268837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$p(x|a,b) = (\pi b (1 + (\frac{x-a}{b})^2))^{-1}@f$ 268937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 269037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 269137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class cauchy_distribution 269237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 269337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 269437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 269537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 269637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 269737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 269837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 269937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 270037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 270137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 270237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef cauchy_distribution<_RealType> distribution_type; 270337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 270437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 270537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_RealType __a = _RealType(0), 270637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __b = _RealType(1)) 270737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_a(__a), _M_b(__b) 270837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 270937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 271037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 271137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh a() const 271237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_a; } 271337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 271437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 271537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh b() const 271637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b; } 271737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 271837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 271937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 272037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 272137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 272237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 272337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_a; 272437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_b; 272537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 272637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 272737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 272837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh cauchy_distribution(_RealType __a = _RealType(0), 272937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __b = _RealType(1)) 273037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__a, __b) 273137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 273237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 273337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 273437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh cauchy_distribution(const param_type& __p) 273537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 273637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 273737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 273837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 273937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 274037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 274137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 274237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 274337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 274437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 274537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 274637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 274737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 274837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 274937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh a() const 275037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.a(); } 275137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 275237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 275337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh b() const 275437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.b(); } 275537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 275637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 275737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 275837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 275937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 276037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 276137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 276237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 276337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 276437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 276537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 276637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 276737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 276837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 276937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 277037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 277137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 277237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 277337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 277437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 277537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 277637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::min(); } 277737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 277837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 277937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 278037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 278137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 278237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 278337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 278437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 278537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 278637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 278737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 278837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 278937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 279037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 279137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 279237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 279337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 279437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 279537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 279637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 279737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 279837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 279937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 280037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 280137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 280237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 280337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Cauchy distributions have 280437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters. 280537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 280637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 280737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 280837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::cauchy_distribution<_RealType>& __d1, 280937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::cauchy_distribution<_RealType>& __d2) 281037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 281137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 281237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 281337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Cauchy distributions have 281437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * different parameters. 281537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 281637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 281737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 281837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::cauchy_distribution<_RealType>& __d1, 281937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::cauchy_distribution<_RealType>& __d2) 282037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 282137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 282237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 282337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %cauchy_distribution random number distribution 282437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 282537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 282637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 282737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %cauchy_distribution random number distribution. 282837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 282937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 283037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 283137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 283237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 283337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_ostream<_CharT, _Traits>& 283437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 283537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::cauchy_distribution<_RealType>& __x); 283637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 283737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 283837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %cauchy_distribution random number distribution 283937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 284037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 284137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 284237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %cauchy_distribution random number 284337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 284437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 284537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 284637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 284737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 284837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_istream<_CharT, _Traits>& 284937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 285037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::cauchy_distribution<_RealType>& __x); 285137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 285237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 285337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 285437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A fisher_f_distribution random number distribution. 285537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 285637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the normal probability mass function is 285737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f[ 285837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * p(x|m,n) = \frac{\Gamma((m+n)/2)}{\Gamma(m/2)\Gamma(n/2)} 285937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * (\frac{m}{n})^{m/2} x^{(m/2)-1} 286037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * (1 + \frac{mx}{n})^{-(m+n)/2} 286137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f] 286237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 286337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 286437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class fisher_f_distribution 286537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 286637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 286737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 286837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 286937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 287037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 287137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 287237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 287337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 287437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 287537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef fisher_f_distribution<_RealType> distribution_type; 287637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 287737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 287837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_RealType __m = _RealType(1), 287937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __n = _RealType(1)) 288037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_m(__m), _M_n(__n) 288137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 288237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 288337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 288437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh m() const 288537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_m; } 288637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 288737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 288837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh n() const 288937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_n; } 289037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 289137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 289237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 289337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_m == __p2._M_m && __p1._M_n == __p2._M_n; } 289437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 289537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 289637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_m; 289737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_n; 289837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 289937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 290037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 290137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh fisher_f_distribution(_RealType __m = _RealType(1), 290237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __n = _RealType(1)) 290337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__m, __n), _M_gd_x(__m / 2), _M_gd_y(__n / 2) 290437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 290537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 290637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 290737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh fisher_f_distribution(const param_type& __p) 290837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p), _M_gd_x(__p.m() / 2), _M_gd_y(__p.n() / 2) 290937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 291037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 291137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 291237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 291337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 291437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 291537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 291637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 291737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_gd_x.reset(); 291837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_gd_y.reset(); 291937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 292037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 292137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 292237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 292337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 292437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 292537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh m() const 292637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.m(); } 292737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 292837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 292937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh n() const 293037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.n(); } 293137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 293237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 293337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 293437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 293537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 293637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 293737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 293837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 293937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 294037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 294137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 294237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 294337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 294437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 294537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 294637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 294737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 294837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 294937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 295037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 295137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 295237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return result_type(0); } 295337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 295437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 295537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 295637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 295737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 295837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 295937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 296037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 296137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 296237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 296337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 296437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 296537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 296637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 296737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (_M_gd_x(__urng) * n()) / (_M_gd_y(__urng) * m()); } 296837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 296937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 297037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 297137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 297237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p) 297337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 297437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename std::gamma_distribution<result_type>::param_type 297537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type; 297637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return ((_M_gd_x(__urng, param_type(__p.m() / 2)) * n()) 297737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh / (_M_gd_y(__urng, param_type(__p.n() / 2)) * m())); 297837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 297937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 298037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 298137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Fisher f distributions have 298237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters and the sequences that would 298337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * be generated are equal. 298437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 298537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 298637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const fisher_f_distribution& __d1, 298737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const fisher_f_distribution& __d2) 298837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (__d1.param() == __d2.param() 298937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __d1._M_gd_x == __d2._M_gd_x 299037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __d1._M_gd_y == __d2._M_gd_y); } 299137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 299237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 299337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %fisher_f_distribution random number distribution 299437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 299537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 299637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 299737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %fisher_f_distribution random number distribution. 299837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 299937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 300037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 300137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 300237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 300337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 300437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 300537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::fisher_f_distribution<_RealType1>& __x); 300637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 300737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 300837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %fisher_f_distribution random number distribution 300937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 301037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 301137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 301237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %fisher_f_distribution random number 301337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 301437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 301537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 301637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 301737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 301837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 301937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 302037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::fisher_f_distribution<_RealType1>& __x); 302137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 302237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 302337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 302437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 302537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::gamma_distribution<result_type> _M_gd_x, _M_gd_y; 302637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 302737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 302837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 302937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Fisher f distributions are diferent. 303037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 303137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 303237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 303337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::fisher_f_distribution<_RealType>& __d1, 303437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::fisher_f_distribution<_RealType>& __d2) 303537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 303637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 303737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 303837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A student_t_distribution random number distribution. 303937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 304037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the normal probability mass function is: 304137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f[ 304237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * p(x|n) = \frac{1}{\sqrt(n\pi)} \frac{\Gamma((n+1)/2)}{\Gamma(n/2)} 304337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * (1 + \frac{x^2}{n}) ^{-(n+1)/2} 304437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f] 304537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 304637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 304737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class student_t_distribution 304837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 304937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 305037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 305137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 305237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 305337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 305437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 305537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 305637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 305737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 305837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef student_t_distribution<_RealType> distribution_type; 305937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 306037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 306137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_RealType __n = _RealType(1)) 306237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_n(__n) 306337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 306437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 306537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 306637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh n() const 306737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_n; } 306837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 306937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 307037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 307137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_n == __p2._M_n; } 307237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 307337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 307437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_n; 307537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 307637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 307737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 307837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh student_t_distribution(_RealType __n = _RealType(1)) 307937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__n), _M_nd(), _M_gd(__n / 2, 2) 308037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 308137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 308237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 308337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh student_t_distribution(const param_type& __p) 308437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p), _M_nd(), _M_gd(__p.n() / 2, 2) 308537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 308637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 308737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 308837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 308937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 309037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 309137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 309237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 309337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_nd.reset(); 309437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_gd.reset(); 309537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 309637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 309737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 309837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 309937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 310037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 310137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh n() const 310237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.n(); } 310337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 310437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 310537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 310637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 310737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 310837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 310937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 311037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 311137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 311237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 311337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 311437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 311537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 311637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 311737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 311837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 311937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 312037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 312137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 312237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 312337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 312437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::min(); } 312537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 312637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 312737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 312837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 312937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 313037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 313137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 313237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 313337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 313437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 313537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 313637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 313737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 313837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 313937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_nd(__urng) * std::sqrt(n() / _M_gd(__urng)); } 314037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 314137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 314237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 314337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 314437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p) 314537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 314637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename std::gamma_distribution<result_type>::param_type 314737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type; 314837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 314937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const result_type __g = _M_gd(__urng, param_type(__p.n() / 2, 2)); 315037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_nd(__urng) * std::sqrt(__p.n() / __g); 315137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 315237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 315337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 315437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Student t distributions have 315537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters and the sequences that would 315637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * be generated are equal. 315737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 315837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 315937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const student_t_distribution& __d1, 316037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const student_t_distribution& __d2) 316137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (__d1.param() == __d2.param() 316237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __d1._M_nd == __d2._M_nd && __d1._M_gd == __d2._M_gd); } 316337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 316437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 316537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %student_t_distribution random number distribution 316637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 316737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 316837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 316937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %student_t_distribution random number distribution. 317037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 317137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 317237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 317337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 317437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 317537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 317637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 317737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::student_t_distribution<_RealType1>& __x); 317837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 317937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 318037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %student_t_distribution random number distribution 318137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 318237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 318337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 318437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %student_t_distribution random number 318537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 318637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 318737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 318837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 318937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 319037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 319137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 319237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::student_t_distribution<_RealType1>& __x); 319337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 319437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 319537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 319637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 319737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::normal_distribution<result_type> _M_nd; 319837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::gamma_distribution<result_type> _M_gd; 319937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 320037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 320137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 320237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Student t distributions are different. 320337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 320437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 320537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 320637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::student_t_distribution<_RealType>& __d1, 320737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::student_t_distribution<_RealType>& __d2) 320837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 320937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 321037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 321137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group random_distributions_normal 321237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 321337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 321437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup random_distributions_bernoulli Bernoulli Distributions 321537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup random_distributions 321637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 321737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 321837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 321937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 322037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A Bernoulli random number distribution. 322137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 322237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Generates a sequence of true and false values with likelihood @f$p@f$ 322337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * that true will come up and @f$(1 - p)@f$ that false will appear. 322437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 322537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class bernoulli_distribution 322637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 322737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 322837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 322937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef bool result_type; 323037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 323137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 323237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 323337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef bernoulli_distribution distribution_type; 323437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 323537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 323637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(double __p = 0.5) 323737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_p(__p) 323837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 323937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0)); 324037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 324137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 324237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 324337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh p() const 324437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_p; } 324537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 324637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 324737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 324837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_p == __p2._M_p; } 324937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 325037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 325137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double _M_p; 325237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 325337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 325437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 325537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 325637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs a Bernoulli distribution with likelihood @p p. 325737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 325837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __p [IN] The likelihood of a true result being returned. 325937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Must be in the interval @f$[0, 1]@f$. 326037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 326137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 326237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh bernoulli_distribution(double __p = 0.5) 326337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 326437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 326537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 326637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 326737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh bernoulli_distribution(const param_type& __p) 326837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 326937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 327037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 327137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 327237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 327337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 327437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Does nothing for a Bernoulli distribution. 327537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 327637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 327737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() { } 327837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 327937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 328037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the @p p parameter of the distribution. 328137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 328237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 328337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh p() const 328437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.p(); } 328537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 328637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 328737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 328837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 328937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 329037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 329137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 329237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 329337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 329437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 329537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 329637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 329737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 329837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 329937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 330037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 330137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 330237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 330337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 330437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 330537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 330637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::min(); } 330737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 330837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 330937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 331037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 331137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 331237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 331337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 331437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 331537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 331637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 331737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 331837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 331937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 332037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 332137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 332237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 332337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 332437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 332537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 332637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p) 332737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 332837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __detail::_Adaptor<_UniformRandomNumberGenerator, double> 332937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __aurng(__urng); 333037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if ((__aurng() - __aurng.min()) 333137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh < __p.p() * (__aurng.max() - __aurng.min())) 333237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return true; 333337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return false; 333437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 333537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 333637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 333737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 333837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 333937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 334037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 334137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Bernoulli distributions have 334237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters. 334337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 334437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 334537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::bernoulli_distribution& __d1, 334637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::bernoulli_distribution& __d2) 334737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 334837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 334937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 335037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Bernoulli distributions have 335137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * different parameters. 335237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 335337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 335437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::bernoulli_distribution& __d1, 335537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::bernoulli_distribution& __d2) 335637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 335737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 335837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 335937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %bernoulli_distribution random number distribution 336037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 336137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 336237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 336337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %bernoulli_distribution random number distribution. 336437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 336537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 336637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 336737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 336837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _CharT, typename _Traits> 336937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_ostream<_CharT, _Traits>& 337037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 337137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::bernoulli_distribution& __x); 337237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 337337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 337437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %bernoulli_distribution random number distribution 337537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 337637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 337737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 337837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %bernoulli_distribution random number generator engine. 337937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 338037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 338137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 338237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _CharT, typename _Traits> 338337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_istream<_CharT, _Traits>& 338437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 338537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::bernoulli_distribution& __x) 338637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 338737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double __p; 338837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __is >> __p; 338937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __x.param(bernoulli_distribution::param_type(__p)); 339037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __is; 339137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 339237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 339337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 339437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 339537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A discrete binomial random number distribution. 339637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 339737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the binomial probability density function is 339837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$p(i|t,p) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$ 339937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * and @f$p@f$ are the parameters of the distribution. 340037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 340137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType = int> 340237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class binomial_distribution 340337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 340437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_integral<_IntType>::value, 340537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not an integral type"); 340637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 340737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 340837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 340937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType result_type; 341037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 341137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 341237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 341337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef binomial_distribution<_IntType> distribution_type; 341437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend class binomial_distribution<_IntType>; 341537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 341637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 341737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_IntType __t = _IntType(1), double __p = 0.5) 341837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_t(__t), _M_p(__p) 341937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 342037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT((_M_t >= _IntType(0)) 342137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && (_M_p >= 0.0) 342237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && (_M_p <= 1.0)); 342337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 342437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 342537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 342637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType 342737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh t() const 342837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_t; } 342937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 343037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 343137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh p() const 343237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_p; } 343337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 343437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 343537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 343637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_t == __p2._M_t && __p1._M_p == __p2._M_p; } 343737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 343837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 343937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 344037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 344137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 344237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType _M_t; 344337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double _M_p; 344437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 344537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double _M_q; 344637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#if _GLIBCXX_USE_C99_MATH_TR1 344737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double _M_d1, _M_d2, _M_s1, _M_s2, _M_c, 344837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_a1, _M_a123, _M_s, _M_lf, _M_lp1p; 344937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 345037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh bool _M_easy; 345137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 345237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 345337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // constructors and member function 345437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 345537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh binomial_distribution(_IntType __t = _IntType(1), 345637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double __p = 0.5) 345737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__t, __p), _M_nd() 345837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 345937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 346037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 346137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh binomial_distribution(const param_type& __p) 346237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p), _M_nd() 346337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 346437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 346537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 346637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 346737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 346837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 346937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 347037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_nd.reset(); } 347137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 347237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 347337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the distribution @p t parameter. 347437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 347537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType 347637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh t() const 347737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.t(); } 347837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 347937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 348037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the distribution @p p parameter. 348137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 348237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 348337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh p() const 348437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.p(); } 348537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 348637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 348737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 348837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 348937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 349037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 349137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 349237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 349337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 349437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 349537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 349637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 349737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 349837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 349937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 350037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 350137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 350237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 350337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 350437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 350537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 350637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0; } 350737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 350837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 350937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 351037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 351137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 351237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 351337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.t(); } 351437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 351537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 351637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 351737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 351837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 351937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 352037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 352137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 352237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 352337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 352437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 352537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 352637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 352737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 352837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 352937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two binomial distributions have 353037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters and the sequences that would 353137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * be generated are equal. 353237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 353337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 353437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const binomial_distribution& __d1, 353537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const binomial_distribution& __d2) 353637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_C99_MATH_TR1 353737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param() && __d1._M_nd == __d2._M_nd; } 353837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else 353937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 354037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 354137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 354237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 354337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %binomial_distribution random number distribution 354437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 354537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 354637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 354737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %binomial_distribution random number distribution. 354837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 354937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 355037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 355137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 355237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, 355337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 355437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 355537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 355637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::binomial_distribution<_IntType1>& __x); 355737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 355837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 355937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %binomial_distribution random number distribution 356037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 356137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 356237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 356337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %binomial_distribution random number generator engine. 356437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 356537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error 356637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * state. 356737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 356837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, 356937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 357037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 357137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 357237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::binomial_distribution<_IntType1>& __x); 357337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 357437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 357537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 357637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 357737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_waiting(_UniformRandomNumberGenerator& __urng, _IntType __t); 357837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 357937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 358037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 358137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined. 358237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::normal_distribution<double> _M_nd; 358337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 358437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 358537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 358637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two binomial distributions are different. 358737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 358837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 358937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 359037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::binomial_distribution<_IntType>& __d1, 359137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::binomial_distribution<_IntType>& __d2) 359237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 359337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 359437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 359537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 359637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A discrete geometric random number distribution. 359737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 359837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the geometric probability density function is 359937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$p(i|p) = p(1 - p)^{i}@f$ where @f$p@f$ is the parameter of the 360037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution. 360137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 360237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType = int> 360337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class geometric_distribution 360437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 360537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_integral<_IntType>::value, 360637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not an integral type"); 360737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 360837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 360937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 361037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType result_type; 361137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 361237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 361337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 361437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef geometric_distribution<_IntType> distribution_type; 361537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend class geometric_distribution<_IntType>; 361637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 361737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 361837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(double __p = 0.5) 361937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_p(__p) 362037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 362137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0) && (_M_p < 1.0)); 362237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 362337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 362437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 362537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 362637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh p() const 362737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_p; } 362837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 362937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 363037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 363137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_p == __p2._M_p; } 363237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 363337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 363437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 363537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize() 363637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_log_1_p = std::log(1.0 - _M_p); } 363737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 363837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double _M_p; 363937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 364037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double _M_log_1_p; 364137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 364237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 364337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // constructors and member function 364437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 364537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh geometric_distribution(double __p = 0.5) 364637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 364737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 364837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 364937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 365037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh geometric_distribution(const param_type& __p) 365137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 365237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 365337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 365437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 365537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 365637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 365737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Does nothing for the geometric distribution. 365837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 365937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 366037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() { } 366137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 366237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 366337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the distribution parameter @p p. 366437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 366537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 366637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh p() const 366737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.p(); } 366837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 366937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 367037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 367137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 367237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 367337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 367437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 367537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 367637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 367737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 367837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 367937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 368037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 368137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 368237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 368337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 368437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 368537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 368637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 368737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 368837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 368937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0; } 369037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 369137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 369237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 369337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 369437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 369537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 369637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 369737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 369837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 369937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 370037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 370137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 370237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 370337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 370437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 370537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 370637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 370737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 370837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 370937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 371037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 371137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 371237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 371337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 371437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 371537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 371637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two geometric distributions have 371737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters. 371837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 371937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 372037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 372137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::geometric_distribution<_IntType>& __d1, 372237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::geometric_distribution<_IntType>& __d2) 372337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 372437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 372537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 372637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two geometric distributions have 372737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * different parameters. 372837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 372937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 373037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 373137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::geometric_distribution<_IntType>& __d1, 373237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::geometric_distribution<_IntType>& __d2) 373337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 373437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 373537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 373637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %geometric_distribution random number distribution 373737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 373837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 373937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 374037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %geometric_distribution random number distribution. 374137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 374237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 374337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 374437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 374537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType, 374637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 374737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_ostream<_CharT, _Traits>& 374837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 374937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::geometric_distribution<_IntType>& __x); 375037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 375137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 375237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %geometric_distribution random number distribution 375337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 375437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 375537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 375637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %geometric_distribution random number generator engine. 375737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 375837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 375937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 376037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType, 376137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 376237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_istream<_CharT, _Traits>& 376337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 376437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::geometric_distribution<_IntType>& __x); 376537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 376637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 376737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 376837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A negative_binomial_distribution random number distribution. 376937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 377037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the negative binomial probability mass function is 377137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$p(i) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$ 377237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * and @f$p@f$ are the parameters of the distribution. 377337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 377437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType = int> 377537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class negative_binomial_distribution 377637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 377737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_integral<_IntType>::value, 377837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not an integral type"); 377937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 378037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 378137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 378237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType result_type; 378337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 378437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 378537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 378637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef negative_binomial_distribution<_IntType> distribution_type; 378737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 378837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 378937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_IntType __k = 1, double __p = 0.5) 379037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_k(__k), _M_p(__p) 379137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 379237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT((_M_k > 0) && (_M_p > 0.0) && (_M_p <= 1.0)); 379337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 379437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 379537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType 379637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh k() const 379737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_k; } 379837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 379937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 380037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh p() const 380137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_p; } 380237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 380337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 380437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 380537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_k == __p2._M_k && __p1._M_p == __p2._M_p; } 380637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 380737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 380837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType _M_k; 380937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double _M_p; 381037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 381137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 381237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 381337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh negative_binomial_distribution(_IntType __k = 1, double __p = 0.5) 381437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__k, __p), _M_gd(__k, (1.0 - __p) / __p) 381537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 381637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 381737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 381837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh negative_binomial_distribution(const param_type& __p) 381937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p), _M_gd(__p.k(), (1.0 - __p.p()) / __p.p()) 382037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 382137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 382237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 382337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 382437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 382537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 382637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 382737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_gd.reset(); } 382837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 382937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 383037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return the @f$k@f$ parameter of the distribution. 383137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 383237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType 383337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh k() const 383437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.k(); } 383537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 383637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 383737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return the @f$p@f$ parameter of the distribution. 383837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 383937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 384037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh p() const 384137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.p(); } 384237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 384337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 384437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 384537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 384637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 384737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 384837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 384937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 385037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 385137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 385237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 385337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 385437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 385537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 385637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 385737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 385837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 385937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 386037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 386137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 386237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 386337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return result_type(0); } 386437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 386537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 386637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 386737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 386837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 386937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 387037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 387137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 387237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 387337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 387437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 387537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 387637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 387737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng); 387837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 387937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 388037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 388137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 388237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 388337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 388437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 388537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two negative binomial distributions have 388637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same parameters and the sequences that would be 388737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generated are equal. 388837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 388937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 389037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const negative_binomial_distribution& __d1, 389137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const negative_binomial_distribution& __d2) 389237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param() && __d1._M_gd == __d2._M_gd; } 389337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 389437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 389537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %negative_binomial_distribution random 389637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * number distribution @p __x into the output stream @p __os. 389737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 389837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 389937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %negative_binomial_distribution random number 390037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution. 390137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 390237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 390337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 390437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 390537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 390637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 390737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 390837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::negative_binomial_distribution<_IntType1>& __x); 390937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 391037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 391137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %negative_binomial_distribution random number 391237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution @p __x from the input stream @p __is. 391337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 391437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 391537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %negative_binomial_distribution random number 391637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 391737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 391837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 391937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 392037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 392137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 392237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 392337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::negative_binomial_distribution<_IntType1>& __x); 392437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 392537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 392637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 392737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 392837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::gamma_distribution<double> _M_gd; 392937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 393037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 393137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 393237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two negative binomial distributions are different. 393337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 393437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 393537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 393637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::negative_binomial_distribution<_IntType>& __d1, 393737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::negative_binomial_distribution<_IntType>& __d2) 393837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 393937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 394037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 394137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group random_distributions_bernoulli 394237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 394337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 394437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup random_distributions_poisson Poisson Distributions 394537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup random_distributions 394637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 394737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 394837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 394937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 395037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A discrete Poisson random number distribution. 395137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 395237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the Poisson probability density function is 395337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$p(i|\mu) = \frac{\mu^i}{i!} e^{-\mu}@f$ where @f$\mu@f$ is the 395437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameter of the distribution. 395537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 395637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType = int> 395737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class poisson_distribution 395837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 395937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_integral<_IntType>::value, 396037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not an integral type"); 396137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 396237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 396337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 396437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType result_type; 396537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 396637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 396737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 396837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef poisson_distribution<_IntType> distribution_type; 396937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend class poisson_distribution<_IntType>; 397037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 397137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 397237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(double __mean = 1.0) 397337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_mean(__mean) 397437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 397537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0); 397637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 397737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 397837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 397937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 398037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mean() const 398137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_mean; } 398237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 398337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 398437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 398537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_mean == __p2._M_mean; } 398637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 398737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 398837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // Hosts either log(mean) or the threshold of the simple method. 398937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 399037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 399137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 399237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double _M_mean; 399337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 399437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double _M_lm_thr; 399537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#if _GLIBCXX_USE_C99_MATH_TR1 399637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double _M_lfm, _M_sm, _M_d, _M_scx, _M_1cx, _M_c2b, _M_cb; 399737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 399837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 399937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 400037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // constructors and member function 400137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 400237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh poisson_distribution(double __mean = 1.0) 400337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__mean), _M_nd() 400437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 400537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 400637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 400737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh poisson_distribution(const param_type& __p) 400837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p), _M_nd() 400937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 401037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 401137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 401237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 401337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 401437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 401537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 401637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_nd.reset(); } 401737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 401837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 401937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the distribution parameter @p mean. 402037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 402137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 402237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mean() const 402337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.mean(); } 402437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 402537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 402637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 402737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 402837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 402937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 403037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 403137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 403237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 403337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 403437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 403537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 403637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 403737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 403837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 403937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 404037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 404137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 404237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 404337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 404437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 404537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0; } 404637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 404737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 404837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 404937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 405037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 405137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 405237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 405337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 405437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 405537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 405637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 405737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 405837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 405937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 406037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 406137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 406237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 406337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 406437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 406537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 406637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 406737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 406837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Poisson distributions have the same 406937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters and the sequences that would be generated 407037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * are equal. 407137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 407237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 407337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const poisson_distribution& __d1, 407437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const poisson_distribution& __d2) 407537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_C99_MATH_TR1 407637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param() && __d1._M_nd == __d2._M_nd; } 407737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else 407837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 407937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 408037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 408137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 408237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %poisson_distribution random number distribution 408337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 408437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 408537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 408637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %poisson_distribution random number distribution. 408737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 408837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 408937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 409037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 409137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 409237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 409337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 409437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::poisson_distribution<_IntType1>& __x); 409537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 409637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 409737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %poisson_distribution random number distribution 409837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 409937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 410037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 410137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %poisson_distribution random number generator engine. 410237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 410337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error 410437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * state. 410537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 410637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 410737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 410837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 410937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::poisson_distribution<_IntType1>& __x); 411037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 411137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 411237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 411337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 411437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined. 411537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::normal_distribution<double> _M_nd; 411637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 411737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 411837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 411937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Poisson distributions are different. 412037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 412137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 412237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 412337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::poisson_distribution<_IntType>& __d1, 412437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::poisson_distribution<_IntType>& __d2) 412537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 412637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 412737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 412837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 412937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief An exponential continuous distribution for random numbers. 413037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 413137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the exponential probability density function is 413237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$p(x|\lambda) = \lambda e^{-\lambda x}@f$. 413337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 413437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <table border=1 cellpadding=10 cellspacing=0> 413537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <caption align=top>Distribution Statistics</caption> 413637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>Mean</td><td>@f$\frac{1}{\lambda}@f$</td></tr> 413737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>Median</td><td>@f$\frac{\ln 2}{\lambda}@f$</td></tr> 413837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>Mode</td><td>@f$zero@f$</td></tr> 413937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>Range</td><td>@f$[0, \infty]@f$</td></tr> 414037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>Standard Deviation</td><td>@f$\frac{1}{\lambda}@f$</td></tr> 414137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * </table> 414237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 414337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 414437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class exponential_distribution 414537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 414637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 414737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 414837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 414937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 415037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 415137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 415237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 415337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 415437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 415537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef exponential_distribution<_RealType> distribution_type; 415637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 415737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 415837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_RealType __lambda = _RealType(1)) 415937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_lambda(__lambda) 416037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 416137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_lambda > _RealType(0)); 416237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 416337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 416437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 416537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh lambda() const 416637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_lambda; } 416737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 416837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 416937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 417037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_lambda == __p2._M_lambda; } 417137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 417237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 417337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_lambda; 417437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 417537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 417637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 417737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 417837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Constructs an exponential distribution with inverse scale 417937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameter @f$\lambda@f$. 418037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 418137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 418237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh exponential_distribution(const result_type& __lambda = result_type(1)) 418337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__lambda) 418437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 418537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 418637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 418737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh exponential_distribution(const param_type& __p) 418837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 418937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 419037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 419137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 419237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 419337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 419437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Has no effect on exponential distributions. 419537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 419637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 419737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() { } 419837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 419937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 420037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the inverse scale parameter of the distribution. 420137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 420237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 420337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh lambda() const 420437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.lambda(); } 420537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 420637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 420737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 420837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 420937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 421037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 421137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 421237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 421337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 421437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 421537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 421637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 421737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 421837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 421937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 422037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 422137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 422237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 422337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 422437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 422537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 422637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return result_type(0); } 422737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 422837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 422937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 423037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 423137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 423237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 423337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 423437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 423537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 423637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 423737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 423837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 423937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 424037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 424137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 424237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 424337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 424437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 424537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 424637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p) 424737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 424837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> 424937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __aurng(__urng); 425037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return -std::log(__aurng()) / __p.lambda(); 425137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 425237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 425337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 425437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 425537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 425637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 425737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 425837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two exponential distributions have the same 425937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters. 426037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 426137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 426237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 426337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::exponential_distribution<_RealType>& __d1, 426437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::exponential_distribution<_RealType>& __d2) 426537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 426637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 426737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 426837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two exponential distributions have different 426937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters. 427037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 427137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 427237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 427337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::exponential_distribution<_RealType>& __d1, 427437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::exponential_distribution<_RealType>& __d2) 427537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 427637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 427737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 427837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %exponential_distribution random number distribution 427937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 428037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 428137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 428237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %exponential_distribution random number distribution. 428337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 428437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 428537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 428637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 428737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 428837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_ostream<_CharT, _Traits>& 428937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 429037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::exponential_distribution<_RealType>& __x); 429137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 429237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 429337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %exponential_distribution random number distribution 429437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 429537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 429637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 429737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %exponential_distribution random number 429837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 429937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 430037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 430137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 430237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 430337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_istream<_CharT, _Traits>& 430437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 430537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::exponential_distribution<_RealType>& __x); 430637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 430737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 430837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 430937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A weibull_distribution random number distribution. 431037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 431137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the normal probability density function is: 431237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f[ 431337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * p(x|\alpha,\beta) = \frac{\alpha}{\beta} (\frac{x}{\beta})^{\alpha-1} 431437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * \exp{(-(\frac{x}{\beta})^\alpha)} 431537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f] 431637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 431737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 431837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class weibull_distribution 431937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 432037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 432137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 432237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 432337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 432437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 432537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 432637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 432737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 432837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 432937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef weibull_distribution<_RealType> distribution_type; 433037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 433137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 433237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_RealType __a = _RealType(1), 433337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __b = _RealType(1)) 433437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_a(__a), _M_b(__b) 433537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 433637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 433737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 433837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh a() const 433937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_a; } 434037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 434137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 434237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh b() const 434337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b; } 434437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 434537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 434637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 434737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 434837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 434937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 435037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_a; 435137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_b; 435237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 435337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 435437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 435537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh weibull_distribution(_RealType __a = _RealType(1), 435637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __b = _RealType(1)) 435737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__a, __b) 435837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 435937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 436037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 436137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh weibull_distribution(const param_type& __p) 436237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 436337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 436437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 436537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 436637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 436737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 436837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 436937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 437037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 437137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 437237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 437337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return the @f$a@f$ parameter of the distribution. 437437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 437537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 437637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh a() const 437737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.a(); } 437837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 437937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 438037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return the @f$b@f$ parameter of the distribution. 438137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 438237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 438337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh b() const 438437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.b(); } 438537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 438637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 438737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 438837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 438937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 439037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 439137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 439237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 439337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 439437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 439537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 439637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 439737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 439837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 439937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 440037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 440137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 440237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 440337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 440437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 440537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 440637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return result_type(0); } 440737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 440837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 440937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 441037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 441137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 441237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 441337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 441437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 441537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 441637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 441737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 441837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 441937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 442037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 442137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 442237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 442337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 442437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 442537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 442637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 442737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 442837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 442937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 443037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 443137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 443237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 443337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Weibull distributions have the same 443437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters. 443537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 443637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 443737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 443837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::weibull_distribution<_RealType>& __d1, 443937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::weibull_distribution<_RealType>& __d2) 444037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 444137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 444237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 444337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two Weibull distributions have different 444437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters. 444537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 444637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 444737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 444837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::weibull_distribution<_RealType>& __d1, 444937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::weibull_distribution<_RealType>& __d2) 445037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 445137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 445237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 445337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %weibull_distribution random number distribution 445437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 445537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 445637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 445737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %weibull_distribution random number distribution. 445837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 445937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 446037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 446137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 446237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 446337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_ostream<_CharT, _Traits>& 446437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 446537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::weibull_distribution<_RealType>& __x); 446637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 446737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 446837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %weibull_distribution random number distribution 446937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 447037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 447137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 447237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %weibull_distribution random number 447337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 447437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 447537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 447637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 447737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 447837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_istream<_CharT, _Traits>& 447937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 448037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::weibull_distribution<_RealType>& __x); 448137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 448237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 448337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 448437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A extreme_value_distribution random number distribution. 448537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 448637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the normal probability mass function is 448737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f[ 448837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * p(x|a,b) = \frac{1}{b} 448937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * \exp( \frac{a-x}{b} - \exp(\frac{a-x}{b})) 449037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f] 449137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 449237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 449337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class extreme_value_distribution 449437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 449537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 449637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 449737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 449837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 449937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 450037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 450137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 450237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 450337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 450437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef extreme_value_distribution<_RealType> distribution_type; 450537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 450637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 450737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_RealType __a = _RealType(0), 450837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __b = _RealType(1)) 450937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_a(__a), _M_b(__b) 451037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 451137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 451237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 451337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh a() const 451437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_a; } 451537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 451637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 451737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh b() const 451837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b; } 451937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 452037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 452137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 452237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 452337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 452437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 452537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_a; 452637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_b; 452737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 452837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 452937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 453037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh extreme_value_distribution(_RealType __a = _RealType(0), 453137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __b = _RealType(1)) 453237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__a, __b) 453337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 453437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 453537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 453637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh extreme_value_distribution(const param_type& __p) 453737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 453837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 453937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 454037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 454137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 454237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 454337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 454437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 454537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 454637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 454737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 454837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return the @f$a@f$ parameter of the distribution. 454937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 455037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 455137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh a() const 455237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.a(); } 455337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 455437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 455537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return the @f$b@f$ parameter of the distribution. 455637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 455737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 455837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh b() const 455937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param.b(); } 456037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 456137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 456237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 456337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 456437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 456537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 456637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 456737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 456837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 456937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 457037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 457137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 457237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 457337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 457437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 457537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 457637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 457737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 457837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 457937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 458037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 458137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::min(); } 458237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 458337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 458437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 458537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 458637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 458737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 458837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 458937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 459037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 459137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 459237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 459337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 459437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 459537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 459637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 459737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 459837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 459937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 460037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 460137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 460237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 460337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 460437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 460537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 460637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 460737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 460837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two extreme value distributions have the same 460937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters. 461037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 461137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 461237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 461337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::extreme_value_distribution<_RealType>& __d1, 461437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::extreme_value_distribution<_RealType>& __d2) 461537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 461637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 461737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 461837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two extreme value distributions have different 461937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters. 462037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 462137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 462237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 462337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::extreme_value_distribution<_RealType>& __d1, 462437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::extreme_value_distribution<_RealType>& __d2) 462537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 462637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 462737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 462837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %extreme_value_distribution random number distribution 462937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 463037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 463137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 463237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %extreme_value_distribution random number distribution. 463337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 463437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 463537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 463637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 463737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 463837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_ostream<_CharT, _Traits>& 463937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 464037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::extreme_value_distribution<_RealType>& __x); 464137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 464237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 464337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %extreme_value_distribution random number 464437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution @p __x from the input stream @p __is. 464537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 464637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 464737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %extreme_value_distribution random number 464837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 464937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 465037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 465137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 465237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 465337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::basic_istream<_CharT, _Traits>& 465437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 465537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::extreme_value_distribution<_RealType>& __x); 465637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 465737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 465837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 465937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A discrete_distribution random number distribution. 466037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 466137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the discrete probability mass function is 466237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 466337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 466437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType = int> 466537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class discrete_distribution 466637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 466737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_integral<_IntType>::value, 466837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not an integral type"); 466937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 467037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 467137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 467237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType result_type; 467337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 467437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 467537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 467637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef discrete_distribution<_IntType> distribution_type; 467737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend class discrete_distribution<_IntType>; 467837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 467937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type() 468037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_prob(), _M_cp() 468137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 468237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 468337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _InputIterator> 468437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_InputIterator __wbegin, 468537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _InputIterator __wend) 468637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_prob(__wbegin, __wend), _M_cp() 468737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_initialize(); } 468837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 468937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(initializer_list<double> __wil) 469037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_prob(__wil.begin(), __wil.end()), _M_cp() 469137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_initialize(); } 469237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 469337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Func> 469437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(size_t __nw, double __xmin, double __xmax, 469537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Func __fw); 469637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 469737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/ 469837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(const param_type&) = default; 469937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type& operator=(const param_type&) = default; 470037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 470137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> 470237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh probabilities() const 470337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_prob.empty() ? std::vector<double>(1, 1.0) : _M_prob; } 470437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 470537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 470637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 470737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_prob == __p2._M_prob; } 470837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 470937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 471037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 471137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 471237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 471337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> _M_prob; 471437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> _M_cp; 471537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 471637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 471737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discrete_distribution() 471837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param() 471937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 472037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 472137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _InputIterator> 472237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discrete_distribution(_InputIterator __wbegin, 472337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _InputIterator __wend) 472437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__wbegin, __wend) 472537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 472637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 472737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discrete_distribution(initializer_list<double> __wl) 472837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__wl) 472937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 473037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 473137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Func> 473237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discrete_distribution(size_t __nw, double __xmin, double __xmax, 473337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Func __fw) 473437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__nw, __xmin, __xmax, __fw) 473537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 473637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 473737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 473837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discrete_distribution(const param_type& __p) 473937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 474037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 474137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 474237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 474337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 474437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 474537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 474637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 474737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 474837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 474937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 475037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the probabilities of the distribution. 475137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 475237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> 475337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh probabilities() const 475437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 475537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_param._M_prob.empty() 475637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ? std::vector<double>(1, 1.0) : _M_param._M_prob; 475737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 475837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 475937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 476037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 476137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 476237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 476337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 476437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 476537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 476637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 476737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 476837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 476937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 477037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 477137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 477237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 477337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 477437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 477537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 477637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 477737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 477837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 477937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return result_type(0); } 478037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 478137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 478237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 478337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 478437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 478537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 478637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 478737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_param._M_prob.empty() 478837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ? result_type(0) : result_type(_M_param._M_prob.size() - 1); 478937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 479037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 479137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 479237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 479337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 479437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 479537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 479637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 479737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 479837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 479937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 480037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 480137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 480237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 480337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 480437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 480537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %discrete_distribution random number distribution 480637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 480737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 480837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 480937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %discrete_distribution random number distribution. 481037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 481137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 481237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 481337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 481437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 481537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 481637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 481737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::discrete_distribution<_IntType1>& __x); 481837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 481937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 482037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %discrete_distribution random number distribution 482137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 482237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 482337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 482437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %discrete_distribution random number 482537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 482637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 482737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error 482837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * state. 482937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 483037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 483137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 483237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 483337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::discrete_distribution<_IntType1>& __x); 483437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 483537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 483637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 483737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 483837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 483937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 484037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two discrete distributions have the same 484137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters. 484237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 484337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 484437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 484537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::discrete_distribution<_IntType>& __d1, 484637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::discrete_distribution<_IntType>& __d2) 484737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 484837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 484937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 485037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two discrete distributions have different 485137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters. 485237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 485337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 485437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 485537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::discrete_distribution<_IntType>& __d1, 485637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::discrete_distribution<_IntType>& __d2) 485737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 485837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 485937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 486037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 486137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A piecewise_constant_distribution random number distribution. 486237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 486337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the piecewise constant probability mass function is 486437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 486537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 486637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 486737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class piecewise_constant_distribution 486837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 486937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 487037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 487137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 487237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 487337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 487437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 487537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 487637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 487737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 487837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef piecewise_constant_distribution<_RealType> distribution_type; 487937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend class piecewise_constant_distribution<_RealType>; 488037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 488137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type() 488237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_int(), _M_den(), _M_cp() 488337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 488437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 488537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _InputIteratorB, typename _InputIteratorW> 488637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_InputIteratorB __bfirst, 488737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _InputIteratorB __bend, 488837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _InputIteratorW __wbegin); 488937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 489037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Func> 489137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(initializer_list<_RealType> __bi, _Func __fw); 489237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 489337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Func> 489437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(size_t __nw, _RealType __xmin, _RealType __xmax, 489537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Func __fw); 489637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 489737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/ 489837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(const param_type&) = default; 489937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type& operator=(const param_type&) = default; 490037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 490137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<_RealType> 490237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh intervals() const 490337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 490437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (_M_int.empty()) 490537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 490637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<_RealType> __tmp(2); 490737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __tmp[1] = _RealType(1); 490837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __tmp; 490937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 491037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else 491137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_int; 491237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 491337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 491437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> 491537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh densities() const 491637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_den.empty() ? std::vector<double>(1, 1.0) : _M_den; } 491737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 491837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 491937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 492037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __p1._M_int == __p2._M_int && __p1._M_den == __p2._M_den; } 492137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 492237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 492337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 492437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 492537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 492637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<_RealType> _M_int; 492737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> _M_den; 492837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> _M_cp; 492937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 493037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 493137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 493237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh piecewise_constant_distribution() 493337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param() 493437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 493537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 493637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _InputIteratorB, typename _InputIteratorW> 493737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh piecewise_constant_distribution(_InputIteratorB __bfirst, 493837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _InputIteratorB __bend, 493937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _InputIteratorW __wbegin) 494037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__bfirst, __bend, __wbegin) 494137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 494237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 494337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Func> 494437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh piecewise_constant_distribution(initializer_list<_RealType> __bl, 494537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Func __fw) 494637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__bl, __fw) 494737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 494837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 494937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Func> 495037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh piecewise_constant_distribution(size_t __nw, 495137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __xmin, _RealType __xmax, 495237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Func __fw) 495337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__nw, __xmin, __xmax, __fw) 495437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 495537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 495637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 495737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh piecewise_constant_distribution(const param_type& __p) 495837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 495937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 496037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 496137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 496237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Resets the distribution state. 496337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 496437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 496537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 496637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 496737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 496837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 496937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns a vector of the intervals. 497037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 497137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<_RealType> 497237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh intervals() const 497337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 497437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (_M_param._M_int.empty()) 497537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 497637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<_RealType> __tmp(2); 497737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __tmp[1] = _RealType(1); 497837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __tmp; 497937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 498037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else 498137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_param._M_int; 498237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 498337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 498437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 498537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns a vector of the probability densities. 498637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 498737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> 498837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh densities() const 498937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 499037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_param._M_den.empty() 499137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ? std::vector<double>(1, 1.0) : _M_param._M_den; 499237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 499337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 499437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 499537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 499637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 499737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 499837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 499937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 500037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 500137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 500237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 500337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 500437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 500537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 500637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 500737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 500837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 500937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 501037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 501137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 501237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 501337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 501437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 501537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_param._M_int.empty() 501637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ? result_type(0) : _M_param._M_int.front(); 501737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 501837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 501937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 502037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 502137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 502237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 502337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 502437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 502537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_param._M_int.empty() 502637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ? result_type(1) : _M_param._M_int.back(); 502737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 502837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 502937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 503037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 503137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 503237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 503337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 503437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 503537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 503637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 503737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 503837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 503937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 504037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 504137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 504237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 504337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %piecewise_constan_distribution random 504437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * number distribution @p __x into the output stream @p __os. 504537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 504637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 504737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %piecewise_constan_distribution random number 504837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution. 504937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 505037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 505137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 505237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 505337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 505437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 505537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 505637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::piecewise_constant_distribution<_RealType1>& __x); 505737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 505837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 505937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %piecewise_constan_distribution random 506037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * number distribution @p __x from the input stream @p __is. 506137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 506237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 506337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %piecewise_constan_distribution random number 506437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 506537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 506637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error 506737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * state. 506837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 506937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 507037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 507137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 507237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::piecewise_constant_distribution<_RealType1>& __x); 507337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 507437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 507537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 507637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 507737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 507837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 507937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two piecewise constant distributions have the 508037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * same parameters. 508137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 508237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 508337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 508437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::piecewise_constant_distribution<_RealType>& __d1, 508537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::piecewise_constant_distribution<_RealType>& __d2) 508637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 508737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 508837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 508937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two piecewise constant distributions have 509037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * different parameters. 509137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 509237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 509337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 509437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::piecewise_constant_distribution<_RealType>& __d1, 509537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::piecewise_constant_distribution<_RealType>& __d2) 509637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 509737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 509837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 509937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 510037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A piecewise_linear_distribution random number distribution. 510137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 510237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the piecewise linear probability mass function is 510337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 510437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 510537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 510637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class piecewise_linear_distribution 510737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 510837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 510937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "template argument not a floating point type"); 511037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 511137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 511237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 511337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 511437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Parameter type. */ 511537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct param_type 511637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 511737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef piecewise_linear_distribution<_RealType> distribution_type; 511837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend class piecewise_linear_distribution<_RealType>; 511937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 512037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type() 512137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_int(), _M_den(), _M_cp(), _M_m() 512237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 512337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 512437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _InputIteratorB, typename _InputIteratorW> 512537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(_InputIteratorB __bfirst, 512637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _InputIteratorB __bend, 512737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _InputIteratorW __wbegin); 512837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 512937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Func> 513037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(initializer_list<_RealType> __bl, _Func __fw); 513137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 513237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Func> 513337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(size_t __nw, _RealType __xmin, _RealType __xmax, 513437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Func __fw); 513537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 513637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/ 513737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type(const param_type&) = default; 513837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type& operator=(const param_type&) = default; 513937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 514037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<_RealType> 514137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh intervals() const 514237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 514337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (_M_int.empty()) 514437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 514537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<_RealType> __tmp(2); 514637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __tmp[1] = _RealType(1); 514737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __tmp; 514837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 514937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else 515037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_int; 515137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 515237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 515337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> 515437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh densities() const 515537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_den.empty() ? std::vector<double>(2, 1.0) : _M_den; } 515637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 515737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 515837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 515937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (__p1._M_int == __p2._M_int 516037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && __p1._M_den == __p2._M_den); } 516137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 516237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 516337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 516437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 516537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 516637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<_RealType> _M_int; 516737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> _M_den; 516837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> _M_cp; 516937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> _M_m; 517037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 517137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 517237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 517337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh piecewise_linear_distribution() 517437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param() 517537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 517637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 517737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _InputIteratorB, typename _InputIteratorW> 517837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh piecewise_linear_distribution(_InputIteratorB __bfirst, 517937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _InputIteratorB __bend, 518037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _InputIteratorW __wbegin) 518137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__bfirst, __bend, __wbegin) 518237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 518337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 518437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Func> 518537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh piecewise_linear_distribution(initializer_list<_RealType> __bl, 518637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Func __fw) 518737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__bl, __fw) 518837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 518937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 519037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Func> 519137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh piecewise_linear_distribution(size_t __nw, 519237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __xmin, _RealType __xmax, 519337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Func __fw) 519437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__nw, __xmin, __xmax, __fw) 519537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 519637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 519737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 519837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh piecewise_linear_distribution(const param_type& __p) 519937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_param(__p) 520037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 520137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 520237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 520337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Resets the distribution state. 520437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 520537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 520637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 520737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 520837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 520937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 521037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return the intervals of the distribution. 521137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 521237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<_RealType> 521337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh intervals() const 521437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 521537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (_M_param._M_int.empty()) 521637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 521737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<_RealType> __tmp(2); 521837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __tmp[1] = _RealType(1); 521937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __tmp; 522037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 522137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else 522237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_param._M_int; 522337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 522437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 522537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 522637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return a vector of the probability densities of the 522737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution. 522837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 522937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<double> 523037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh densities() const 523137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 523237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_param._M_den.empty() 523337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ? std::vector<double>(2, 1.0) : _M_param._M_den; 523437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 523537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 523637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 523737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the parameter set of the distribution. 523837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 523937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type 524037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param() const 524137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_param; } 524237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 524337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 524437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Sets the parameter set of the distribution. 524537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __param The new parameter set of the distribution. 524637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 524737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 524837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(const param_type& __param) 524937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_param = __param; } 525037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 525137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 525237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 525337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 525437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 525537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 525637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 525737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_param._M_int.empty() 525837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ? result_type(0) : _M_param._M_int.front(); 525937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 526037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 526137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 526237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Returns the least upper bound value of the distribution. 526337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 526437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 526537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 526637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 526737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_param._M_int.empty() 526837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ? result_type(1) : _M_param._M_int.back(); 526937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 527037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 527137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 527237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Generating functions. 527337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 527437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 527537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 527637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 527737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->operator()(__urng, this->param()); } 527837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 527937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 528037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 528137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 528237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const param_type& __p); 528337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 528437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 528537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Inserts a %piecewise_linear_distribution random number 528637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution @p __x into the output stream @p __os. 528737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 528837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 528937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %piecewise_linear_distribution random number 529037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution. 529137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 529237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 529337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 529437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 529537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 529637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 529737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 529837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::piecewise_linear_distribution<_RealType1>& __x); 529937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 530037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 530137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Extracts a %piecewise_linear_distribution random number 530237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution @p __x from the input stream @p __is. 530337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 530437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 530537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %piecewise_linear_distribution random number 530637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 530737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 530837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error 530937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * state. 531037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 531137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 531237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 531337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 531437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::piecewise_linear_distribution<_RealType1>& __x); 531537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 531637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 531737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param_type _M_param; 531837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 531937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 532037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 532137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two piecewise linear distributions have the 532237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * same parameters. 532337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 532437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 532537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 532637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const std::piecewise_linear_distribution<_RealType>& __d1, 532737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::piecewise_linear_distribution<_RealType>& __d2) 532837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __d1.param() == __d2.param(); } 532937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 533037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 533137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Return true if two piecewise linear distributions have 533237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * different parameters. 533337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 533437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 533537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline bool 533637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const std::piecewise_linear_distribution<_RealType>& __d1, 533737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const std::piecewise_linear_distribution<_RealType>& __d2) 533837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__d1 == __d2); } 533937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 534037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 534137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group random_distributions_poisson 534237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 534337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group random_distributions 534437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 534537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 534637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup random_utilities Random Number Utilities 534737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup random 534837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 534937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 535037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 535137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 535237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief The seed_seq class generates sequences of seeds for random 535337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * number generators. 535437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 535537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class seed_seq 535637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 535737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 535837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 535937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the seed vales. */ 536037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef uint_least32_t result_type; 536137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 536237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** Default constructor. */ 536337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed_seq() 536437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_v() 536537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { } 536637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 536737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType> 536837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed_seq(std::initializer_list<_IntType> il); 536937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 537037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _InputIterator> 537137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed_seq(_InputIterator __begin, _InputIterator __end); 537237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 537337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // generating functions 537437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RandomAccessIterator> 537537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 537637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh generate(_RandomAccessIterator __begin, _RandomAccessIterator __end); 537737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 537837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // property functions 537937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh size_t size() const 538037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_v.size(); } 538137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 538237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename OutputIterator> 538337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 538437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh param(OutputIterator __dest) const 538537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { std::copy(_M_v.begin(), _M_v.end(), __dest); } 538637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 538737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 538837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /// 538937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::vector<result_type> _M_v; 539037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 539137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 539237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group random_utilities 539337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 539437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group random 539537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 539637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_GLIBCXX_END_NAMESPACE_VERSION 539737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh} // namespace std 539837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 539937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 5400