13123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// random number generation -*- C++ -*- 23123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc. 43123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// 53123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// This file is part of the GNU ISO C++ Library. This library is free 63123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// software; you can redistribute it and/or modify it under the 73123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// terms of the GNU General Public License as published by the 83123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// Free Software Foundation; either version 3, or (at your option) 93123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// any later version. 103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// This library is distributed in the hope that it will be useful, 123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// but WITHOUT ANY WARRANTY; without even the implied warranty of 133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// GNU General Public License for more details. 153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// Under Section 7 of GPL version 3, you are granted additional 173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// permissions described in the GCC Runtime Library Exception, version 183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// 3.1, as published by the Free Software Foundation. 193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// You should have received a copy of the GNU General Public License and 213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// a copy of the GCC Runtime Library Exception along with this program; 223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// <http://www.gnu.org/licenses/>. 243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh/** 263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @file bits/random.h 273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * This is an internal header file, included by other library headers. 283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Do not attempt to use it directly. @headername{random} 293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifndef _RANDOM_H 323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#define _RANDOM_H 1 333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#include <vector> 353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsiehnamespace std _GLIBCXX_VISIBILITY(default) 373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh{ 383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh_GLIBCXX_BEGIN_NAMESPACE_VERSION 393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // [26.4] Random number generation 413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @defgroup random Random Number Generation 443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @ingroup numerics 453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * A facility for generating random numbers on selected distributions. 473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @{ 483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A function template for converting the output of a (integral) 523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * uniform random number generator to a floatng point result in the range 533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * [0-1). 543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType, size_t __bits, 563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _UniformRandomNumberGenerator> 573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh generate_canonical(_UniformRandomNumberGenerator& __g); 593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh_GLIBCXX_END_NAMESPACE_VERSION 613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /* 633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Implementation-space details. 643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh namespace __detail 663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_BEGIN_NAMESPACE_VERSION 683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType, size_t __w, 703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh bool = __w < static_cast<size_t> 713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh (std::numeric_limits<_UIntType>::digits)> 723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct _Shift 733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { static const _UIntType __value = 0; }; 743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType, size_t __w> 763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct _Shift<_UIntType, __w, true> 773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { static const _UIntType __value = _UIntType(1) << __w; }; 783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, bool> 803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct _Mod; 813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // Dispatch based on modulus value to prevent divide-by-zero compile-time 833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // errors when m == 0. 843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Tp, _Tp __m, _Tp __a = 1, _Tp __c = 0> 853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline _Tp 863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __mod(_Tp __x) 873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _Mod<_Tp, __m, __a, __c, __m == 0>::__calc(__x); } 883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /* 903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * An adaptor class for converting the output of any Generator into 913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the input for a specific Distribution. 923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Engine, typename _DInputType> 943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct _Adaptor 953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _Adaptor(_Engine& __g) 993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_g(__g) { } 1003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _DInputType 1023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 1033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _DInputType(0); } 1043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _DInputType 1063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 1073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _DInputType(1); } 1083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /* 1103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Converts a value generated by the adapted random number generator 1113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * into a value in the input domain for the dependent random number 1123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution. 1133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 1143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _DInputType 1153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()() 1163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 1173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return std::generate_canonical<_DInputType, 1183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::numeric_limits<_DInputType>::digits, 1193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _Engine>(_M_g); 1203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 1213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 1233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _Engine& _M_g; 1243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 1253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_END_NAMESPACE_VERSION 1273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } // namespace __detail 1283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh_GLIBCXX_BEGIN_NAMESPACE_VERSION 1303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 1323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @addtogroup random_generators Random Number Generators 1333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @ingroup random 1343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 1353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * These classes define objects which provide random or pseudorandom 1363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * numbers, either from a discrete or a continuous interval. The 1373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * random number generator supplied as a part of this library are 1383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * all uniform random number generators which provide a sequence of 1393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * random number uniformly distributed over their range. 1403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 1413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * A number generator is a function object with an operator() that 1423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * takes zero arguments and returns a number. 1433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 1443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * A compliant random number generator must satisfy the following 1453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * requirements. <table border=1 cellpadding=10 cellspacing=0> 1463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * <caption align=top>Random Number Generator Requirements</caption> 1473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * <tr><td>To be documented.</td></tr> </table> 1483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 1493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @{ 1503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 1513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 1533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A model of a linear congruential random number generator. 1543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 1553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * A random number generator that produces pseudorandom numbers via 1563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * linear function: 1573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f[ 1583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * x_{i+1}\leftarrow(ax_{i} + c) \bmod m 1593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f] 1603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 1613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The template parameter @p _UIntType must be an unsigned integral type 1623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * large enough to store values up to (__m-1). If the template parameter 1633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __m is 0, the modulus @p __m used is 1643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * std::numeric_limits<_UIntType>::max() plus 1. Otherwise, the template 1653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameters @p __a and @p __c must be less than @p __m. 1663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 1673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The size of the state is @f$1@f$. 1683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 1693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 1703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class linear_congruential_engine 1713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 1723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_unsigned<_UIntType>::value, "template argument " 1733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "substituting _UIntType not an unsigned integral type"); 1743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__m == 0u || (__a < __m && __c < __m), 1753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __m out of bounds"); 1763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // XXX FIXME: 1783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // _Mod::__calc should handle correctly __m % __a >= __m / __a too. 1793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__m % __a < __m / __a, 1803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "sorry, not implemented yet: try a smaller 'a' constant"); 1813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 1833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the generated random value. */ 1843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _UIntType result_type; 1853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The multiplier. */ 1873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type multiplier = __a; 1883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** An increment. */ 1893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type increment = __c; 1903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The modulus. */ 1913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type modulus = __m; 1923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type default_seed = 1u; 1933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 1953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs a %linear_congruential_engine random number 1963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine with seed @p __s. The default seed value 1973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * is 1. 1983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 1993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __s The initial seed value. 2003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 2013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 2023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh linear_congruential_engine(result_type __s = default_seed) 2033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { seed(__s); } 2043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 2053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 2063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs a %linear_congruential_engine random number 2073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine seeded from the seed sequence @p __q. 2083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 2093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __q the seed sequence. 2103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 2113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq, typename = typename 2123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::enable_if<!std::is_same<_Sseq, linear_congruential_engine>::value> 2133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ::type> 2143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 2153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh linear_congruential_engine(_Sseq& __q) 2163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { seed(__q); } 2173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 2183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 2193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Reseeds the %linear_congruential_engine random number generator 2203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * engine sequence to the seed @p __s. 2213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 2223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __s The new seed. 2233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 2243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 2253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(result_type __s = default_seed); 2263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 2273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 2283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Reseeds the %linear_congruential_engine random number generator 2293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * engine 2303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * sequence using values from the seed sequence @p __q. 2313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 2323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __q the seed sequence. 2333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 2343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq> 2353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename std::enable_if<std::is_class<_Sseq>::value>::type 2363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(_Sseq& __q); 2373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 2383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 2393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the smallest possible value in the output range. 2403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 2413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The minimum depends on the @p __c parameter: if it is zero, the 2423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * minimum generated must be > 0, otherwise 0 is allowed. 2433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 2443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 2453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() 2463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __c == 0u ? 1u : 0u; } 2473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 2483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 2493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the largest possible value in the output range. 2503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 2513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 2523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() 2533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __m - 1u; } 2543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 2553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 2563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Discard a sequence of random numbers. 2573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 2583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 2593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discard(unsigned long long __z) 2603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 2613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh for (; __z != 0ULL; --__z) 2623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh (*this)(); 2633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 2643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 2653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 2663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the next random number in the sequence. 2673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 2683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 2693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()() 2703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 2713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_x = __detail::__mod<_UIntType, __m, __a, __c>(_M_x); 2723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_x; 2733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 2743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 2753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 2763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Compares two linear congruential random number generator 2773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * objects of the same type for equality. 2783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 2793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A linear congruential random number generator object. 2803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another linear congruential random number generator 2813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 2823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 2833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 2843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be equal, false otherwise. 2853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 2863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 2873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const linear_congruential_engine& __lhs, 2883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const linear_congruential_engine& __rhs) 2893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __lhs._M_x == __rhs._M_x; } 2903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 2913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 2923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Writes the textual representation of the state x(i) of x to 2933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __os. 2943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 2953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os The output stream. 2963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lcr A % linear_congruential_engine random number generator. 2973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns __os. 2983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 2993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1, 3003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType1 __m1, typename _CharT, typename _Traits> 3013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 3023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 3033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::linear_congruential_engine<_UIntType1, 3043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __a1, __c1, __m1>& __lcr); 3053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 3063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 3073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the state of the engine by reading its textual 3083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * representation from @p __is. 3093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 3103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The textual representation must have been previously written using 3113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an output stream whose imbued locale and whose type's template 3123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * specialization arguments _CharT and _Traits were the same as those 3133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * of @p __is. 3143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 3153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is The input stream. 3163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lcr A % linear_congruential_engine random number generator. 3173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns __is. 3183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 3193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1, 3203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType1 __m1, typename _CharT, typename _Traits> 3213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 3223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 3233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::linear_congruential_engine<_UIntType1, __a1, 3243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __c1, __m1>& __lcr); 3253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 3263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 3273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType _M_x; 3283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 3293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 3303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 3313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Compares two linear congruential random number generator 3323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * objects of the same type for inequality. 3333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 3343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A linear congruential random number generator object. 3353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another linear congruential random number generator 3363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 3373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 3383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 3393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be different, false otherwise. 3403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 3413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 3423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 3433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::linear_congruential_engine<_UIntType, __a, 3443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __c, __m>& __lhs, 3453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::linear_congruential_engine<_UIntType, __a, 3463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __c, __m>& __rhs) 3473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__lhs == __rhs); } 3483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 3493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 3503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 3513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * A generalized feedback shift register discrete random number generator. 3523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 3533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * This algorithm avoids multiplication and division and is designed to be 3543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * friendly to a pipelined architecture. If the parameters are chosen 3553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * correctly, this generator will produce numbers with a very long period and 3563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * fairly good apparent entropy, although still not cryptographically strong. 3573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 3583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The best way to use this generator is with the predefined mt19937 class. 3593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 3603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * This algorithm was originally invented by Makoto Matsumoto and 3613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Takuji Nishimura. 3623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 3633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __w Word size, the number of bits in each element of 3643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the state vector. 3653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __n The degree of recursion. 3663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __m The period parameter. 3673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __r The separation point bit index. 3683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __a The last row of the twist matrix. 3693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __u The first right-shift tempering matrix parameter. 3703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __d The first right-shift tempering matrix mask. 3713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __s The first left-shift tempering matrix parameter. 3723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __b The first left-shift tempering matrix mask. 3733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __t The second left-shift tempering matrix parameter. 3743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __c The second left-shift tempering matrix mask. 3753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __l The second right-shift tempering matrix parameter. 3763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @tparam __f Initialization multiplier. 3773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 3783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType, size_t __w, 3793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh size_t __n, size_t __m, size_t __r, 3803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType __a, size_t __u, _UIntType __d, size_t __s, 3813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType __b, size_t __t, 3823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType __c, size_t __l, _UIntType __f> 3833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class mersenne_twister_engine 3843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 3853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_unsigned<_UIntType>::value, "template argument " 3863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "substituting _UIntType not an unsigned integral type"); 3873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(1u <= __m && __m <= __n, 3883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __m out of bounds"); 3893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__r <= __w, "template argument substituting " 3903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "__r out of bound"); 3913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__u <= __w, "template argument substituting " 3923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "__u out of bound"); 3933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__s <= __w, "template argument substituting " 3943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "__s out of bound"); 3953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__t <= __w, "template argument substituting " 3963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "__t out of bound"); 3973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__l <= __w, "template argument substituting " 3983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "__l out of bound"); 3993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__w <= std::numeric_limits<_UIntType>::digits, 4003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __w out of bound"); 4013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__a <= (__detail::_Shift<_UIntType, __w>::__value - 1), 4023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __a out of bound"); 4033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__b <= (__detail::_Shift<_UIntType, __w>::__value - 1), 4043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __b out of bound"); 4053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__c <= (__detail::_Shift<_UIntType, __w>::__value - 1), 4063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __c out of bound"); 4073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__d <= (__detail::_Shift<_UIntType, __w>::__value - 1), 4083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __d out of bound"); 4093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(__f <= (__detail::_Shift<_UIntType, __w>::__value - 1), 4103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __f out of bound"); 4113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 4123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 4133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the generated random value. */ 4143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _UIntType result_type; 4153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 4163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // parameter values 4173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t word_size = __w; 4183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t state_size = __n; 4193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t shift_size = __m; 4203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t mask_bits = __r; 4213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type xor_mask = __a; 4223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t tempering_u = __u; 4233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type tempering_d = __d; 4243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t tempering_s = __s; 4253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type tempering_b = __b; 4263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t tempering_t = __t; 4273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type tempering_c = __c; 4283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t tempering_l = __l; 4293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type initialization_multiplier = __f; 4303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type default_seed = 5489u; 4313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 4323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // constructors and member function 4333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 4343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh mersenne_twister_engine(result_type __sd = default_seed) 4353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { seed(__sd); } 4363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 4373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 4383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs a %mersenne_twister_engine random number generator 4393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * engine seeded from the seed sequence @p __q. 4403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 4413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __q the seed sequence. 4423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 4433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq, typename = typename 4443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::enable_if<!std::is_same<_Sseq, mersenne_twister_engine>::value> 4453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ::type> 4463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 4473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh mersenne_twister_engine(_Sseq& __q) 4483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { seed(__q); } 4493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 4503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 4513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(result_type __sd = default_seed); 4523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 4533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq> 4543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename std::enable_if<std::is_class<_Sseq>::value>::type 4553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(_Sseq& __q); 4563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 4573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 4583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the smallest possible value in the output range. 4593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 4603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 4613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() 4623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return 0; }; 4633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 4643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 4653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the largest possible value in the output range. 4663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 4673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 4683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() 4693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __detail::_Shift<_UIntType, __w>::__value - 1; } 4703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 4713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 4723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Discard a sequence of random numbers. 4733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 4743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 4753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discard(unsigned long long __z) 4763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 4773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh for (; __z != 0ULL; --__z) 4783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh (*this)(); 4793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 4803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 4813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 4823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(); 4833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 4843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 4853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Compares two % mersenne_twister_engine random number generator 4863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * objects of the same type for equality. 4873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 4883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A % mersenne_twister_engine random number generator 4893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 4903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another % mersenne_twister_engine random number 4913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator object. 4923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 4933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 4943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be equal, false otherwise. 4953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 4963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 4973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const mersenne_twister_engine& __lhs, 4983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const mersenne_twister_engine& __rhs) 4993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return (std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x) 5003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __lhs._M_p == __rhs._M_p); } 5013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 5023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 5033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts the current state of a % mersenne_twister_engine 5043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * random number generator engine @p __x into the output stream 5053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __os. 5063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 5073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 5083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A % mersenne_twister_engine random number generator 5093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * engine. 5103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 5113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 5123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 5133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 5143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType1, 5153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh size_t __w1, size_t __n1, 5163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh size_t __m1, size_t __r1, 5173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType1 __a1, size_t __u1, 5183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType1 __d1, size_t __s1, 5193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType1 __b1, size_t __t1, 5203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType1 __c1, size_t __l1, _UIntType1 __f1, 5213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 5223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 5233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 5243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::mersenne_twister_engine<_UIntType1, __w1, __n1, 5253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __m1, __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1, 5263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __l1, __f1>& __x); 5273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 5283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 5293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts the current state of a % mersenne_twister_engine 5303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * random number generator engine @p __x from the input stream 5313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __is. 5323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 5333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 5343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A % mersenne_twister_engine random number generator 5353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * engine. 5363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 5373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with the state of @p __x extracted or in 5383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 5393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 5403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType1, 5413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh size_t __w1, size_t __n1, 5423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh size_t __m1, size_t __r1, 5433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType1 __a1, size_t __u1, 5443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType1 __d1, size_t __s1, 5453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType1 __b1, size_t __t1, 5463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType1 __c1, size_t __l1, _UIntType1 __f1, 5473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 5483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 5493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 5503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::mersenne_twister_engine<_UIntType1, __w1, __n1, __m1, 5513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1, 5523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __l1, __f1>& __x); 5533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 5543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 5553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType _M_x[state_size]; 5563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh size_t _M_p; 5573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 5583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 5593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 5603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Compares two % mersenne_twister_engine random number generator 5613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * objects of the same type for inequality. 5623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 5633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A % mersenne_twister_engine random number generator 5643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 5653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another % mersenne_twister_engine random number 5663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator object. 5673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 5683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 5693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be different, false otherwise. 5703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 5713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType, size_t __w, 5723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh size_t __n, size_t __m, size_t __r, 5733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType __a, size_t __u, _UIntType __d, size_t __s, 5743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType __b, size_t __t, 5753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType __c, size_t __l, _UIntType __f> 5763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 5773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::mersenne_twister_engine<_UIntType, __w, __n, __m, 5783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __lhs, 5793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::mersenne_twister_engine<_UIntType, __w, __n, __m, 5803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __rhs) 5813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__lhs == __rhs); } 5823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 5833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 5843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 5853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief The Marsaglia-Zaman generator. 5863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 5873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * This is a model of a Generalized Fibonacci discrete random number 5883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator, sometimes referred to as the SWC generator. 5893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 5903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * A discrete random number generator that produces pseudorandom 5913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * numbers using: 5923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f[ 5933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * x_{i}\leftarrow(x_{i - s} - x_{i - r} - carry_{i-1}) \bmod m 5943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f] 5953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 5963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The size of the state is @f$r@f$ 5973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * and the maximum period of the generator is @f$(m^r - m^s - 1)@f$. 5983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 5993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @var _M_x The state of the generator. This is a ring buffer. 6003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @var _M_carry The carry. 6013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @var _M_p Current index of x(i - r). 6023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 6033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType, size_t __w, size_t __s, size_t __r> 6043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class subtract_with_carry_engine 6053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 6063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_unsigned<_UIntType>::value, "template argument " 6073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "substituting _UIntType not an unsigned integral type"); 6083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(0u < __s && __s < __r, 6093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __s out of bounds"); 6103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits, 6113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __w out of bounds"); 6123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 6143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the generated random value. */ 6153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _UIntType result_type; 6163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // parameter values 6183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t word_size = __w; 6193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t short_lag = __s; 6203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t long_lag = __r; 6213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type default_seed = 19780503u; 6223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 6243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs an explicitly seeded % subtract_with_carry_engine 6253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * random number generator. 6263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 6273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 6283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh subtract_with_carry_engine(result_type __sd = default_seed) 6293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { seed(__sd); } 6303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 6323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs a %subtract_with_carry_engine random number engine 6333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * seeded from the seed sequence @p __q. 6343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 6353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __q the seed sequence. 6363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 6373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq, typename = typename 6383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::enable_if<!std::is_same<_Sseq, subtract_with_carry_engine>::value> 6393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ::type> 6403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 6413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh subtract_with_carry_engine(_Sseq& __q) 6423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { seed(__q); } 6433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 6453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Seeds the initial state @f$x_0@f$ of the random number 6463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator. 6473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 6483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * N1688[4.19] modifies this as follows. If @p __value == 0, 6493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * sets value to 19780503. In any case, with a linear 6503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * congruential generator lcg(i) having parameters @f$ m_{lcg} = 6513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 2147483563, a_{lcg} = 40014, c_{lcg} = 0, and lcg(0) = value 6523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f$, sets @f$ x_{-r} \dots x_{-1} @f$ to @f$ lcg(1) \bmod m 6533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * \dots lcg(r) \bmod m @f$ respectively. If @f$ x_{-1} = 0 @f$ 6543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * set carry to 1, otherwise sets carry to 0. 6553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 6563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 6573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(result_type __sd = default_seed); 6583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 6603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Seeds the initial state @f$x_0@f$ of the 6613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * % subtract_with_carry_engine random number generator. 6623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 6633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq> 6643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename std::enable_if<std::is_class<_Sseq>::value>::type 6653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(_Sseq& __q); 6663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 6683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the inclusive minimum value of the range of random 6693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * integers returned by this generator. 6703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 6713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 6723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() 6733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return 0; } 6743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 6763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the inclusive maximum value of the range of random 6773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * integers returned by this generator. 6783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 6793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 6803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() 6813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __detail::_Shift<_UIntType, __w>::__value - 1; } 6823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 6843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Discard a sequence of random numbers. 6853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 6863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 6873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discard(unsigned long long __z) 6883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 6893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh for (; __z != 0ULL; --__z) 6903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh (*this)(); 6913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 6923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 6943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the next random number in the sequence. 6953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 6963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 6973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(); 6983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 7003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Compares two % subtract_with_carry_engine random number 7013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator objects of the same type for equality. 7023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 7033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A % subtract_with_carry_engine random number generator 7043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 7053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another % subtract_with_carry_engine random number 7063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator object. 7073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 7083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 7093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be equal, false otherwise. 7103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 7113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 7123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const subtract_with_carry_engine& __lhs, 7133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const subtract_with_carry_engine& __rhs) 7143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return (std::equal(__lhs._M_x, __lhs._M_x + long_lag, __rhs._M_x) 7153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __lhs._M_carry == __rhs._M_carry 7163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __lhs._M_p == __rhs._M_p); } 7173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 7183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 7193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts the current state of a % subtract_with_carry_engine 7203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * random number generator engine @p __x into the output stream 7213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __os. 7223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 7233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 7243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A % subtract_with_carry_engine random number generator 7253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * engine. 7263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 7273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 7283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 7293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 7303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1, 7313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 7323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 7333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>&, 7343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::subtract_with_carry_engine<_UIntType1, __w1, 7353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __s1, __r1>&); 7363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 7373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 7383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts the current state of a % subtract_with_carry_engine 7393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * random number generator engine @p __x from the input stream 7403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __is. 7413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 7423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 7433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A % subtract_with_carry_engine random number generator 7443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * engine. 7453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 7463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with the state of @p __x extracted or in 7473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 7483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 7493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1, 7503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 7513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 7523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>&, 7533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::subtract_with_carry_engine<_UIntType1, __w1, 7543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __s1, __r1>&); 7553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 7563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 7573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType _M_x[long_lag]; 7583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType _M_carry; 7593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh size_t _M_p; 7603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 7613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 7623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 7633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Compares two % subtract_with_carry_engine random number 7643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator objects of the same type for inequality. 7653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 7663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A % subtract_with_carry_engine random number generator 7673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 7683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another % subtract_with_carry_engine random number 7693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator object. 7703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 7713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 7723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be different, false otherwise. 7733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 7743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UIntType, size_t __w, size_t __s, size_t __r> 7753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 7763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::subtract_with_carry_engine<_UIntType, __w, 7773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __s, __r>& __lhs, 7783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::subtract_with_carry_engine<_UIntType, __w, 7793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __s, __r>& __rhs) 7803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__lhs == __rhs); } 7813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 7823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 7833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 7843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Produces random numbers from some base engine by discarding blocks of 7853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * data. 7863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 7873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 0 <= @p __r <= @p __p 7883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 7893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomNumberEngine, size_t __p, size_t __r> 7903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class discard_block_engine 7913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 7923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(1 <= __r && __r <= __p, 7933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __r out of bounds"); 7943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 7953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 7963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the generated random value. */ 7973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef typename _RandomNumberEngine::result_type result_type; 7983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 7993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // parameter values 8003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t block_size = __p; 8013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t used_block = __r; 8023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 8033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 8043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs a default %discard_block_engine engine. 8053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 8063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The underlying engine is default constructed as well. 8073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 8083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discard_block_engine() 8093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(), _M_n(0) { } 8103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 8113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 8123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Copy constructs a %discard_block_engine engine. 8133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 8143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Copies an existing base class random number generator. 8153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rng An existing (base class) engine object. 8163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 8173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 8183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discard_block_engine(const _RandomNumberEngine& __rng) 8193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(__rng), _M_n(0) { } 8203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 8213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 8223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Move constructs a %discard_block_engine engine. 8233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 8243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Copies an existing base class random number generator. 8253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rng An existing (base class) engine object. 8263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 8273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 8283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discard_block_engine(_RandomNumberEngine&& __rng) 8293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(std::move(__rng)), _M_n(0) { } 8303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 8313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 8323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Seed constructs a %discard_block_engine engine. 8333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 8343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Constructs the underlying generator engine seeded with @p __s. 8353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __s A seed value for the base class engine. 8363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 8373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 8383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discard_block_engine(result_type __s) 8393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(__s), _M_n(0) { } 8403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 8413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 8423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generator construct a %discard_block_engine engine. 8433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 8443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __q A seed sequence. 8453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 8463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq, typename = typename 8473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::enable_if<!std::is_same<_Sseq, discard_block_engine>::value 8483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && !std::is_same<_Sseq, _RandomNumberEngine>::value> 8493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ::type> 8503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 8513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discard_block_engine(_Sseq& __q) 8523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(__q), _M_n(0) 8533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 8543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 8553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 8563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Reseeds the %discard_block_engine object with the default 8573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * seed for the underlying base class generator engine. 8583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 8593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 8603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed() 8613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 8623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_b.seed(); 8633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_n = 0; 8643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 8653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 8663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 8673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Reseeds the %discard_block_engine object with the default 8683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * seed for the underlying base class generator engine. 8693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 8703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 8713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(result_type __s) 8723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 8733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_b.seed(__s); 8743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_n = 0; 8753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 8763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 8773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 8783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Reseeds the %discard_block_engine object with the given seed 8793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * sequence. 8803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __q A seed generator function. 8813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 8823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq> 8833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 8843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(_Sseq& __q) 8853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 8863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_b.seed(__q); 8873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_n = 0; 8883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 8893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 8903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 8913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets a const reference to the underlying generator engine 8923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 8933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 8943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const _RandomNumberEngine& 8953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh base() const noexcept 8963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_b; } 8973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 8983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 8993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the minimum value in the generated random number range. 9003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 9013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 9023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() 9033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _RandomNumberEngine::min(); } 9043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 9053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 9063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the maximum value in the generated random number range. 9073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 9083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 9093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() 9103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _RandomNumberEngine::max(); } 9113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 9123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 9133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Discard a sequence of random numbers. 9143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 9153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 9163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discard(unsigned long long __z) 9173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 9183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh for (; __z != 0ULL; --__z) 9193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh (*this)(); 9203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 9213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 9223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 9233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the next value in the generated random number sequence. 9243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 9253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 9263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(); 9273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 9283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 9293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Compares two %discard_block_engine random number generator 9303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * objects of the same type for equality. 9313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 9323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A %discard_block_engine random number generator object. 9333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another %discard_block_engine random number generator 9343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 9353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 9363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 9373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be equal, false otherwise. 9383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 9393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 9403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const discard_block_engine& __lhs, 9413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const discard_block_engine& __rhs) 9423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __lhs._M_b == __rhs._M_b && __lhs._M_n == __rhs._M_n; } 9433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 9443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 9453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts the current state of a %discard_block_engine random 9463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * number generator engine @p __x into the output stream 9473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __os. 9483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 9493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 9503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %discard_block_engine random number generator engine. 9513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 9523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 9533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 9543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 9553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomNumberEngine1, size_t __p1, size_t __r1, 9563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 9573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 9583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 9593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::discard_block_engine<_RandomNumberEngine1, 9603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __p1, __r1>& __x); 9613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 9623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 9633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts the current state of a % subtract_with_carry_engine 9643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * random number generator engine @p __x from the input stream 9653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __is. 9663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 9673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 9683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %discard_block_engine random number generator engine. 9693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 9703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with the state of @p __x extracted or in 9713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 9723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 9733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomNumberEngine1, size_t __p1, size_t __r1, 9743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 9753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 9763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 9773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::discard_block_engine<_RandomNumberEngine1, 9783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __p1, __r1>& __x); 9793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 9803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 9813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RandomNumberEngine _M_b; 9823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh size_t _M_n; 9833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 9843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 9853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 9863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Compares two %discard_block_engine random number generator 9873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * objects of the same type for inequality. 9883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 9893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A %discard_block_engine random number generator object. 9903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another %discard_block_engine random number generator 9913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 9923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 9933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 9943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be different, false otherwise. 9953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 9963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomNumberEngine, size_t __p, size_t __r> 9973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 9983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::discard_block_engine<_RandomNumberEngine, __p, 9993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __r>& __lhs, 10003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::discard_block_engine<_RandomNumberEngine, __p, 10013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __r>& __rhs) 10023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__lhs == __rhs); } 10033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 10063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Produces random numbers by combining random numbers from some base 10073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * engine to produce random numbers with a specifies number of bits @p __w. 10083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 10093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomNumberEngine, size_t __w, typename _UIntType> 10103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class independent_bits_engine 10113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 10123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_unsigned<_UIntType>::value, "template argument " 10133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "substituting _UIntType not an unsigned integral type"); 10143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits, 10153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument substituting __w out of bounds"); 10163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 10183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the generated random value. */ 10193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _UIntType result_type; 10203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 10223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs a default %independent_bits_engine engine. 10233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 10243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The underlying engine is default constructed as well. 10253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 10263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh independent_bits_engine() 10273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b() { } 10283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 10303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Copy constructs a %independent_bits_engine engine. 10313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 10323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Copies an existing base class random number generator. 10333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rng An existing (base class) engine object. 10343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 10353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 10363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh independent_bits_engine(const _RandomNumberEngine& __rng) 10373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(__rng) { } 10383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 10403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Move constructs a %independent_bits_engine engine. 10413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 10423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Copies an existing base class random number generator. 10433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rng An existing (base class) engine object. 10443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 10453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 10463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh independent_bits_engine(_RandomNumberEngine&& __rng) 10473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(std::move(__rng)) { } 10483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 10503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Seed constructs a %independent_bits_engine engine. 10513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 10523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Constructs the underlying generator engine seeded with @p __s. 10533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __s A seed value for the base class engine. 10543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 10553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 10563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh independent_bits_engine(result_type __s) 10573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(__s) { } 10583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 10603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generator construct a %independent_bits_engine engine. 10613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 10623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __q A seed sequence. 10633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 10643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq, typename = typename 10653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::enable_if<!std::is_same<_Sseq, independent_bits_engine>::value 10663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && !std::is_same<_Sseq, _RandomNumberEngine>::value> 10673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ::type> 10683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 10693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh independent_bits_engine(_Sseq& __q) 10703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(__q) 10713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 10723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 10743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Reseeds the %independent_bits_engine object with the default 10753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * seed for the underlying base class generator engine. 10763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 10773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 10783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed() 10793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_b.seed(); } 10803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 10823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Reseeds the %independent_bits_engine object with the default 10833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * seed for the underlying base class generator engine. 10843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 10853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 10863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(result_type __s) 10873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_b.seed(__s); } 10883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 10903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Reseeds the %independent_bits_engine object with the given 10913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * seed sequence. 10923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __q A seed generator function. 10933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 10943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq> 10953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 10963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(_Sseq& __q) 10973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_b.seed(__q); } 10983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 10993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 11003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets a const reference to the underlying generator engine 11013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 11023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 11033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const _RandomNumberEngine& 11043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh base() const noexcept 11053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_b; } 11063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 11073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 11083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the minimum value in the generated random number range. 11093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 11103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 11113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() 11123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return 0U; } 11133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 11143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 11153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the maximum value in the generated random number range. 11163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 11173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 11183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() 11193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __detail::_Shift<_UIntType, __w>::__value - 1; } 11203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 11213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 11223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Discard a sequence of random numbers. 11233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 11243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 11253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discard(unsigned long long __z) 11263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 11273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh for (; __z != 0ULL; --__z) 11283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh (*this)(); 11293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 11303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 11313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 11323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Gets the next value in the generated random number sequence. 11333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 11343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 11353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(); 11363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 11373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 11383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Compares two %independent_bits_engine random number generator 11393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * objects of the same type for equality. 11403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 11413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A %independent_bits_engine random number generator 11423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 11433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another %independent_bits_engine random number generator 11443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 11453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 11463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 11473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be equal, false otherwise. 11483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 11493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 11503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const independent_bits_engine& __lhs, 11513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const independent_bits_engine& __rhs) 11523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __lhs._M_b == __rhs._M_b; } 11533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 11543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 11553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts the current state of a % subtract_with_carry_engine 11563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * random number generator engine @p __x from the input stream 11573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __is. 11583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 11593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 11603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %independent_bits_engine random number generator 11613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * engine. 11623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 11633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with the state of @p __x extracted or in 11643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 11653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 11663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _CharT, typename _Traits> 11673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 11683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 11693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::independent_bits_engine<_RandomNumberEngine, 11703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __w, _UIntType>& __x) 11713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 11723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __is >> __x._M_b; 11733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return __is; 11743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 11753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 11763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 11773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RandomNumberEngine _M_b; 11783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 11793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 11803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 11813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Compares two %independent_bits_engine random number generator 11823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * objects of the same type for inequality. 11833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 11843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A %independent_bits_engine random number generator 11853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 11863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another %independent_bits_engine random number generator 11873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 11883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 11893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 11903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be different, false otherwise. 11913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 11923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomNumberEngine, size_t __w, typename _UIntType> 11933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 11943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::independent_bits_engine<_RandomNumberEngine, __w, 11953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType>& __lhs, 11963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::independent_bits_engine<_RandomNumberEngine, __w, 11973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _UIntType>& __rhs) 11983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__lhs == __rhs); } 11993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 12003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 12013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts the current state of a %independent_bits_engine random 12023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * number generator engine @p __x into the output stream @p __os. 12033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 12043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 12053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %independent_bits_engine random number generator engine. 12063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 12073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 12083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 12093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 12103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomNumberEngine, size_t __w, typename _UIntType, 12113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 12123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_ostream<_CharT, _Traits>& 12133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 12143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::independent_bits_engine<_RandomNumberEngine, 12153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __w, _UIntType>& __x) 12163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 12173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __os << __x.base(); 12183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return __os; 12193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 12203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 12213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 12223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 12233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Produces random numbers by combining random numbers from some 12243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * base engine to produce random numbers with a specifies number of bits 12253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __w. 12263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 12273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomNumberEngine, size_t __k> 12283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class shuffle_order_engine 12293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 12303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(1u <= __k, "template argument substituting " 12313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "__k out of bound"); 12323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 12333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 12343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the generated random value. */ 12353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef typename _RandomNumberEngine::result_type result_type; 12363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 12373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr size_t table_size = __k; 12383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 12393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 12403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs a default %shuffle_order_engine engine. 12413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 12423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The underlying engine is default constructed as well. 12433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 12443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh shuffle_order_engine() 12453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b() 12463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_initialize(); } 12473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 12483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 12493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Copy constructs a %shuffle_order_engine engine. 12503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 12513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Copies an existing base class random number generator. 12523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rng An existing (base class) engine object. 12533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 12543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 12553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh shuffle_order_engine(const _RandomNumberEngine& __rng) 12563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(__rng) 12573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_initialize(); } 12583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 12593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 12603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Move constructs a %shuffle_order_engine engine. 12613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 12623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Copies an existing base class random number generator. 12633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rng An existing (base class) engine object. 12643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 12653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 12663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh shuffle_order_engine(_RandomNumberEngine&& __rng) 12673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(std::move(__rng)) 12683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_initialize(); } 12693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 12703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 12713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Seed constructs a %shuffle_order_engine engine. 12723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 12733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Constructs the underlying generator engine seeded with @p __s. 12743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __s A seed value for the base class engine. 12753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 12763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 12773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh shuffle_order_engine(result_type __s) 12783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(__s) 12793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_initialize(); } 12803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 12813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 12823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generator construct a %shuffle_order_engine engine. 12833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 12843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __q A seed sequence. 12853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 12863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq, typename = typename 12873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::enable_if<!std::is_same<_Sseq, shuffle_order_engine>::value 12883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && !std::is_same<_Sseq, _RandomNumberEngine>::value> 12893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ::type> 12903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 12913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh shuffle_order_engine(_Sseq& __q) 12923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_b(__q) 12933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_initialize(); } 12943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 12953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 12963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Reseeds the %shuffle_order_engine object with the default seed 12973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh for the underlying base class generator engine. 12983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 12993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 13003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed() 13013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 13023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_b.seed(); 13033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 13043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 13053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 13063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 13073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Reseeds the %shuffle_order_engine object with the default seed 13083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * for the underlying base class generator engine. 13093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 13103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 13113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(result_type __s) 13123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 13133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_b.seed(__s); 13143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 13153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 13163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 13173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 13183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Reseeds the %shuffle_order_engine object with the given seed 13193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * sequence. 13203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __q A seed generator function. 13213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 13223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Sseq> 13233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 13243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed(_Sseq& __q) 13253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 13263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_b.seed(__q); 13273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 13283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 13293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 13303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 13313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Gets a const reference to the underlying generator engine object. 13323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 13333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const _RandomNumberEngine& 13343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh base() const noexcept 13353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_b; } 13363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 13373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 13383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Gets the minimum value in the generated random number range. 13393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 13403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 13413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() 13423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _RandomNumberEngine::min(); } 13433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 13443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 13453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Gets the maximum value in the generated random number range. 13463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 13473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 13483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() 13493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _RandomNumberEngine::max(); } 13503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 13513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 13523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Discard a sequence of random numbers. 13533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 13543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 13553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discard(unsigned long long __z) 13563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 13573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh for (; __z != 0ULL; --__z) 13583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh (*this)(); 13593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 13603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 13613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 13623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Gets the next value in the generated random number sequence. 13633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 13643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 13653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(); 13663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 13673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 13683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Compares two %shuffle_order_engine random number generator objects 13693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * of the same type for equality. 13703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 13713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A %shuffle_order_engine random number generator object. 13723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another %shuffle_order_engine random number generator 13733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 13743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 13753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 13763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be equal, false otherwise. 13773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 13783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 13793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const shuffle_order_engine& __lhs, 13803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const shuffle_order_engine& __rhs) 13813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return (__lhs._M_b == __rhs._M_b 13823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && std::equal(__lhs._M_v, __lhs._M_v + __k, __rhs._M_v) 13833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __lhs._M_y == __rhs._M_y); } 13843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 13853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 13863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts the current state of a %shuffle_order_engine random 13873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * number generator engine @p __x into the output stream 13883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh @p __os. 13893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 13903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 13913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %shuffle_order_engine random number generator engine. 13923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 13933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 13943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 13953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 13963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomNumberEngine1, size_t __k1, 13973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 13983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 13993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 14003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::shuffle_order_engine<_RandomNumberEngine1, 14013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __k1>& __x); 14023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 14043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts the current state of a % subtract_with_carry_engine 14053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * random number generator engine @p __x from the input stream 14063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __is. 14073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 14083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 14093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %shuffle_order_engine random number generator engine. 14103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 14113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with the state of @p __x extracted or in 14123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 14133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 14143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomNumberEngine1, size_t __k1, 14153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 14163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 14173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 14183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::shuffle_order_engine<_RandomNumberEngine1, __k1>& __x); 14193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 14213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void _M_initialize() 14223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 14233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh for (size_t __i = 0; __i < __k; ++__i) 14243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_v[__i] = _M_b(); 14253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_y = _M_b(); 14263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 14273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RandomNumberEngine _M_b; 14293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type _M_v[__k]; 14303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type _M_y; 14313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 14323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 14343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Compares two %shuffle_order_engine random number generator objects 14353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * of the same type for inequality. 14363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 14373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __lhs A %shuffle_order_engine random number generator object. 14383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __rhs Another %shuffle_order_engine random number generator 14393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * object. 14403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 14413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns true if the infinite sequences of generated values 14423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * would be different, false otherwise. 14433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 14443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomNumberEngine, size_t __k> 14453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 14463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::shuffle_order_engine<_RandomNumberEngine, 14473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __k>& __lhs, 14483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::shuffle_order_engine<_RandomNumberEngine, 14493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __k>& __rhs) 14503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__lhs == __rhs); } 14513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 14543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller. 14553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 14563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef linear_congruential_engine<uint_fast32_t, 16807UL, 0UL, 2147483647UL> 14573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh minstd_rand0; 14583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 14603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * An alternative LCR (Lehmer Generator function). 14613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 14623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef linear_congruential_engine<uint_fast32_t, 48271UL, 0UL, 2147483647UL> 14633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh minstd_rand; 14643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 14663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The classic Mersenne Twister. 14673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 14683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Reference: 14693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * M. Matsumoto and T. Nishimura, Mersenne Twister: A 623-Dimensionally 14703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Equidistributed Uniform Pseudo-Random Number Generator, ACM Transactions 14713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30. 14723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 14733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef mersenne_twister_engine< 14743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh uint_fast32_t, 14753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32, 624, 397, 31, 14763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 0x9908b0dfUL, 11, 14773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 0xffffffffUL, 7, 14783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 0x9d2c5680UL, 15, 14793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 0xefc60000UL, 18, 1812433253UL> mt19937; 14803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 14823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * An alternative Mersenne Twister. 14833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 14843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef mersenne_twister_engine< 14853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh uint_fast64_t, 14863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 64, 312, 156, 31, 14873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 0xb5026f5aa96619e9ULL, 29, 14883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 0x5555555555555555ULL, 17, 14893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 0x71d67fffeda60000ULL, 37, 14903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 0xfff7eee000000000ULL, 43, 14913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 6364136223846793005ULL> mt19937_64; 14923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> 14943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ranlux24_base; 14953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> 14973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ranlux48_base; 14983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 14993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; 15003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; 15023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef shuffle_order_engine<minstd_rand0, 256> knuth_b; 15043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef minstd_rand0 default_random_engine; 15063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 15083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * A standard interface to a platform-specific non-deterministic 15093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * random number generator (if any are available). 15103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 15113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class random_device 15123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 15133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 15143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the generated random value. */ 15153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef unsigned int result_type; 15163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // constructors, destructors and member functions 15183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1 15203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 15223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh random_device(const std::string& __token = "/dev/urandom") 15233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 15243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh if ((__token != "/dev/urandom" && __token != "/dev/random") 15253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh || !(_M_file = std::fopen(__token.c_str(), "rb"))) 15263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::__throw_runtime_error(__N("random_device::" 15273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "random_device(const std::string&)")); 15283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 15293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ~random_device() 15313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { std::fclose(_M_file); } 15323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#else 15343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 15363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh random_device(const std::string& __token = "mt19937") 15373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_mt(_M_strtoul(__token)) { } 15383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 15403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static unsigned long 15413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_strtoul(const std::string& __str) 15423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 15433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh unsigned long __ret = 5489UL; 15443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh if (__str != "mt19937") 15453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 15463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const char* __nptr = __str.c_str(); 15473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh char* __endptr; 15483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __ret = std::strtoul(__nptr, &__endptr, 0); 15493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh if (*__nptr == '\0' || *__endptr != '\0') 15503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::__throw_runtime_error(__N("random_device::_M_strtoul" 15513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "(const std::string&)")); 15523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 15533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return __ret; 15543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 15553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 15573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif 15593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 15613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() 15623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::min(); } 15633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static constexpr result_type 15653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() 15663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 15673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double 15693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh entropy() const noexcept 15703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return 0.0; } 15713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 15733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()() 15743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 15753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1 15763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type __ret; 15773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type), 15783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 1, _M_file); 15793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return __ret; 15803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#else 15813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_mt(); 15823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif 15833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 15843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // No copy functions. 15863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh random_device(const random_device&) = delete; 15873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void operator=(const random_device&) = delete; 15883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 15903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1 15923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh FILE* _M_file; 15933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#else 15943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh mt19937 _M_mt; 15953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif 15963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 15973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 15983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /* @} */ // group random_generators 15993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 16013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @addtogroup random_distributions Random Number Distributions 16023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @ingroup random 16033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @{ 16043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 16053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 16073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @addtogroup random_distributions_uniform Uniform Distributions 16083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @ingroup random_distributions 16093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @{ 16103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 16113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 16133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Uniform discrete distribution for random numbers. 16143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * A discrete random distribution on the range @f$[min, max]@f$ with equal 16153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * probability throughout the range. 16163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 16173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType = int> 16183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class uniform_int_distribution 16193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 16203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_integral<_IntType>::value, 16213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not an integral type"); 16223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 16243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 16253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _IntType result_type; 16263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 16273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 16283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 16293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef uniform_int_distribution<_IntType> distribution_type; 16303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 16323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_IntType __a = 0, 16333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _IntType __b = std::numeric_limits<_IntType>::max()) 16343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_a(__a), _M_b(__b) 16353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 16363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b); 16373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 16383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 16403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh a() const 16413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_a; } 16423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 16443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh b() const 16453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_b; } 16463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 16483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 16493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 16503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 16523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _IntType _M_a; 16533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _IntType _M_b; 16543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 16553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 16573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 16583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs a uniform distribution object. 16593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 16603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 16613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh uniform_int_distribution(_IntType __a = 0, 16623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _IntType __b = std::numeric_limits<_IntType>::max()) 16633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__a, __b) 16643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 16653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 16673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh uniform_int_distribution(const param_type& __p) 16683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 16693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 16703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 16723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 16733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 16743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Does nothing for the uniform integer distribution. 16753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 16763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 16773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() { } 16783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 16803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh a() const 16813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.a(); } 16823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 16843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh b() const 16853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.b(); } 16863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 16883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 16893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 16903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 16913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 16923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 16933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 16943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 16953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 16963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 16973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 16983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 16993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 17003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 17013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 17033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the inclusive lower bound of the distribution range. 17043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 17053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 17063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 17073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->a(); } 17083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 17103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the inclusive upper bound of the distribution range. 17113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 17123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 17133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 17143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->b(); } 17153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 17173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 17183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 17193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 17203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 17213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 17223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 17233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 17253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 17263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 17273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 17283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 17303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 17313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 17333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two uniform integer distributions have 17343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters. 17353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 17363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 17373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 17383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::uniform_int_distribution<_IntType>& __d1, 17393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::uniform_int_distribution<_IntType>& __d2) 17403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 17413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 17433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two uniform integer distributions have 17443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * different parameters. 17453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 17463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 17473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 17483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::uniform_int_distribution<_IntType>& __d1, 17493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::uniform_int_distribution<_IntType>& __d2) 17503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 17513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 17533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %uniform_int_distribution random number 17543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution @p __x into the output stream @p os. 17553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 17563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 17573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %uniform_int_distribution random number distribution. 17583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 17593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 17603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 17613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 17623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType, typename _CharT, typename _Traits> 17633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_ostream<_CharT, _Traits>& 17643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>&, 17653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::uniform_int_distribution<_IntType>&); 17663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 17683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %uniform_int_distribution random number distribution 17693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 17703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 17713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 17723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %uniform_int_distribution random number generator engine. 17733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 17743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 17753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 17763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType, typename _CharT, typename _Traits> 17773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_istream<_CharT, _Traits>& 17783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>&, 17793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::uniform_int_distribution<_IntType>&); 17803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 17833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Uniform continuous distribution for random numbers. 17843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 17853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * A continuous random distribution on the range [min, max) with equal 17863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * probability throughout the range. The URNG should be real-valued and 17873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * deliver number in the range [0, 1). 17883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 17893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 17903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class uniform_real_distribution 17913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 17923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 17933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 17943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 17953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 17963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 17973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 17983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 17993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 18003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 18013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef uniform_real_distribution<_RealType> distribution_type; 18023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 18043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_RealType __a = _RealType(0), 18053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __b = _RealType(1)) 18063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_a(__a), _M_b(__b) 18073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 18083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b); 18093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 18103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 18123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh a() const 18133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_a; } 18143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 18163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh b() const 18173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_b; } 18183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 18203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 18213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 18223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 18243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_a; 18253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_b; 18263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 18273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 18293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 18303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs a uniform_real_distribution object. 18313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 18323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __a [IN] The lower bound of the distribution. 18333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __b [IN] The upper bound of the distribution. 18343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 18353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 18363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh uniform_real_distribution(_RealType __a = _RealType(0), 18373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __b = _RealType(1)) 18383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__a, __b) 18393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 18403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 18423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh uniform_real_distribution(const param_type& __p) 18433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 18443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 18453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 18473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 18483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 18493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Does nothing for the uniform real distribution. 18503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 18513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 18523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() { } 18533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 18553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh a() const 18563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.a(); } 18573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 18593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh b() const 18603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.b(); } 18613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 18633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 18643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 18653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 18663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 18673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 18683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 18703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 18713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 18723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 18733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 18743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 18753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 18763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 18783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the inclusive lower bound of the distribution range. 18793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 18803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 18813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 18823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->a(); } 18833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 18853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the inclusive upper bound of the distribution range. 18863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 18873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 18883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 18893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->b(); } 18903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 18923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 18933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 18943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 18953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 18963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 18973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 18983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 18993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 19003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 19013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 19023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p) 19033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 19043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> 19053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __aurng(__urng); 19063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return (__aurng() * (__p.b() - __p.a())) + __p.a(); 19073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 19083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 19093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 19103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 19113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 19123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 19133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 19143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two uniform real distributions have 19153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters. 19163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 19173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 19183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 19193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::uniform_real_distribution<_IntType>& __d1, 19203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::uniform_real_distribution<_IntType>& __d2) 19213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 19223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 19233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 19243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two uniform real distributions have 19253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * different parameters. 19263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 19273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 19283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 19293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::uniform_real_distribution<_IntType>& __d1, 19303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::uniform_real_distribution<_IntType>& __d2) 19313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 19323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 19333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 19343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %uniform_real_distribution random number 19353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution @p __x into the output stream @p __os. 19363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 19373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 19383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %uniform_real_distribution random number distribution. 19393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 19403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 19413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 19423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 19433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 19443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_ostream<_CharT, _Traits>& 19453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>&, 19463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::uniform_real_distribution<_RealType>&); 19473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 19483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 19493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %uniform_real_distribution random number distribution 19503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 19513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 19523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 19533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %uniform_real_distribution random number generator engine. 19543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 19553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 19563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 19573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 19583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_istream<_CharT, _Traits>& 19593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>&, 19603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::uniform_real_distribution<_RealType>&); 19613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 19623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /* @} */ // group random_distributions_uniform 19633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 19643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 19653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @addtogroup random_distributions_normal Normal Distributions 19663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @ingroup random_distributions 19673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @{ 19683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 19693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 19703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 19713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A normal continuous distribution for random numbers. 19723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 19733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the normal probability density function is 19743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f[ 19753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * p(x|\mu,\sigma) = \frac{1}{\sigma \sqrt{2 \pi}} 19763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * e^{- \frac{{x - \mu}^ {2}}{2 \sigma ^ {2}} } 19773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f] 19783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 19793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 19803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class normal_distribution 19813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 19823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 19833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 19843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 19853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 19863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 19873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 19883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 19893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 19903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 19913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef normal_distribution<_RealType> distribution_type; 19923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 19933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 19943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_RealType __mean = _RealType(0), 19953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __stddev = _RealType(1)) 19963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_mean(__mean), _M_stddev(__stddev) 19973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 19983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_stddev > _RealType(0)); 19993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 20003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 20023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh mean() const 20033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_mean; } 20043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 20063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh stddev() const 20073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_stddev; } 20083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 20103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 20113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return (__p1._M_mean == __p2._M_mean 20123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __p1._M_stddev == __p2._M_stddev); } 20133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 20153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_mean; 20163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_stddev; 20173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 20183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 20203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 20213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Constructs a normal distribution with parameters @f$mean@f$ and 20223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * standard deviation. 20233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 20243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 20253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh normal_distribution(result_type __mean = result_type(0), 20263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type __stddev = result_type(1)) 20273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__mean, __stddev), _M_saved_available(false) 20283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 20293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 20313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh normal_distribution(const param_type& __p) 20323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p), _M_saved_available(false) 20333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 20343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 20363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 20373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 20383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 20393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 20403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_saved_available = false; } 20413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 20433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the mean of the distribution. 20443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 20453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 20463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh mean() const 20473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.mean(); } 20483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 20503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the standard deviation of the distribution. 20513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 20523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 20533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh stddev() const 20543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.stddev(); } 20553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 20573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 20583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 20593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 20603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 20613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 20623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 20643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 20653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 20663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 20673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 20683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 20693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 20703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 20723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 20733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 20743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 20753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 20763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::min(); } 20773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 20793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 20803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 20813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 20823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 20833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 20843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 20863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 20873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 20883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 20893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 20903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 20913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 20923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 20943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 20953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 20963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 20973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 20983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 20993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two normal distributions have 21003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters and the sequences that would 21013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * be generated are equal. 21023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 21033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1> 21043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 21053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::normal_distribution<_RealType1>& __d1, 21063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::normal_distribution<_RealType1>& __d2); 21073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 21093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %normal_distribution random number distribution 21103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 21113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 21123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 21133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %normal_distribution random number distribution. 21143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 21153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 21163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 21173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 21183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 21193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 21203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 21213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::normal_distribution<_RealType1>& __x); 21223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 21243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %normal_distribution random number distribution 21253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 21263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 21273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 21283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %normal_distribution random number generator engine. 21293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 21303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error 21313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * state. 21323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 21333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 21343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 21353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 21363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::normal_distribution<_RealType1>& __x); 21373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 21393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 21403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type _M_saved; 21413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh bool _M_saved_available; 21423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 21433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 21453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two normal distributions are different. 21463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 21473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 21483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 21493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::normal_distribution<_RealType>& __d1, 21503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::normal_distribution<_RealType>& __d2) 21513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 21523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 21553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A lognormal_distribution random number distribution. 21563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 21573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the normal probability mass function is 21583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f[ 21593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * p(x|m,s) = \frac{1}{sx\sqrt{2\pi}} 21603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * \exp{-\frac{(\ln{x} - m)^2}{2s^2}} 21613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f] 21623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 21633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 21643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class lognormal_distribution 21653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 21663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 21673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 21683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 21703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 21713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 21723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 21733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 21743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 21753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef lognormal_distribution<_RealType> distribution_type; 21763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 21783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_RealType __m = _RealType(0), 21793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __s = _RealType(1)) 21803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_m(__m), _M_s(__s) 21813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 21823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 21843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh m() const 21853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_m; } 21863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 21883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh s() const 21893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_s; } 21903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 21923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 21933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_m == __p2._M_m && __p1._M_s == __p2._M_s; } 21943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 21953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 21963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_m; 21973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_s; 21983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 21993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 22013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh lognormal_distribution(_RealType __m = _RealType(0), 22023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __s = _RealType(1)) 22033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__m, __s), _M_nd() 22043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 22053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 22073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh lognormal_distribution(const param_type& __p) 22083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p), _M_nd() 22093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 22103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 22123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Resets the distribution state. 22133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 22143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 22153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 22163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_nd.reset(); } 22173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 22193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 22203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 22213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 22223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh m() const 22233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.m(); } 22243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 22263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh s() const 22273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.s(); } 22283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 22303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 22313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 22323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 22333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 22343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 22353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 22373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 22383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 22393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 22403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 22413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 22423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 22433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 22453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 22463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 22473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 22483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 22493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return result_type(0); } 22503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 22523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 22533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 22543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 22553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 22563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 22573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 22593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 22603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 22613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 22623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 22633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 22643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 22653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 22673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 22683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 22693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p) 22703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::exp(__p.s() * _M_nd(__urng) + __p.m()); } 22713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 22733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two lognormal distributions have 22743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters and the sequences that would 22753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * be generated are equal. 22763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 22773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 22783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const lognormal_distribution& __d1, 22793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const lognormal_distribution& __d2) 22803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return (__d1.param() == __d2.param() 22813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __d1._M_nd == __d2._M_nd); } 22823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 22843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %lognormal_distribution random number distribution 22853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 22863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 22873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 22883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %lognormal_distribution random number distribution. 22893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 22903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 22913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 22923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 22933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 22943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 22953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 22963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::lognormal_distribution<_RealType1>& __x); 22973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 22983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 22993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %lognormal_distribution random number distribution 23003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 23013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 23023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 23033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %lognormal_distribution random number 23043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 23053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 23063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 23073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 23083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 23093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 23103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 23113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::lognormal_distribution<_RealType1>& __x); 23123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 23143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 23153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::normal_distribution<result_type> _M_nd; 23173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 23183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 23203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two lognormal distributions are different. 23213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 23223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 23233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 23243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::lognormal_distribution<_RealType>& __d1, 23253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::lognormal_distribution<_RealType>& __d2) 23263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 23273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 23303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A gamma continuous distribution for random numbers. 23313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 23323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the gamma probability density function is: 23333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f[ 23343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * p(x|\alpha,\beta) = \frac{1}{\beta\Gamma(\alpha)} 23353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * (x/\beta)^{\alpha - 1} e^{-x/\beta} 23363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f] 23373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 23383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 23393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class gamma_distribution 23403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 23413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 23423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 23433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 23453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 23463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 23473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 23483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 23493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 23503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef gamma_distribution<_RealType> distribution_type; 23513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend class gamma_distribution<_RealType>; 23523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 23543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_RealType __alpha_val = _RealType(1), 23553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __beta_val = _RealType(1)) 23563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_alpha(__alpha_val), _M_beta(__beta_val) 23573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 23583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_alpha > _RealType(0)); 23593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 23603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 23613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 23633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh alpha() const 23643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_alpha; } 23653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 23673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh beta() const 23683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_beta; } 23693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 23713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 23723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return (__p1._M_alpha == __p2._M_alpha 23733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __p1._M_beta == __p2._M_beta); } 23743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 23763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 23773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 23783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_alpha; 23803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_beta; 23813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_malpha, _M_a2; 23833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 23843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 23863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 23873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs a gamma distribution with parameters 23883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f$\alpha@f$ and @f$\beta@f$. 23893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 23903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 23913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh gamma_distribution(_RealType __alpha_val = _RealType(1), 23923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __beta_val = _RealType(1)) 23933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__alpha_val, __beta_val), _M_nd() 23943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 23953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 23963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 23973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh gamma_distribution(const param_type& __p) 23983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p), _M_nd() 23993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 24003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 24023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 24033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 24043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 24053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 24063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_nd.reset(); } 24073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 24093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the @f$\alpha@f$ of the distribution. 24103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 24113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 24123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh alpha() const 24133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.alpha(); } 24143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 24163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the @f$\beta@f$ of the distribution. 24173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 24183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 24193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh beta() const 24203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.beta(); } 24213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 24233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 24243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 24253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 24263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 24273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 24283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 24303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 24313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 24323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 24333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 24343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 24353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 24363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 24383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 24393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 24403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 24413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 24423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return result_type(0); } 24433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 24453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 24463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 24473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 24483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 24493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 24503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 24523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 24533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 24543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 24553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 24563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 24573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 24583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 24603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 24613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 24623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 24633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 24653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two gamma distributions have the same 24663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameters and the sequences that would be generated 24673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * are equal. 24683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 24693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 24703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const gamma_distribution& __d1, 24713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const gamma_distribution& __d2) 24723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return (__d1.param() == __d2.param() 24733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __d1._M_nd == __d2._M_nd); } 24743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 24763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %gamma_distribution random number distribution 24773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 24783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 24793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 24803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %gamma_distribution random number distribution. 24813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 24823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 24833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 24843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 24853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 24863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 24873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 24883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::gamma_distribution<_RealType1>& __x); 24893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 24903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 24913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %gamma_distribution random number distribution 24923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 24933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 24943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 24953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %gamma_distribution random number generator engine. 24963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 24973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 24983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 24993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 25003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 25013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 25023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::gamma_distribution<_RealType1>& __x); 25033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 25053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 25063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::normal_distribution<result_type> _M_nd; 25083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 25093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 25113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two gamma distributions are different. 25123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 25133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 25143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 25153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::gamma_distribution<_RealType>& __d1, 25163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::gamma_distribution<_RealType>& __d2) 25173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 25183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 25213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A chi_squared_distribution random number distribution. 25223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 25233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the normal probability mass function is 25243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f$p(x|n) = \frac{x^{(n/2) - 1}e^{-x/2}}{\Gamma(n/2) 2^{n/2}}@f$ 25253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 25263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 25273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class chi_squared_distribution 25283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 25293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 25303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 25313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 25333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 25343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 25353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 25363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 25373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 25383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef chi_squared_distribution<_RealType> distribution_type; 25393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 25413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_RealType __n = _RealType(1)) 25423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_n(__n) 25433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 25443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 25463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh n() const 25473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_n; } 25483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 25503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 25513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_n == __p2._M_n; } 25523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 25543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_n; 25553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 25563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 25583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh chi_squared_distribution(_RealType __n = _RealType(1)) 25593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__n), _M_gd(__n / 2) 25603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 25613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 25633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh chi_squared_distribution(const param_type& __p) 25643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p), _M_gd(__p.n() / 2) 25653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 25663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 25683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 25693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 25703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 25713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 25723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_gd.reset(); } 25733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 25753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 25763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 25773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 25783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh n() const 25793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.n(); } 25803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 25823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 25833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 25843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 25853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 25863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 25873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 25893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 25903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 25913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 25923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 25933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 25943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 25953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 25963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 25973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 25983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 25993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 26003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 26013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return result_type(0); } 26023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 26043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 26053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 26063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 26073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 26083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 26093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 26113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 26123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 26133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 26143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 26153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 26163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return 2 * _M_gd(__urng); } 26173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 26193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 26203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 26213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p) 26223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 26233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef typename std::gamma_distribution<result_type>::param_type 26243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type; 26253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return 2 * _M_gd(__urng, param_type(__p.n() / 2)); 26263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 26273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 26293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Chi-squared distributions have 26303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters and the sequences that would be 26313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generated are equal. 26323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 26333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 26343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const chi_squared_distribution& __d1, 26353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const chi_squared_distribution& __d2) 26363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param() && __d1._M_gd == __d2._M_gd; } 26373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 26393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %chi_squared_distribution random number distribution 26403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 26413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 26423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 26433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %chi_squared_distribution random number distribution. 26443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 26453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 26463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 26473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 26483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 26493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 26503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 26513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::chi_squared_distribution<_RealType1>& __x); 26523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 26543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %chi_squared_distribution random number distribution 26553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 26563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 26573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 26583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %chi_squared_distribution random number 26593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 26603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 26613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 26623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 26633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 26643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 26653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 26663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::chi_squared_distribution<_RealType1>& __x); 26673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 26693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 26703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::gamma_distribution<result_type> _M_gd; 26723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 26733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 26753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Chi-squared distributions are different. 26763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 26773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 26783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 26793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::chi_squared_distribution<_RealType>& __d1, 26803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::chi_squared_distribution<_RealType>& __d2) 26813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 26823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 26853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A cauchy_distribution random number distribution. 26863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 26873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the normal probability mass function is 26883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f$p(x|a,b) = (\pi b (1 + (\frac{x-a}{b})^2))^{-1}@f$ 26893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 26903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 26913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class cauchy_distribution 26923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 26933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 26943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 26953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 26963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 26973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 26983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 26993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 27003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 27013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 27023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef cauchy_distribution<_RealType> distribution_type; 27033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 27053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_RealType __a = _RealType(0), 27063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __b = _RealType(1)) 27073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_a(__a), _M_b(__b) 27083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 27093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 27113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh a() const 27123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_a; } 27133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 27153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh b() const 27163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_b; } 27173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 27193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 27203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 27213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 27233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_a; 27243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_b; 27253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 27263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 27283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh cauchy_distribution(_RealType __a = _RealType(0), 27293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __b = _RealType(1)) 27303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__a, __b) 27313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 27323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 27343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh cauchy_distribution(const param_type& __p) 27353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 27363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 27373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 27393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 27403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 27413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 27423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 27433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 27443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 27463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 27473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 27483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 27493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh a() const 27503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.a(); } 27513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 27533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh b() const 27543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.b(); } 27553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 27573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 27583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 27593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 27603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 27613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 27623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 27643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 27653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 27663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 27673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 27683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 27693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 27703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 27723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 27733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 27743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 27753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 27763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::min(); } 27773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 27793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 27803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 27813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 27823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 27833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 27843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 27863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 27873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 27883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 27893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 27903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 27913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 27923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 27943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 27953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 27963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 27973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 27983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 27993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 28003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 28013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 28033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Cauchy distributions have 28043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters. 28053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 28063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 28073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 28083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::cauchy_distribution<_RealType>& __d1, 28093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::cauchy_distribution<_RealType>& __d2) 28103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 28113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 28133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Cauchy distributions have 28143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * different parameters. 28153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 28163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 28173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 28183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::cauchy_distribution<_RealType>& __d1, 28193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::cauchy_distribution<_RealType>& __d2) 28203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 28213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 28233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %cauchy_distribution random number distribution 28243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 28253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 28263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 28273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %cauchy_distribution random number distribution. 28283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 28293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 28303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 28313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 28323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 28333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_ostream<_CharT, _Traits>& 28343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 28353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::cauchy_distribution<_RealType>& __x); 28363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 28383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %cauchy_distribution random number distribution 28393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 28403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 28413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 28423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %cauchy_distribution random number 28433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 28443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 28453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 28463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 28473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 28483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_istream<_CharT, _Traits>& 28493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 28503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::cauchy_distribution<_RealType>& __x); 28513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 28543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A fisher_f_distribution random number distribution. 28553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 28563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the normal probability mass function is 28573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f[ 28583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * p(x|m,n) = \frac{\Gamma((m+n)/2)}{\Gamma(m/2)\Gamma(n/2)} 28593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * (\frac{m}{n})^{m/2} x^{(m/2)-1} 28603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * (1 + \frac{mx}{n})^{-(m+n)/2} 28613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f] 28623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 28633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 28643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class fisher_f_distribution 28653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 28663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 28673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 28683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 28703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 28713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 28723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 28733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 28743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 28753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef fisher_f_distribution<_RealType> distribution_type; 28763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 28783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_RealType __m = _RealType(1), 28793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __n = _RealType(1)) 28803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_m(__m), _M_n(__n) 28813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 28823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 28843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh m() const 28853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_m; } 28863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 28883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh n() const 28893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_n; } 28903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 28923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 28933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_m == __p2._M_m && __p1._M_n == __p2._M_n; } 28943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 28953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 28963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_m; 28973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_n; 28983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 28993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 29013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh fisher_f_distribution(_RealType __m = _RealType(1), 29023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __n = _RealType(1)) 29033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__m, __n), _M_gd_x(__m / 2), _M_gd_y(__n / 2) 29043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 29053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 29073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh fisher_f_distribution(const param_type& __p) 29083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p), _M_gd_x(__p.m() / 2), _M_gd_y(__p.n() / 2) 29093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 29103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 29123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 29133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 29143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 29153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 29163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 29173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_gd_x.reset(); 29183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_gd_y.reset(); 29193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 29203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 29223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 29233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 29243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 29253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh m() const 29263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.m(); } 29273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 29293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh n() const 29303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.n(); } 29313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 29333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 29343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 29353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 29363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 29373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 29383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 29403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 29413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 29423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 29433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 29443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 29453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 29463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 29483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 29493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 29503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 29513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 29523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return result_type(0); } 29533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 29553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 29563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 29573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 29583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 29593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 29603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 29623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 29633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 29643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 29653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 29663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 29673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return (_M_gd_x(__urng) * n()) / (_M_gd_y(__urng) * m()); } 29683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 29703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 29713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 29723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p) 29733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 29743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef typename std::gamma_distribution<result_type>::param_type 29753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type; 29763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return ((_M_gd_x(__urng, param_type(__p.m() / 2)) * n()) 29773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh / (_M_gd_y(__urng, param_type(__p.n() / 2)) * m())); 29783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 29793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 29813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Fisher f distributions have 29823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters and the sequences that would 29833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * be generated are equal. 29843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 29853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 29863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const fisher_f_distribution& __d1, 29873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const fisher_f_distribution& __d2) 29883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return (__d1.param() == __d2.param() 29893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __d1._M_gd_x == __d2._M_gd_x 29903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __d1._M_gd_y == __d2._M_gd_y); } 29913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 29923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 29933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %fisher_f_distribution random number distribution 29943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 29953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 29963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 29973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %fisher_f_distribution random number distribution. 29983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 29993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 30003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 30013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 30023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 30033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 30043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 30053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::fisher_f_distribution<_RealType1>& __x); 30063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 30083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %fisher_f_distribution random number distribution 30093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 30103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 30113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 30123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %fisher_f_distribution random number 30133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 30143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 30153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 30163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 30173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 30183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 30193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 30203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::fisher_f_distribution<_RealType1>& __x); 30213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 30233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 30243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::gamma_distribution<result_type> _M_gd_x, _M_gd_y; 30263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 30273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 30293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Fisher f distributions are diferent. 30303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 30313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 30323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 30333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::fisher_f_distribution<_RealType>& __d1, 30343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::fisher_f_distribution<_RealType>& __d2) 30353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 30363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 30383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A student_t_distribution random number distribution. 30393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 30403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the normal probability mass function is: 30413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f[ 30423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * p(x|n) = \frac{1}{\sqrt(n\pi)} \frac{\Gamma((n+1)/2)}{\Gamma(n/2)} 30433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * (1 + \frac{x^2}{n}) ^{-(n+1)/2} 30443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f] 30453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 30463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 30473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class student_t_distribution 30483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 30493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 30503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 30513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 30533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 30543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 30553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 30563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 30573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 30583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef student_t_distribution<_RealType> distribution_type; 30593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 30613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_RealType __n = _RealType(1)) 30623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_n(__n) 30633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 30643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 30663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh n() const 30673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_n; } 30683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 30703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 30713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_n == __p2._M_n; } 30723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 30743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_n; 30753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 30763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 30783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh student_t_distribution(_RealType __n = _RealType(1)) 30793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__n), _M_nd(), _M_gd(__n / 2, 2) 30803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 30813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 30833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh student_t_distribution(const param_type& __p) 30843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p), _M_nd(), _M_gd(__p.n() / 2, 2) 30853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 30863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 30883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 30893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 30903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 30913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 30923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 30933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_nd.reset(); 30943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_gd.reset(); 30953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 30963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 30973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 30983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 30993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 31003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 31013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh n() const 31023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.n(); } 31033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 31053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 31063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 31073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 31083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 31093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 31103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 31123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 31133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 31143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 31153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 31163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 31173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 31183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 31203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 31213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 31223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 31233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 31243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::min(); } 31253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 31273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 31283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 31293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 31303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 31313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 31323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 31343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 31353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 31363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 31373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 31383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 31393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_nd(__urng) * std::sqrt(n() / _M_gd(__urng)); } 31403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 31423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 31433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 31443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p) 31453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 31463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef typename std::gamma_distribution<result_type>::param_type 31473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type; 31483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const result_type __g = _M_gd(__urng, param_type(__p.n() / 2, 2)); 31503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_nd(__urng) * std::sqrt(__p.n() / __g); 31513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 31523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 31543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Student t distributions have 31553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters and the sequences that would 31563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * be generated are equal. 31573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 31583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 31593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const student_t_distribution& __d1, 31603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const student_t_distribution& __d2) 31613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return (__d1.param() == __d2.param() 31623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __d1._M_nd == __d2._M_nd && __d1._M_gd == __d2._M_gd); } 31633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 31653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %student_t_distribution random number distribution 31663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 31673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 31683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 31693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %student_t_distribution random number distribution. 31703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 31713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 31723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 31733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 31743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 31753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 31763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 31773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::student_t_distribution<_RealType1>& __x); 31783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 31803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %student_t_distribution random number distribution 31813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 31823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 31833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 31843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %student_t_distribution random number 31853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 31863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 31873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 31883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 31893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 31903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 31913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 31923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::student_t_distribution<_RealType1>& __x); 31933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 31953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 31963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 31973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::normal_distribution<result_type> _M_nd; 31983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::gamma_distribution<result_type> _M_gd; 31993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 32003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 32023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Student t distributions are different. 32033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 32043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 32053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 32063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::student_t_distribution<_RealType>& __d1, 32073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::student_t_distribution<_RealType>& __d2) 32083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 32093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /* @} */ // group random_distributions_normal 32123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 32143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @addtogroup random_distributions_bernoulli Bernoulli Distributions 32153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @ingroup random_distributions 32163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @{ 32173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 32183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 32203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A Bernoulli random number distribution. 32213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 32223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Generates a sequence of true and false values with likelihood @f$p@f$ 32233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * that true will come up and @f$(1 - p)@f$ that false will appear. 32243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 32253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class bernoulli_distribution 32263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 32273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 32283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 32293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef bool result_type; 32303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 32313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 32323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 32333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef bernoulli_distribution distribution_type; 32343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 32363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(double __p = 0.5) 32373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_p(__p) 32383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 32393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0)); 32403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 32413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double 32433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh p() const 32443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_p; } 32453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 32473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 32483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_p == __p2._M_p; } 32493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 32513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double _M_p; 32523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 32533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 32553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 32563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs a Bernoulli distribution with likelihood @p p. 32573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 32583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __p [IN] The likelihood of a true result being returned. 32593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Must be in the interval @f$[0, 1]@f$. 32603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 32613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 32623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh bernoulli_distribution(double __p = 0.5) 32633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 32643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 32653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 32673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh bernoulli_distribution(const param_type& __p) 32683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 32693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 32703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 32723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 32733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 32743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Does nothing for a Bernoulli distribution. 32753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 32763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 32773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() { } 32783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 32803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the @p p parameter of the distribution. 32813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 32823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double 32833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh p() const 32843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.p(); } 32853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 32873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 32883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 32893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 32903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 32913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 32923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 32933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 32943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 32953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 32963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 32973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 32983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 32993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 33003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 33023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 33033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 33043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 33053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 33063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::min(); } 33073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 33093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 33103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 33113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 33123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 33133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 33143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 33163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 33173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 33183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 33193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 33203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 33213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 33223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 33243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 33253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 33263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p) 33273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 33283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __detail::_Adaptor<_UniformRandomNumberGenerator, double> 33293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __aurng(__urng); 33303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh if ((__aurng() - __aurng.min()) 33313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh < __p.p() * (__aurng.max() - __aurng.min())) 33323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return true; 33333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return false; 33343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 33353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 33373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 33383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 33393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 33413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Bernoulli distributions have 33423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters. 33433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 33443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 33453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::bernoulli_distribution& __d1, 33463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::bernoulli_distribution& __d2) 33473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 33483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 33503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Bernoulli distributions have 33513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * different parameters. 33523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 33533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 33543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::bernoulli_distribution& __d1, 33553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::bernoulli_distribution& __d2) 33563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 33573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 33593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %bernoulli_distribution random number distribution 33603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 33613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 33623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 33633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %bernoulli_distribution random number distribution. 33643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 33653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 33663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 33673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 33683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _CharT, typename _Traits> 33693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_ostream<_CharT, _Traits>& 33703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 33713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::bernoulli_distribution& __x); 33723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 33743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %bernoulli_distribution random number distribution 33753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 33763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 33773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 33783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %bernoulli_distribution random number generator engine. 33793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 33803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 33813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 33823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _CharT, typename _Traits> 33833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_istream<_CharT, _Traits>& 33843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 33853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::bernoulli_distribution& __x) 33863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 33873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double __p; 33883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __is >> __p; 33893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __x.param(bernoulli_distribution::param_type(__p)); 33903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return __is; 33913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 33923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 33943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 33953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A discrete binomial random number distribution. 33963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 33973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the binomial probability density function is 33983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f$p(i|t,p) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$ 33993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * and @f$p@f$ are the parameters of the distribution. 34003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 34013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType = int> 34023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class binomial_distribution 34033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 34043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_integral<_IntType>::value, 34053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not an integral type"); 34063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 34083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 34093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _IntType result_type; 34103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 34113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 34123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 34133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef binomial_distribution<_IntType> distribution_type; 34143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend class binomial_distribution<_IntType>; 34153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 34173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_IntType __t = _IntType(1), double __p = 0.5) 34183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_t(__t), _M_p(__p) 34193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 34203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_DEBUG_ASSERT((_M_t >= _IntType(0)) 34213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && (_M_p >= 0.0) 34223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && (_M_p <= 1.0)); 34233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 34243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 34253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _IntType 34273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh t() const 34283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_t; } 34293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double 34313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh p() const 34323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_p; } 34333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 34353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 34363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_t == __p2._M_t && __p1._M_p == __p2._M_p; } 34373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 34393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 34403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 34413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _IntType _M_t; 34433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double _M_p; 34443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double _M_q; 34463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#if _GLIBCXX_USE_C99_MATH_TR1 34473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double _M_d1, _M_d2, _M_s1, _M_s2, _M_c, 34483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_a1, _M_a123, _M_s, _M_lf, _M_lp1p; 34493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif 34503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh bool _M_easy; 34513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 34523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // constructors and member function 34543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 34553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh binomial_distribution(_IntType __t = _IntType(1), 34563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double __p = 0.5) 34573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__t, __p), _M_nd() 34583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 34593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 34613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh binomial_distribution(const param_type& __p) 34623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p), _M_nd() 34633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 34643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 34663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 34673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 34683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 34693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 34703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_nd.reset(); } 34713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 34733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the distribution @p t parameter. 34743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 34753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _IntType 34763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh t() const 34773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.t(); } 34783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 34803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the distribution @p p parameter. 34813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 34823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double 34833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh p() const 34843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.p(); } 34853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 34873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 34883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 34893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 34903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 34913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 34923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 34933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 34943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 34953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 34963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 34973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 34983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 34993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 35003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 35023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 35033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 35043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 35053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 35063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return 0; } 35073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 35093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 35103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 35113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 35123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 35133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.t(); } 35143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 35163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 35173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 35183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 35193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 35203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 35213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 35223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 35243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 35253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 35263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 35273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 35293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two binomial distributions have 35303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters and the sequences that would 35313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * be generated are equal. 35323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 35333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 35343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const binomial_distribution& __d1, 35353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const binomial_distribution& __d2) 35363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifdef _GLIBCXX_USE_C99_MATH_TR1 35373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param() && __d1._M_nd == __d2._M_nd; } 35383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#else 35393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 35403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif 35413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 35433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %binomial_distribution random number distribution 35443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 35453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 35463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 35473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %binomial_distribution random number distribution. 35483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 35493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 35503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 35513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 35523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType1, 35533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 35543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 35553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 35563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::binomial_distribution<_IntType1>& __x); 35573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 35593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %binomial_distribution random number distribution 35603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 35613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 35623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 35633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %binomial_distribution random number generator engine. 35643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 35653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error 35663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * state. 35673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 35683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType1, 35693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 35703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 35713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 35723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::binomial_distribution<_IntType1>& __x); 35733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 35753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 35763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 35773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_waiting(_UniformRandomNumberGenerator& __urng, _IntType __t); 35783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 35803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined. 35823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::normal_distribution<double> _M_nd; 35833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 35843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 35863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two binomial distributions are different. 35873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 35883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 35893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 35903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::binomial_distribution<_IntType>& __d1, 35913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::binomial_distribution<_IntType>& __d2) 35923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 35933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 35953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 35963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A discrete geometric random number distribution. 35973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 35983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the geometric probability density function is 35993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f$p(i|p) = p(1 - p)^{i}@f$ where @f$p@f$ is the parameter of the 36003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution. 36013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 36023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType = int> 36033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class geometric_distribution 36043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 36053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_integral<_IntType>::value, 36063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not an integral type"); 36073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 36093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 36103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _IntType result_type; 36113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 36123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 36133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 36143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef geometric_distribution<_IntType> distribution_type; 36153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend class geometric_distribution<_IntType>; 36163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 36183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(double __p = 0.5) 36193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_p(__p) 36203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 36213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0) && (_M_p < 1.0)); 36223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 36233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 36243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double 36263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh p() const 36273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_p; } 36283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 36303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 36313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_p == __p2._M_p; } 36323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 36343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 36353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize() 36363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_log_1_p = std::log(1.0 - _M_p); } 36373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double _M_p; 36393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double _M_log_1_p; 36413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 36423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // constructors and member function 36443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 36453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh geometric_distribution(double __p = 0.5) 36463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 36473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 36483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 36503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh geometric_distribution(const param_type& __p) 36513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 36523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 36533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 36553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 36563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 36573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Does nothing for the geometric distribution. 36583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 36593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 36603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() { } 36613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 36633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the distribution parameter @p p. 36643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 36653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double 36663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh p() const 36673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.p(); } 36683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 36703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 36713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 36723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 36733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 36743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 36753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 36773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 36783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 36793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 36803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 36813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 36823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 36833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 36853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 36863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 36873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 36883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 36893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return 0; } 36903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 36923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 36933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 36943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 36953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 36963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 36973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 36983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 36993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 37003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 37013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 37023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 37033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 37043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 37053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 37073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 37083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 37093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 37103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 37123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 37133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 37143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 37163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two geometric distributions have 37173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters. 37183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 37193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 37203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 37213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::geometric_distribution<_IntType>& __d1, 37223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::geometric_distribution<_IntType>& __d2) 37233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 37243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 37263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two geometric distributions have 37273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * different parameters. 37283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 37293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 37303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 37313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::geometric_distribution<_IntType>& __d1, 37323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::geometric_distribution<_IntType>& __d2) 37333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 37343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 37363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %geometric_distribution random number distribution 37373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 37383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 37393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 37403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %geometric_distribution random number distribution. 37413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 37423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 37433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 37443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 37453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType, 37463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 37473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_ostream<_CharT, _Traits>& 37483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 37493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::geometric_distribution<_IntType>& __x); 37503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 37523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %geometric_distribution random number distribution 37533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 37543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 37553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 37563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %geometric_distribution random number generator engine. 37573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 37583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 37593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 37603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType, 37613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typename _CharT, typename _Traits> 37623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_istream<_CharT, _Traits>& 37633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 37643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::geometric_distribution<_IntType>& __x); 37653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 37683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A negative_binomial_distribution random number distribution. 37693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 37703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the negative binomial probability mass function is 37713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f$p(i) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$ 37723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * and @f$p@f$ are the parameters of the distribution. 37733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 37743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType = int> 37753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class negative_binomial_distribution 37763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 37773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_integral<_IntType>::value, 37783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not an integral type"); 37793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 37813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 37823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _IntType result_type; 37833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 37843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 37853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 37863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef negative_binomial_distribution<_IntType> distribution_type; 37873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 37893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_IntType __k = 1, double __p = 0.5) 37903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_k(__k), _M_p(__p) 37913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 37923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_DEBUG_ASSERT((_M_k > 0) && (_M_p > 0.0) && (_M_p <= 1.0)); 37933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 37943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _IntType 37963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh k() const 37973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_k; } 37983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 37993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double 38003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh p() const 38013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_p; } 38023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 38043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 38053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_k == __p2._M_k && __p1._M_p == __p2._M_p; } 38063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 38083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _IntType _M_k; 38093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double _M_p; 38103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 38113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 38133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh negative_binomial_distribution(_IntType __k = 1, double __p = 0.5) 38143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__k, __p), _M_gd(__k, (1.0 - __p) / __p) 38153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 38163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 38183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh negative_binomial_distribution(const param_type& __p) 38193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p), _M_gd(__p.k(), (1.0 - __p.p()) / __p.p()) 38203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 38213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 38233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 38243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 38253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 38263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 38273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_gd.reset(); } 38283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 38303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return the @f$k@f$ parameter of the distribution. 38313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 38323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _IntType 38333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh k() const 38343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.k(); } 38353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 38373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return the @f$p@f$ parameter of the distribution. 38383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 38393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double 38403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh p() const 38413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.p(); } 38423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 38443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 38453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 38463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 38473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 38483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 38493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 38513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 38523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 38533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 38543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 38553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 38563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 38573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 38593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 38603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 38613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 38623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 38633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return result_type(0); } 38643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 38663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 38673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 38683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 38693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 38703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 38713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 38733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 38743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 38753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 38763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 38773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng); 38783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 38803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 38813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 38823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 38833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 38853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two negative binomial distributions have 38863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * the same parameters and the sequences that would be 38873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generated are equal. 38883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 38893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 38903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const negative_binomial_distribution& __d1, 38913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const negative_binomial_distribution& __d2) 38923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param() && __d1._M_gd == __d2._M_gd; } 38933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 38943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 38953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %negative_binomial_distribution random 38963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * number distribution @p __x into the output stream @p __os. 38973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 38983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 38993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %negative_binomial_distribution random number 39003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution. 39013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 39023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 39033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 39043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 39053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 39063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 39073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 39083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::negative_binomial_distribution<_IntType1>& __x); 39093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 39113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %negative_binomial_distribution random number 39123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution @p __x from the input stream @p __is. 39133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 39143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 39153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %negative_binomial_distribution random number 39163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 39173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 39183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 39193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 39203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 39213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 39223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 39233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::negative_binomial_distribution<_IntType1>& __x); 39243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 39263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 39273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::gamma_distribution<double> _M_gd; 39293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 39303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 39323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two negative binomial distributions are different. 39333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 39343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 39353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 39363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::negative_binomial_distribution<_IntType>& __d1, 39373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::negative_binomial_distribution<_IntType>& __d2) 39383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 39393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /* @} */ // group random_distributions_bernoulli 39423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 39443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @addtogroup random_distributions_poisson Poisson Distributions 39453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @ingroup random_distributions 39463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @{ 39473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 39483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 39503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A discrete Poisson random number distribution. 39513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 39523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the Poisson probability density function is 39533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f$p(i|\mu) = \frac{\mu^i}{i!} e^{-\mu}@f$ where @f$\mu@f$ is the 39543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameter of the distribution. 39553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 39563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType = int> 39573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class poisson_distribution 39583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 39593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_integral<_IntType>::value, 39603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not an integral type"); 39613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 39633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 39643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _IntType result_type; 39653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 39663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 39673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 39683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef poisson_distribution<_IntType> distribution_type; 39693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend class poisson_distribution<_IntType>; 39703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 39723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(double __mean = 1.0) 39733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_mean(__mean) 39743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 39753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0); 39763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 39773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 39783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double 39803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh mean() const 39813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_mean; } 39823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 39843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 39853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_mean == __p2._M_mean; } 39863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 39883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // Hosts either log(mean) or the threshold of the simple method. 39893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 39903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 39913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double _M_mean; 39933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 39943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double _M_lm_thr; 39953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#if _GLIBCXX_USE_C99_MATH_TR1 39963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double _M_lfm, _M_sm, _M_d, _M_scx, _M_1cx, _M_c2b, _M_cb; 39973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif 39983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 39993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // constructors and member function 40013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 40023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh poisson_distribution(double __mean = 1.0) 40033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__mean), _M_nd() 40043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 40053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 40073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh poisson_distribution(const param_type& __p) 40083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p), _M_nd() 40093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 40103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 40123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 40133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 40143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 40153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 40163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_nd.reset(); } 40173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 40193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the distribution parameter @p mean. 40203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 40213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh double 40223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh mean() const 40233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.mean(); } 40243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 40263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 40273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 40283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 40293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 40303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 40313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 40333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 40343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 40353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 40363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 40373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 40383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 40393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 40413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 40423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 40433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 40443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 40453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return 0; } 40463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 40483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 40493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 40503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 40513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 40523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 40533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 40553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 40563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 40573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 40583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 40593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 40603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 40613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 40633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 40643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 40653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 40663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 40683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Poisson distributions have the same 40693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameters and the sequences that would be generated 40703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * are equal. 40713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 40723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 40733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const poisson_distribution& __d1, 40743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const poisson_distribution& __d2) 40753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifdef _GLIBCXX_USE_C99_MATH_TR1 40763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param() && __d1._M_nd == __d2._M_nd; } 40773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#else 40783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 40793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif 40803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 40823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %poisson_distribution random number distribution 40833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 40843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 40853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 40863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %poisson_distribution random number distribution. 40873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 40883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 40893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 40903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 40913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 40923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 40933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 40943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::poisson_distribution<_IntType1>& __x); 40953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 40963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 40973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %poisson_distribution random number distribution 40983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 40993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 41003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 41013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %poisson_distribution random number generator engine. 41023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 41033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error 41043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * state. 41053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 41063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 41073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 41083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 41093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::poisson_distribution<_IntType1>& __x); 41103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 41123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 41133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined. 41153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::normal_distribution<double> _M_nd; 41163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 41173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 41193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Poisson distributions are different. 41203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 41213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 41223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 41233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::poisson_distribution<_IntType>& __d1, 41243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::poisson_distribution<_IntType>& __d2) 41253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 41263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 41293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief An exponential continuous distribution for random numbers. 41303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 41313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the exponential probability density function is 41323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f$p(x|\lambda) = \lambda e^{-\lambda x}@f$. 41333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 41343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * <table border=1 cellpadding=10 cellspacing=0> 41353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * <caption align=top>Distribution Statistics</caption> 41363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * <tr><td>Mean</td><td>@f$\frac{1}{\lambda}@f$</td></tr> 41373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * <tr><td>Median</td><td>@f$\frac{\ln 2}{\lambda}@f$</td></tr> 41383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * <tr><td>Mode</td><td>@f$zero@f$</td></tr> 41393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * <tr><td>Range</td><td>@f$[0, \infty]@f$</td></tr> 41403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * <tr><td>Standard Deviation</td><td>@f$\frac{1}{\lambda}@f$</td></tr> 41413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * </table> 41423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 41433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 41443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class exponential_distribution 41453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 41463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 41473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 41483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 41503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 41513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 41523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 41533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 41543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 41553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef exponential_distribution<_RealType> distribution_type; 41563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 41583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_RealType __lambda = _RealType(1)) 41593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_lambda(__lambda) 41603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 41613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_lambda > _RealType(0)); 41623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 41633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 41653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh lambda() const 41663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_lambda; } 41673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 41693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 41703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_lambda == __p2._M_lambda; } 41713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 41733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_lambda; 41743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 41753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 41773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 41783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Constructs an exponential distribution with inverse scale 41793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameter @f$\lambda@f$. 41803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 41813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 41823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh exponential_distribution(const result_type& __lambda = result_type(1)) 41833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__lambda) 41843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 41853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 41873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh exponential_distribution(const param_type& __p) 41883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 41893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 41903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 41923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 41933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 41943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Has no effect on exponential distributions. 41953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 41963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 41973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() { } 41983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 41993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 42003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the inverse scale parameter of the distribution. 42013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 42023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 42033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh lambda() const 42043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.lambda(); } 42053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 42063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 42073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 42083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 42093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 42103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 42113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 42123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 42133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 42143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 42153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 42163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 42173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 42183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 42193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 42203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 42213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 42223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 42233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 42243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 42253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 42263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return result_type(0); } 42273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 42283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 42293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 42303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 42313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 42323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 42333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 42343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 42353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 42363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 42373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 42383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 42393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 42403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 42413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 42423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 42433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 42443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 42453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 42463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p) 42473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 42483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> 42493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __aurng(__urng); 42503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return -std::log(__aurng()) / __p.lambda(); 42513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 42523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 42533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 42543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 42553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 42563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 42573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 42583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two exponential distributions have the same 42593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameters. 42603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 42613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 42623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 42633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::exponential_distribution<_RealType>& __d1, 42643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::exponential_distribution<_RealType>& __d2) 42653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 42663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 42673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 42683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two exponential distributions have different 42693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameters. 42703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 42713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 42723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 42733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::exponential_distribution<_RealType>& __d1, 42743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::exponential_distribution<_RealType>& __d2) 42753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 42763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 42773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 42783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %exponential_distribution random number distribution 42793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 42803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 42813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 42823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %exponential_distribution random number distribution. 42833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 42843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 42853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 42863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 42873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 42883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_ostream<_CharT, _Traits>& 42893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 42903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::exponential_distribution<_RealType>& __x); 42913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 42923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 42933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %exponential_distribution random number distribution 42943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 42953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 42963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 42973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %exponential_distribution random number 42983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 42993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 43003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 43013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 43023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 43033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_istream<_CharT, _Traits>& 43043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 43053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::exponential_distribution<_RealType>& __x); 43063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 43093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A weibull_distribution random number distribution. 43103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 43113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the normal probability density function is: 43123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f[ 43133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * p(x|\alpha,\beta) = \frac{\alpha}{\beta} (\frac{x}{\beta})^{\alpha-1} 43143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * \exp{(-(\frac{x}{\beta})^\alpha)} 43153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f] 43163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 43173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 43183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class weibull_distribution 43193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 43203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 43213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 43223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 43243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 43253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 43263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 43273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 43283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 43293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef weibull_distribution<_RealType> distribution_type; 43303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 43323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_RealType __a = _RealType(1), 43333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __b = _RealType(1)) 43343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_a(__a), _M_b(__b) 43353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 43363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 43383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh a() const 43393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_a; } 43403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 43423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh b() const 43433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_b; } 43443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 43463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 43473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 43483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 43503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_a; 43513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_b; 43523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 43533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 43553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh weibull_distribution(_RealType __a = _RealType(1), 43563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __b = _RealType(1)) 43573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__a, __b) 43583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 43593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 43613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh weibull_distribution(const param_type& __p) 43623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 43633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 43643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 43663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 43673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 43683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 43693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 43703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 43713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 43733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return the @f$a@f$ parameter of the distribution. 43743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 43753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 43763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh a() const 43773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.a(); } 43783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 43803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return the @f$b@f$ parameter of the distribution. 43813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 43823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 43833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh b() const 43843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.b(); } 43853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 43873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 43883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 43893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 43903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 43913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 43923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 43933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 43943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 43953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 43963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 43973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 43983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 43993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 44003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 44023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 44033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 44043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 44053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 44063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return result_type(0); } 44073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 44093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 44103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 44113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 44123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 44133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 44143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 44163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 44173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 44183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 44193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 44203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 44213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 44223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 44243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 44253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 44263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 44273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 44293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 44303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 44313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 44333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Weibull distributions have the same 44343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameters. 44353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 44363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 44373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 44383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::weibull_distribution<_RealType>& __d1, 44393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::weibull_distribution<_RealType>& __d2) 44403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 44413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 44433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two Weibull distributions have different 44443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameters. 44453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 44463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 44473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 44483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::weibull_distribution<_RealType>& __d1, 44493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::weibull_distribution<_RealType>& __d2) 44503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 44513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 44533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %weibull_distribution random number distribution 44543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 44553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 44563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 44573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %weibull_distribution random number distribution. 44583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 44593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 44603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 44613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 44623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 44633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_ostream<_CharT, _Traits>& 44643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 44653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::weibull_distribution<_RealType>& __x); 44663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 44683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %weibull_distribution random number distribution 44693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 44703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 44713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 44723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %weibull_distribution random number 44733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 44743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 44753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 44763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 44773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 44783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_istream<_CharT, _Traits>& 44793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 44803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::weibull_distribution<_RealType>& __x); 44813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 44843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A extreme_value_distribution random number distribution. 44853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 44863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the normal probability mass function is 44873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f[ 44883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * p(x|a,b) = \frac{1}{b} 44893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * \exp( \frac{a-x}{b} - \exp(\frac{a-x}{b})) 44903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @f] 44913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 44923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 44933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class extreme_value_distribution 44943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 44953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 44963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 44973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 44983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 44993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 45003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 45013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 45023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 45033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 45043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef extreme_value_distribution<_RealType> distribution_type; 45053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 45073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_RealType __a = _RealType(0), 45083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __b = _RealType(1)) 45093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_a(__a), _M_b(__b) 45103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 45113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 45133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh a() const 45143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_a; } 45153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 45173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh b() const 45183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_b; } 45193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 45213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 45223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 45233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 45253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_a; 45263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType _M_b; 45273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 45283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 45303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh extreme_value_distribution(_RealType __a = _RealType(0), 45313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __b = _RealType(1)) 45323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__a, __b) 45333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 45343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 45363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh extreme_value_distribution(const param_type& __p) 45373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 45383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 45393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 45413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 45423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 45433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 45443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 45453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 45463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 45483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return the @f$a@f$ parameter of the distribution. 45493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 45503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 45513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh a() const 45523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.a(); } 45533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 45553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return the @f$b@f$ parameter of the distribution. 45563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 45573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType 45583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh b() const 45593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param.b(); } 45603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 45623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 45633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 45643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 45653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 45663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 45673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 45693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 45703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 45713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 45723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 45733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 45743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 45753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 45773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 45783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 45793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 45803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 45813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::min(); } 45823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 45843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 45853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 45863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 45873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 45883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return std::numeric_limits<result_type>::max(); } 45893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 45913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 45923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 45933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 45943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 45953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 45963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 45973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 45983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 45993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 46003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 46013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 46023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 46043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 46053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 46063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 46083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two extreme value distributions have the same 46093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameters. 46103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 46113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 46123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 46133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::extreme_value_distribution<_RealType>& __d1, 46143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::extreme_value_distribution<_RealType>& __d2) 46153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 46163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 46183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two extreme value distributions have different 46193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameters. 46203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 46213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 46223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 46233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::extreme_value_distribution<_RealType>& __d1, 46243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::extreme_value_distribution<_RealType>& __d2) 46253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 46263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 46283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %extreme_value_distribution random number distribution 46293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 46303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 46313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 46323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %extreme_value_distribution random number distribution. 46333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 46343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 46353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 46363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 46373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 46383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_ostream<_CharT, _Traits>& 46393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 46403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::extreme_value_distribution<_RealType>& __x); 46413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 46433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %extreme_value_distribution random number 46443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution @p __x from the input stream @p __is. 46453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 46463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 46473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %extreme_value_distribution random number 46483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 46493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 46503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 46513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 46523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType, typename _CharT, typename _Traits> 46533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::basic_istream<_CharT, _Traits>& 46543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 46553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::extreme_value_distribution<_RealType>& __x); 46563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 46593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A discrete_distribution random number distribution. 46603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 46613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the discrete probability mass function is 46623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 46633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 46643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType = int> 46653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class discrete_distribution 46663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 46673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_integral<_IntType>::value, 46683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not an integral type"); 46693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 46713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 46723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _IntType result_type; 46733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 46743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 46753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 46763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef discrete_distribution<_IntType> distribution_type; 46773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend class discrete_distribution<_IntType>; 46783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type() 46803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_prob(), _M_cp() 46813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 46823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _InputIterator> 46843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_InputIterator __wbegin, 46853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _InputIterator __wend) 46863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_prob(__wbegin, __wend), _M_cp() 46873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_initialize(); } 46883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(initializer_list<double> __wil) 46903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_prob(__wil.begin(), __wil.end()), _M_cp() 46913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_initialize(); } 46923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Func> 46943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(size_t __nw, double __xmin, double __xmax, 46953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _Func __fw); 46963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 46973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/ 46983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(const param_type&) = default; 46993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type& operator=(const param_type&) = default; 47003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> 47023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh probabilities() const 47033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_prob.empty() ? std::vector<double>(1, 1.0) : _M_prob; } 47043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 47063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 47073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_prob == __p2._M_prob; } 47083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 47103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 47113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 47123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> _M_prob; 47143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> _M_cp; 47153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 47163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discrete_distribution() 47183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param() 47193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 47203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _InputIterator> 47223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discrete_distribution(_InputIterator __wbegin, 47233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _InputIterator __wend) 47243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__wbegin, __wend) 47253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 47263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discrete_distribution(initializer_list<double> __wl) 47283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__wl) 47293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 47303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Func> 47323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discrete_distribution(size_t __nw, double __xmin, double __xmax, 47333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _Func __fw) 47343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__nw, __xmin, __xmax, __fw) 47353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 47363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 47383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh discrete_distribution(const param_type& __p) 47393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 47403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 47413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 47433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 47443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 47453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 47463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 47473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 47483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 47503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the probabilities of the distribution. 47513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 47523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> 47533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh probabilities() const 47543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 47553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_param._M_prob.empty() 47563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ? std::vector<double>(1, 1.0) : _M_param._M_prob; 47573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 47583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 47603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 47613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 47623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 47633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 47643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 47653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 47673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 47683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 47693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 47703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 47713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 47723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 47733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 47753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 47763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 47773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 47783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 47793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return result_type(0); } 47803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 47823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 47833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 47843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 47853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 47863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 47873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_param._M_prob.empty() 47883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ? result_type(0) : result_type(_M_param._M_prob.size() - 1); 47893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 47903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 47923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 47933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 47943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 47953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 47963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 47973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 47983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 47993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 48003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 48013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 48023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 48033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 48053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %discrete_distribution random number distribution 48063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x into the output stream @p __os. 48073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 48083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 48093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %discrete_distribution random number distribution. 48103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 48113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 48123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 48133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 48143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 48153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 48163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 48173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::discrete_distribution<_IntType1>& __x); 48183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 48203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %discrete_distribution random number distribution 48213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @p __x from the input stream @p __is. 48223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 48233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 48243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %discrete_distribution random number 48253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 48263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 48273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error 48283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * state. 48293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 48303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 48313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 48323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 48333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::discrete_distribution<_IntType1>& __x); 48343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 48363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 48373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 48383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 48403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two discrete distributions have the same 48413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameters. 48423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 48433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 48443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 48453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::discrete_distribution<_IntType>& __d1, 48463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::discrete_distribution<_IntType>& __d2) 48473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 48483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 48503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two discrete distributions have different 48513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * parameters. 48523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 48533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 48543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 48553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::discrete_distribution<_IntType>& __d1, 48563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::discrete_distribution<_IntType>& __d2) 48573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 48583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 48613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A piecewise_constant_distribution random number distribution. 48623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 48633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the piecewise constant probability mass function is 48643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 48653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 48663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 48673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class piecewise_constant_distribution 48683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 48693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 48703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 48713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 48733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 48743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 48753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 48763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 48773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 48783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef piecewise_constant_distribution<_RealType> distribution_type; 48793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend class piecewise_constant_distribution<_RealType>; 48803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type() 48823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_int(), _M_den(), _M_cp() 48833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 48843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _InputIteratorB, typename _InputIteratorW> 48863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_InputIteratorB __bfirst, 48873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _InputIteratorB __bend, 48883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _InputIteratorW __wbegin); 48893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Func> 48913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(initializer_list<_RealType> __bi, _Func __fw); 48923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Func> 48943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(size_t __nw, _RealType __xmin, _RealType __xmax, 48953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _Func __fw); 48963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 48973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/ 48983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(const param_type&) = default; 48993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type& operator=(const param_type&) = default; 49003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<_RealType> 49023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh intervals() const 49033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 49043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh if (_M_int.empty()) 49053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 49063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<_RealType> __tmp(2); 49073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __tmp[1] = _RealType(1); 49083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return __tmp; 49093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 49103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh else 49113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_int; 49123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 49133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> 49153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh densities() const 49163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_den.empty() ? std::vector<double>(1, 1.0) : _M_den; } 49173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 49193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 49203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __p1._M_int == __p2._M_int && __p1._M_den == __p2._M_den; } 49213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 49233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 49243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 49253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<_RealType> _M_int; 49273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> _M_den; 49283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> _M_cp; 49293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 49303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 49323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh piecewise_constant_distribution() 49333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param() 49343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 49353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _InputIteratorB, typename _InputIteratorW> 49373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh piecewise_constant_distribution(_InputIteratorB __bfirst, 49383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _InputIteratorB __bend, 49393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _InputIteratorW __wbegin) 49403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__bfirst, __bend, __wbegin) 49413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 49423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Func> 49443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh piecewise_constant_distribution(initializer_list<_RealType> __bl, 49453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _Func __fw) 49463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__bl, __fw) 49473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 49483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Func> 49503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh piecewise_constant_distribution(size_t __nw, 49513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __xmin, _RealType __xmax, 49523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _Func __fw) 49533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__nw, __xmin, __xmax, __fw) 49543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 49553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 49573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh piecewise_constant_distribution(const param_type& __p) 49583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 49593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 49603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 49623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Resets the distribution state. 49633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 49643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 49653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 49663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 49673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 49693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns a vector of the intervals. 49703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 49713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<_RealType> 49723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh intervals() const 49733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 49743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh if (_M_param._M_int.empty()) 49753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 49763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<_RealType> __tmp(2); 49773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __tmp[1] = _RealType(1); 49783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return __tmp; 49793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 49803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh else 49813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_param._M_int; 49823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 49833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 49853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns a vector of the probability densities. 49863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 49873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> 49883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh densities() const 49893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 49903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_param._M_den.empty() 49913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ? std::vector<double>(1, 1.0) : _M_param._M_den; 49923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 49933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 49943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 49953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 49963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 49973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 49983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 49993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 50003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 50023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 50033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 50043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 50053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 50063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 50073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 50083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 50103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 50113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 50123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 50133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 50143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 50153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_param._M_int.empty() 50163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ? result_type(0) : _M_param._M_int.front(); 50173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 50183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 50203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 50213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 50223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 50233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 50243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 50253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_param._M_int.empty() 50263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ? result_type(1) : _M_param._M_int.back(); 50273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 50283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 50303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 50313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 50323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 50333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 50343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 50353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 50363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 50383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 50393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 50403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 50413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 50433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %piecewise_constan_distribution random 50443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * number distribution @p __x into the output stream @p __os. 50453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 50463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 50473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %piecewise_constan_distribution random number 50483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution. 50493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 50503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 50513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 50523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 50533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 50543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 50553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 50563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::piecewise_constant_distribution<_RealType1>& __x); 50573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 50593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %piecewise_constan_distribution random 50603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * number distribution @p __x from the input stream @p __is. 50613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 50623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 50633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %piecewise_constan_distribution random number 50643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 50653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 50663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error 50673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * state. 50683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 50693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 50703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 50713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 50723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::piecewise_constant_distribution<_RealType1>& __x); 50733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 50753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 50763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 50773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 50793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two piecewise constant distributions have the 50803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * same parameters. 50813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 50823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 50833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 50843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::piecewise_constant_distribution<_RealType>& __d1, 50853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::piecewise_constant_distribution<_RealType>& __d2) 50863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 50873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 50893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two piecewise constant distributions have 50903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * different parameters. 50913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 50923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 50933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 50943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::piecewise_constant_distribution<_RealType>& __d1, 50953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::piecewise_constant_distribution<_RealType>& __d2) 50963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 50973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 50993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 51003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief A piecewise_linear_distribution random number distribution. 51013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 51023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The formula for the piecewise linear probability mass function is 51033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 51043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 51053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType = double> 51063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class piecewise_linear_distribution 51073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 51083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh static_assert(std::is_floating_point<_RealType>::value, 51093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh "template argument not a floating point type"); 51103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 51123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the range of the distribution. */ 51133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef _RealType result_type; 51143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Parameter type. */ 51153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh struct param_type 51163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 51173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef piecewise_linear_distribution<_RealType> distribution_type; 51183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend class piecewise_linear_distribution<_RealType>; 51193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type() 51213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_int(), _M_den(), _M_cp(), _M_m() 51223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 51233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _InputIteratorB, typename _InputIteratorW> 51253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(_InputIteratorB __bfirst, 51263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _InputIteratorB __bend, 51273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _InputIteratorW __wbegin); 51283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Func> 51303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(initializer_list<_RealType> __bl, _Func __fw); 51313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Func> 51333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(size_t __nw, _RealType __xmin, _RealType __xmax, 51343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _Func __fw); 51353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/ 51373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type(const param_type&) = default; 51383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type& operator=(const param_type&) = default; 51393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<_RealType> 51413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh intervals() const 51423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 51433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh if (_M_int.empty()) 51443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 51453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<_RealType> __tmp(2); 51463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __tmp[1] = _RealType(1); 51473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return __tmp; 51483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 51493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh else 51503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_int; 51513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 51523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> 51543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh densities() const 51553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_den.empty() ? std::vector<double>(2, 1.0) : _M_den; } 51563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend bool 51583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const param_type& __p1, const param_type& __p2) 51593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return (__p1._M_int == __p2._M_int 51603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh && __p1._M_den == __p2._M_den); } 51613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 51633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 51643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _M_initialize(); 51653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<_RealType> _M_int; 51673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> _M_den; 51683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> _M_cp; 51693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> _M_m; 51703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 51713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 51733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh piecewise_linear_distribution() 51743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param() 51753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 51763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _InputIteratorB, typename _InputIteratorW> 51783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh piecewise_linear_distribution(_InputIteratorB __bfirst, 51793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _InputIteratorB __bend, 51803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _InputIteratorW __wbegin) 51813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__bfirst, __bend, __wbegin) 51823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 51833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Func> 51853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh piecewise_linear_distribution(initializer_list<_RealType> __bl, 51863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _Func __fw) 51873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__bl, __fw) 51883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 51893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _Func> 51913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh piecewise_linear_distribution(size_t __nw, 51923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _RealType __xmin, _RealType __xmax, 51933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh _Func __fw) 51943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__nw, __xmin, __xmax, __fw) 51953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 51963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 51973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh explicit 51983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh piecewise_linear_distribution(const param_type& __p) 51993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_param(__p) 52003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 52013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 52023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 52033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Resets the distribution state. 52043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 52053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 52063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh reset() 52073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 52083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 52093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 52103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return the intervals of the distribution. 52113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 52123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<_RealType> 52133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh intervals() const 52143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 52153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh if (_M_param._M_int.empty()) 52163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 52173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<_RealType> __tmp(2); 52183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh __tmp[1] = _RealType(1); 52193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return __tmp; 52203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 52213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh else 52223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_param._M_int; 52233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 52243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 52253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 52263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return a vector of the probability densities of the 52273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution. 52283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 52293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<double> 52303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh densities() const 52313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 52323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_param._M_den.empty() 52333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ? std::vector<double>(2, 1.0) : _M_param._M_den; 52343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 52353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 52363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 52373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the parameter set of the distribution. 52383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 52393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type 52403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param() const 52413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_param; } 52423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 52433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 52443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Sets the parameter set of the distribution. 52453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __param The new parameter set of the distribution. 52463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 52473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 52483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(const param_type& __param) 52493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { _M_param = __param; } 52503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 52513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 52523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the greatest lower bound value of the distribution. 52533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 52543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 52553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh min() const 52563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 52573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_param._M_int.empty() 52583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ? result_type(0) : _M_param._M_int.front(); 52593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 52603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 52613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 52623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Returns the least upper bound value of the distribution. 52633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 52643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 52653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh max() const 52663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 52673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh return _M_param._M_int.empty() 52683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh ? result_type(1) : _M_param._M_int.back(); 52693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh } 52703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 52713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 52723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Generating functions. 52733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 52743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 52753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 52763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 52773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return this->operator()(__urng, this->param()); } 52783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 52793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _UniformRandomNumberGenerator> 52803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh result_type 52813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, 52823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const param_type& __p); 52833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 52843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 52853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Inserts a %piecewise_linear_distribution random number 52863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution @p __x into the output stream @p __os. 52873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 52883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __os An output stream. 52893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %piecewise_linear_distribution random number 52903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution. 52913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 52923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The output stream with the state of @p __x inserted or in 52933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * an error state. 52943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 52953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 52963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 52973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 52983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::piecewise_linear_distribution<_RealType1>& __x); 52993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 53013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Extracts a %piecewise_linear_distribution random number 53023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * distribution @p __x from the input stream @p __is. 53033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 53043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __is An input stream. 53053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @param __x A %piecewise_linear_distribution random number 53063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * generator engine. 53073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * 53083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @returns The input stream with @p __x extracted or in an error 53093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * state. 53103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 53113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 53123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh friend std::basic_istream<_CharT, _Traits>& 53133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 53143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::piecewise_linear_distribution<_RealType1>& __x); 53153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 53173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param_type _M_param; 53183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 53193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 53213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two piecewise linear distributions have the 53223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * same parameters. 53233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 53243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 53253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 53263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator==(const std::piecewise_linear_distribution<_RealType>& __d1, 53273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::piecewise_linear_distribution<_RealType>& __d2) 53283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return __d1.param() == __d2.param(); } 53293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 53313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief Return true if two piecewise linear distributions have 53323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * different parameters. 53333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 53343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RealType> 53353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh inline bool 53363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh operator!=(const std::piecewise_linear_distribution<_RealType>& __d1, 53373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh const std::piecewise_linear_distribution<_RealType>& __d2) 53383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return !(__d1 == __d2); } 53393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /* @} */ // group random_distributions_poisson 53423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /* @} */ // group random_distributions 53443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 53463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @addtogroup random_utilities Random Number Utilities 53473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @ingroup random 53483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @{ 53493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 53503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** 53523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @brief The seed_seq class generates sequences of seeds for random 53533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * number generators. 53543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */ 53553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh class seed_seq 53563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { 53573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh public: 53593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** The type of the seed vales. */ 53603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh typedef uint_least32_t result_type; 53613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /** Default constructor. */ 53633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed_seq() 53643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh : _M_v() 53653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { } 53663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _IntType> 53683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed_seq(std::initializer_list<_IntType> il); 53693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _InputIterator> 53713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh seed_seq(_InputIterator __begin, _InputIterator __end); 53723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // generating functions 53743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename _RandomAccessIterator> 53753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 53763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh generate(_RandomAccessIterator __begin, _RandomAccessIterator __end); 53773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh // property functions 53793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh size_t size() const 53803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { return _M_v.size(); } 53813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh template<typename OutputIterator> 53833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh void 53843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh param(OutputIterator __dest) const 53853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh { std::copy(_M_v.begin(), _M_v.end(), __dest); } 53863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh private: 53883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /// 53893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh std::vector<result_type> _M_v; 53903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh }; 53913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /* @} */ // group random_utilities 53933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh /* @} */ // group random 53953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh_GLIBCXX_END_NAMESPACE_VERSION 53973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh} // namespace std 53983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh 53993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif 5400