Home | History | Annotate | Line # | Download | only in ext
      1   1.1  mrg // Random number extensions -*- C++ -*-
      2   1.1  mrg 
      3  1.10  mrg // Copyright (C) 2012-2022 Free Software Foundation, Inc.
      4   1.1  mrg //
      5   1.1  mrg // This file is part of the GNU ISO C++ Library.  This library is free
      6   1.1  mrg // software; you can redistribute it and/or modify it under the
      7   1.1  mrg // terms of the GNU General Public License as published by the
      8   1.1  mrg // Free Software Foundation; either version 3, or (at your option)
      9   1.1  mrg // any later version.
     10   1.1  mrg 
     11   1.1  mrg // This library is distributed in the hope that it will be useful,
     12   1.1  mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13   1.1  mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14   1.1  mrg // GNU General Public License for more details.
     15   1.1  mrg 
     16   1.1  mrg // Under Section 7 of GPL version 3, you are granted additional
     17   1.1  mrg // permissions described in the GCC Runtime Library Exception, version
     18   1.1  mrg // 3.1, as published by the Free Software Foundation.
     19   1.1  mrg 
     20   1.1  mrg // You should have received a copy of the GNU General Public License and
     21   1.1  mrg // a copy of the GCC Runtime Library Exception along with this program;
     22   1.1  mrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23   1.1  mrg // <http://www.gnu.org/licenses/>.
     24   1.1  mrg 
     25   1.1  mrg /** @file ext/random
     26   1.1  mrg  *  This file is a GNU extension to the Standard C++ Library.
     27   1.1  mrg  */
     28   1.1  mrg 
     29   1.1  mrg #ifndef _EXT_RANDOM
     30   1.1  mrg #define _EXT_RANDOM 1
     31   1.1  mrg 
     32   1.1  mrg #pragma GCC system_header
     33   1.1  mrg 
     34   1.1  mrg #if __cplusplus < 201103L
     35   1.1  mrg # include <bits/c++0x_warning.h>
     36   1.1  mrg #else
     37   1.1  mrg 
     38   1.1  mrg #include <random>
     39   1.3  mrg #include <algorithm>
     40   1.1  mrg #include <array>
     41   1.1  mrg #include <ext/cmath>
     42   1.1  mrg #ifdef __SSE2__
     43   1.4  mrg # include <emmintrin.h>
     44   1.1  mrg #endif
     45   1.1  mrg 
     46   1.4  mrg #if defined(_GLIBCXX_USE_C99_STDINT_TR1) && defined(UINT32_C)
     47   1.1  mrg 
     48   1.1  mrg namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
     49   1.1  mrg {
     50   1.1  mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
     51   1.1  mrg 
     52   1.1  mrg #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
     53   1.1  mrg 
     54   1.1  mrg   /* Mersenne twister implementation optimized for vector operations.
     55   1.1  mrg    *
     56   1.1  mrg    * Reference: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/
     57   1.1  mrg    */
     58   1.1  mrg   template<typename _UIntType, size_t __m,
     59   1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
     60   1.1  mrg 	   size_t __sr1, size_t __sr2,
     61   1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
     62   1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
     63   1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
     64   1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
     65   1.1  mrg     class simd_fast_mersenne_twister_engine
     66   1.1  mrg     {
     67   1.1  mrg       static_assert(std::is_unsigned<_UIntType>::value, "template argument "
     68   1.1  mrg 		    "substituting _UIntType not an unsigned integral type");
     69   1.1  mrg       static_assert(__sr1 < 32, "first right shift too large");
     70   1.1  mrg       static_assert(__sr2 < 16, "second right shift too large");
     71   1.1  mrg       static_assert(__sl1 < 32, "first left shift too large");
     72   1.1  mrg       static_assert(__sl2 < 16, "second left shift too large");
     73   1.1  mrg 
     74   1.1  mrg     public:
     75   1.1  mrg       typedef _UIntType result_type;
     76   1.1  mrg 
     77   1.1  mrg     private:
     78   1.1  mrg       static constexpr size_t m_w = sizeof(result_type) * 8;
     79   1.1  mrg       static constexpr size_t _M_nstate = __m / 128 + 1;
     80   1.1  mrg       static constexpr size_t _M_nstate32 = _M_nstate * 4;
     81   1.1  mrg 
     82   1.1  mrg       static_assert(std::is_unsigned<_UIntType>::value, "template argument "
     83   1.1  mrg 		    "substituting _UIntType not an unsigned integral type");
     84   1.1  mrg       static_assert(__pos1 < _M_nstate, "POS1 not smaller than state size");
     85   1.1  mrg       static_assert(16 % sizeof(_UIntType) == 0,
     86   1.1  mrg 		    "UIntType size must divide 16");
     87   1.1  mrg 
     88   1.8  mrg       template<typename _Sseq>
     89   1.8  mrg 	using _If_seed_seq
     90   1.8  mrg 	  = typename std::enable_if<std::__detail::__is_seed_seq<
     91   1.8  mrg 	    _Sseq, simd_fast_mersenne_twister_engine, result_type>::value
     92   1.8  mrg 	    >::type;
     93   1.8  mrg 
     94   1.1  mrg     public:
     95   1.1  mrg       static constexpr size_t state_size = _M_nstate * (16
     96   1.1  mrg 							/ sizeof(result_type));
     97   1.1  mrg       static constexpr result_type default_seed = 5489u;
     98   1.1  mrg 
     99   1.8  mrg       // constructors and member functions
    100   1.8  mrg 
    101   1.8  mrg       simd_fast_mersenne_twister_engine()
    102   1.8  mrg       : simd_fast_mersenne_twister_engine(default_seed)
    103   1.8  mrg       { }
    104   1.8  mrg 
    105   1.1  mrg       explicit
    106   1.8  mrg       simd_fast_mersenne_twister_engine(result_type __sd)
    107   1.1  mrg       { seed(__sd); }
    108   1.1  mrg 
    109   1.8  mrg       template<typename _Sseq, typename = _If_seed_seq<_Sseq>>
    110   1.1  mrg 	explicit
    111   1.1  mrg 	simd_fast_mersenne_twister_engine(_Sseq& __q)
    112   1.1  mrg 	{ seed(__q); }
    113   1.1  mrg 
    114   1.1  mrg       void
    115   1.1  mrg       seed(result_type __sd = default_seed);
    116   1.1  mrg 
    117   1.1  mrg       template<typename _Sseq>
    118   1.8  mrg 	_If_seed_seq<_Sseq>
    119   1.1  mrg 	seed(_Sseq& __q);
    120   1.1  mrg 
    121   1.1  mrg       static constexpr result_type
    122   1.1  mrg       min()
    123   1.7  mrg       { return 0; }
    124   1.1  mrg 
    125   1.1  mrg       static constexpr result_type
    126   1.1  mrg       max()
    127   1.1  mrg       { return std::numeric_limits<result_type>::max(); }
    128   1.1  mrg 
    129   1.1  mrg       void
    130   1.1  mrg       discard(unsigned long long __z);
    131   1.1  mrg 
    132   1.1  mrg       result_type
    133   1.1  mrg       operator()()
    134   1.1  mrg       {
    135   1.1  mrg 	if (__builtin_expect(_M_pos >= state_size, 0))
    136   1.1  mrg 	  _M_gen_rand();
    137   1.1  mrg 
    138   1.1  mrg 	return _M_stateT[_M_pos++];
    139   1.1  mrg       }
    140   1.1  mrg 
    141   1.1  mrg       template<typename _UIntType_2, size_t __m_2,
    142   1.1  mrg 	       size_t __pos1_2, size_t __sl1_2, size_t __sl2_2,
    143   1.1  mrg 	       size_t __sr1_2, size_t __sr2_2,
    144   1.1  mrg 	       uint32_t __msk1_2, uint32_t __msk2_2,
    145   1.1  mrg 	       uint32_t __msk3_2, uint32_t __msk4_2,
    146   1.1  mrg 	       uint32_t __parity1_2, uint32_t __parity2_2,
    147   1.1  mrg 	       uint32_t __parity3_2, uint32_t __parity4_2>
    148   1.1  mrg 	friend bool
    149   1.1  mrg 	operator==(const simd_fast_mersenne_twister_engine<_UIntType_2,
    150   1.1  mrg 		   __m_2, __pos1_2, __sl1_2, __sl2_2, __sr1_2, __sr2_2,
    151   1.1  mrg 		   __msk1_2, __msk2_2, __msk3_2, __msk4_2,
    152   1.1  mrg 		   __parity1_2, __parity2_2, __parity3_2, __parity4_2>& __lhs,
    153   1.1  mrg 		   const simd_fast_mersenne_twister_engine<_UIntType_2,
    154   1.1  mrg 		   __m_2, __pos1_2, __sl1_2, __sl2_2, __sr1_2, __sr2_2,
    155   1.1  mrg 		   __msk1_2, __msk2_2, __msk3_2, __msk4_2,
    156   1.1  mrg 		   __parity1_2, __parity2_2, __parity3_2, __parity4_2>& __rhs);
    157   1.1  mrg 
    158   1.1  mrg       template<typename _UIntType_2, size_t __m_2,
    159   1.1  mrg 	       size_t __pos1_2, size_t __sl1_2, size_t __sl2_2,
    160   1.1  mrg 	       size_t __sr1_2, size_t __sr2_2,
    161   1.1  mrg 	       uint32_t __msk1_2, uint32_t __msk2_2,
    162   1.1  mrg 	       uint32_t __msk3_2, uint32_t __msk4_2,
    163   1.1  mrg 	       uint32_t __parity1_2, uint32_t __parity2_2,
    164   1.1  mrg 	       uint32_t __parity3_2, uint32_t __parity4_2,
    165   1.1  mrg 	       typename _CharT, typename _Traits>
    166   1.1  mrg 	friend std::basic_ostream<_CharT, _Traits>&
    167   1.1  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    168   1.1  mrg 		   const __gnu_cxx::simd_fast_mersenne_twister_engine
    169   1.1  mrg 		   <_UIntType_2,
    170   1.1  mrg 		   __m_2, __pos1_2, __sl1_2, __sl2_2, __sr1_2, __sr2_2,
    171   1.1  mrg 		   __msk1_2, __msk2_2, __msk3_2, __msk4_2,
    172   1.1  mrg 		   __parity1_2, __parity2_2, __parity3_2, __parity4_2>& __x);
    173   1.1  mrg 
    174   1.1  mrg       template<typename _UIntType_2, size_t __m_2,
    175   1.1  mrg 	       size_t __pos1_2, size_t __sl1_2, size_t __sl2_2,
    176   1.1  mrg 	       size_t __sr1_2, size_t __sr2_2,
    177   1.1  mrg 	       uint32_t __msk1_2, uint32_t __msk2_2,
    178   1.1  mrg 	       uint32_t __msk3_2, uint32_t __msk4_2,
    179   1.1  mrg 	       uint32_t __parity1_2, uint32_t __parity2_2,
    180   1.1  mrg 	       uint32_t __parity3_2, uint32_t __parity4_2,
    181   1.1  mrg 	       typename _CharT, typename _Traits>
    182   1.1  mrg 	friend std::basic_istream<_CharT, _Traits>&
    183   1.1  mrg 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
    184   1.1  mrg 		   __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType_2,
    185   1.1  mrg 		   __m_2, __pos1_2, __sl1_2, __sl2_2, __sr1_2, __sr2_2,
    186   1.1  mrg 		   __msk1_2, __msk2_2, __msk3_2, __msk4_2,
    187   1.1  mrg 		   __parity1_2, __parity2_2, __parity3_2, __parity4_2>& __x);
    188   1.1  mrg 
    189   1.1  mrg     private:
    190   1.1  mrg       union
    191   1.1  mrg       {
    192   1.1  mrg #ifdef __SSE2__
    193   1.1  mrg 	__m128i _M_state[_M_nstate];
    194   1.1  mrg #endif
    195   1.7  mrg #ifdef __ARM_NEON
    196   1.7  mrg #ifdef __aarch64__
    197   1.7  mrg 	__Uint32x4_t _M_state[_M_nstate];
    198   1.7  mrg #endif
    199   1.7  mrg #endif
    200   1.1  mrg 	uint32_t _M_state32[_M_nstate32];
    201   1.1  mrg 	result_type _M_stateT[state_size];
    202   1.1  mrg       } __attribute__ ((__aligned__ (16)));
    203   1.1  mrg       size_t _M_pos;
    204   1.1  mrg 
    205   1.1  mrg       void _M_gen_rand(void);
    206   1.1  mrg       void _M_period_certification();
    207   1.1  mrg   };
    208   1.1  mrg 
    209   1.1  mrg 
    210   1.1  mrg   template<typename _UIntType, size_t __m,
    211   1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    212   1.1  mrg 	   size_t __sr1, size_t __sr2,
    213   1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    214   1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    215   1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    216   1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
    217   1.1  mrg     inline bool
    218   1.1  mrg     operator!=(const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    219   1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2, __msk1, __msk2, __msk3,
    220   1.1  mrg 	       __msk4, __parity1, __parity2, __parity3, __parity4>& __lhs,
    221   1.1  mrg 	       const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    222   1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2, __msk1, __msk2, __msk3,
    223   1.1  mrg 	       __msk4, __parity1, __parity2, __parity3, __parity4>& __rhs)
    224   1.1  mrg     { return !(__lhs == __rhs); }
    225   1.1  mrg 
    226   1.1  mrg 
    227   1.1  mrg   /* Definitions for the SIMD-oriented Fast Mersenne Twister as defined
    228   1.1  mrg    * in the C implementation by Daito and Matsumoto, as both a 32-bit
    229   1.1  mrg    * and 64-bit version.
    230   1.1  mrg    */
    231   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint32_t, 607, 2,
    232   1.1  mrg 					    15, 3, 13, 3,
    233   1.1  mrg 					    0xfdff37ffU, 0xef7f3f7dU,
    234   1.1  mrg 					    0xff777b7dU, 0x7ff7fb2fU,
    235   1.1  mrg 					    0x00000001U, 0x00000000U,
    236   1.1  mrg 					    0x00000000U, 0x5986f054U>
    237   1.1  mrg     sfmt607;
    238   1.1  mrg 
    239   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint64_t, 607, 2,
    240   1.1  mrg 					    15, 3, 13, 3,
    241   1.1  mrg 					    0xfdff37ffU, 0xef7f3f7dU,
    242   1.1  mrg 					    0xff777b7dU, 0x7ff7fb2fU,
    243   1.1  mrg 					    0x00000001U, 0x00000000U,
    244   1.1  mrg 					    0x00000000U, 0x5986f054U>
    245   1.1  mrg     sfmt607_64;
    246   1.1  mrg 
    247   1.1  mrg 
    248   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint32_t, 1279, 7,
    249   1.1  mrg 					    14, 3, 5, 1,
    250   1.1  mrg 					    0xf7fefffdU, 0x7fefcfffU,
    251   1.1  mrg 					    0xaff3ef3fU, 0xb5ffff7fU,
    252   1.1  mrg 					    0x00000001U, 0x00000000U,
    253   1.1  mrg 					    0x00000000U, 0x20000000U>
    254   1.1  mrg     sfmt1279;
    255   1.1  mrg 
    256   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint64_t, 1279, 7,
    257   1.1  mrg 					    14, 3, 5, 1,
    258   1.1  mrg 					    0xf7fefffdU, 0x7fefcfffU,
    259   1.1  mrg 					    0xaff3ef3fU, 0xb5ffff7fU,
    260   1.1  mrg 					    0x00000001U, 0x00000000U,
    261   1.1  mrg 					    0x00000000U, 0x20000000U>
    262   1.1  mrg     sfmt1279_64;
    263   1.1  mrg 
    264   1.1  mrg 
    265   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint32_t, 2281, 12,
    266   1.1  mrg 					    19, 1, 5, 1,
    267   1.1  mrg 					    0xbff7ffbfU, 0xfdfffffeU,
    268   1.1  mrg 					    0xf7ffef7fU, 0xf2f7cbbfU,
    269   1.1  mrg 					    0x00000001U, 0x00000000U,
    270   1.1  mrg 					    0x00000000U, 0x41dfa600U>
    271   1.1  mrg     sfmt2281;
    272   1.1  mrg 
    273   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint64_t, 2281, 12,
    274   1.1  mrg 					    19, 1, 5, 1,
    275   1.1  mrg 					    0xbff7ffbfU, 0xfdfffffeU,
    276   1.1  mrg 					    0xf7ffef7fU, 0xf2f7cbbfU,
    277   1.1  mrg 					    0x00000001U, 0x00000000U,
    278   1.1  mrg 					    0x00000000U, 0x41dfa600U>
    279   1.1  mrg     sfmt2281_64;
    280   1.1  mrg 
    281   1.1  mrg 
    282   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint32_t, 4253, 17,
    283   1.1  mrg 					    20, 1, 7, 1,
    284   1.1  mrg 					    0x9f7bffffU, 0x9fffff5fU,
    285   1.1  mrg 					    0x3efffffbU, 0xfffff7bbU,
    286   1.1  mrg 					    0xa8000001U, 0xaf5390a3U,
    287   1.1  mrg 					    0xb740b3f8U, 0x6c11486dU>
    288   1.1  mrg     sfmt4253;
    289   1.1  mrg 
    290   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint64_t, 4253, 17,
    291   1.1  mrg 					    20, 1, 7, 1,
    292   1.1  mrg 					    0x9f7bffffU, 0x9fffff5fU,
    293   1.1  mrg 					    0x3efffffbU, 0xfffff7bbU,
    294   1.1  mrg 					    0xa8000001U, 0xaf5390a3U,
    295   1.1  mrg 					    0xb740b3f8U, 0x6c11486dU>
    296   1.1  mrg     sfmt4253_64;
    297   1.1  mrg 
    298   1.1  mrg 
    299   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint32_t, 11213, 68,
    300   1.1  mrg 					    14, 3, 7, 3,
    301   1.1  mrg 					    0xeffff7fbU, 0xffffffefU,
    302   1.1  mrg 					    0xdfdfbfffU, 0x7fffdbfdU,
    303   1.1  mrg 					    0x00000001U, 0x00000000U,
    304   1.1  mrg 					    0xe8148000U, 0xd0c7afa3U>
    305   1.1  mrg     sfmt11213;
    306   1.1  mrg 
    307   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint64_t, 11213, 68,
    308   1.1  mrg 					    14, 3, 7, 3,
    309   1.1  mrg 					    0xeffff7fbU, 0xffffffefU,
    310   1.1  mrg 					    0xdfdfbfffU, 0x7fffdbfdU,
    311   1.1  mrg 					    0x00000001U, 0x00000000U,
    312   1.1  mrg 					    0xe8148000U, 0xd0c7afa3U>
    313   1.1  mrg     sfmt11213_64;
    314   1.1  mrg 
    315   1.1  mrg 
    316   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint32_t, 19937, 122,
    317   1.1  mrg 					    18, 1, 11, 1,
    318   1.1  mrg 					    0xdfffffefU, 0xddfecb7fU,
    319   1.1  mrg 					    0xbffaffffU, 0xbffffff6U,
    320   1.1  mrg 					    0x00000001U, 0x00000000U,
    321   1.1  mrg 					    0x00000000U, 0x13c9e684U>
    322   1.1  mrg     sfmt19937;
    323   1.1  mrg 
    324   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint64_t, 19937, 122,
    325   1.1  mrg 					    18, 1, 11, 1,
    326   1.1  mrg 					    0xdfffffefU, 0xddfecb7fU,
    327   1.1  mrg 					    0xbffaffffU, 0xbffffff6U,
    328   1.1  mrg 					    0x00000001U, 0x00000000U,
    329   1.1  mrg 					    0x00000000U, 0x13c9e684U>
    330   1.1  mrg     sfmt19937_64;
    331   1.1  mrg 
    332   1.1  mrg 
    333   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint32_t, 44497, 330,
    334   1.1  mrg 					    5, 3, 9, 3,
    335   1.1  mrg 					    0xeffffffbU, 0xdfbebfffU,
    336   1.1  mrg 					    0xbfbf7befU, 0x9ffd7bffU,
    337   1.1  mrg 					    0x00000001U, 0x00000000U,
    338   1.1  mrg 					    0xa3ac4000U, 0xecc1327aU>
    339   1.1  mrg     sfmt44497;
    340   1.1  mrg 
    341   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint64_t, 44497, 330,
    342   1.1  mrg 					    5, 3, 9, 3,
    343   1.1  mrg 					    0xeffffffbU, 0xdfbebfffU,
    344   1.1  mrg 					    0xbfbf7befU, 0x9ffd7bffU,
    345   1.1  mrg 					    0x00000001U, 0x00000000U,
    346   1.1  mrg 					    0xa3ac4000U, 0xecc1327aU>
    347   1.1  mrg     sfmt44497_64;
    348   1.1  mrg 
    349  1.10  mrg #if __SIZE_WIDTH__ >= 32
    350   1.1  mrg 
    351   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint32_t, 86243, 366,
    352   1.1  mrg 					    6, 7, 19, 1,
    353   1.1  mrg 					    0xfdbffbffU, 0xbff7ff3fU,
    354   1.1  mrg 					    0xfd77efffU, 0xbf9ff3ffU,
    355   1.1  mrg 					    0x00000001U, 0x00000000U,
    356   1.1  mrg 					    0x00000000U, 0xe9528d85U>
    357   1.1  mrg     sfmt86243;
    358   1.1  mrg 
    359   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint64_t, 86243, 366,
    360   1.1  mrg 					    6, 7, 19, 1,
    361   1.1  mrg 					    0xfdbffbffU, 0xbff7ff3fU,
    362   1.1  mrg 					    0xfd77efffU, 0xbf9ff3ffU,
    363   1.1  mrg 					    0x00000001U, 0x00000000U,
    364   1.1  mrg 					    0x00000000U, 0xe9528d85U>
    365   1.1  mrg     sfmt86243_64;
    366   1.1  mrg 
    367   1.1  mrg 
    368   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint32_t, 132049, 110,
    369   1.1  mrg 					    19, 1, 21, 1,
    370   1.1  mrg 					    0xffffbb5fU, 0xfb6ebf95U,
    371   1.1  mrg 					    0xfffefffaU, 0xcff77fffU,
    372   1.1  mrg 					    0x00000001U, 0x00000000U,
    373   1.1  mrg 					    0xcb520000U, 0xc7e91c7dU>
    374   1.1  mrg     sfmt132049;
    375   1.1  mrg 
    376   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint64_t, 132049, 110,
    377   1.1  mrg 					    19, 1, 21, 1,
    378   1.1  mrg 					    0xffffbb5fU, 0xfb6ebf95U,
    379   1.1  mrg 					    0xfffefffaU, 0xcff77fffU,
    380   1.1  mrg 					    0x00000001U, 0x00000000U,
    381   1.1  mrg 					    0xcb520000U, 0xc7e91c7dU>
    382   1.1  mrg     sfmt132049_64;
    383   1.1  mrg 
    384   1.1  mrg 
    385   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint32_t, 216091, 627,
    386   1.1  mrg 					    11, 3, 10, 1,
    387   1.1  mrg 					    0xbff7bff7U, 0xbfffffffU,
    388   1.1  mrg 					    0xbffffa7fU, 0xffddfbfbU,
    389   1.1  mrg 					    0xf8000001U, 0x89e80709U,
    390   1.1  mrg 					    0x3bd2b64bU, 0x0c64b1e4U>
    391   1.1  mrg     sfmt216091;
    392   1.1  mrg 
    393   1.1  mrg   typedef simd_fast_mersenne_twister_engine<uint64_t, 216091, 627,
    394   1.1  mrg 					    11, 3, 10, 1,
    395   1.1  mrg 					    0xbff7bff7U, 0xbfffffffU,
    396   1.1  mrg 					    0xbffffa7fU, 0xffddfbfbU,
    397   1.1  mrg 					    0xf8000001U, 0x89e80709U,
    398   1.1  mrg 					    0x3bd2b64bU, 0x0c64b1e4U>
    399   1.1  mrg     sfmt216091_64;
    400  1.10  mrg #endif // __SIZE_WIDTH__ >= 32
    401   1.1  mrg 
    402   1.1  mrg #endif // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
    403   1.1  mrg 
    404   1.1  mrg   /**
    405   1.1  mrg    * @brief A beta continuous distribution for random numbers.
    406   1.1  mrg    *
    407   1.1  mrg    * The formula for the beta probability density function is:
    408   1.1  mrg    * @f[
    409   1.1  mrg    *     p(x|\alpha,\beta) = \frac{1}{B(\alpha,\beta)}
    410   1.1  mrg    *                         x^{\alpha - 1} (1 - x)^{\beta - 1}
    411   1.1  mrg    * @f]
    412   1.1  mrg    */
    413   1.1  mrg   template<typename _RealType = double>
    414   1.1  mrg     class beta_distribution
    415   1.1  mrg     {
    416   1.1  mrg       static_assert(std::is_floating_point<_RealType>::value,
    417   1.1  mrg 		    "template argument not a floating point type");
    418   1.1  mrg 
    419   1.1  mrg     public:
    420   1.1  mrg       /** The type of the range of the distribution. */
    421   1.1  mrg       typedef _RealType result_type;
    422   1.6  mrg 
    423   1.1  mrg       /** Parameter type. */
    424   1.1  mrg       struct param_type
    425   1.1  mrg       {
    426   1.1  mrg 	typedef beta_distribution<_RealType> distribution_type;
    427   1.1  mrg 	friend class beta_distribution<_RealType>;
    428   1.1  mrg 
    429   1.8  mrg 	param_type() : param_type(1) { }
    430   1.8  mrg 
    431   1.1  mrg 	explicit
    432   1.8  mrg 	param_type(_RealType __alpha_val, _RealType __beta_val = _RealType(1))
    433   1.1  mrg 	: _M_alpha(__alpha_val), _M_beta(__beta_val)
    434   1.1  mrg 	{
    435   1.4  mrg 	  __glibcxx_assert(_M_alpha > _RealType(0));
    436   1.4  mrg 	  __glibcxx_assert(_M_beta > _RealType(0));
    437   1.1  mrg 	}
    438   1.1  mrg 
    439   1.1  mrg 	_RealType
    440   1.1  mrg 	alpha() const
    441   1.1  mrg 	{ return _M_alpha; }
    442   1.1  mrg 
    443   1.1  mrg 	_RealType
    444   1.1  mrg 	beta() const
    445   1.1  mrg 	{ return _M_beta; }
    446   1.1  mrg 
    447   1.1  mrg 	friend bool
    448   1.1  mrg 	operator==(const param_type& __p1, const param_type& __p2)
    449   1.1  mrg 	{ return (__p1._M_alpha == __p2._M_alpha
    450   1.1  mrg 		  && __p1._M_beta == __p2._M_beta); }
    451   1.1  mrg 
    452   1.6  mrg 	friend bool
    453   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
    454   1.6  mrg 	{ return !(__p1 == __p2); }
    455   1.6  mrg 
    456   1.1  mrg       private:
    457   1.1  mrg 	void
    458   1.1  mrg 	_M_initialize();
    459   1.1  mrg 
    460   1.1  mrg 	_RealType _M_alpha;
    461   1.1  mrg 	_RealType _M_beta;
    462   1.1  mrg       };
    463   1.1  mrg 
    464   1.1  mrg     public:
    465   1.8  mrg       beta_distribution() : beta_distribution(1.0) { }
    466   1.8  mrg 
    467   1.1  mrg       /**
    468   1.1  mrg        * @brief Constructs a beta distribution with parameters
    469   1.1  mrg        * @f$\alpha@f$ and @f$\beta@f$.
    470   1.1  mrg        */
    471   1.1  mrg       explicit
    472   1.8  mrg       beta_distribution(_RealType __alpha_val,
    473   1.1  mrg 			_RealType __beta_val = _RealType(1))
    474   1.1  mrg       : _M_param(__alpha_val, __beta_val)
    475   1.1  mrg       { }
    476   1.1  mrg 
    477   1.1  mrg       explicit
    478   1.1  mrg       beta_distribution(const param_type& __p)
    479   1.1  mrg       : _M_param(__p)
    480   1.1  mrg       { }
    481   1.1  mrg 
    482   1.1  mrg       /**
    483   1.1  mrg        * @brief Resets the distribution state.
    484   1.1  mrg        */
    485   1.1  mrg       void
    486   1.1  mrg       reset()
    487   1.1  mrg       { }
    488   1.1  mrg 
    489   1.1  mrg       /**
    490   1.1  mrg        * @brief Returns the @f$\alpha@f$ of the distribution.
    491   1.1  mrg        */
    492   1.1  mrg       _RealType
    493   1.1  mrg       alpha() const
    494   1.1  mrg       { return _M_param.alpha(); }
    495   1.1  mrg 
    496   1.1  mrg       /**
    497   1.1  mrg        * @brief Returns the @f$\beta@f$ of the distribution.
    498   1.1  mrg        */
    499   1.1  mrg       _RealType
    500   1.1  mrg       beta() const
    501   1.1  mrg       { return _M_param.beta(); }
    502   1.1  mrg 
    503   1.1  mrg       /**
    504   1.1  mrg        * @brief Returns the parameter set of the distribution.
    505   1.1  mrg        */
    506   1.1  mrg       param_type
    507   1.1  mrg       param() const
    508   1.1  mrg       { return _M_param; }
    509   1.1  mrg 
    510   1.1  mrg       /**
    511   1.1  mrg        * @brief Sets the parameter set of the distribution.
    512   1.1  mrg        * @param __param The new parameter set of the distribution.
    513   1.1  mrg        */
    514   1.1  mrg       void
    515   1.1  mrg       param(const param_type& __param)
    516   1.1  mrg       { _M_param = __param; }
    517   1.1  mrg 
    518   1.1  mrg       /**
    519   1.1  mrg        * @brief Returns the greatest lower bound value of the distribution.
    520   1.1  mrg        */
    521   1.1  mrg       result_type
    522   1.1  mrg       min() const
    523   1.1  mrg       { return result_type(0); }
    524   1.1  mrg 
    525   1.1  mrg       /**
    526   1.1  mrg        * @brief Returns the least upper bound value of the distribution.
    527   1.1  mrg        */
    528   1.1  mrg       result_type
    529   1.1  mrg       max() const
    530   1.1  mrg       { return result_type(1); }
    531   1.1  mrg 
    532   1.1  mrg       /**
    533   1.1  mrg        * @brief Generating functions.
    534   1.1  mrg        */
    535   1.1  mrg       template<typename _UniformRandomNumberGenerator>
    536   1.1  mrg 	result_type
    537   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
    538   1.1  mrg 	{ return this->operator()(__urng, _M_param); }
    539   1.1  mrg 
    540   1.1  mrg       template<typename _UniformRandomNumberGenerator>
    541   1.1  mrg 	result_type
    542   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
    543   1.1  mrg 		   const param_type& __p);
    544   1.1  mrg 
    545   1.1  mrg       template<typename _ForwardIterator,
    546   1.1  mrg 	       typename _UniformRandomNumberGenerator>
    547   1.1  mrg 	void
    548   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
    549   1.1  mrg 		   _UniformRandomNumberGenerator& __urng)
    550   1.1  mrg 	{ this->__generate(__f, __t, __urng, _M_param); }
    551   1.1  mrg 
    552   1.1  mrg       template<typename _ForwardIterator,
    553   1.1  mrg 	       typename _UniformRandomNumberGenerator>
    554   1.1  mrg 	void
    555   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
    556   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
    557   1.1  mrg 		   const param_type& __p)
    558   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
    559   1.1  mrg 
    560   1.1  mrg       template<typename _UniformRandomNumberGenerator>
    561   1.1  mrg 	void
    562   1.1  mrg 	__generate(result_type* __f, result_type* __t,
    563   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
    564   1.1  mrg 		   const param_type& __p)
    565   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
    566   1.1  mrg 
    567   1.1  mrg       /**
    568   1.1  mrg        * @brief Return true if two beta distributions have the same
    569   1.1  mrg        *        parameters and the sequences that would be generated
    570   1.1  mrg        *        are equal.
    571   1.1  mrg        */
    572   1.1  mrg       friend bool
    573   1.1  mrg       operator==(const beta_distribution& __d1,
    574   1.1  mrg 		 const beta_distribution& __d2)
    575   1.1  mrg       { return __d1._M_param == __d2._M_param; }
    576   1.1  mrg 
    577   1.1  mrg       /**
    578   1.1  mrg        * @brief Inserts a %beta_distribution random number distribution
    579   1.1  mrg        * @p __x into the output stream @p __os.
    580   1.1  mrg        *
    581   1.1  mrg        * @param __os An output stream.
    582   1.1  mrg        * @param __x  A %beta_distribution random number distribution.
    583   1.1  mrg        *
    584   1.1  mrg        * @returns The output stream with the state of @p __x inserted or in
    585   1.1  mrg        * an error state.
    586   1.1  mrg        */
    587   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
    588   1.1  mrg 	friend std::basic_ostream<_CharT, _Traits>&
    589   1.1  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    590   1.1  mrg 		   const __gnu_cxx::beta_distribution<_RealType1>& __x);
    591   1.1  mrg 
    592   1.1  mrg       /**
    593   1.1  mrg        * @brief Extracts a %beta_distribution random number distribution
    594   1.1  mrg        * @p __x from the input stream @p __is.
    595   1.1  mrg        *
    596   1.1  mrg        * @param __is An input stream.
    597   1.1  mrg        * @param __x  A %beta_distribution random number generator engine.
    598   1.1  mrg        *
    599   1.1  mrg        * @returns The input stream with @p __x extracted or in an error state.
    600   1.1  mrg        */
    601   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
    602   1.1  mrg 	friend std::basic_istream<_CharT, _Traits>&
    603   1.1  mrg 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
    604   1.1  mrg 		   __gnu_cxx::beta_distribution<_RealType1>& __x);
    605   1.1  mrg 
    606   1.1  mrg     private:
    607   1.1  mrg       template<typename _ForwardIterator,
    608   1.1  mrg 	       typename _UniformRandomNumberGenerator>
    609   1.1  mrg 	void
    610   1.1  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
    611   1.1  mrg 			_UniformRandomNumberGenerator& __urng,
    612   1.1  mrg 			const param_type& __p);
    613   1.1  mrg 
    614   1.1  mrg       param_type _M_param;
    615   1.1  mrg     };
    616   1.1  mrg 
    617   1.1  mrg   /**
    618   1.1  mrg    * @brief Return true if two beta distributions are different.
    619   1.1  mrg    */
    620   1.1  mrg   template<typename _RealType>
    621   1.1  mrg     inline bool
    622   1.1  mrg     operator!=(const __gnu_cxx::beta_distribution<_RealType>& __d1,
    623   1.1  mrg 	       const __gnu_cxx::beta_distribution<_RealType>& __d2)
    624   1.3  mrg     { return !(__d1 == __d2); }
    625   1.1  mrg 
    626   1.1  mrg 
    627   1.1  mrg   /**
    628   1.1  mrg    * @brief A multi-variate normal continuous distribution for random numbers.
    629   1.1  mrg    *
    630   1.1  mrg    * The formula for the normal probability density function is
    631   1.1  mrg    * @f[
    632   1.1  mrg    *     p(\overrightarrow{x}|\overrightarrow{\mu },\Sigma) =
    633   1.1  mrg    *       \frac{1}{\sqrt{(2\pi )^k\det(\Sigma))}}
    634   1.1  mrg    *       e^{-\frac{1}{2}(\overrightarrow{x}-\overrightarrow{\mu})^\text{T}
    635   1.1  mrg    *          \Sigma ^{-1}(\overrightarrow{x}-\overrightarrow{\mu})}
    636   1.1  mrg    * @f]
    637   1.1  mrg    *
    638   1.1  mrg    * where @f$\overrightarrow{x}@f$ and @f$\overrightarrow{\mu}@f$ are
    639   1.1  mrg    * vectors of dimension @f$k@f$ and @f$\Sigma@f$ is the covariance
    640   1.1  mrg    * matrix (which must be positive-definite).
    641   1.1  mrg    */
    642   1.1  mrg   template<std::size_t _Dimen, typename _RealType = double>
    643   1.1  mrg     class normal_mv_distribution
    644   1.1  mrg     {
    645   1.1  mrg       static_assert(std::is_floating_point<_RealType>::value,
    646   1.1  mrg 		    "template argument not a floating point type");
    647   1.1  mrg       static_assert(_Dimen != 0, "dimension is zero");
    648   1.1  mrg 
    649   1.1  mrg     public:
    650   1.1  mrg       /** The type of the range of the distribution. */
    651   1.1  mrg       typedef std::array<_RealType, _Dimen> result_type;
    652   1.1  mrg       /** Parameter type. */
    653   1.1  mrg       class param_type
    654   1.1  mrg       {
    655   1.1  mrg 	static constexpr size_t _M_t_size = _Dimen * (_Dimen + 1) / 2;
    656   1.1  mrg 
    657   1.1  mrg       public:
    658   1.1  mrg 	typedef normal_mv_distribution<_Dimen, _RealType> distribution_type;
    659   1.1  mrg 	friend class normal_mv_distribution<_Dimen, _RealType>;
    660   1.1  mrg 
    661   1.1  mrg 	param_type()
    662   1.1  mrg 	{
    663   1.1  mrg 	  std::fill(_M_mean.begin(), _M_mean.end(), _RealType(0));
    664   1.1  mrg 	  auto __it = _M_t.begin();
    665   1.1  mrg 	  for (size_t __i = 0; __i < _Dimen; ++__i)
    666   1.1  mrg 	    {
    667   1.1  mrg 	      std::fill_n(__it, __i, _RealType(0));
    668   1.1  mrg 	      __it += __i;
    669   1.1  mrg 	      *__it++ = _RealType(1);
    670   1.1  mrg 	    }
    671   1.1  mrg 	}
    672   1.1  mrg 
    673   1.1  mrg 	template<typename _ForwardIterator1, typename _ForwardIterator2>
    674   1.1  mrg 	  param_type(_ForwardIterator1 __meanbegin,
    675   1.1  mrg 		     _ForwardIterator1 __meanend,
    676   1.1  mrg 		     _ForwardIterator2 __varcovbegin,
    677   1.1  mrg 		     _ForwardIterator2 __varcovend)
    678   1.1  mrg 	{
    679   1.1  mrg 	  __glibcxx_function_requires(_ForwardIteratorConcept<
    680   1.1  mrg 				      _ForwardIterator1>)
    681   1.1  mrg 	  __glibcxx_function_requires(_ForwardIteratorConcept<
    682   1.1  mrg 				      _ForwardIterator2>)
    683   1.1  mrg 	  _GLIBCXX_DEBUG_ASSERT(std::distance(__meanbegin, __meanend)
    684   1.1  mrg 				<= _Dimen);
    685   1.1  mrg 	  const auto __dist = std::distance(__varcovbegin, __varcovend);
    686   1.1  mrg 	  _GLIBCXX_DEBUG_ASSERT(__dist == _Dimen * _Dimen
    687   1.1  mrg 				|| __dist == _Dimen * (_Dimen + 1) / 2
    688   1.1  mrg 				|| __dist == _Dimen);
    689   1.1  mrg 
    690   1.1  mrg 	  if (__dist == _Dimen * _Dimen)
    691   1.1  mrg 	    _M_init_full(__meanbegin, __meanend, __varcovbegin, __varcovend);
    692   1.1  mrg 	  else if (__dist == _Dimen * (_Dimen + 1) / 2)
    693   1.1  mrg 	    _M_init_lower(__meanbegin, __meanend, __varcovbegin, __varcovend);
    694   1.1  mrg 	  else
    695   1.4  mrg 	    {
    696   1.4  mrg 	      __glibcxx_assert(__dist == _Dimen);
    697   1.4  mrg 	      _M_init_diagonal(__meanbegin, __meanend,
    698   1.4  mrg 			       __varcovbegin, __varcovend);
    699   1.4  mrg 	    }
    700   1.1  mrg 	}
    701   1.1  mrg 
    702   1.1  mrg 	param_type(std::initializer_list<_RealType> __mean,
    703   1.1  mrg 		   std::initializer_list<_RealType> __varcov)
    704   1.1  mrg 	{
    705   1.1  mrg 	  _GLIBCXX_DEBUG_ASSERT(__mean.size() <= _Dimen);
    706   1.1  mrg 	  _GLIBCXX_DEBUG_ASSERT(__varcov.size() == _Dimen * _Dimen
    707   1.1  mrg 				|| __varcov.size() == _Dimen * (_Dimen + 1) / 2
    708   1.1  mrg 				|| __varcov.size() == _Dimen);
    709   1.1  mrg 
    710   1.1  mrg 	  if (__varcov.size() == _Dimen * _Dimen)
    711   1.1  mrg 	    _M_init_full(__mean.begin(), __mean.end(),
    712   1.1  mrg 			 __varcov.begin(), __varcov.end());
    713   1.1  mrg 	  else if (__varcov.size() == _Dimen * (_Dimen + 1) / 2)
    714   1.1  mrg 	    _M_init_lower(__mean.begin(), __mean.end(),
    715   1.1  mrg 			  __varcov.begin(), __varcov.end());
    716   1.1  mrg 	  else
    717   1.4  mrg 	    {
    718   1.4  mrg 	      __glibcxx_assert(__varcov.size() == _Dimen);
    719   1.4  mrg 	      _M_init_diagonal(__mean.begin(), __mean.end(),
    720   1.4  mrg 			       __varcov.begin(), __varcov.end());
    721   1.4  mrg 	    }
    722   1.1  mrg 	}
    723   1.1  mrg 
    724   1.1  mrg 	std::array<_RealType, _Dimen>
    725   1.1  mrg 	mean() const
    726   1.1  mrg 	{ return _M_mean; }
    727   1.1  mrg 
    728   1.1  mrg 	std::array<_RealType, _M_t_size>
    729   1.1  mrg 	varcov() const
    730   1.1  mrg 	{ return _M_t; }
    731   1.1  mrg 
    732   1.1  mrg 	friend bool
    733   1.1  mrg 	operator==(const param_type& __p1, const param_type& __p2)
    734   1.1  mrg 	{ return __p1._M_mean == __p2._M_mean && __p1._M_t == __p2._M_t; }
    735   1.1  mrg 
    736   1.6  mrg 	friend bool
    737   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
    738   1.6  mrg 	{ return !(__p1 == __p2); }
    739   1.6  mrg 
    740   1.1  mrg       private:
    741   1.1  mrg 	template <typename _InputIterator1, typename _InputIterator2>
    742   1.1  mrg 	  void _M_init_full(_InputIterator1 __meanbegin,
    743   1.1  mrg 			    _InputIterator1 __meanend,
    744   1.1  mrg 			    _InputIterator2 __varcovbegin,
    745   1.1  mrg 			    _InputIterator2 __varcovend);
    746   1.1  mrg 	template <typename _InputIterator1, typename _InputIterator2>
    747   1.1  mrg 	  void _M_init_lower(_InputIterator1 __meanbegin,
    748   1.1  mrg 			     _InputIterator1 __meanend,
    749   1.1  mrg 			     _InputIterator2 __varcovbegin,
    750   1.1  mrg 			     _InputIterator2 __varcovend);
    751   1.1  mrg 	template <typename _InputIterator1, typename _InputIterator2>
    752   1.1  mrg 	  void _M_init_diagonal(_InputIterator1 __meanbegin,
    753   1.1  mrg 				_InputIterator1 __meanend,
    754   1.1  mrg 				_InputIterator2 __varbegin,
    755   1.1  mrg 				_InputIterator2 __varend);
    756   1.1  mrg 
    757   1.9  mrg 	// param_type constructors apply Cholesky decomposition to the
    758   1.9  mrg 	// varcov matrix in _M_init_full and _M_init_lower, but the
    759   1.9  mrg 	// varcov matrix output ot a stream is already decomposed, so
    760   1.9  mrg 	// we need means to restore it as-is when reading it back in.
    761   1.9  mrg 	template<size_t _Dimen1, typename _RealType1,
    762   1.9  mrg 		 typename _CharT, typename _Traits>
    763   1.9  mrg 	friend std::basic_istream<_CharT, _Traits>&
    764   1.9  mrg 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
    765   1.9  mrg 		   __gnu_cxx::normal_mv_distribution<_Dimen1, _RealType1>&
    766   1.9  mrg 		   __x);
    767   1.9  mrg 	param_type(std::array<_RealType, _Dimen> const &__mean,
    768   1.9  mrg 		   std::array<_RealType, _M_t_size> const &__varcov)
    769   1.9  mrg 	  : _M_mean (__mean), _M_t (__varcov)
    770   1.9  mrg 	{}
    771   1.9  mrg 
    772   1.1  mrg 	std::array<_RealType, _Dimen> _M_mean;
    773   1.1  mrg 	std::array<_RealType, _M_t_size> _M_t;
    774   1.1  mrg       };
    775   1.1  mrg 
    776   1.1  mrg     public:
    777   1.1  mrg       normal_mv_distribution()
    778   1.1  mrg       : _M_param(), _M_nd()
    779   1.1  mrg       { }
    780   1.1  mrg 
    781   1.1  mrg       template<typename _ForwardIterator1, typename _ForwardIterator2>
    782   1.1  mrg 	normal_mv_distribution(_ForwardIterator1 __meanbegin,
    783   1.1  mrg 			       _ForwardIterator1 __meanend,
    784   1.1  mrg 			       _ForwardIterator2 __varcovbegin,
    785   1.1  mrg 			       _ForwardIterator2 __varcovend)
    786   1.1  mrg 	: _M_param(__meanbegin, __meanend, __varcovbegin, __varcovend),
    787   1.1  mrg 	  _M_nd()
    788   1.1  mrg 	{ }
    789   1.1  mrg 
    790   1.1  mrg       normal_mv_distribution(std::initializer_list<_RealType> __mean,
    791   1.1  mrg 			     std::initializer_list<_RealType> __varcov)
    792   1.1  mrg       : _M_param(__mean, __varcov), _M_nd()
    793   1.1  mrg       { }
    794   1.1  mrg 
    795   1.1  mrg       explicit
    796   1.1  mrg       normal_mv_distribution(const param_type& __p)
    797   1.1  mrg       : _M_param(__p), _M_nd()
    798   1.1  mrg       { }
    799   1.1  mrg 
    800   1.1  mrg       /**
    801   1.1  mrg        * @brief Resets the distribution state.
    802   1.1  mrg        */
    803   1.1  mrg       void
    804   1.1  mrg       reset()
    805   1.1  mrg       { _M_nd.reset(); }
    806   1.1  mrg 
    807   1.1  mrg       /**
    808   1.1  mrg        * @brief Returns the mean of the distribution.
    809   1.1  mrg        */
    810   1.1  mrg       result_type
    811   1.1  mrg       mean() const
    812   1.1  mrg       { return _M_param.mean(); }
    813   1.1  mrg 
    814   1.1  mrg       /**
    815   1.1  mrg        * @brief Returns the compact form of the variance/covariance
    816   1.1  mrg        * matrix of the distribution.
    817   1.1  mrg        */
    818   1.1  mrg       std::array<_RealType, _Dimen * (_Dimen + 1) / 2>
    819   1.1  mrg       varcov() const
    820   1.1  mrg       { return _M_param.varcov(); }
    821   1.1  mrg 
    822   1.1  mrg       /**
    823   1.1  mrg        * @brief Returns the parameter set of the distribution.
    824   1.1  mrg        */
    825   1.1  mrg       param_type
    826   1.1  mrg       param() const
    827   1.1  mrg       { return _M_param; }
    828   1.1  mrg 
    829   1.1  mrg       /**
    830   1.1  mrg        * @brief Sets the parameter set of the distribution.
    831   1.1  mrg        * @param __param The new parameter set of the distribution.
    832   1.1  mrg        */
    833   1.1  mrg       void
    834   1.1  mrg       param(const param_type& __param)
    835   1.1  mrg       { _M_param = __param; }
    836   1.1  mrg 
    837   1.1  mrg       /**
    838   1.1  mrg        * @brief Returns the greatest lower bound value of the distribution.
    839   1.1  mrg        */
    840   1.1  mrg       result_type
    841   1.1  mrg       min() const
    842   1.1  mrg       { result_type __res;
    843   1.1  mrg 	__res.fill(std::numeric_limits<_RealType>::lowest());
    844   1.1  mrg 	return __res; }
    845   1.1  mrg 
    846   1.1  mrg       /**
    847   1.1  mrg        * @brief Returns the least upper bound value of the distribution.
    848   1.1  mrg        */
    849   1.1  mrg       result_type
    850   1.1  mrg       max() const
    851   1.1  mrg       { result_type __res;
    852   1.1  mrg 	__res.fill(std::numeric_limits<_RealType>::max());
    853   1.1  mrg 	return __res; }
    854   1.1  mrg 
    855   1.1  mrg       /**
    856   1.1  mrg        * @brief Generating functions.
    857   1.1  mrg        */
    858   1.1  mrg       template<typename _UniformRandomNumberGenerator>
    859   1.1  mrg 	result_type
    860   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
    861   1.1  mrg 	{ return this->operator()(__urng, _M_param); }
    862   1.1  mrg 
    863   1.1  mrg       template<typename _UniformRandomNumberGenerator>
    864   1.1  mrg 	result_type
    865   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
    866   1.1  mrg 		   const param_type& __p);
    867   1.1  mrg 
    868   1.1  mrg       template<typename _ForwardIterator,
    869   1.1  mrg 	       typename _UniformRandomNumberGenerator>
    870   1.1  mrg 	void
    871   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
    872   1.1  mrg 		   _UniformRandomNumberGenerator& __urng)
    873   1.1  mrg 	{ return this->__generate_impl(__f, __t, __urng, _M_param); }
    874   1.1  mrg 
    875   1.1  mrg       template<typename _ForwardIterator,
    876   1.1  mrg 	       typename _UniformRandomNumberGenerator>
    877   1.1  mrg 	void
    878   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
    879   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
    880   1.1  mrg 		   const param_type& __p)
    881   1.1  mrg 	{ return this->__generate_impl(__f, __t, __urng, __p); }
    882   1.1  mrg 
    883   1.1  mrg       /**
    884   1.1  mrg        * @brief Return true if two multi-variant normal distributions have
    885   1.1  mrg        *        the same parameters and the sequences that would
    886   1.1  mrg        *        be generated are equal.
    887   1.1  mrg        */
    888   1.1  mrg       template<size_t _Dimen1, typename _RealType1>
    889   1.1  mrg 	friend bool
    890   1.1  mrg 	operator==(const
    891   1.1  mrg 		   __gnu_cxx::normal_mv_distribution<_Dimen1, _RealType1>&
    892   1.1  mrg 		   __d1,
    893   1.1  mrg 		   const
    894   1.1  mrg 		   __gnu_cxx::normal_mv_distribution<_Dimen1, _RealType1>&
    895   1.1  mrg 		   __d2);
    896   1.1  mrg 
    897   1.1  mrg       /**
    898   1.1  mrg        * @brief Inserts a %normal_mv_distribution random number distribution
    899   1.1  mrg        * @p __x into the output stream @p __os.
    900   1.1  mrg        *
    901   1.1  mrg        * @param __os An output stream.
    902   1.1  mrg        * @param __x  A %normal_mv_distribution random number distribution.
    903   1.1  mrg        *
    904   1.1  mrg        * @returns The output stream with the state of @p __x inserted or in
    905   1.1  mrg        * an error state.
    906   1.1  mrg        */
    907   1.1  mrg       template<size_t _Dimen1, typename _RealType1,
    908   1.1  mrg 	       typename _CharT, typename _Traits>
    909   1.1  mrg 	friend std::basic_ostream<_CharT, _Traits>&
    910   1.1  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    911   1.1  mrg 		   const
    912   1.1  mrg 		   __gnu_cxx::normal_mv_distribution<_Dimen1, _RealType1>&
    913   1.1  mrg 		   __x);
    914   1.1  mrg 
    915   1.1  mrg       /**
    916   1.1  mrg        * @brief Extracts a %normal_mv_distribution random number distribution
    917   1.1  mrg        * @p __x from the input stream @p __is.
    918   1.1  mrg        *
    919   1.1  mrg        * @param __is An input stream.
    920   1.1  mrg        * @param __x  A %normal_mv_distribution random number generator engine.
    921   1.1  mrg        *
    922   1.1  mrg        * @returns The input stream with @p __x extracted or in an error
    923   1.1  mrg        *          state.
    924   1.1  mrg        */
    925   1.1  mrg       template<size_t _Dimen1, typename _RealType1,
    926   1.1  mrg 	       typename _CharT, typename _Traits>
    927   1.1  mrg 	friend std::basic_istream<_CharT, _Traits>&
    928   1.1  mrg 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
    929   1.1  mrg 		   __gnu_cxx::normal_mv_distribution<_Dimen1, _RealType1>&
    930   1.1  mrg 		   __x);
    931   1.1  mrg 
    932   1.1  mrg     private:
    933   1.1  mrg       template<typename _ForwardIterator,
    934   1.1  mrg 	       typename _UniformRandomNumberGenerator>
    935   1.1  mrg 	void
    936   1.1  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
    937   1.1  mrg 			_UniformRandomNumberGenerator& __urng,
    938   1.1  mrg 			const param_type& __p);
    939   1.1  mrg 
    940   1.1  mrg       param_type _M_param;
    941   1.1  mrg       std::normal_distribution<_RealType> _M_nd;
    942   1.1  mrg   };
    943   1.1  mrg 
    944   1.1  mrg   /**
    945   1.1  mrg    * @brief Return true if two multi-variate normal distributions are
    946   1.1  mrg    * different.
    947   1.1  mrg    */
    948   1.1  mrg   template<size_t _Dimen, typename _RealType>
    949   1.1  mrg     inline bool
    950   1.1  mrg     operator!=(const __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>&
    951   1.1  mrg 	       __d1,
    952   1.1  mrg 	       const __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>&
    953   1.1  mrg 	       __d2)
    954   1.1  mrg     { return !(__d1 == __d2); }
    955   1.1  mrg 
    956   1.1  mrg 
    957   1.1  mrg   /**
    958   1.1  mrg    * @brief A Rice continuous distribution for random numbers.
    959   1.1  mrg    *
    960   1.1  mrg    * The formula for the Rice probability density function is
    961   1.1  mrg    * @f[
    962   1.1  mrg    *     p(x|\nu,\sigma) = \frac{x}{\sigma^2}
    963   1.1  mrg    *                       \exp\left(-\frac{x^2+\nu^2}{2\sigma^2}\right)
    964   1.1  mrg    *                       I_0\left(\frac{x \nu}{\sigma^2}\right)
    965   1.1  mrg    * @f]
    966   1.1  mrg    * where @f$I_0(z)@f$ is the modified Bessel function of the first kind
    967   1.1  mrg    * of order 0 and @f$\nu >= 0@f$ and @f$\sigma > 0@f$.
    968   1.1  mrg    *
    969   1.1  mrg    * <table border=1 cellpadding=10 cellspacing=0>
    970   1.1  mrg    * <caption align=top>Distribution Statistics</caption>
    971   1.1  mrg    * <tr><td>Mean</td><td>@f$\sqrt{\pi/2}L_{1/2}(-\nu^2/2\sigma^2)@f$</td></tr>
    972   1.1  mrg    * <tr><td>Variance</td><td>@f$2\sigma^2 + \nu^2
    973   1.1  mrg    *                   + (\pi\sigma^2/2)L^2_{1/2}(-\nu^2/2\sigma^2)@f$</td></tr>
    974   1.1  mrg    * <tr><td>Range</td><td>@f$[0, \infty)@f$</td></tr>
    975   1.1  mrg    * </table>
    976   1.1  mrg    * where @f$L_{1/2}(x)@f$ is the Laguerre polynomial of order 1/2.
    977   1.1  mrg    */
    978   1.1  mrg   template<typename _RealType = double>
    979   1.1  mrg     class
    980   1.1  mrg     rice_distribution
    981   1.1  mrg     {
    982   1.1  mrg       static_assert(std::is_floating_point<_RealType>::value,
    983   1.1  mrg 		    "template argument not a floating point type");
    984   1.1  mrg     public:
    985   1.1  mrg       /** The type of the range of the distribution. */
    986   1.1  mrg       typedef _RealType result_type;
    987   1.6  mrg 
    988   1.1  mrg       /** Parameter type. */
    989   1.1  mrg       struct param_type
    990   1.1  mrg       {
    991   1.1  mrg 	typedef rice_distribution<result_type> distribution_type;
    992   1.1  mrg 
    993   1.8  mrg 	param_type() : param_type(0) { }
    994   1.8  mrg 
    995   1.8  mrg 	param_type(result_type __nu_val,
    996   1.1  mrg 		   result_type __sigma_val = result_type(1))
    997   1.1  mrg 	: _M_nu(__nu_val), _M_sigma(__sigma_val)
    998   1.1  mrg 	{
    999   1.4  mrg 	  __glibcxx_assert(_M_nu >= result_type(0));
   1000   1.4  mrg 	  __glibcxx_assert(_M_sigma > result_type(0));
   1001   1.1  mrg 	}
   1002   1.1  mrg 
   1003   1.1  mrg 	result_type
   1004   1.1  mrg 	nu() const
   1005   1.1  mrg 	{ return _M_nu; }
   1006   1.1  mrg 
   1007   1.1  mrg 	result_type
   1008   1.1  mrg 	sigma() const
   1009   1.1  mrg 	{ return _M_sigma; }
   1010   1.1  mrg 
   1011   1.1  mrg 	friend bool
   1012   1.1  mrg 	operator==(const param_type& __p1, const param_type& __p2)
   1013   1.6  mrg 	{ return __p1._M_nu == __p2._M_nu && __p1._M_sigma == __p2._M_sigma; }
   1014   1.6  mrg 
   1015   1.6  mrg 	friend bool
   1016   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
   1017   1.6  mrg 	{ return !(__p1 == __p2); }
   1018   1.1  mrg 
   1019   1.1  mrg       private:
   1020   1.1  mrg 	void _M_initialize();
   1021   1.1  mrg 
   1022   1.1  mrg 	result_type _M_nu;
   1023   1.1  mrg 	result_type _M_sigma;
   1024   1.1  mrg       };
   1025   1.1  mrg 
   1026   1.1  mrg       /**
   1027   1.1  mrg        * @brief Constructors.
   1028   1.8  mrg        * @{
   1029   1.1  mrg        */
   1030   1.8  mrg 
   1031   1.8  mrg       rice_distribution() : rice_distribution(0) { }
   1032   1.8  mrg 
   1033   1.1  mrg       explicit
   1034   1.8  mrg       rice_distribution(result_type __nu_val,
   1035   1.1  mrg 			result_type __sigma_val = result_type(1))
   1036   1.1  mrg       : _M_param(__nu_val, __sigma_val),
   1037   1.1  mrg 	_M_ndx(__nu_val, __sigma_val),
   1038   1.1  mrg 	_M_ndy(result_type(0), __sigma_val)
   1039   1.1  mrg       { }
   1040   1.1  mrg 
   1041   1.1  mrg       explicit
   1042   1.1  mrg       rice_distribution(const param_type& __p)
   1043   1.1  mrg       : _M_param(__p),
   1044   1.1  mrg 	_M_ndx(__p.nu(), __p.sigma()),
   1045   1.1  mrg 	_M_ndy(result_type(0), __p.sigma())
   1046   1.1  mrg       { }
   1047   1.1  mrg 
   1048   1.9  mrg       /// @}
   1049   1.8  mrg 
   1050   1.1  mrg       /**
   1051   1.1  mrg        * @brief Resets the distribution state.
   1052   1.1  mrg        */
   1053   1.1  mrg       void
   1054   1.1  mrg       reset()
   1055   1.1  mrg       {
   1056   1.1  mrg 	_M_ndx.reset();
   1057   1.1  mrg 	_M_ndy.reset();
   1058   1.1  mrg       }
   1059   1.1  mrg 
   1060   1.1  mrg       /**
   1061   1.1  mrg        * @brief Return the parameters of the distribution.
   1062   1.1  mrg        */
   1063   1.1  mrg       result_type
   1064   1.1  mrg       nu() const
   1065   1.1  mrg       { return _M_param.nu(); }
   1066   1.1  mrg 
   1067   1.1  mrg       result_type
   1068   1.1  mrg       sigma() const
   1069   1.1  mrg       { return _M_param.sigma(); }
   1070   1.1  mrg 
   1071   1.1  mrg       /**
   1072   1.1  mrg        * @brief Returns the parameter set of the distribution.
   1073   1.1  mrg        */
   1074   1.1  mrg       param_type
   1075   1.1  mrg       param() const
   1076   1.1  mrg       { return _M_param; }
   1077   1.1  mrg 
   1078   1.1  mrg       /**
   1079   1.1  mrg        * @brief Sets the parameter set of the distribution.
   1080   1.1  mrg        * @param __param The new parameter set of the distribution.
   1081   1.1  mrg        */
   1082   1.1  mrg       void
   1083   1.1  mrg       param(const param_type& __param)
   1084   1.1  mrg       { _M_param = __param; }
   1085   1.1  mrg 
   1086   1.1  mrg       /**
   1087   1.1  mrg        * @brief Returns the greatest lower bound value of the distribution.
   1088   1.1  mrg        */
   1089   1.1  mrg       result_type
   1090   1.1  mrg       min() const
   1091   1.1  mrg       { return result_type(0); }
   1092   1.1  mrg 
   1093   1.1  mrg       /**
   1094   1.1  mrg        * @brief Returns the least upper bound value of the distribution.
   1095   1.1  mrg        */
   1096   1.1  mrg       result_type
   1097   1.1  mrg       max() const
   1098   1.1  mrg       { return std::numeric_limits<result_type>::max(); }
   1099   1.1  mrg 
   1100   1.1  mrg       /**
   1101   1.1  mrg        * @brief Generating functions.
   1102   1.1  mrg        */
   1103   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1104   1.1  mrg 	result_type
   1105   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
   1106   1.1  mrg 	{
   1107   1.1  mrg 	  result_type __x = this->_M_ndx(__urng);
   1108   1.1  mrg 	  result_type __y = this->_M_ndy(__urng);
   1109   1.1  mrg #if _GLIBCXX_USE_C99_MATH_TR1
   1110   1.1  mrg 	  return std::hypot(__x, __y);
   1111   1.1  mrg #else
   1112   1.1  mrg 	  return std::sqrt(__x * __x + __y * __y);
   1113   1.1  mrg #endif
   1114   1.1  mrg 	}
   1115   1.1  mrg 
   1116   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1117   1.1  mrg 	result_type
   1118   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
   1119   1.1  mrg 		   const param_type& __p)
   1120   1.1  mrg 	{
   1121   1.1  mrg 	  typename std::normal_distribution<result_type>::param_type
   1122   1.1  mrg 	    __px(__p.nu(), __p.sigma()), __py(result_type(0), __p.sigma());
   1123   1.1  mrg 	  result_type __x = this->_M_ndx(__px, __urng);
   1124   1.1  mrg 	  result_type __y = this->_M_ndy(__py, __urng);
   1125   1.1  mrg #if _GLIBCXX_USE_C99_MATH_TR1
   1126   1.1  mrg 	  return std::hypot(__x, __y);
   1127   1.1  mrg #else
   1128   1.1  mrg 	  return std::sqrt(__x * __x + __y * __y);
   1129   1.1  mrg #endif
   1130   1.1  mrg 	}
   1131   1.1  mrg 
   1132   1.1  mrg       template<typename _ForwardIterator,
   1133   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1134   1.1  mrg 	void
   1135   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   1136   1.1  mrg 		   _UniformRandomNumberGenerator& __urng)
   1137   1.1  mrg 	{ this->__generate(__f, __t, __urng, _M_param); }
   1138   1.1  mrg 
   1139   1.1  mrg       template<typename _ForwardIterator,
   1140   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1141   1.1  mrg 	void
   1142   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   1143   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   1144   1.1  mrg 		   const param_type& __p)
   1145   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   1146   1.1  mrg 
   1147   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1148   1.1  mrg 	void
   1149   1.1  mrg 	__generate(result_type* __f, result_type* __t,
   1150   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   1151   1.1  mrg 		   const param_type& __p)
   1152   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   1153   1.1  mrg 
   1154   1.1  mrg       /**
   1155   1.1  mrg        * @brief Return true if two Rice distributions have
   1156   1.1  mrg        *        the same parameters and the sequences that would
   1157   1.1  mrg        *        be generated are equal.
   1158   1.1  mrg        */
   1159   1.1  mrg       friend bool
   1160   1.1  mrg       operator==(const rice_distribution& __d1,
   1161   1.1  mrg 		 const rice_distribution& __d2)
   1162   1.1  mrg       { return (__d1._M_param == __d2._M_param
   1163   1.1  mrg 		&& __d1._M_ndx == __d2._M_ndx
   1164   1.1  mrg 		&& __d1._M_ndy == __d2._M_ndy); }
   1165   1.1  mrg 
   1166   1.1  mrg       /**
   1167   1.1  mrg        * @brief Inserts a %rice_distribution random number distribution
   1168   1.1  mrg        * @p __x into the output stream @p __os.
   1169   1.1  mrg        *
   1170   1.1  mrg        * @param __os An output stream.
   1171   1.1  mrg        * @param __x  A %rice_distribution random number distribution.
   1172   1.1  mrg        *
   1173   1.1  mrg        * @returns The output stream with the state of @p __x inserted or in
   1174   1.1  mrg        * an error state.
   1175   1.1  mrg        */
   1176   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   1177   1.1  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   1178   1.1  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>&,
   1179   1.1  mrg 		   const rice_distribution<_RealType1>&);
   1180   1.1  mrg 
   1181   1.1  mrg       /**
   1182   1.1  mrg        * @brief Extracts a %rice_distribution random number distribution
   1183   1.1  mrg        * @p __x from the input stream @p __is.
   1184   1.1  mrg        *
   1185   1.1  mrg        * @param __is An input stream.
   1186   1.1  mrg        * @param __x A %rice_distribution random number
   1187   1.1  mrg        *            generator engine.
   1188   1.1  mrg        *
   1189   1.1  mrg        * @returns The input stream with @p __x extracted or in an error state.
   1190   1.1  mrg        */
   1191   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   1192   1.1  mrg 	friend std::basic_istream<_CharT, _Traits>&
   1193   1.1  mrg 	operator>>(std::basic_istream<_CharT, _Traits>&,
   1194   1.1  mrg 		   rice_distribution<_RealType1>&);
   1195   1.1  mrg 
   1196   1.1  mrg     private:
   1197   1.1  mrg       template<typename _ForwardIterator,
   1198   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1199   1.1  mrg 	void
   1200   1.1  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   1201   1.1  mrg 			_UniformRandomNumberGenerator& __urng,
   1202   1.1  mrg 			const param_type& __p);
   1203   1.1  mrg 
   1204   1.1  mrg       param_type _M_param;
   1205   1.1  mrg 
   1206   1.1  mrg       std::normal_distribution<result_type> _M_ndx;
   1207   1.1  mrg       std::normal_distribution<result_type> _M_ndy;
   1208   1.1  mrg     };
   1209   1.1  mrg 
   1210   1.1  mrg   /**
   1211   1.1  mrg    * @brief Return true if two Rice distributions are not equal.
   1212   1.1  mrg    */
   1213   1.1  mrg   template<typename _RealType1>
   1214   1.1  mrg     inline bool
   1215   1.1  mrg     operator!=(const rice_distribution<_RealType1>& __d1,
   1216   1.1  mrg 	       const rice_distribution<_RealType1>& __d2)
   1217   1.1  mrg     { return !(__d1 == __d2); }
   1218   1.1  mrg 
   1219   1.1  mrg 
   1220   1.1  mrg   /**
   1221   1.1  mrg    * @brief A Nakagami continuous distribution for random numbers.
   1222   1.1  mrg    *
   1223   1.1  mrg    * The formula for the Nakagami probability density function is
   1224   1.1  mrg    * @f[
   1225   1.1  mrg    *     p(x|\mu,\omega) = \frac{2\mu^\mu}{\Gamma(\mu)\omega^\mu}
   1226   1.1  mrg    *                       x^{2\mu-1}e^{-\mu x / \omega}
   1227   1.1  mrg    * @f]
   1228   1.1  mrg    * where @f$\Gamma(z)@f$ is the gamma function and @f$\mu >= 0.5@f$
   1229   1.1  mrg    * and @f$\omega > 0@f$.
   1230   1.1  mrg    */
   1231   1.1  mrg   template<typename _RealType = double>
   1232   1.1  mrg     class
   1233   1.1  mrg     nakagami_distribution
   1234   1.1  mrg     {
   1235   1.1  mrg       static_assert(std::is_floating_point<_RealType>::value,
   1236   1.1  mrg 		    "template argument not a floating point type");
   1237   1.1  mrg 
   1238   1.1  mrg     public:
   1239   1.1  mrg       /** The type of the range of the distribution. */
   1240   1.1  mrg       typedef _RealType result_type;
   1241   1.6  mrg 
   1242   1.1  mrg       /** Parameter type. */
   1243   1.1  mrg       struct param_type
   1244   1.1  mrg       {
   1245   1.1  mrg 	typedef nakagami_distribution<result_type> distribution_type;
   1246   1.1  mrg 
   1247   1.8  mrg 	param_type() : param_type(1) { }
   1248   1.8  mrg 
   1249   1.8  mrg 	param_type(result_type __mu_val,
   1250   1.1  mrg 		   result_type __omega_val = result_type(1))
   1251   1.1  mrg 	: _M_mu(__mu_val), _M_omega(__omega_val)
   1252   1.1  mrg 	{
   1253   1.4  mrg 	  __glibcxx_assert(_M_mu >= result_type(0.5L));
   1254   1.4  mrg 	  __glibcxx_assert(_M_omega > result_type(0));
   1255   1.1  mrg 	}
   1256   1.1  mrg 
   1257   1.1  mrg 	result_type
   1258   1.1  mrg 	mu() const
   1259   1.1  mrg 	{ return _M_mu; }
   1260   1.1  mrg 
   1261   1.1  mrg 	result_type
   1262   1.1  mrg 	omega() const
   1263   1.1  mrg 	{ return _M_omega; }
   1264   1.1  mrg 
   1265   1.1  mrg 	friend bool
   1266   1.1  mrg 	operator==(const param_type& __p1, const param_type& __p2)
   1267   1.6  mrg 	{ return __p1._M_mu == __p2._M_mu && __p1._M_omega == __p2._M_omega; }
   1268   1.6  mrg 
   1269   1.6  mrg 	friend bool
   1270   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
   1271   1.6  mrg 	{ return !(__p1 == __p2); }
   1272   1.1  mrg 
   1273   1.1  mrg       private:
   1274   1.1  mrg 	void _M_initialize();
   1275   1.1  mrg 
   1276   1.1  mrg 	result_type _M_mu;
   1277   1.1  mrg 	result_type _M_omega;
   1278   1.1  mrg       };
   1279   1.1  mrg 
   1280   1.1  mrg       /**
   1281   1.1  mrg        * @brief Constructors.
   1282   1.8  mrg        * @{
   1283   1.1  mrg        */
   1284   1.8  mrg 
   1285   1.8  mrg       nakagami_distribution() : nakagami_distribution(1) { }
   1286   1.8  mrg 
   1287   1.1  mrg       explicit
   1288   1.8  mrg       nakagami_distribution(result_type __mu_val,
   1289   1.1  mrg 			    result_type __omega_val = result_type(1))
   1290   1.1  mrg       : _M_param(__mu_val, __omega_val),
   1291   1.1  mrg 	_M_gd(__mu_val, __omega_val / __mu_val)
   1292   1.1  mrg       { }
   1293   1.1  mrg 
   1294   1.1  mrg       explicit
   1295   1.1  mrg       nakagami_distribution(const param_type& __p)
   1296   1.1  mrg       : _M_param(__p),
   1297   1.1  mrg 	_M_gd(__p.mu(), __p.omega() / __p.mu())
   1298   1.1  mrg       { }
   1299   1.1  mrg 
   1300   1.9  mrg       /// @}
   1301   1.8  mrg 
   1302   1.1  mrg       /**
   1303   1.1  mrg        * @brief Resets the distribution state.
   1304   1.1  mrg        */
   1305   1.1  mrg       void
   1306   1.1  mrg       reset()
   1307   1.1  mrg       { _M_gd.reset(); }
   1308   1.1  mrg 
   1309   1.1  mrg       /**
   1310   1.1  mrg        * @brief Return the parameters of the distribution.
   1311   1.1  mrg        */
   1312   1.1  mrg       result_type
   1313   1.1  mrg       mu() const
   1314   1.1  mrg       { return _M_param.mu(); }
   1315   1.1  mrg 
   1316   1.1  mrg       result_type
   1317   1.1  mrg       omega() const
   1318   1.1  mrg       { return _M_param.omega(); }
   1319   1.1  mrg 
   1320   1.1  mrg       /**
   1321   1.1  mrg        * @brief Returns the parameter set of the distribution.
   1322   1.1  mrg        */
   1323   1.1  mrg       param_type
   1324   1.1  mrg       param() const
   1325   1.1  mrg       { return _M_param; }
   1326   1.1  mrg 
   1327   1.1  mrg       /**
   1328   1.1  mrg        * @brief Sets the parameter set of the distribution.
   1329   1.1  mrg        * @param __param The new parameter set of the distribution.
   1330   1.1  mrg        */
   1331   1.1  mrg       void
   1332   1.1  mrg       param(const param_type& __param)
   1333   1.1  mrg       { _M_param = __param; }
   1334   1.1  mrg 
   1335   1.1  mrg       /**
   1336   1.1  mrg        * @brief Returns the greatest lower bound value of the distribution.
   1337   1.1  mrg        */
   1338   1.1  mrg       result_type
   1339   1.1  mrg       min() const
   1340   1.1  mrg       { return result_type(0); }
   1341   1.1  mrg 
   1342   1.1  mrg       /**
   1343   1.1  mrg        * @brief Returns the least upper bound value of the distribution.
   1344   1.1  mrg        */
   1345   1.1  mrg       result_type
   1346   1.1  mrg       max() const
   1347   1.1  mrg       { return std::numeric_limits<result_type>::max(); }
   1348   1.1  mrg 
   1349   1.1  mrg       /**
   1350   1.1  mrg        * @brief Generating functions.
   1351   1.1  mrg        */
   1352   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1353   1.1  mrg 	result_type
   1354   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
   1355   1.1  mrg 	{ return std::sqrt(this->_M_gd(__urng)); }
   1356   1.1  mrg 
   1357   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1358   1.1  mrg 	result_type
   1359   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
   1360   1.1  mrg 		   const param_type& __p)
   1361   1.1  mrg 	{
   1362   1.1  mrg 	  typename std::gamma_distribution<result_type>::param_type
   1363   1.1  mrg 	    __pg(__p.mu(), __p.omega() / __p.mu());
   1364   1.1  mrg 	  return std::sqrt(this->_M_gd(__pg, __urng));
   1365   1.1  mrg 	}
   1366   1.1  mrg 
   1367   1.1  mrg       template<typename _ForwardIterator,
   1368   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1369   1.1  mrg 	void
   1370   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   1371   1.1  mrg 		   _UniformRandomNumberGenerator& __urng)
   1372   1.1  mrg 	{ this->__generate(__f, __t, __urng, _M_param); }
   1373   1.1  mrg 
   1374   1.1  mrg       template<typename _ForwardIterator,
   1375   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1376   1.1  mrg 	void
   1377   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   1378   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   1379   1.1  mrg 		   const param_type& __p)
   1380   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   1381   1.1  mrg 
   1382   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1383   1.1  mrg 	void
   1384   1.1  mrg 	__generate(result_type* __f, result_type* __t,
   1385   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   1386   1.1  mrg 		   const param_type& __p)
   1387   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   1388   1.1  mrg 
   1389   1.1  mrg       /**
   1390   1.1  mrg        * @brief Return true if two Nakagami distributions have
   1391   1.1  mrg        *        the same parameters and the sequences that would
   1392   1.1  mrg        *        be generated are equal.
   1393   1.1  mrg        */
   1394   1.1  mrg       friend bool
   1395   1.1  mrg       operator==(const nakagami_distribution& __d1,
   1396   1.1  mrg 		 const nakagami_distribution& __d2)
   1397   1.1  mrg       { return (__d1._M_param == __d2._M_param
   1398   1.1  mrg 		&& __d1._M_gd == __d2._M_gd); }
   1399   1.1  mrg 
   1400   1.1  mrg       /**
   1401   1.1  mrg        * @brief Inserts a %nakagami_distribution random number distribution
   1402   1.1  mrg        * @p __x into the output stream @p __os.
   1403   1.1  mrg        *
   1404   1.1  mrg        * @param __os An output stream.
   1405   1.1  mrg        * @param __x  A %nakagami_distribution random number distribution.
   1406   1.1  mrg        *
   1407   1.1  mrg        * @returns The output stream with the state of @p __x inserted or in
   1408   1.1  mrg        * an error state.
   1409   1.1  mrg        */
   1410   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   1411   1.1  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   1412   1.1  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>&,
   1413   1.1  mrg 		   const nakagami_distribution<_RealType1>&);
   1414   1.1  mrg 
   1415   1.1  mrg       /**
   1416   1.1  mrg        * @brief Extracts a %nakagami_distribution random number distribution
   1417   1.1  mrg        * @p __x from the input stream @p __is.
   1418   1.1  mrg        *
   1419   1.1  mrg        * @param __is An input stream.
   1420   1.1  mrg        * @param __x A %nakagami_distribution random number
   1421   1.1  mrg        *            generator engine.
   1422   1.1  mrg        *
   1423   1.1  mrg        * @returns The input stream with @p __x extracted or in an error state.
   1424   1.1  mrg        */
   1425   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   1426   1.1  mrg 	friend std::basic_istream<_CharT, _Traits>&
   1427   1.1  mrg 	operator>>(std::basic_istream<_CharT, _Traits>&,
   1428   1.1  mrg 		   nakagami_distribution<_RealType1>&);
   1429   1.1  mrg 
   1430   1.1  mrg     private:
   1431   1.1  mrg       template<typename _ForwardIterator,
   1432   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1433   1.1  mrg 	void
   1434   1.1  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   1435   1.1  mrg 			_UniformRandomNumberGenerator& __urng,
   1436   1.1  mrg 			const param_type& __p);
   1437   1.1  mrg 
   1438   1.1  mrg       param_type _M_param;
   1439   1.1  mrg 
   1440   1.1  mrg       std::gamma_distribution<result_type> _M_gd;
   1441   1.1  mrg     };
   1442   1.1  mrg 
   1443   1.1  mrg   /**
   1444   1.1  mrg    * @brief Return true if two Nakagami distributions are not equal.
   1445   1.1  mrg    */
   1446   1.1  mrg   template<typename _RealType>
   1447   1.1  mrg     inline bool
   1448   1.1  mrg     operator!=(const nakagami_distribution<_RealType>& __d1,
   1449   1.1  mrg 	       const nakagami_distribution<_RealType>& __d2)
   1450   1.1  mrg     { return !(__d1 == __d2); }
   1451   1.1  mrg 
   1452   1.1  mrg 
   1453   1.1  mrg   /**
   1454   1.1  mrg    * @brief A Pareto continuous distribution for random numbers.
   1455   1.1  mrg    *
   1456   1.1  mrg    * The formula for the Pareto cumulative probability function is
   1457   1.1  mrg    * @f[
   1458   1.1  mrg    *     P(x|\alpha,\mu) = 1 - \left(\frac{\mu}{x}\right)^\alpha
   1459   1.1  mrg    * @f]
   1460   1.1  mrg    * The formula for the Pareto probability density function is
   1461   1.1  mrg    * @f[
   1462   1.1  mrg    *     p(x|\alpha,\mu) = \frac{\alpha + 1}{\mu}
   1463   1.1  mrg    *                       \left(\frac{\mu}{x}\right)^{\alpha + 1}
   1464   1.1  mrg    * @f]
   1465   1.1  mrg    * where @f$x >= \mu@f$ and @f$\mu > 0@f$, @f$\alpha > 0@f$.
   1466   1.1  mrg    *
   1467   1.1  mrg    * <table border=1 cellpadding=10 cellspacing=0>
   1468   1.1  mrg    * <caption align=top>Distribution Statistics</caption>
   1469   1.1  mrg    * <tr><td>Mean</td><td>@f$\alpha \mu / (\alpha - 1)@f$
   1470   1.1  mrg    *              for @f$\alpha > 1@f$</td></tr>
   1471   1.1  mrg    * <tr><td>Variance</td><td>@f$\alpha \mu^2 / [(\alpha - 1)^2(\alpha - 2)]@f$
   1472   1.1  mrg    *              for @f$\alpha > 2@f$</td></tr>
   1473   1.1  mrg    * <tr><td>Range</td><td>@f$[\mu, \infty)@f$</td></tr>
   1474   1.1  mrg    * </table>
   1475   1.1  mrg    */
   1476   1.1  mrg   template<typename _RealType = double>
   1477   1.1  mrg     class
   1478   1.1  mrg     pareto_distribution
   1479   1.1  mrg     {
   1480   1.1  mrg       static_assert(std::is_floating_point<_RealType>::value,
   1481   1.1  mrg 		    "template argument not a floating point type");
   1482   1.1  mrg 
   1483   1.1  mrg     public:
   1484   1.1  mrg       /** The type of the range of the distribution. */
   1485   1.1  mrg       typedef _RealType result_type;
   1486   1.6  mrg 
   1487   1.1  mrg       /** Parameter type. */
   1488   1.1  mrg       struct param_type
   1489   1.1  mrg       {
   1490   1.1  mrg 	typedef pareto_distribution<result_type> distribution_type;
   1491   1.1  mrg 
   1492   1.8  mrg 	param_type() : param_type(1) { }
   1493   1.8  mrg 
   1494   1.8  mrg 	param_type(result_type __alpha_val,
   1495   1.1  mrg 		   result_type __mu_val = result_type(1))
   1496   1.1  mrg 	: _M_alpha(__alpha_val), _M_mu(__mu_val)
   1497   1.1  mrg 	{
   1498   1.4  mrg 	  __glibcxx_assert(_M_alpha > result_type(0));
   1499   1.4  mrg 	  __glibcxx_assert(_M_mu > result_type(0));
   1500   1.1  mrg 	}
   1501   1.1  mrg 
   1502   1.1  mrg 	result_type
   1503   1.1  mrg 	alpha() const
   1504   1.1  mrg 	{ return _M_alpha; }
   1505   1.1  mrg 
   1506   1.1  mrg 	result_type
   1507   1.1  mrg 	mu() const
   1508   1.1  mrg 	{ return _M_mu; }
   1509   1.1  mrg 
   1510   1.1  mrg 	friend bool
   1511   1.1  mrg 	operator==(const param_type& __p1, const param_type& __p2)
   1512   1.1  mrg 	{ return __p1._M_alpha == __p2._M_alpha && __p1._M_mu == __p2._M_mu; }
   1513   1.1  mrg 
   1514   1.6  mrg 	friend bool
   1515   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
   1516   1.6  mrg 	{ return !(__p1 == __p2); }
   1517   1.6  mrg 
   1518   1.1  mrg       private:
   1519   1.1  mrg 	void _M_initialize();
   1520   1.1  mrg 
   1521   1.1  mrg 	result_type _M_alpha;
   1522   1.1  mrg 	result_type _M_mu;
   1523   1.1  mrg       };
   1524   1.1  mrg 
   1525   1.1  mrg       /**
   1526   1.1  mrg        * @brief Constructors.
   1527   1.8  mrg        * @{
   1528   1.1  mrg        */
   1529   1.8  mrg 
   1530   1.8  mrg       pareto_distribution() : pareto_distribution(1) { }
   1531   1.8  mrg 
   1532   1.1  mrg       explicit
   1533   1.8  mrg       pareto_distribution(result_type __alpha_val,
   1534   1.1  mrg 			  result_type __mu_val = result_type(1))
   1535   1.1  mrg       : _M_param(__alpha_val, __mu_val),
   1536   1.1  mrg 	_M_ud()
   1537   1.1  mrg       { }
   1538   1.1  mrg 
   1539   1.1  mrg       explicit
   1540   1.1  mrg       pareto_distribution(const param_type& __p)
   1541   1.1  mrg       : _M_param(__p),
   1542   1.1  mrg 	_M_ud()
   1543   1.1  mrg       { }
   1544   1.1  mrg 
   1545   1.9  mrg       /// @}
   1546   1.8  mrg 
   1547   1.1  mrg       /**
   1548   1.1  mrg        * @brief Resets the distribution state.
   1549   1.1  mrg        */
   1550   1.1  mrg       void
   1551   1.1  mrg       reset()
   1552   1.1  mrg       {
   1553   1.1  mrg 	_M_ud.reset();
   1554   1.1  mrg       }
   1555   1.1  mrg 
   1556   1.1  mrg       /**
   1557   1.1  mrg        * @brief Return the parameters of the distribution.
   1558   1.1  mrg        */
   1559   1.1  mrg       result_type
   1560   1.1  mrg       alpha() const
   1561   1.1  mrg       { return _M_param.alpha(); }
   1562   1.1  mrg 
   1563   1.1  mrg       result_type
   1564   1.1  mrg       mu() const
   1565   1.1  mrg       { return _M_param.mu(); }
   1566   1.1  mrg 
   1567   1.1  mrg       /**
   1568   1.1  mrg        * @brief Returns the parameter set of the distribution.
   1569   1.1  mrg        */
   1570   1.1  mrg       param_type
   1571   1.1  mrg       param() const
   1572   1.1  mrg       { return _M_param; }
   1573   1.1  mrg 
   1574   1.1  mrg       /**
   1575   1.1  mrg        * @brief Sets the parameter set of the distribution.
   1576   1.1  mrg        * @param __param The new parameter set of the distribution.
   1577   1.1  mrg        */
   1578   1.1  mrg       void
   1579   1.1  mrg       param(const param_type& __param)
   1580   1.1  mrg       { _M_param = __param; }
   1581   1.1  mrg 
   1582   1.1  mrg       /**
   1583   1.1  mrg        * @brief Returns the greatest lower bound value of the distribution.
   1584   1.1  mrg        */
   1585   1.1  mrg       result_type
   1586   1.1  mrg       min() const
   1587   1.1  mrg       { return this->mu(); }
   1588   1.1  mrg 
   1589   1.1  mrg       /**
   1590   1.1  mrg        * @brief Returns the least upper bound value of the distribution.
   1591   1.1  mrg        */
   1592   1.1  mrg       result_type
   1593   1.1  mrg       max() const
   1594   1.1  mrg       { return std::numeric_limits<result_type>::max(); }
   1595   1.1  mrg 
   1596   1.1  mrg       /**
   1597   1.1  mrg        * @brief Generating functions.
   1598   1.1  mrg        */
   1599   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1600   1.1  mrg 	result_type
   1601   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
   1602   1.1  mrg 	{
   1603   1.1  mrg 	  return this->mu() * std::pow(this->_M_ud(__urng),
   1604   1.1  mrg 				       -result_type(1) / this->alpha());
   1605   1.1  mrg 	}
   1606   1.1  mrg 
   1607   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1608   1.1  mrg 	result_type
   1609   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
   1610   1.1  mrg 		   const param_type& __p)
   1611   1.1  mrg 	{
   1612   1.1  mrg 	  return __p.mu() * std::pow(this->_M_ud(__urng),
   1613   1.1  mrg 					   -result_type(1) / __p.alpha());
   1614   1.1  mrg 	}
   1615   1.1  mrg 
   1616   1.1  mrg       template<typename _ForwardIterator,
   1617   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1618   1.1  mrg 	void
   1619   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   1620   1.1  mrg 		   _UniformRandomNumberGenerator& __urng)
   1621   1.1  mrg 	{ this->__generate(__f, __t, __urng, _M_param); }
   1622   1.1  mrg 
   1623   1.1  mrg       template<typename _ForwardIterator,
   1624   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1625   1.1  mrg 	void
   1626   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   1627   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   1628   1.1  mrg 		   const param_type& __p)
   1629   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   1630   1.1  mrg 
   1631   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1632   1.1  mrg 	void
   1633   1.1  mrg 	__generate(result_type* __f, result_type* __t,
   1634   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   1635   1.1  mrg 		   const param_type& __p)
   1636   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   1637   1.1  mrg 
   1638   1.1  mrg       /**
   1639   1.1  mrg        * @brief Return true if two Pareto distributions have
   1640   1.1  mrg        *        the same parameters and the sequences that would
   1641   1.1  mrg        *        be generated are equal.
   1642   1.1  mrg        */
   1643   1.1  mrg       friend bool
   1644   1.1  mrg       operator==(const pareto_distribution& __d1,
   1645   1.1  mrg 		 const pareto_distribution& __d2)
   1646   1.1  mrg       { return (__d1._M_param == __d2._M_param
   1647   1.1  mrg 		&& __d1._M_ud == __d2._M_ud); }
   1648   1.1  mrg 
   1649   1.1  mrg       /**
   1650   1.1  mrg        * @brief Inserts a %pareto_distribution random number distribution
   1651   1.1  mrg        * @p __x into the output stream @p __os.
   1652   1.1  mrg        *
   1653   1.1  mrg        * @param __os An output stream.
   1654   1.1  mrg        * @param __x  A %pareto_distribution random number distribution.
   1655   1.1  mrg        *
   1656   1.1  mrg        * @returns The output stream with the state of @p __x inserted or in
   1657   1.1  mrg        * an error state.
   1658   1.1  mrg        */
   1659   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   1660   1.1  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   1661   1.1  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>&,
   1662   1.1  mrg 		   const pareto_distribution<_RealType1>&);
   1663   1.1  mrg 
   1664   1.1  mrg       /**
   1665   1.1  mrg        * @brief Extracts a %pareto_distribution random number distribution
   1666   1.1  mrg        * @p __x from the input stream @p __is.
   1667   1.1  mrg        *
   1668   1.1  mrg        * @param __is An input stream.
   1669   1.1  mrg        * @param __x A %pareto_distribution random number
   1670   1.1  mrg        *            generator engine.
   1671   1.1  mrg        *
   1672   1.1  mrg        * @returns The input stream with @p __x extracted or in an error state.
   1673   1.1  mrg        */
   1674   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   1675   1.1  mrg 	friend std::basic_istream<_CharT, _Traits>&
   1676   1.1  mrg 	operator>>(std::basic_istream<_CharT, _Traits>&,
   1677   1.1  mrg 		   pareto_distribution<_RealType1>&);
   1678   1.1  mrg 
   1679   1.1  mrg     private:
   1680   1.1  mrg       template<typename _ForwardIterator,
   1681   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1682   1.1  mrg 	void
   1683   1.1  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   1684   1.1  mrg 			_UniformRandomNumberGenerator& __urng,
   1685   1.1  mrg 			const param_type& __p);
   1686   1.1  mrg 
   1687   1.1  mrg       param_type _M_param;
   1688   1.1  mrg 
   1689   1.1  mrg       std::uniform_real_distribution<result_type> _M_ud;
   1690   1.1  mrg     };
   1691   1.1  mrg 
   1692   1.1  mrg   /**
   1693   1.1  mrg    * @brief Return true if two Pareto distributions are not equal.
   1694   1.1  mrg    */
   1695   1.1  mrg   template<typename _RealType>
   1696   1.1  mrg     inline bool
   1697   1.1  mrg     operator!=(const pareto_distribution<_RealType>& __d1,
   1698   1.1  mrg 	       const pareto_distribution<_RealType>& __d2)
   1699   1.1  mrg     { return !(__d1 == __d2); }
   1700   1.1  mrg 
   1701   1.1  mrg 
   1702   1.1  mrg   /**
   1703   1.1  mrg    * @brief A K continuous distribution for random numbers.
   1704   1.1  mrg    *
   1705   1.1  mrg    * The formula for the K probability density function is
   1706   1.1  mrg    * @f[
   1707   1.1  mrg    *     p(x|\lambda, \mu, \nu) = \frac{2}{x}
   1708   1.1  mrg    *             \left(\frac{\lambda\nu x}{\mu}\right)^{\frac{\lambda + \nu}{2}}
   1709   1.1  mrg    *             \frac{1}{\Gamma(\lambda)\Gamma(\nu)}
   1710   1.1  mrg    *             K_{\nu - \lambda}\left(2\sqrt{\frac{\lambda\nu x}{\mu}}\right)
   1711   1.1  mrg    * @f]
   1712   1.1  mrg    * where @f$I_0(z)@f$ is the modified Bessel function of the second kind
   1713   1.1  mrg    * of order @f$\nu - \lambda@f$ and @f$\lambda > 0@f$, @f$\mu > 0@f$
   1714   1.1  mrg    * and @f$\nu > 0@f$.
   1715   1.1  mrg    *
   1716   1.1  mrg    * <table border=1 cellpadding=10 cellspacing=0>
   1717   1.1  mrg    * <caption align=top>Distribution Statistics</caption>
   1718   1.1  mrg    * <tr><td>Mean</td><td>@f$\mu@f$</td></tr>
   1719   1.1  mrg    * <tr><td>Variance</td><td>@f$\mu^2\frac{\lambda + \nu + 1}{\lambda\nu}@f$</td></tr>
   1720   1.1  mrg    * <tr><td>Range</td><td>@f$[0, \infty)@f$</td></tr>
   1721   1.1  mrg    * </table>
   1722   1.1  mrg    */
   1723   1.1  mrg   template<typename _RealType = double>
   1724   1.1  mrg     class
   1725   1.1  mrg     k_distribution
   1726   1.1  mrg     {
   1727   1.1  mrg       static_assert(std::is_floating_point<_RealType>::value,
   1728   1.1  mrg 		    "template argument not a floating point type");
   1729   1.1  mrg 
   1730   1.1  mrg     public:
   1731   1.1  mrg       /** The type of the range of the distribution. */
   1732   1.1  mrg       typedef _RealType result_type;
   1733   1.6  mrg 
   1734   1.1  mrg       /** Parameter type. */
   1735   1.1  mrg       struct param_type
   1736   1.1  mrg       {
   1737   1.1  mrg 	typedef k_distribution<result_type> distribution_type;
   1738   1.1  mrg 
   1739   1.8  mrg 	param_type() : param_type(1) { }
   1740   1.8  mrg 
   1741   1.8  mrg 	param_type(result_type __lambda_val,
   1742   1.1  mrg 		   result_type __mu_val = result_type(1),
   1743   1.1  mrg 		   result_type __nu_val = result_type(1))
   1744   1.1  mrg 	: _M_lambda(__lambda_val), _M_mu(__mu_val), _M_nu(__nu_val)
   1745   1.1  mrg 	{
   1746   1.4  mrg 	  __glibcxx_assert(_M_lambda > result_type(0));
   1747   1.4  mrg 	  __glibcxx_assert(_M_mu > result_type(0));
   1748   1.4  mrg 	  __glibcxx_assert(_M_nu > result_type(0));
   1749   1.1  mrg 	}
   1750   1.1  mrg 
   1751   1.1  mrg 	result_type
   1752   1.1  mrg 	lambda() const
   1753   1.1  mrg 	{ return _M_lambda; }
   1754   1.1  mrg 
   1755   1.1  mrg 	result_type
   1756   1.1  mrg 	mu() const
   1757   1.1  mrg 	{ return _M_mu; }
   1758   1.1  mrg 
   1759   1.1  mrg 	result_type
   1760   1.1  mrg 	nu() const
   1761   1.1  mrg 	{ return _M_nu; }
   1762   1.1  mrg 
   1763   1.1  mrg 	friend bool
   1764   1.1  mrg 	operator==(const param_type& __p1, const param_type& __p2)
   1765   1.6  mrg 	{
   1766   1.6  mrg 	  return __p1._M_lambda == __p2._M_lambda
   1767   1.1  mrg 	      && __p1._M_mu == __p2._M_mu
   1768   1.6  mrg 	      && __p1._M_nu == __p2._M_nu;
   1769   1.6  mrg 	}
   1770   1.6  mrg 
   1771   1.6  mrg 	friend bool
   1772   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
   1773   1.6  mrg 	{ return !(__p1 == __p2); }
   1774   1.1  mrg 
   1775   1.1  mrg       private:
   1776   1.1  mrg 	void _M_initialize();
   1777   1.1  mrg 
   1778   1.1  mrg 	result_type _M_lambda;
   1779   1.1  mrg 	result_type _M_mu;
   1780   1.1  mrg 	result_type _M_nu;
   1781   1.1  mrg       };
   1782   1.1  mrg 
   1783   1.1  mrg       /**
   1784   1.1  mrg        * @brief Constructors.
   1785   1.8  mrg        * @{
   1786   1.1  mrg        */
   1787   1.8  mrg 
   1788   1.8  mrg       k_distribution() : k_distribution(1) { }
   1789   1.8  mrg 
   1790   1.1  mrg       explicit
   1791   1.8  mrg       k_distribution(result_type __lambda_val,
   1792   1.1  mrg 		     result_type __mu_val = result_type(1),
   1793   1.1  mrg 		     result_type __nu_val = result_type(1))
   1794   1.1  mrg       : _M_param(__lambda_val, __mu_val, __nu_val),
   1795   1.1  mrg 	_M_gd1(__lambda_val, result_type(1) / __lambda_val),
   1796   1.1  mrg 	_M_gd2(__nu_val, __mu_val / __nu_val)
   1797   1.1  mrg       { }
   1798   1.1  mrg 
   1799   1.1  mrg       explicit
   1800   1.1  mrg       k_distribution(const param_type& __p)
   1801   1.1  mrg       : _M_param(__p),
   1802   1.1  mrg 	_M_gd1(__p.lambda(), result_type(1) / __p.lambda()),
   1803   1.1  mrg 	_M_gd2(__p.nu(), __p.mu() / __p.nu())
   1804   1.1  mrg       { }
   1805   1.1  mrg 
   1806   1.9  mrg       /// @}
   1807   1.8  mrg 
   1808   1.1  mrg       /**
   1809   1.1  mrg        * @brief Resets the distribution state.
   1810   1.1  mrg        */
   1811   1.1  mrg       void
   1812   1.1  mrg       reset()
   1813   1.1  mrg       {
   1814   1.1  mrg 	_M_gd1.reset();
   1815   1.1  mrg 	_M_gd2.reset();
   1816   1.1  mrg       }
   1817   1.1  mrg 
   1818   1.1  mrg       /**
   1819   1.1  mrg        * @brief Return the parameters of the distribution.
   1820   1.1  mrg        */
   1821   1.1  mrg       result_type
   1822   1.1  mrg       lambda() const
   1823   1.1  mrg       { return _M_param.lambda(); }
   1824   1.1  mrg 
   1825   1.1  mrg       result_type
   1826   1.1  mrg       mu() const
   1827   1.1  mrg       { return _M_param.mu(); }
   1828   1.1  mrg 
   1829   1.1  mrg       result_type
   1830   1.1  mrg       nu() const
   1831   1.1  mrg       { return _M_param.nu(); }
   1832   1.1  mrg 
   1833   1.1  mrg       /**
   1834   1.1  mrg        * @brief Returns the parameter set of the distribution.
   1835   1.1  mrg        */
   1836   1.1  mrg       param_type
   1837   1.1  mrg       param() const
   1838   1.1  mrg       { return _M_param; }
   1839   1.1  mrg 
   1840   1.1  mrg       /**
   1841   1.1  mrg        * @brief Sets the parameter set of the distribution.
   1842   1.1  mrg        * @param __param The new parameter set of the distribution.
   1843   1.1  mrg        */
   1844   1.1  mrg       void
   1845   1.1  mrg       param(const param_type& __param)
   1846   1.1  mrg       { _M_param = __param; }
   1847   1.1  mrg 
   1848   1.1  mrg       /**
   1849   1.1  mrg        * @brief Returns the greatest lower bound value of the distribution.
   1850   1.1  mrg        */
   1851   1.1  mrg       result_type
   1852   1.1  mrg       min() const
   1853   1.1  mrg       { return result_type(0); }
   1854   1.1  mrg 
   1855   1.1  mrg       /**
   1856   1.1  mrg        * @brief Returns the least upper bound value of the distribution.
   1857   1.1  mrg        */
   1858   1.1  mrg       result_type
   1859   1.1  mrg       max() const
   1860   1.1  mrg       { return std::numeric_limits<result_type>::max(); }
   1861   1.1  mrg 
   1862   1.1  mrg       /**
   1863   1.1  mrg        * @brief Generating functions.
   1864   1.1  mrg        */
   1865   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1866   1.1  mrg 	result_type
   1867   1.1  mrg 	operator()(_UniformRandomNumberGenerator&);
   1868   1.1  mrg 
   1869   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1870   1.1  mrg 	result_type
   1871   1.1  mrg 	operator()(_UniformRandomNumberGenerator&, const param_type&);
   1872   1.1  mrg 
   1873   1.1  mrg       template<typename _ForwardIterator,
   1874   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1875   1.1  mrg 	void
   1876   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   1877   1.1  mrg 		   _UniformRandomNumberGenerator& __urng)
   1878   1.1  mrg 	{ this->__generate(__f, __t, __urng, _M_param); }
   1879   1.1  mrg 
   1880   1.1  mrg       template<typename _ForwardIterator,
   1881   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1882   1.1  mrg 	void
   1883   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   1884   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   1885   1.1  mrg 		   const param_type& __p)
   1886   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   1887   1.1  mrg 
   1888   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   1889   1.1  mrg 	void
   1890   1.1  mrg 	__generate(result_type* __f, result_type* __t,
   1891   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   1892   1.1  mrg 		   const param_type& __p)
   1893   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   1894   1.1  mrg 
   1895   1.1  mrg       /**
   1896   1.1  mrg        * @brief Return true if two K distributions have
   1897   1.1  mrg        *        the same parameters and the sequences that would
   1898   1.1  mrg        *        be generated are equal.
   1899   1.1  mrg        */
   1900   1.1  mrg       friend bool
   1901   1.1  mrg       operator==(const k_distribution& __d1,
   1902   1.1  mrg 		 const k_distribution& __d2)
   1903   1.1  mrg       { return (__d1._M_param == __d2._M_param
   1904   1.1  mrg 		&& __d1._M_gd1 == __d2._M_gd1
   1905   1.1  mrg 		&& __d1._M_gd2 == __d2._M_gd2); }
   1906   1.1  mrg 
   1907   1.1  mrg       /**
   1908   1.1  mrg        * @brief Inserts a %k_distribution random number distribution
   1909   1.1  mrg        * @p __x into the output stream @p __os.
   1910   1.1  mrg        *
   1911   1.1  mrg        * @param __os An output stream.
   1912   1.1  mrg        * @param __x  A %k_distribution random number distribution.
   1913   1.1  mrg        *
   1914   1.1  mrg        * @returns The output stream with the state of @p __x inserted or in
   1915   1.1  mrg        * an error state.
   1916   1.1  mrg        */
   1917   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   1918   1.1  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   1919   1.1  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>&,
   1920   1.1  mrg 		   const k_distribution<_RealType1>&);
   1921   1.1  mrg 
   1922   1.1  mrg       /**
   1923   1.1  mrg        * @brief Extracts a %k_distribution random number distribution
   1924   1.1  mrg        * @p __x from the input stream @p __is.
   1925   1.1  mrg        *
   1926   1.1  mrg        * @param __is An input stream.
   1927   1.1  mrg        * @param __x A %k_distribution random number
   1928   1.1  mrg        *            generator engine.
   1929   1.1  mrg        *
   1930   1.1  mrg        * @returns The input stream with @p __x extracted or in an error state.
   1931   1.1  mrg        */
   1932   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   1933   1.1  mrg 	friend std::basic_istream<_CharT, _Traits>&
   1934   1.1  mrg 	operator>>(std::basic_istream<_CharT, _Traits>&,
   1935   1.1  mrg 		   k_distribution<_RealType1>&);
   1936   1.1  mrg 
   1937   1.1  mrg     private:
   1938   1.1  mrg       template<typename _ForwardIterator,
   1939   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   1940   1.1  mrg 	void
   1941   1.1  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   1942   1.1  mrg 			_UniformRandomNumberGenerator& __urng,
   1943   1.1  mrg 			const param_type& __p);
   1944   1.1  mrg 
   1945   1.1  mrg       param_type _M_param;
   1946   1.1  mrg 
   1947   1.1  mrg       std::gamma_distribution<result_type> _M_gd1;
   1948   1.1  mrg       std::gamma_distribution<result_type> _M_gd2;
   1949   1.1  mrg     };
   1950   1.1  mrg 
   1951   1.1  mrg   /**
   1952   1.1  mrg    * @brief Return true if two K distributions are not equal.
   1953   1.1  mrg    */
   1954   1.1  mrg   template<typename _RealType>
   1955   1.1  mrg     inline bool
   1956   1.1  mrg     operator!=(const k_distribution<_RealType>& __d1,
   1957   1.1  mrg 	       const k_distribution<_RealType>& __d2)
   1958   1.1  mrg     { return !(__d1 == __d2); }
   1959   1.1  mrg 
   1960   1.1  mrg 
   1961   1.1  mrg   /**
   1962   1.1  mrg    * @brief An arcsine continuous distribution for random numbers.
   1963   1.1  mrg    *
   1964   1.1  mrg    * The formula for the arcsine probability density function is
   1965   1.1  mrg    * @f[
   1966   1.1  mrg    *     p(x|a,b) = \frac{1}{\pi \sqrt{(x - a)(b - x)}}
   1967   1.1  mrg    * @f]
   1968   1.1  mrg    * where @f$x >= a@f$ and @f$x <= b@f$.
   1969   1.1  mrg    *
   1970   1.1  mrg    * <table border=1 cellpadding=10 cellspacing=0>
   1971   1.1  mrg    * <caption align=top>Distribution Statistics</caption>
   1972   1.1  mrg    * <tr><td>Mean</td><td>@f$ (a + b) / 2 @f$</td></tr>
   1973   1.1  mrg    * <tr><td>Variance</td><td>@f$ (b - a)^2 / 8 @f$</td></tr>
   1974   1.1  mrg    * <tr><td>Range</td><td>@f$[a, b]@f$</td></tr>
   1975   1.1  mrg    * </table>
   1976   1.1  mrg    */
   1977   1.1  mrg   template<typename _RealType = double>
   1978   1.1  mrg     class
   1979   1.1  mrg     arcsine_distribution
   1980   1.1  mrg     {
   1981   1.1  mrg       static_assert(std::is_floating_point<_RealType>::value,
   1982   1.1  mrg 		    "template argument not a floating point type");
   1983   1.1  mrg 
   1984   1.1  mrg     public:
   1985   1.1  mrg       /** The type of the range of the distribution. */
   1986   1.1  mrg       typedef _RealType result_type;
   1987   1.6  mrg 
   1988   1.1  mrg       /** Parameter type. */
   1989   1.1  mrg       struct param_type
   1990   1.1  mrg       {
   1991   1.1  mrg 	typedef arcsine_distribution<result_type> distribution_type;
   1992   1.1  mrg 
   1993   1.8  mrg 	param_type() : param_type(0) { }
   1994   1.8  mrg 
   1995   1.8  mrg 	param_type(result_type __a, result_type __b = result_type(1))
   1996   1.1  mrg 	: _M_a(__a), _M_b(__b)
   1997   1.1  mrg 	{
   1998   1.4  mrg 	  __glibcxx_assert(_M_a <= _M_b);
   1999   1.1  mrg 	}
   2000   1.1  mrg 
   2001   1.1  mrg 	result_type
   2002   1.1  mrg 	a() const
   2003   1.1  mrg 	{ return _M_a; }
   2004   1.1  mrg 
   2005   1.1  mrg 	result_type
   2006   1.1  mrg 	b() const
   2007   1.1  mrg 	{ return _M_b; }
   2008   1.1  mrg 
   2009   1.1  mrg 	friend bool
   2010   1.1  mrg 	operator==(const param_type& __p1, const param_type& __p2)
   2011   1.1  mrg 	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
   2012   1.1  mrg 
   2013   1.6  mrg 	friend bool
   2014   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
   2015   1.6  mrg 	{ return !(__p1 == __p2); }
   2016   1.6  mrg 
   2017   1.1  mrg       private:
   2018   1.1  mrg 	void _M_initialize();
   2019   1.1  mrg 
   2020   1.1  mrg 	result_type _M_a;
   2021   1.1  mrg 	result_type _M_b;
   2022   1.1  mrg       };
   2023   1.1  mrg 
   2024   1.1  mrg       /**
   2025   1.1  mrg        * @brief Constructors.
   2026   1.8  mrg        * :{
   2027   1.1  mrg        */
   2028   1.8  mrg 
   2029   1.8  mrg       arcsine_distribution() : arcsine_distribution(0) { }
   2030   1.8  mrg 
   2031   1.1  mrg       explicit
   2032   1.8  mrg       arcsine_distribution(result_type __a, result_type __b = result_type(1))
   2033   1.1  mrg       : _M_param(__a, __b),
   2034   1.1  mrg 	_M_ud(-1.5707963267948966192313216916397514L,
   2035   1.1  mrg 	      +1.5707963267948966192313216916397514L)
   2036   1.1  mrg       { }
   2037   1.1  mrg 
   2038   1.1  mrg       explicit
   2039   1.1  mrg       arcsine_distribution(const param_type& __p)
   2040   1.1  mrg       : _M_param(__p),
   2041   1.1  mrg 	_M_ud(-1.5707963267948966192313216916397514L,
   2042   1.1  mrg 	      +1.5707963267948966192313216916397514L)
   2043   1.1  mrg       { }
   2044   1.1  mrg 
   2045   1.9  mrg       /// @}
   2046   1.8  mrg 
   2047   1.1  mrg       /**
   2048   1.1  mrg        * @brief Resets the distribution state.
   2049   1.1  mrg        */
   2050   1.1  mrg       void
   2051   1.1  mrg       reset()
   2052   1.1  mrg       { _M_ud.reset(); }
   2053   1.1  mrg 
   2054   1.1  mrg       /**
   2055   1.1  mrg        * @brief Return the parameters of the distribution.
   2056   1.1  mrg        */
   2057   1.1  mrg       result_type
   2058   1.1  mrg       a() const
   2059   1.1  mrg       { return _M_param.a(); }
   2060   1.1  mrg 
   2061   1.1  mrg       result_type
   2062   1.1  mrg       b() const
   2063   1.1  mrg       { return _M_param.b(); }
   2064   1.1  mrg 
   2065   1.1  mrg       /**
   2066   1.1  mrg        * @brief Returns the parameter set of the distribution.
   2067   1.1  mrg        */
   2068   1.1  mrg       param_type
   2069   1.1  mrg       param() const
   2070   1.1  mrg       { return _M_param; }
   2071   1.1  mrg 
   2072   1.1  mrg       /**
   2073   1.1  mrg        * @brief Sets the parameter set of the distribution.
   2074   1.1  mrg        * @param __param The new parameter set of the distribution.
   2075   1.1  mrg        */
   2076   1.1  mrg       void
   2077   1.1  mrg       param(const param_type& __param)
   2078   1.1  mrg       { _M_param = __param; }
   2079   1.1  mrg 
   2080   1.1  mrg       /**
   2081   1.1  mrg        * @brief Returns the greatest lower bound value of the distribution.
   2082   1.1  mrg        */
   2083   1.1  mrg       result_type
   2084   1.1  mrg       min() const
   2085   1.1  mrg       { return this->a(); }
   2086   1.1  mrg 
   2087   1.1  mrg       /**
   2088   1.1  mrg        * @brief Returns the least upper bound value of the distribution.
   2089   1.1  mrg        */
   2090   1.1  mrg       result_type
   2091   1.1  mrg       max() const
   2092   1.1  mrg       { return this->b(); }
   2093   1.1  mrg 
   2094   1.1  mrg       /**
   2095   1.1  mrg        * @brief Generating functions.
   2096   1.1  mrg        */
   2097   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2098   1.1  mrg 	result_type
   2099   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
   2100   1.1  mrg 	{
   2101   1.1  mrg 	  result_type __x = std::sin(this->_M_ud(__urng));
   2102   1.1  mrg 	  return (__x * (this->b() - this->a())
   2103   1.1  mrg 		  + this->a() + this->b()) / result_type(2);
   2104   1.1  mrg 	}
   2105   1.1  mrg 
   2106   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2107   1.1  mrg 	result_type
   2108   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
   2109   1.1  mrg 		   const param_type& __p)
   2110   1.1  mrg 	{
   2111   1.1  mrg 	  result_type __x = std::sin(this->_M_ud(__urng));
   2112   1.1  mrg 	  return (__x * (__p.b() - __p.a())
   2113   1.1  mrg 		  + __p.a() + __p.b()) / result_type(2);
   2114   1.1  mrg 	}
   2115   1.1  mrg 
   2116   1.1  mrg       template<typename _ForwardIterator,
   2117   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2118   1.1  mrg 	void
   2119   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   2120   1.1  mrg 		   _UniformRandomNumberGenerator& __urng)
   2121   1.1  mrg 	{ this->__generate(__f, __t, __urng, _M_param); }
   2122   1.1  mrg 
   2123   1.1  mrg       template<typename _ForwardIterator,
   2124   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2125   1.1  mrg 	void
   2126   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   2127   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   2128   1.1  mrg 		   const param_type& __p)
   2129   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   2130   1.1  mrg 
   2131   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2132   1.1  mrg 	void
   2133   1.1  mrg 	__generate(result_type* __f, result_type* __t,
   2134   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   2135   1.1  mrg 		   const param_type& __p)
   2136   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   2137   1.1  mrg 
   2138   1.1  mrg       /**
   2139   1.1  mrg        * @brief Return true if two arcsine distributions have
   2140   1.1  mrg        *        the same parameters and the sequences that would
   2141   1.1  mrg        *        be generated are equal.
   2142   1.1  mrg        */
   2143   1.1  mrg       friend bool
   2144   1.1  mrg       operator==(const arcsine_distribution& __d1,
   2145   1.1  mrg 		 const arcsine_distribution& __d2)
   2146   1.1  mrg       { return (__d1._M_param == __d2._M_param
   2147   1.1  mrg 		&& __d1._M_ud == __d2._M_ud); }
   2148   1.1  mrg 
   2149   1.1  mrg       /**
   2150   1.1  mrg        * @brief Inserts a %arcsine_distribution random number distribution
   2151   1.1  mrg        * @p __x into the output stream @p __os.
   2152   1.1  mrg        *
   2153   1.1  mrg        * @param __os An output stream.
   2154   1.1  mrg        * @param __x  A %arcsine_distribution random number distribution.
   2155   1.1  mrg        *
   2156   1.1  mrg        * @returns The output stream with the state of @p __x inserted or in
   2157   1.1  mrg        * an error state.
   2158   1.1  mrg        */
   2159   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   2160   1.1  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   2161   1.1  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>&,
   2162   1.1  mrg 		   const arcsine_distribution<_RealType1>&);
   2163   1.1  mrg 
   2164   1.1  mrg       /**
   2165   1.1  mrg        * @brief Extracts a %arcsine_distribution random number distribution
   2166   1.1  mrg        * @p __x from the input stream @p __is.
   2167   1.1  mrg        *
   2168   1.1  mrg        * @param __is An input stream.
   2169   1.1  mrg        * @param __x A %arcsine_distribution random number
   2170   1.1  mrg        *            generator engine.
   2171   1.1  mrg        *
   2172   1.1  mrg        * @returns The input stream with @p __x extracted or in an error state.
   2173   1.1  mrg        */
   2174   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   2175   1.1  mrg 	friend std::basic_istream<_CharT, _Traits>&
   2176   1.1  mrg 	operator>>(std::basic_istream<_CharT, _Traits>&,
   2177   1.1  mrg 		   arcsine_distribution<_RealType1>&);
   2178   1.1  mrg 
   2179   1.1  mrg     private:
   2180   1.1  mrg       template<typename _ForwardIterator,
   2181   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2182   1.1  mrg 	void
   2183   1.1  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   2184   1.1  mrg 			_UniformRandomNumberGenerator& __urng,
   2185   1.1  mrg 			const param_type& __p);
   2186   1.1  mrg 
   2187   1.1  mrg       param_type _M_param;
   2188   1.1  mrg 
   2189   1.1  mrg       std::uniform_real_distribution<result_type> _M_ud;
   2190   1.1  mrg     };
   2191   1.1  mrg 
   2192   1.1  mrg   /**
   2193   1.1  mrg    * @brief Return true if two arcsine distributions are not equal.
   2194   1.1  mrg    */
   2195   1.1  mrg   template<typename _RealType>
   2196   1.1  mrg     inline bool
   2197   1.1  mrg     operator!=(const arcsine_distribution<_RealType>& __d1,
   2198   1.1  mrg 	       const arcsine_distribution<_RealType>& __d2)
   2199   1.1  mrg     { return !(__d1 == __d2); }
   2200   1.1  mrg 
   2201   1.1  mrg 
   2202   1.1  mrg   /**
   2203   1.1  mrg    * @brief A Hoyt continuous distribution for random numbers.
   2204   1.1  mrg    *
   2205   1.1  mrg    * The formula for the Hoyt probability density function is
   2206   1.1  mrg    * @f[
   2207   1.1  mrg    *     p(x|q,\omega) = \frac{(1 + q^2)x}{q\omega}
   2208   1.1  mrg    *                     \exp\left(-\frac{(1 + q^2)^2 x^2}{4 q^2 \omega}\right)
   2209   1.1  mrg    *                       I_0\left(\frac{(1 - q^4) x^2}{4 q^2 \omega}\right)
   2210   1.1  mrg    * @f]
   2211   1.1  mrg    * where @f$I_0(z)@f$ is the modified Bessel function of the first kind
   2212   1.1  mrg    * of order 0 and @f$0 < q < 1@f$.
   2213   1.1  mrg    *
   2214   1.1  mrg    * <table border=1 cellpadding=10 cellspacing=0>
   2215   1.1  mrg    * <caption align=top>Distribution Statistics</caption>
   2216   1.1  mrg    * <tr><td>Mean</td><td>@f$ \sqrt{\frac{2}{\pi}} \sqrt{\frac{\omega}{1 + q^2}}
   2217   1.1  mrg    *                       E(1 - q^2) @f$</td></tr>
   2218   1.1  mrg    * <tr><td>Variance</td><td>@f$ \omega \left(1 - \frac{2E^2(1 - q^2)}
   2219   1.1  mrg    *                                      {\pi (1 + q^2)}\right) @f$</td></tr>
   2220   1.1  mrg    * <tr><td>Range</td><td>@f$[0, \infty)@f$</td></tr>
   2221   1.1  mrg    * </table>
   2222   1.1  mrg    * where @f$E(x)@f$ is the elliptic function of the second kind.
   2223   1.1  mrg    */
   2224   1.1  mrg   template<typename _RealType = double>
   2225   1.1  mrg     class
   2226   1.1  mrg     hoyt_distribution
   2227   1.1  mrg     {
   2228   1.1  mrg       static_assert(std::is_floating_point<_RealType>::value,
   2229   1.1  mrg 		    "template argument not a floating point type");
   2230   1.1  mrg 
   2231   1.1  mrg     public:
   2232   1.1  mrg       /** The type of the range of the distribution. */
   2233   1.1  mrg       typedef _RealType result_type;
   2234   1.6  mrg 
   2235   1.1  mrg       /** Parameter type. */
   2236   1.1  mrg       struct param_type
   2237   1.1  mrg       {
   2238   1.1  mrg 	typedef hoyt_distribution<result_type> distribution_type;
   2239   1.1  mrg 
   2240   1.8  mrg 	param_type() : param_type(0.5) { }
   2241   1.8  mrg 
   2242   1.8  mrg 	param_type(result_type __q, result_type __omega = result_type(1))
   2243   1.1  mrg 	: _M_q(__q), _M_omega(__omega)
   2244   1.1  mrg 	{
   2245   1.4  mrg 	  __glibcxx_assert(_M_q > result_type(0));
   2246   1.4  mrg 	  __glibcxx_assert(_M_q < result_type(1));
   2247   1.1  mrg 	}
   2248   1.1  mrg 
   2249   1.1  mrg 	result_type
   2250   1.1  mrg 	q() const
   2251   1.1  mrg 	{ return _M_q; }
   2252   1.1  mrg 
   2253   1.1  mrg 	result_type
   2254   1.1  mrg 	omega() const
   2255   1.1  mrg 	{ return _M_omega; }
   2256   1.1  mrg 
   2257   1.1  mrg 	friend bool
   2258   1.1  mrg 	operator==(const param_type& __p1, const param_type& __p2)
   2259   1.6  mrg 	{ return __p1._M_q == __p2._M_q && __p1._M_omega == __p2._M_omega; }
   2260   1.6  mrg 
   2261   1.6  mrg 	friend bool
   2262   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
   2263   1.6  mrg 	{ return !(__p1 == __p2); }
   2264   1.1  mrg 
   2265   1.1  mrg       private:
   2266   1.1  mrg 	void _M_initialize();
   2267   1.1  mrg 
   2268   1.1  mrg 	result_type _M_q;
   2269   1.1  mrg 	result_type _M_omega;
   2270   1.1  mrg       };
   2271   1.1  mrg 
   2272   1.1  mrg       /**
   2273   1.1  mrg        * @brief Constructors.
   2274   1.8  mrg        * @{
   2275   1.1  mrg        */
   2276   1.8  mrg 
   2277   1.8  mrg       hoyt_distribution() : hoyt_distribution(0.5) { }
   2278   1.8  mrg 
   2279   1.1  mrg       explicit
   2280   1.8  mrg       hoyt_distribution(result_type __q, result_type __omega = result_type(1))
   2281   1.1  mrg       : _M_param(__q, __omega),
   2282   1.1  mrg 	_M_ad(result_type(0.5L) * (result_type(1) + __q * __q),
   2283   1.1  mrg 	      result_type(0.5L) * (result_type(1) + __q * __q)
   2284   1.1  mrg 				/ (__q * __q)),
   2285   1.1  mrg 	_M_ed(result_type(1))
   2286   1.1  mrg       { }
   2287   1.1  mrg 
   2288   1.1  mrg       explicit
   2289   1.1  mrg       hoyt_distribution(const param_type& __p)
   2290   1.1  mrg       : _M_param(__p),
   2291   1.1  mrg 	_M_ad(result_type(0.5L) * (result_type(1) + __p.q() * __p.q()),
   2292   1.1  mrg 	      result_type(0.5L) * (result_type(1) + __p.q() * __p.q())
   2293   1.1  mrg 				/ (__p.q() * __p.q())),
   2294   1.1  mrg 	_M_ed(result_type(1))
   2295   1.1  mrg       { }
   2296   1.1  mrg 
   2297   1.1  mrg       /**
   2298   1.1  mrg        * @brief Resets the distribution state.
   2299   1.1  mrg        */
   2300   1.1  mrg       void
   2301   1.1  mrg       reset()
   2302   1.1  mrg       {
   2303   1.1  mrg 	_M_ad.reset();
   2304   1.1  mrg 	_M_ed.reset();
   2305   1.1  mrg       }
   2306   1.1  mrg 
   2307   1.1  mrg       /**
   2308   1.1  mrg        * @brief Return the parameters of the distribution.
   2309   1.1  mrg        */
   2310   1.1  mrg       result_type
   2311   1.1  mrg       q() const
   2312   1.1  mrg       { return _M_param.q(); }
   2313   1.1  mrg 
   2314   1.1  mrg       result_type
   2315   1.1  mrg       omega() const
   2316   1.1  mrg       { return _M_param.omega(); }
   2317   1.1  mrg 
   2318   1.1  mrg       /**
   2319   1.1  mrg        * @brief Returns the parameter set of the distribution.
   2320   1.1  mrg        */
   2321   1.1  mrg       param_type
   2322   1.1  mrg       param() const
   2323   1.1  mrg       { return _M_param; }
   2324   1.1  mrg 
   2325   1.1  mrg       /**
   2326   1.1  mrg        * @brief Sets the parameter set of the distribution.
   2327   1.1  mrg        * @param __param The new parameter set of the distribution.
   2328   1.1  mrg        */
   2329   1.1  mrg       void
   2330   1.1  mrg       param(const param_type& __param)
   2331   1.1  mrg       { _M_param = __param; }
   2332   1.1  mrg 
   2333   1.1  mrg       /**
   2334   1.1  mrg        * @brief Returns the greatest lower bound value of the distribution.
   2335   1.1  mrg        */
   2336   1.1  mrg       result_type
   2337   1.1  mrg       min() const
   2338   1.1  mrg       { return result_type(0); }
   2339   1.1  mrg 
   2340   1.1  mrg       /**
   2341   1.1  mrg        * @brief Returns the least upper bound value of the distribution.
   2342   1.1  mrg        */
   2343   1.1  mrg       result_type
   2344   1.1  mrg       max() const
   2345   1.1  mrg       { return std::numeric_limits<result_type>::max(); }
   2346   1.1  mrg 
   2347   1.1  mrg       /**
   2348   1.1  mrg        * @brief Generating functions.
   2349   1.1  mrg        */
   2350   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2351   1.1  mrg 	result_type
   2352   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng);
   2353   1.1  mrg 
   2354   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2355   1.1  mrg 	result_type
   2356   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
   2357   1.1  mrg 		   const param_type& __p);
   2358   1.1  mrg 
   2359   1.1  mrg       template<typename _ForwardIterator,
   2360   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2361   1.1  mrg 	void
   2362   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   2363   1.1  mrg 		   _UniformRandomNumberGenerator& __urng)
   2364   1.1  mrg 	{ this->__generate(__f, __t, __urng, _M_param); }
   2365   1.1  mrg 
   2366   1.1  mrg       template<typename _ForwardIterator,
   2367   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2368   1.1  mrg 	void
   2369   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   2370   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   2371   1.1  mrg 		   const param_type& __p)
   2372   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   2373   1.1  mrg 
   2374   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2375   1.1  mrg 	void
   2376   1.1  mrg 	__generate(result_type* __f, result_type* __t,
   2377   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   2378   1.1  mrg 		   const param_type& __p)
   2379   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   2380   1.1  mrg 
   2381   1.1  mrg       /**
   2382   1.1  mrg        * @brief Return true if two Hoyt distributions have
   2383   1.1  mrg        *        the same parameters and the sequences that would
   2384   1.1  mrg        *        be generated are equal.
   2385   1.1  mrg        */
   2386   1.1  mrg       friend bool
   2387   1.1  mrg       operator==(const hoyt_distribution& __d1,
   2388   1.1  mrg 		 const hoyt_distribution& __d2)
   2389   1.1  mrg       { return (__d1._M_param == __d2._M_param
   2390   1.1  mrg 		&& __d1._M_ad == __d2._M_ad
   2391   1.1  mrg 		&& __d1._M_ed == __d2._M_ed); }
   2392   1.1  mrg 
   2393   1.1  mrg       /**
   2394   1.1  mrg        * @brief Inserts a %hoyt_distribution random number distribution
   2395   1.1  mrg        * @p __x into the output stream @p __os.
   2396   1.1  mrg        *
   2397   1.1  mrg        * @param __os An output stream.
   2398   1.1  mrg        * @param __x  A %hoyt_distribution random number distribution.
   2399   1.1  mrg        *
   2400   1.1  mrg        * @returns The output stream with the state of @p __x inserted or in
   2401   1.1  mrg        * an error state.
   2402   1.1  mrg        */
   2403   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   2404   1.1  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   2405   1.1  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>&,
   2406   1.1  mrg 		   const hoyt_distribution<_RealType1>&);
   2407   1.1  mrg 
   2408   1.1  mrg       /**
   2409   1.1  mrg        * @brief Extracts a %hoyt_distribution random number distribution
   2410   1.1  mrg        * @p __x from the input stream @p __is.
   2411   1.1  mrg        *
   2412   1.1  mrg        * @param __is An input stream.
   2413   1.1  mrg        * @param __x A %hoyt_distribution random number
   2414   1.1  mrg        *            generator engine.
   2415   1.1  mrg        *
   2416   1.1  mrg        * @returns The input stream with @p __x extracted or in an error state.
   2417   1.1  mrg        */
   2418   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   2419   1.1  mrg 	friend std::basic_istream<_CharT, _Traits>&
   2420   1.1  mrg 	operator>>(std::basic_istream<_CharT, _Traits>&,
   2421   1.1  mrg 		   hoyt_distribution<_RealType1>&);
   2422   1.1  mrg 
   2423   1.1  mrg     private:
   2424   1.1  mrg       template<typename _ForwardIterator,
   2425   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2426   1.1  mrg 	void
   2427   1.1  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   2428   1.1  mrg 			_UniformRandomNumberGenerator& __urng,
   2429   1.1  mrg 			const param_type& __p);
   2430   1.1  mrg 
   2431   1.1  mrg       param_type _M_param;
   2432   1.1  mrg 
   2433   1.1  mrg       __gnu_cxx::arcsine_distribution<result_type> _M_ad;
   2434   1.1  mrg       std::exponential_distribution<result_type> _M_ed;
   2435   1.1  mrg     };
   2436   1.1  mrg 
   2437   1.1  mrg   /**
   2438   1.1  mrg    * @brief Return true if two Hoyt distributions are not equal.
   2439   1.1  mrg    */
   2440   1.1  mrg   template<typename _RealType>
   2441   1.1  mrg     inline bool
   2442   1.1  mrg     operator!=(const hoyt_distribution<_RealType>& __d1,
   2443   1.1  mrg 	       const hoyt_distribution<_RealType>& __d2)
   2444   1.1  mrg     { return !(__d1 == __d2); }
   2445   1.1  mrg 
   2446   1.1  mrg 
   2447   1.1  mrg   /**
   2448   1.1  mrg    * @brief A triangular distribution for random numbers.
   2449   1.1  mrg    *
   2450   1.1  mrg    * The formula for the triangular probability density function is
   2451   1.1  mrg    * @f[
   2452   1.1  mrg    *                  / 0                          for x < a
   2453   1.1  mrg    *     p(x|a,b,c) = | \frac{2(x-a)}{(c-a)(b-a)}  for a <= x <= b
   2454   1.1  mrg    *                  | \frac{2(c-x)}{(c-a)(c-b)}  for b < x <= c
   2455   1.1  mrg    *                  \ 0                          for c < x
   2456   1.1  mrg    * @f]
   2457   1.1  mrg    *
   2458   1.1  mrg    * <table border=1 cellpadding=10 cellspacing=0>
   2459   1.1  mrg    * <caption align=top>Distribution Statistics</caption>
   2460   1.1  mrg    * <tr><td>Mean</td><td>@f$ \frac{a+b+c}{2} @f$</td></tr>
   2461   1.1  mrg    * <tr><td>Variance</td><td>@f$ \frac{a^2+b^2+c^2-ab-ac-bc}
   2462   1.1  mrg    *                                   {18}@f$</td></tr>
   2463   1.1  mrg    * <tr><td>Range</td><td>@f$[a, c]@f$</td></tr>
   2464   1.1  mrg    * </table>
   2465   1.1  mrg    */
   2466   1.1  mrg   template<typename _RealType = double>
   2467   1.1  mrg     class triangular_distribution
   2468   1.1  mrg     {
   2469   1.1  mrg       static_assert(std::is_floating_point<_RealType>::value,
   2470   1.1  mrg 		    "template argument not a floating point type");
   2471   1.1  mrg 
   2472   1.1  mrg     public:
   2473   1.1  mrg       /** The type of the range of the distribution. */
   2474   1.1  mrg       typedef _RealType result_type;
   2475   1.6  mrg 
   2476   1.1  mrg       /** Parameter type. */
   2477   1.1  mrg       struct param_type
   2478   1.1  mrg       {
   2479   1.1  mrg 	friend class triangular_distribution<_RealType>;
   2480   1.1  mrg 
   2481   1.8  mrg 	param_type() : param_type(0) { }
   2482   1.8  mrg 
   2483   1.1  mrg 	explicit
   2484   1.8  mrg 	param_type(_RealType __a,
   2485   1.1  mrg 		   _RealType __b = _RealType(0.5),
   2486   1.1  mrg 		   _RealType __c = _RealType(1))
   2487   1.1  mrg 	: _M_a(__a), _M_b(__b), _M_c(__c)
   2488   1.1  mrg 	{
   2489   1.4  mrg 	  __glibcxx_assert(_M_a <= _M_b);
   2490   1.4  mrg 	  __glibcxx_assert(_M_b <= _M_c);
   2491   1.4  mrg 	  __glibcxx_assert(_M_a < _M_c);
   2492   1.1  mrg 
   2493   1.1  mrg 	  _M_r_ab = (_M_b - _M_a) / (_M_c - _M_a);
   2494   1.1  mrg 	  _M_f_ab_ac = (_M_b - _M_a) * (_M_c - _M_a);
   2495   1.1  mrg 	  _M_f_bc_ac = (_M_c - _M_b) * (_M_c - _M_a);
   2496   1.1  mrg 	}
   2497   1.1  mrg 
   2498   1.1  mrg 	_RealType
   2499   1.1  mrg 	a() const
   2500   1.1  mrg 	{ return _M_a; }
   2501   1.1  mrg 
   2502   1.1  mrg 	_RealType
   2503   1.1  mrg 	b() const
   2504   1.1  mrg 	{ return _M_b; }
   2505   1.1  mrg 
   2506   1.1  mrg 	_RealType
   2507   1.1  mrg 	c() const
   2508   1.1  mrg 	{ return _M_c; }
   2509   1.1  mrg 
   2510   1.1  mrg 	friend bool
   2511   1.1  mrg 	operator==(const param_type& __p1, const param_type& __p2)
   2512   1.6  mrg 	{
   2513   1.6  mrg 	  return (__p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b
   2514   1.6  mrg 		  && __p1._M_c == __p2._M_c);
   2515   1.6  mrg 	}
   2516   1.6  mrg 
   2517   1.6  mrg 	friend bool
   2518   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
   2519   1.6  mrg 	{ return !(__p1 == __p2); }
   2520   1.1  mrg 
   2521   1.1  mrg       private:
   2522   1.1  mrg 
   2523   1.1  mrg 	_RealType _M_a;
   2524   1.1  mrg 	_RealType _M_b;
   2525   1.1  mrg 	_RealType _M_c;
   2526   1.1  mrg 	_RealType _M_r_ab;
   2527   1.1  mrg 	_RealType _M_f_ab_ac;
   2528   1.1  mrg 	_RealType _M_f_bc_ac;
   2529   1.1  mrg       };
   2530   1.1  mrg 
   2531   1.8  mrg       triangular_distribution() : triangular_distribution(0.0) { }
   2532   1.8  mrg 
   2533   1.1  mrg       /**
   2534   1.1  mrg        * @brief Constructs a triangle distribution with parameters
   2535   1.1  mrg        * @f$ a @f$, @f$ b @f$ and @f$ c @f$.
   2536   1.1  mrg        */
   2537   1.1  mrg       explicit
   2538   1.8  mrg       triangular_distribution(result_type __a,
   2539   1.1  mrg 			      result_type __b = result_type(0.5),
   2540   1.1  mrg 			      result_type __c = result_type(1))
   2541   1.1  mrg       : _M_param(__a, __b, __c)
   2542   1.1  mrg       { }
   2543   1.1  mrg 
   2544   1.1  mrg       explicit
   2545   1.1  mrg       triangular_distribution(const param_type& __p)
   2546   1.1  mrg       : _M_param(__p)
   2547   1.1  mrg       { }
   2548   1.1  mrg 
   2549   1.1  mrg       /**
   2550   1.1  mrg        * @brief Resets the distribution state.
   2551   1.1  mrg        */
   2552   1.1  mrg       void
   2553   1.1  mrg       reset()
   2554   1.1  mrg       { }
   2555   1.1  mrg 
   2556   1.1  mrg       /**
   2557   1.1  mrg        * @brief Returns the @f$ a @f$ of the distribution.
   2558   1.1  mrg        */
   2559   1.1  mrg       result_type
   2560   1.1  mrg       a() const
   2561   1.1  mrg       { return _M_param.a(); }
   2562   1.1  mrg 
   2563   1.1  mrg       /**
   2564   1.1  mrg        * @brief Returns the @f$ b @f$ of the distribution.
   2565   1.1  mrg        */
   2566   1.1  mrg       result_type
   2567   1.1  mrg       b() const
   2568   1.1  mrg       { return _M_param.b(); }
   2569   1.1  mrg 
   2570   1.1  mrg       /**
   2571   1.1  mrg        * @brief Returns the @f$ c @f$ of the distribution.
   2572   1.1  mrg        */
   2573   1.1  mrg       result_type
   2574   1.1  mrg       c() const
   2575   1.1  mrg       { return _M_param.c(); }
   2576   1.1  mrg 
   2577   1.1  mrg       /**
   2578   1.1  mrg        * @brief Returns the parameter set of the distribution.
   2579   1.1  mrg        */
   2580   1.1  mrg       param_type
   2581   1.1  mrg       param() const
   2582   1.1  mrg       { return _M_param; }
   2583   1.1  mrg 
   2584   1.1  mrg       /**
   2585   1.1  mrg        * @brief Sets the parameter set of the distribution.
   2586   1.1  mrg        * @param __param The new parameter set of the distribution.
   2587   1.1  mrg        */
   2588   1.1  mrg       void
   2589   1.1  mrg       param(const param_type& __param)
   2590   1.1  mrg       { _M_param = __param; }
   2591   1.1  mrg 
   2592   1.1  mrg       /**
   2593   1.1  mrg        * @brief Returns the greatest lower bound value of the distribution.
   2594   1.1  mrg        */
   2595   1.1  mrg       result_type
   2596   1.1  mrg       min() const
   2597   1.1  mrg       { return _M_param._M_a; }
   2598   1.1  mrg 
   2599   1.1  mrg       /**
   2600   1.1  mrg        * @brief Returns the least upper bound value of the distribution.
   2601   1.1  mrg        */
   2602   1.1  mrg       result_type
   2603   1.1  mrg       max() const
   2604   1.1  mrg       { return _M_param._M_c; }
   2605   1.1  mrg 
   2606   1.1  mrg       /**
   2607   1.1  mrg        * @brief Generating functions.
   2608   1.1  mrg        */
   2609   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2610   1.1  mrg 	result_type
   2611   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
   2612   1.1  mrg 	{ return this->operator()(__urng, _M_param); }
   2613   1.1  mrg 
   2614   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2615   1.1  mrg 	result_type
   2616   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
   2617   1.1  mrg 		   const param_type& __p)
   2618   1.1  mrg 	{
   2619   1.1  mrg 	  std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
   2620   1.1  mrg 	    __aurng(__urng);
   2621   1.1  mrg 	  result_type __rnd = __aurng();
   2622   1.1  mrg 	  if (__rnd <= __p._M_r_ab)
   2623   1.1  mrg 	    return __p.a() + std::sqrt(__rnd * __p._M_f_ab_ac);
   2624   1.1  mrg 	  else
   2625   1.1  mrg 	    return __p.c() - std::sqrt((result_type(1) - __rnd)
   2626   1.1  mrg 				       * __p._M_f_bc_ac);
   2627   1.1  mrg 	}
   2628   1.1  mrg 
   2629   1.1  mrg       template<typename _ForwardIterator,
   2630   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2631   1.1  mrg 	void
   2632   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   2633   1.1  mrg 		   _UniformRandomNumberGenerator& __urng)
   2634   1.1  mrg 	{ this->__generate(__f, __t, __urng, _M_param); }
   2635   1.1  mrg 
   2636   1.1  mrg       template<typename _ForwardIterator,
   2637   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2638   1.1  mrg 	void
   2639   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   2640   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   2641   1.1  mrg 		   const param_type& __p)
   2642   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   2643   1.1  mrg 
   2644   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2645   1.1  mrg 	void
   2646   1.1  mrg 	__generate(result_type* __f, result_type* __t,
   2647   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   2648   1.1  mrg 		   const param_type& __p)
   2649   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   2650   1.1  mrg 
   2651   1.1  mrg       /**
   2652   1.1  mrg        * @brief Return true if two triangle distributions have the same
   2653   1.1  mrg        *        parameters and the sequences that would be generated
   2654   1.1  mrg        *        are equal.
   2655   1.1  mrg        */
   2656   1.1  mrg       friend bool
   2657   1.1  mrg       operator==(const triangular_distribution& __d1,
   2658   1.1  mrg 		 const triangular_distribution& __d2)
   2659   1.1  mrg       { return __d1._M_param == __d2._M_param; }
   2660   1.1  mrg 
   2661   1.1  mrg       /**
   2662   1.1  mrg        * @brief Inserts a %triangular_distribution random number distribution
   2663   1.1  mrg        * @p __x into the output stream @p __os.
   2664   1.1  mrg        *
   2665   1.1  mrg        * @param __os An output stream.
   2666   1.1  mrg        * @param __x  A %triangular_distribution random number distribution.
   2667   1.1  mrg        *
   2668   1.1  mrg        * @returns The output stream with the state of @p __x inserted or in
   2669   1.1  mrg        * an error state.
   2670   1.1  mrg        */
   2671   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   2672   1.1  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   2673   1.1  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   2674   1.1  mrg 		   const __gnu_cxx::triangular_distribution<_RealType1>& __x);
   2675   1.1  mrg 
   2676   1.1  mrg       /**
   2677   1.1  mrg        * @brief Extracts a %triangular_distribution random number distribution
   2678   1.1  mrg        * @p __x from the input stream @p __is.
   2679   1.1  mrg        *
   2680   1.1  mrg        * @param __is An input stream.
   2681   1.1  mrg        * @param __x  A %triangular_distribution random number generator engine.
   2682   1.1  mrg        *
   2683   1.1  mrg        * @returns The input stream with @p __x extracted or in an error state.
   2684   1.1  mrg        */
   2685   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   2686   1.1  mrg 	friend std::basic_istream<_CharT, _Traits>&
   2687   1.1  mrg 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
   2688   1.1  mrg 		   __gnu_cxx::triangular_distribution<_RealType1>& __x);
   2689   1.1  mrg 
   2690   1.1  mrg     private:
   2691   1.1  mrg       template<typename _ForwardIterator,
   2692   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2693   1.1  mrg 	void
   2694   1.1  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   2695   1.1  mrg 			_UniformRandomNumberGenerator& __urng,
   2696   1.1  mrg 			const param_type& __p);
   2697   1.1  mrg 
   2698   1.1  mrg       param_type _M_param;
   2699   1.1  mrg     };
   2700   1.1  mrg 
   2701   1.1  mrg   /**
   2702   1.1  mrg    * @brief Return true if two triangle distributions are different.
   2703   1.1  mrg    */
   2704   1.1  mrg   template<typename _RealType>
   2705   1.1  mrg     inline bool
   2706   1.1  mrg     operator!=(const __gnu_cxx::triangular_distribution<_RealType>& __d1,
   2707   1.1  mrg 	       const __gnu_cxx::triangular_distribution<_RealType>& __d2)
   2708   1.3  mrg     { return !(__d1 == __d2); }
   2709   1.1  mrg 
   2710   1.1  mrg 
   2711   1.1  mrg   /**
   2712   1.1  mrg    * @brief A von Mises distribution for random numbers.
   2713   1.1  mrg    *
   2714   1.1  mrg    * The formula for the von Mises probability density function is
   2715   1.1  mrg    * @f[
   2716   1.1  mrg    *     p(x|\mu,\kappa) = \frac{e^{\kappa \cos(x-\mu)}}
   2717   1.1  mrg    *                            {2\pi I_0(\kappa)}
   2718   1.1  mrg    * @f]
   2719   1.1  mrg    *
   2720   1.1  mrg    * The generating functions use the method according to:
   2721   1.1  mrg    *
   2722   1.1  mrg    * D. J. Best and N. I. Fisher, 1979. "Efficient Simulation of the
   2723   1.1  mrg    * von Mises Distribution", Journal of the Royal Statistical Society.
   2724   1.1  mrg    * Series C (Applied Statistics), Vol. 28, No. 2, pp. 152-157.
   2725   1.1  mrg    *
   2726   1.1  mrg    * <table border=1 cellpadding=10 cellspacing=0>
   2727   1.1  mrg    * <caption align=top>Distribution Statistics</caption>
   2728   1.1  mrg    * <tr><td>Mean</td><td>@f$ \mu @f$</td></tr>
   2729   1.1  mrg    * <tr><td>Variance</td><td>@f$ 1-I_1(\kappa)/I_0(\kappa) @f$</td></tr>
   2730   1.1  mrg    * <tr><td>Range</td><td>@f$[-\pi, \pi]@f$</td></tr>
   2731   1.1  mrg    * </table>
   2732   1.1  mrg    */
   2733   1.1  mrg   template<typename _RealType = double>
   2734   1.1  mrg     class von_mises_distribution
   2735   1.1  mrg     {
   2736   1.1  mrg       static_assert(std::is_floating_point<_RealType>::value,
   2737   1.1  mrg 		    "template argument not a floating point type");
   2738   1.1  mrg 
   2739   1.1  mrg     public:
   2740   1.1  mrg       /** The type of the range of the distribution. */
   2741   1.1  mrg       typedef _RealType result_type;
   2742   1.8  mrg 
   2743   1.1  mrg       /** Parameter type. */
   2744   1.1  mrg       struct param_type
   2745   1.1  mrg       {
   2746   1.1  mrg 	friend class von_mises_distribution<_RealType>;
   2747   1.1  mrg 
   2748   1.8  mrg 	param_type() : param_type(0) { }
   2749   1.8  mrg 
   2750   1.1  mrg 	explicit
   2751   1.8  mrg 	param_type(_RealType __mu, _RealType __kappa = _RealType(1))
   2752   1.1  mrg 	: _M_mu(__mu), _M_kappa(__kappa)
   2753   1.1  mrg 	{
   2754   1.1  mrg 	  const _RealType __pi = __gnu_cxx::__math_constants<_RealType>::__pi;
   2755   1.4  mrg 	  __glibcxx_assert(_M_mu >= -__pi && _M_mu <= __pi);
   2756   1.4  mrg 	  __glibcxx_assert(_M_kappa >= _RealType(0));
   2757   1.1  mrg 
   2758   1.1  mrg 	  auto __tau = std::sqrt(_RealType(4) * _M_kappa * _M_kappa
   2759   1.1  mrg 				 + _RealType(1)) + _RealType(1);
   2760   1.1  mrg 	  auto __rho = ((__tau - std::sqrt(_RealType(2) * __tau))
   2761   1.1  mrg 			/ (_RealType(2) * _M_kappa));
   2762   1.1  mrg 	  _M_r = (_RealType(1) + __rho * __rho) / (_RealType(2) * __rho);
   2763   1.1  mrg 	}
   2764   1.1  mrg 
   2765   1.1  mrg 	_RealType
   2766   1.1  mrg 	mu() const
   2767   1.1  mrg 	{ return _M_mu; }
   2768   1.1  mrg 
   2769   1.1  mrg 	_RealType
   2770   1.1  mrg 	kappa() const
   2771   1.1  mrg 	{ return _M_kappa; }
   2772   1.1  mrg 
   2773   1.1  mrg 	friend bool
   2774   1.1  mrg 	operator==(const param_type& __p1, const param_type& __p2)
   2775   1.6  mrg 	{ return __p1._M_mu == __p2._M_mu && __p1._M_kappa == __p2._M_kappa; }
   2776   1.6  mrg 
   2777   1.6  mrg 	friend bool
   2778   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
   2779   1.6  mrg 	{ return !(__p1 == __p2); }
   2780   1.1  mrg 
   2781   1.1  mrg       private:
   2782   1.1  mrg 	_RealType _M_mu;
   2783   1.1  mrg 	_RealType _M_kappa;
   2784   1.1  mrg 	_RealType _M_r;
   2785   1.1  mrg       };
   2786   1.1  mrg 
   2787   1.8  mrg       von_mises_distribution() : von_mises_distribution(0.0) { }
   2788   1.8  mrg 
   2789   1.1  mrg       /**
   2790   1.1  mrg        * @brief Constructs a von Mises distribution with parameters
   2791   1.1  mrg        * @f$\mu@f$ and @f$\kappa@f$.
   2792   1.1  mrg        */
   2793   1.1  mrg       explicit
   2794   1.8  mrg       von_mises_distribution(result_type __mu,
   2795   1.1  mrg 			     result_type __kappa = result_type(1))
   2796   1.8  mrg       : _M_param(__mu, __kappa)
   2797   1.1  mrg       { }
   2798   1.1  mrg 
   2799   1.1  mrg       explicit
   2800   1.1  mrg       von_mises_distribution(const param_type& __p)
   2801   1.1  mrg       : _M_param(__p)
   2802   1.1  mrg       { }
   2803   1.1  mrg 
   2804   1.1  mrg       /**
   2805   1.1  mrg        * @brief Resets the distribution state.
   2806   1.1  mrg        */
   2807   1.1  mrg       void
   2808   1.1  mrg       reset()
   2809   1.1  mrg       { }
   2810   1.1  mrg 
   2811   1.1  mrg       /**
   2812   1.1  mrg        * @brief Returns the @f$ \mu @f$ of the distribution.
   2813   1.1  mrg        */
   2814   1.1  mrg       result_type
   2815   1.1  mrg       mu() const
   2816   1.1  mrg       { return _M_param.mu(); }
   2817   1.1  mrg 
   2818   1.1  mrg       /**
   2819   1.1  mrg        * @brief Returns the @f$ \kappa @f$ of the distribution.
   2820   1.1  mrg        */
   2821   1.1  mrg       result_type
   2822   1.1  mrg       kappa() const
   2823   1.1  mrg       { return _M_param.kappa(); }
   2824   1.1  mrg 
   2825   1.1  mrg       /**
   2826   1.1  mrg        * @brief Returns the parameter set of the distribution.
   2827   1.1  mrg        */
   2828   1.1  mrg       param_type
   2829   1.1  mrg       param() const
   2830   1.1  mrg       { return _M_param; }
   2831   1.1  mrg 
   2832   1.1  mrg       /**
   2833   1.1  mrg        * @brief Sets the parameter set of the distribution.
   2834   1.1  mrg        * @param __param The new parameter set of the distribution.
   2835   1.1  mrg        */
   2836   1.1  mrg       void
   2837   1.1  mrg       param(const param_type& __param)
   2838   1.1  mrg       { _M_param = __param; }
   2839   1.1  mrg 
   2840   1.1  mrg       /**
   2841   1.1  mrg        * @brief Returns the greatest lower bound value of the distribution.
   2842   1.1  mrg        */
   2843   1.1  mrg       result_type
   2844   1.1  mrg       min() const
   2845   1.1  mrg       {
   2846   1.1  mrg 	return -__gnu_cxx::__math_constants<result_type>::__pi;
   2847   1.1  mrg       }
   2848   1.1  mrg 
   2849   1.1  mrg       /**
   2850   1.1  mrg        * @brief Returns the least upper bound value of the distribution.
   2851   1.1  mrg        */
   2852   1.1  mrg       result_type
   2853   1.1  mrg       max() const
   2854   1.1  mrg       {
   2855   1.1  mrg 	return __gnu_cxx::__math_constants<result_type>::__pi;
   2856   1.1  mrg       }
   2857   1.1  mrg 
   2858   1.1  mrg       /**
   2859   1.1  mrg        * @brief Generating functions.
   2860   1.1  mrg        */
   2861   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2862   1.1  mrg 	result_type
   2863   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
   2864   1.1  mrg 	{ return this->operator()(__urng, _M_param); }
   2865   1.1  mrg 
   2866   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2867   1.1  mrg 	result_type
   2868   1.1  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
   2869   1.3  mrg 		   const param_type& __p);
   2870   1.1  mrg 
   2871   1.1  mrg       template<typename _ForwardIterator,
   2872   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2873   1.1  mrg 	void
   2874   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   2875   1.1  mrg 		   _UniformRandomNumberGenerator& __urng)
   2876   1.1  mrg 	{ this->__generate(__f, __t, __urng, _M_param); }
   2877   1.1  mrg 
   2878   1.1  mrg       template<typename _ForwardIterator,
   2879   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2880   1.1  mrg 	void
   2881   1.1  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   2882   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   2883   1.1  mrg 		   const param_type& __p)
   2884   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   2885   1.1  mrg 
   2886   1.1  mrg       template<typename _UniformRandomNumberGenerator>
   2887   1.1  mrg 	void
   2888   1.1  mrg 	__generate(result_type* __f, result_type* __t,
   2889   1.1  mrg 		   _UniformRandomNumberGenerator& __urng,
   2890   1.1  mrg 		   const param_type& __p)
   2891   1.1  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   2892   1.1  mrg 
   2893   1.1  mrg       /**
   2894   1.1  mrg        * @brief Return true if two von Mises distributions have the same
   2895   1.1  mrg        *        parameters and the sequences that would be generated
   2896   1.1  mrg        *        are equal.
   2897   1.1  mrg        */
   2898   1.1  mrg       friend bool
   2899   1.1  mrg       operator==(const von_mises_distribution& __d1,
   2900   1.1  mrg 		 const von_mises_distribution& __d2)
   2901   1.1  mrg       { return __d1._M_param == __d2._M_param; }
   2902   1.1  mrg 
   2903   1.1  mrg       /**
   2904   1.1  mrg        * @brief Inserts a %von_mises_distribution random number distribution
   2905   1.1  mrg        * @p __x into the output stream @p __os.
   2906   1.1  mrg        *
   2907   1.1  mrg        * @param __os An output stream.
   2908   1.1  mrg        * @param __x  A %von_mises_distribution random number distribution.
   2909   1.1  mrg        *
   2910   1.1  mrg        * @returns The output stream with the state of @p __x inserted or in
   2911   1.1  mrg        * an error state.
   2912   1.1  mrg        */
   2913   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   2914   1.1  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   2915   1.1  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   2916   1.1  mrg 		   const __gnu_cxx::von_mises_distribution<_RealType1>& __x);
   2917   1.1  mrg 
   2918   1.1  mrg       /**
   2919   1.1  mrg        * @brief Extracts a %von_mises_distribution random number distribution
   2920   1.1  mrg        * @p __x from the input stream @p __is.
   2921   1.1  mrg        *
   2922   1.1  mrg        * @param __is An input stream.
   2923   1.1  mrg        * @param __x  A %von_mises_distribution random number generator engine.
   2924   1.1  mrg        *
   2925   1.1  mrg        * @returns The input stream with @p __x extracted or in an error state.
   2926   1.1  mrg        */
   2927   1.1  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   2928   1.1  mrg 	friend std::basic_istream<_CharT, _Traits>&
   2929   1.1  mrg 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
   2930   1.1  mrg 		   __gnu_cxx::von_mises_distribution<_RealType1>& __x);
   2931   1.1  mrg 
   2932   1.1  mrg     private:
   2933   1.1  mrg       template<typename _ForwardIterator,
   2934   1.1  mrg 	       typename _UniformRandomNumberGenerator>
   2935   1.1  mrg 	void
   2936   1.1  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   2937   1.1  mrg 			_UniformRandomNumberGenerator& __urng,
   2938   1.1  mrg 			const param_type& __p);
   2939   1.1  mrg 
   2940   1.1  mrg       param_type _M_param;
   2941   1.1  mrg     };
   2942   1.1  mrg 
   2943   1.1  mrg   /**
   2944   1.1  mrg    * @brief Return true if two von Mises distributions are different.
   2945   1.1  mrg    */
   2946   1.1  mrg   template<typename _RealType>
   2947   1.1  mrg     inline bool
   2948   1.1  mrg     operator!=(const __gnu_cxx::von_mises_distribution<_RealType>& __d1,
   2949   1.1  mrg 	       const __gnu_cxx::von_mises_distribution<_RealType>& __d2)
   2950   1.3  mrg     { return !(__d1 == __d2); }
   2951   1.3  mrg 
   2952   1.3  mrg 
   2953   1.3  mrg   /**
   2954   1.3  mrg    * @brief A discrete hypergeometric random number distribution.
   2955   1.3  mrg    *
   2956   1.3  mrg    * The hypergeometric distribution is a discrete probability distribution
   2957   1.3  mrg    * that describes the probability of @p k successes in @p n draws @a without
   2958   1.3  mrg    * replacement from a finite population of size @p N containing exactly @p K
   2959   1.3  mrg    * successes.
   2960   1.3  mrg    *
   2961   1.3  mrg    * The formula for the hypergeometric probability density function is
   2962   1.3  mrg    * @f[
   2963   1.3  mrg    *   p(k|N,K,n) = \frac{\binom{K}{k} \binom{N-K}{n-k}}{\binom{N}{n}}
   2964   1.3  mrg    * @f]
   2965   1.3  mrg    * where @f$N@f$ is the total population of the distribution,
   2966   1.3  mrg    * @f$K@f$ is the total population of the distribution.
   2967   1.3  mrg    *
   2968   1.3  mrg    * <table border=1 cellpadding=10 cellspacing=0>
   2969   1.3  mrg    * <caption align=top>Distribution Statistics</caption>
   2970   1.3  mrg    * <tr><td>Mean</td><td>@f$ n\frac{K}{N} @f$</td></tr>
   2971   1.3  mrg    * <tr><td>Variance</td><td>@f$ n\frac{K}{N}\frac{N-K}{N}\frac{N-n}{N-1}
   2972   1.3  mrg    *   @f$</td></tr>
   2973   1.3  mrg    * <tr><td>Range</td><td>@f$[max(0, n+K-N), min(K, n)]@f$</td></tr>
   2974   1.3  mrg    * </table>
   2975   1.3  mrg    */
   2976   1.3  mrg   template<typename _UIntType = unsigned int>
   2977   1.3  mrg     class hypergeometric_distribution
   2978   1.3  mrg     {
   2979   1.3  mrg       static_assert(std::is_unsigned<_UIntType>::value, "template argument "
   2980   1.3  mrg 		    "substituting _UIntType not an unsigned integral type");
   2981   1.3  mrg 
   2982   1.3  mrg     public:
   2983   1.3  mrg       /** The type of the range of the distribution. */
   2984   1.3  mrg       typedef _UIntType  result_type;
   2985   1.3  mrg 
   2986   1.3  mrg       /** Parameter type. */
   2987   1.3  mrg       struct param_type
   2988   1.3  mrg       {
   2989   1.3  mrg 	typedef hypergeometric_distribution<_UIntType> distribution_type;
   2990   1.3  mrg 	friend class hypergeometric_distribution<_UIntType>;
   2991   1.3  mrg 
   2992   1.8  mrg 	param_type() : param_type(10) { }
   2993   1.8  mrg 
   2994   1.3  mrg 	explicit
   2995   1.8  mrg 	param_type(result_type __N, result_type __K = 5,
   2996   1.3  mrg 		   result_type __n = 1)
   2997   1.3  mrg 	: _M_N{__N}, _M_K{__K}, _M_n{__n}
   2998   1.3  mrg 	{
   2999   1.4  mrg 	  __glibcxx_assert(_M_N >= _M_K);
   3000   1.4  mrg 	  __glibcxx_assert(_M_N >= _M_n);
   3001   1.3  mrg 	}
   3002   1.3  mrg 
   3003   1.3  mrg 	result_type
   3004   1.3  mrg 	total_size() const
   3005   1.3  mrg 	{ return _M_N; }
   3006   1.3  mrg 
   3007   1.3  mrg 	result_type
   3008   1.3  mrg 	successful_size() const
   3009   1.3  mrg 	{ return _M_K; }
   3010   1.3  mrg 
   3011   1.3  mrg 	result_type
   3012   1.3  mrg 	unsuccessful_size() const
   3013   1.3  mrg 	{ return _M_N - _M_K; }
   3014   1.3  mrg 
   3015   1.3  mrg 	result_type
   3016   1.3  mrg 	total_draws() const
   3017   1.3  mrg 	{ return _M_n; }
   3018   1.3  mrg 
   3019   1.3  mrg 	friend bool
   3020   1.3  mrg 	operator==(const param_type& __p1, const param_type& __p2)
   3021   1.3  mrg 	{ return (__p1._M_N == __p2._M_N)
   3022   1.3  mrg 	      && (__p1._M_K == __p2._M_K)
   3023   1.3  mrg 	      && (__p1._M_n == __p2._M_n); }
   3024   1.3  mrg 
   3025   1.6  mrg 	friend bool
   3026   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
   3027   1.6  mrg 	{ return !(__p1 == __p2); }
   3028   1.6  mrg 
   3029   1.3  mrg       private:
   3030   1.3  mrg 
   3031   1.3  mrg 	result_type _M_N;
   3032   1.3  mrg 	result_type _M_K;
   3033   1.3  mrg 	result_type _M_n;
   3034   1.3  mrg       };
   3035   1.3  mrg 
   3036   1.8  mrg       // constructors and member functions
   3037   1.8  mrg 
   3038   1.8  mrg       hypergeometric_distribution() : hypergeometric_distribution(10) { }
   3039   1.8  mrg 
   3040   1.3  mrg       explicit
   3041   1.8  mrg       hypergeometric_distribution(result_type __N, result_type __K = 5,
   3042   1.3  mrg 				  result_type __n = 1)
   3043   1.3  mrg       : _M_param{__N, __K, __n}
   3044   1.3  mrg       { }
   3045   1.3  mrg 
   3046   1.3  mrg       explicit
   3047   1.3  mrg       hypergeometric_distribution(const param_type& __p)
   3048   1.3  mrg       : _M_param{__p}
   3049   1.3  mrg       { }
   3050   1.3  mrg 
   3051   1.3  mrg       /**
   3052   1.3  mrg        * @brief Resets the distribution state.
   3053   1.3  mrg        */
   3054   1.3  mrg       void
   3055   1.3  mrg       reset()
   3056   1.3  mrg       { }
   3057   1.3  mrg 
   3058   1.3  mrg       /**
   3059   1.3  mrg        * @brief Returns the distribution parameter @p N,
   3060   1.3  mrg        *	the total number of items.
   3061   1.3  mrg        */
   3062   1.3  mrg       result_type
   3063   1.3  mrg       total_size() const
   3064   1.3  mrg       { return this->_M_param.total_size(); }
   3065   1.3  mrg 
   3066   1.3  mrg       /**
   3067   1.3  mrg        * @brief Returns the distribution parameter @p K,
   3068   1.3  mrg        *	the total number of successful items.
   3069   1.3  mrg        */
   3070   1.3  mrg       result_type
   3071   1.3  mrg       successful_size() const
   3072   1.3  mrg       { return this->_M_param.successful_size(); }
   3073   1.3  mrg 
   3074   1.3  mrg       /**
   3075   1.3  mrg        * @brief Returns the total number of unsuccessful items @f$ N - K @f$.
   3076   1.3  mrg        */
   3077   1.3  mrg       result_type
   3078   1.3  mrg       unsuccessful_size() const
   3079   1.3  mrg       { return this->_M_param.unsuccessful_size(); }
   3080   1.3  mrg 
   3081   1.3  mrg       /**
   3082   1.3  mrg        * @brief Returns the distribution parameter @p n,
   3083   1.3  mrg        *	the total number of draws.
   3084   1.3  mrg        */
   3085   1.3  mrg       result_type
   3086   1.3  mrg       total_draws() const
   3087   1.3  mrg       { return this->_M_param.total_draws(); }
   3088   1.3  mrg 
   3089   1.3  mrg       /**
   3090   1.3  mrg        * @brief Returns the parameter set of the distribution.
   3091   1.3  mrg        */
   3092   1.3  mrg       param_type
   3093   1.3  mrg       param() const
   3094   1.3  mrg       { return this->_M_param; }
   3095   1.3  mrg 
   3096   1.3  mrg       /**
   3097   1.3  mrg        * @brief Sets the parameter set of the distribution.
   3098   1.3  mrg        * @param __param The new parameter set of the distribution.
   3099   1.3  mrg        */
   3100   1.3  mrg       void
   3101   1.3  mrg       param(const param_type& __param)
   3102   1.3  mrg       { this->_M_param = __param; }
   3103   1.3  mrg 
   3104   1.3  mrg       /**
   3105   1.3  mrg        * @brief Returns the greatest lower bound value of the distribution.
   3106   1.3  mrg        */
   3107   1.3  mrg       result_type
   3108   1.3  mrg       min() const
   3109   1.3  mrg       {
   3110   1.3  mrg 	using _IntType = typename std::make_signed<result_type>::type;
   3111   1.3  mrg 	return static_cast<result_type>(std::max(static_cast<_IntType>(0),
   3112   1.3  mrg 				static_cast<_IntType>(this->total_draws()
   3113   1.3  mrg 						- this->unsuccessful_size())));
   3114   1.3  mrg       }
   3115   1.3  mrg 
   3116   1.3  mrg       /**
   3117   1.3  mrg        * @brief Returns the least upper bound value of the distribution.
   3118   1.3  mrg        */
   3119   1.3  mrg       result_type
   3120   1.3  mrg       max() const
   3121   1.3  mrg       { return std::min(this->successful_size(), this->total_draws()); }
   3122   1.3  mrg 
   3123   1.3  mrg       /**
   3124   1.3  mrg        * @brief Generating functions.
   3125   1.3  mrg        */
   3126   1.3  mrg       template<typename _UniformRandomNumberGenerator>
   3127   1.3  mrg 	result_type
   3128   1.3  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
   3129   1.3  mrg 	{ return this->operator()(__urng, this->_M_param); }
   3130   1.3  mrg 
   3131   1.3  mrg       template<typename _UniformRandomNumberGenerator>
   3132   1.3  mrg 	result_type
   3133   1.3  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
   3134   1.3  mrg 		   const param_type& __p);
   3135   1.3  mrg 
   3136   1.3  mrg       template<typename _ForwardIterator,
   3137   1.3  mrg 	       typename _UniformRandomNumberGenerator>
   3138   1.3  mrg 	void
   3139   1.3  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   3140   1.3  mrg 		   _UniformRandomNumberGenerator& __urng)
   3141   1.3  mrg 	{ this->__generate(__f, __t, __urng, this->_M_param); }
   3142   1.3  mrg 
   3143   1.3  mrg       template<typename _ForwardIterator,
   3144   1.3  mrg 	       typename _UniformRandomNumberGenerator>
   3145   1.3  mrg 	void
   3146   1.3  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   3147   1.3  mrg 		   _UniformRandomNumberGenerator& __urng,
   3148   1.3  mrg 		   const param_type& __p)
   3149   1.3  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   3150   1.3  mrg 
   3151   1.3  mrg       template<typename _UniformRandomNumberGenerator>
   3152   1.3  mrg 	void
   3153   1.3  mrg 	__generate(result_type* __f, result_type* __t,
   3154   1.3  mrg 		   _UniformRandomNumberGenerator& __urng,
   3155   1.3  mrg 		   const param_type& __p)
   3156   1.3  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   3157   1.3  mrg 
   3158   1.3  mrg        /**
   3159   1.3  mrg 	* @brief Return true if two hypergeometric distributions have the same
   3160   1.3  mrg 	*        parameters and the sequences that would be generated
   3161   1.3  mrg 	*        are equal.
   3162   1.3  mrg 	*/
   3163   1.3  mrg       friend bool
   3164   1.3  mrg       operator==(const hypergeometric_distribution& __d1,
   3165   1.3  mrg 		 const hypergeometric_distribution& __d2)
   3166   1.3  mrg       { return __d1._M_param == __d2._M_param; }
   3167   1.3  mrg 
   3168   1.3  mrg       /**
   3169   1.3  mrg        * @brief Inserts a %hypergeometric_distribution random number
   3170   1.3  mrg        * distribution @p __x into the output stream @p __os.
   3171   1.3  mrg        *
   3172   1.3  mrg        * @param __os An output stream.
   3173   1.3  mrg        * @param __x  A %hypergeometric_distribution random number
   3174   1.3  mrg        *             distribution.
   3175   1.3  mrg        *
   3176   1.3  mrg        * @returns The output stream with the state of @p __x inserted or in
   3177   1.3  mrg        * an error state.
   3178   1.3  mrg        */
   3179   1.3  mrg       template<typename _UIntType1, typename _CharT, typename _Traits>
   3180   1.3  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   3181   1.3  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   3182   1.3  mrg 		   const __gnu_cxx::hypergeometric_distribution<_UIntType1>&
   3183   1.3  mrg 		   __x);
   3184   1.3  mrg 
   3185   1.3  mrg       /**
   3186   1.3  mrg        * @brief Extracts a %hypergeometric_distribution random number
   3187   1.3  mrg        * distribution @p __x from the input stream @p __is.
   3188   1.3  mrg        *
   3189   1.3  mrg        * @param __is An input stream.
   3190   1.3  mrg        * @param __x  A %hypergeometric_distribution random number generator
   3191   1.3  mrg        *             distribution.
   3192   1.3  mrg        *
   3193   1.3  mrg        * @returns The input stream with @p __x extracted or in an error
   3194   1.3  mrg        *          state.
   3195   1.3  mrg        */
   3196   1.3  mrg       template<typename _UIntType1, typename _CharT, typename _Traits>
   3197   1.3  mrg 	friend std::basic_istream<_CharT, _Traits>&
   3198   1.3  mrg 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
   3199   1.3  mrg 		   __gnu_cxx::hypergeometric_distribution<_UIntType1>& __x);
   3200   1.3  mrg 
   3201   1.3  mrg     private:
   3202   1.3  mrg 
   3203   1.3  mrg       template<typename _ForwardIterator,
   3204   1.3  mrg 	       typename _UniformRandomNumberGenerator>
   3205   1.3  mrg 	void
   3206   1.3  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   3207   1.3  mrg 			_UniformRandomNumberGenerator& __urng,
   3208   1.3  mrg 			const param_type& __p);
   3209   1.3  mrg 
   3210   1.3  mrg       param_type _M_param;
   3211   1.3  mrg     };
   3212   1.3  mrg 
   3213   1.3  mrg   /**
   3214   1.3  mrg    * @brief Return true if two hypergeometric distributions are different.
   3215   1.3  mrg    */
   3216   1.3  mrg   template<typename _UIntType>
   3217   1.3  mrg     inline bool
   3218   1.3  mrg     operator!=(const __gnu_cxx::hypergeometric_distribution<_UIntType>& __d1,
   3219   1.3  mrg 	       const __gnu_cxx::hypergeometric_distribution<_UIntType>& __d2)
   3220   1.3  mrg     { return !(__d1 == __d2); }
   3221   1.3  mrg 
   3222   1.3  mrg   /**
   3223   1.3  mrg    * @brief A logistic continuous distribution for random numbers.
   3224   1.3  mrg    *
   3225   1.3  mrg    * The formula for the logistic probability density function is
   3226   1.3  mrg    * @f[
   3227   1.3  mrg    *     p(x|\a,\b) = \frac{e^{(x - a)/b}}{b[1 + e^{(x - a)/b}]^2}
   3228   1.3  mrg    * @f]
   3229   1.3  mrg    * where @f$b > 0@f$.
   3230   1.3  mrg    *
   3231   1.3  mrg    * The formula for the logistic probability function is
   3232   1.3  mrg    * @f[
   3233   1.3  mrg    *     cdf(x|\a,\b) = \frac{e^{(x - a)/b}}{1 + e^{(x - a)/b}}
   3234   1.3  mrg    * @f]
   3235   1.3  mrg    * where @f$b > 0@f$.
   3236   1.3  mrg    *
   3237   1.3  mrg    * <table border=1 cellpadding=10 cellspacing=0>
   3238   1.3  mrg    * <caption align=top>Distribution Statistics</caption>
   3239   1.3  mrg    * <tr><td>Mean</td><td>@f$a@f$</td></tr>
   3240   1.3  mrg    * <tr><td>Variance</td><td>@f$b^2\pi^2/3@f$</td></tr>
   3241   1.3  mrg    * <tr><td>Range</td><td>@f$[0, \infty)@f$</td></tr>
   3242   1.3  mrg    * </table>
   3243   1.3  mrg    */
   3244   1.3  mrg   template<typename _RealType = double>
   3245   1.3  mrg     class
   3246   1.3  mrg     logistic_distribution
   3247   1.3  mrg     {
   3248   1.3  mrg       static_assert(std::is_floating_point<_RealType>::value,
   3249   1.3  mrg 		    "template argument not a floating point type");
   3250   1.3  mrg 
   3251   1.3  mrg     public:
   3252   1.3  mrg       /** The type of the range of the distribution. */
   3253   1.3  mrg       typedef _RealType result_type;
   3254   1.6  mrg 
   3255   1.3  mrg       /** Parameter type. */
   3256   1.3  mrg       struct param_type
   3257   1.3  mrg       {
   3258   1.3  mrg 	typedef logistic_distribution<result_type> distribution_type;
   3259   1.3  mrg 
   3260   1.8  mrg 	param_type() : param_type(0) { }
   3261   1.8  mrg 
   3262   1.8  mrg 	explicit
   3263   1.8  mrg 	param_type(result_type __a, result_type __b = result_type(1))
   3264   1.3  mrg 	: _M_a(__a), _M_b(__b)
   3265   1.3  mrg 	{
   3266   1.4  mrg 	  __glibcxx_assert(_M_b > result_type(0));
   3267   1.3  mrg 	}
   3268   1.3  mrg 
   3269   1.3  mrg 	result_type
   3270   1.3  mrg 	a() const
   3271   1.3  mrg 	{ return _M_a; }
   3272   1.3  mrg 
   3273   1.3  mrg 	result_type
   3274   1.3  mrg 	b() const
   3275   1.3  mrg 	{ return _M_b; }
   3276   1.3  mrg 
   3277   1.3  mrg 	friend bool
   3278   1.3  mrg 	operator==(const param_type& __p1, const param_type& __p2)
   3279   1.6  mrg 	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
   3280   1.6  mrg 
   3281   1.6  mrg 	friend bool
   3282   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
   3283   1.6  mrg 	{ return !(__p1 == __p2); }
   3284   1.3  mrg 
   3285   1.3  mrg       private:
   3286   1.3  mrg 	void _M_initialize();
   3287   1.3  mrg 
   3288   1.3  mrg 	result_type _M_a;
   3289   1.3  mrg 	result_type _M_b;
   3290   1.3  mrg       };
   3291   1.3  mrg 
   3292   1.3  mrg       /**
   3293   1.3  mrg        * @brief Constructors.
   3294   1.8  mrg        * @{
   3295   1.3  mrg        */
   3296   1.8  mrg       logistic_distribution() : logistic_distribution(0.0) { }
   3297   1.8  mrg 
   3298   1.3  mrg       explicit
   3299   1.8  mrg       logistic_distribution(result_type __a, result_type __b = result_type(1))
   3300   1.3  mrg       : _M_param(__a, __b)
   3301   1.3  mrg       { }
   3302   1.3  mrg 
   3303   1.3  mrg       explicit
   3304   1.3  mrg       logistic_distribution(const param_type& __p)
   3305   1.3  mrg       : _M_param(__p)
   3306   1.3  mrg       { }
   3307   1.3  mrg 
   3308   1.9  mrg       /// @}
   3309   1.8  mrg 
   3310   1.3  mrg       /**
   3311   1.3  mrg        * @brief Resets the distribution state.
   3312   1.3  mrg        */
   3313   1.3  mrg       void
   3314   1.3  mrg       reset()
   3315   1.3  mrg       { }
   3316   1.3  mrg 
   3317   1.3  mrg       /**
   3318   1.3  mrg        * @brief Return the parameters of the distribution.
   3319   1.3  mrg        */
   3320   1.3  mrg       result_type
   3321   1.3  mrg       a() const
   3322   1.3  mrg       { return _M_param.a(); }
   3323   1.3  mrg 
   3324   1.3  mrg       result_type
   3325   1.3  mrg       b() const
   3326   1.3  mrg       { return _M_param.b(); }
   3327   1.3  mrg 
   3328   1.3  mrg       /**
   3329   1.3  mrg        * @brief Returns the parameter set of the distribution.
   3330   1.3  mrg        */
   3331   1.3  mrg       param_type
   3332   1.3  mrg       param() const
   3333   1.3  mrg       { return _M_param; }
   3334   1.3  mrg 
   3335   1.3  mrg       /**
   3336   1.3  mrg        * @brief Sets the parameter set of the distribution.
   3337   1.3  mrg        * @param __param The new parameter set of the distribution.
   3338   1.3  mrg        */
   3339   1.3  mrg       void
   3340   1.3  mrg       param(const param_type& __param)
   3341   1.3  mrg       { _M_param = __param; }
   3342   1.3  mrg 
   3343   1.3  mrg       /**
   3344   1.3  mrg        * @brief Returns the greatest lower bound value of the distribution.
   3345   1.3  mrg        */
   3346   1.3  mrg       result_type
   3347   1.3  mrg       min() const
   3348   1.3  mrg       { return -std::numeric_limits<result_type>::max(); }
   3349   1.3  mrg 
   3350   1.3  mrg       /**
   3351   1.3  mrg        * @brief Returns the least upper bound value of the distribution.
   3352   1.3  mrg        */
   3353   1.3  mrg       result_type
   3354   1.3  mrg       max() const
   3355   1.3  mrg       { return std::numeric_limits<result_type>::max(); }
   3356   1.3  mrg 
   3357   1.3  mrg       /**
   3358   1.3  mrg        * @brief Generating functions.
   3359   1.3  mrg        */
   3360   1.3  mrg       template<typename _UniformRandomNumberGenerator>
   3361   1.3  mrg 	result_type
   3362   1.3  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
   3363   1.3  mrg 	{ return this->operator()(__urng, this->_M_param); }
   3364   1.3  mrg 
   3365   1.3  mrg       template<typename _UniformRandomNumberGenerator>
   3366   1.3  mrg 	result_type
   3367   1.3  mrg 	operator()(_UniformRandomNumberGenerator&,
   3368   1.3  mrg 		   const param_type&);
   3369   1.3  mrg 
   3370   1.3  mrg       template<typename _ForwardIterator,
   3371   1.3  mrg 	       typename _UniformRandomNumberGenerator>
   3372   1.3  mrg 	void
   3373   1.3  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   3374   1.3  mrg 		   _UniformRandomNumberGenerator& __urng)
   3375   1.3  mrg 	{ this->__generate(__f, __t, __urng, this->param()); }
   3376   1.3  mrg 
   3377   1.3  mrg       template<typename _ForwardIterator,
   3378   1.3  mrg 	       typename _UniformRandomNumberGenerator>
   3379   1.3  mrg 	void
   3380   1.3  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   3381   1.3  mrg 		   _UniformRandomNumberGenerator& __urng,
   3382   1.3  mrg 		   const param_type& __p)
   3383   1.3  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   3384   1.3  mrg 
   3385   1.3  mrg       template<typename _UniformRandomNumberGenerator>
   3386   1.3  mrg 	void
   3387   1.3  mrg 	__generate(result_type* __f, result_type* __t,
   3388   1.3  mrg 		   _UniformRandomNumberGenerator& __urng,
   3389   1.3  mrg 		   const param_type& __p)
   3390   1.3  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   3391   1.3  mrg 
   3392   1.3  mrg       /**
   3393   1.3  mrg        * @brief Return true if two logistic distributions have
   3394   1.3  mrg        *        the same parameters and the sequences that would
   3395   1.3  mrg        *        be generated are equal.
   3396   1.3  mrg        */
   3397   1.3  mrg       template<typename _RealType1>
   3398   1.3  mrg 	friend bool
   3399   1.3  mrg 	operator==(const logistic_distribution<_RealType1>& __d1,
   3400   1.3  mrg 		   const logistic_distribution<_RealType1>& __d2)
   3401   1.3  mrg 	{ return __d1.param() == __d2.param(); }
   3402   1.3  mrg 
   3403   1.3  mrg       /**
   3404   1.3  mrg        * @brief Inserts a %logistic_distribution random number distribution
   3405   1.3  mrg        * @p __x into the output stream @p __os.
   3406   1.3  mrg        *
   3407   1.3  mrg        * @param __os An output stream.
   3408   1.3  mrg        * @param __x  A %logistic_distribution random number distribution.
   3409   1.3  mrg        *
   3410   1.3  mrg        * @returns The output stream with the state of @p __x inserted or in
   3411   1.3  mrg        * an error state.
   3412   1.3  mrg        */
   3413   1.3  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   3414   1.3  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   3415   1.3  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>&,
   3416   1.3  mrg 		   const logistic_distribution<_RealType1>&);
   3417   1.3  mrg 
   3418   1.3  mrg       /**
   3419   1.3  mrg        * @brief Extracts a %logistic_distribution random number distribution
   3420   1.3  mrg        * @p __x from the input stream @p __is.
   3421   1.3  mrg        *
   3422   1.3  mrg        * @param __is An input stream.
   3423   1.3  mrg        * @param __x A %logistic_distribution random number
   3424   1.3  mrg        *            generator engine.
   3425   1.3  mrg        *
   3426   1.3  mrg        * @returns The input stream with @p __x extracted or in an error state.
   3427   1.3  mrg        */
   3428   1.3  mrg       template<typename _RealType1, typename _CharT, typename _Traits>
   3429   1.3  mrg 	friend std::basic_istream<_CharT, _Traits>&
   3430   1.3  mrg 	operator>>(std::basic_istream<_CharT, _Traits>&,
   3431   1.3  mrg 		   logistic_distribution<_RealType1>&);
   3432   1.3  mrg 
   3433   1.3  mrg     private:
   3434   1.3  mrg       template<typename _ForwardIterator,
   3435   1.3  mrg 	       typename _UniformRandomNumberGenerator>
   3436   1.3  mrg 	void
   3437   1.3  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   3438   1.3  mrg 			_UniformRandomNumberGenerator& __urng,
   3439   1.3  mrg 			const param_type& __p);
   3440   1.3  mrg 
   3441   1.3  mrg       param_type _M_param;
   3442   1.3  mrg     };
   3443   1.3  mrg 
   3444   1.3  mrg   /**
   3445   1.3  mrg    * @brief Return true if two logistic distributions are not equal.
   3446   1.3  mrg    */
   3447   1.3  mrg   template<typename _RealType1>
   3448   1.3  mrg     inline bool
   3449   1.3  mrg     operator!=(const logistic_distribution<_RealType1>& __d1,
   3450   1.3  mrg 	       const logistic_distribution<_RealType1>& __d2)
   3451   1.3  mrg     { return !(__d1 == __d2); }
   3452   1.3  mrg 
   3453   1.3  mrg 
   3454   1.3  mrg   /**
   3455   1.3  mrg    * @brief A distribution for random coordinates on a unit sphere.
   3456   1.3  mrg    *
   3457   1.3  mrg    * The method used in the generation function is attributed by Donald Knuth
   3458   1.3  mrg    * to G. W. Brown, Modern Mathematics for the Engineer (1956).
   3459   1.3  mrg    */
   3460   1.3  mrg   template<std::size_t _Dimen, typename _RealType = double>
   3461   1.3  mrg     class uniform_on_sphere_distribution
   3462   1.3  mrg     {
   3463   1.3  mrg       static_assert(std::is_floating_point<_RealType>::value,
   3464   1.3  mrg 		    "template argument not a floating point type");
   3465   1.3  mrg       static_assert(_Dimen != 0, "dimension is zero");
   3466   1.3  mrg 
   3467   1.3  mrg     public:
   3468   1.3  mrg       /** The type of the range of the distribution. */
   3469   1.3  mrg       typedef std::array<_RealType, _Dimen> result_type;
   3470   1.6  mrg 
   3471   1.3  mrg       /** Parameter type. */
   3472   1.3  mrg       struct param_type
   3473   1.3  mrg       {
   3474   1.8  mrg 	param_type() { }
   3475   1.3  mrg 
   3476   1.3  mrg 	friend bool
   3477   1.6  mrg 	operator==(const param_type&, const param_type&)
   3478   1.3  mrg 	{ return true; }
   3479   1.6  mrg 
   3480   1.6  mrg 	friend bool
   3481   1.6  mrg 	operator!=(const param_type&, const param_type&)
   3482   1.6  mrg 	{ return false; }
   3483   1.3  mrg       };
   3484   1.3  mrg 
   3485   1.3  mrg       /**
   3486   1.3  mrg        * @brief Constructs a uniform on sphere distribution.
   3487   1.3  mrg        */
   3488   1.3  mrg       uniform_on_sphere_distribution()
   3489   1.3  mrg       : _M_param(), _M_nd()
   3490   1.3  mrg       { }
   3491   1.3  mrg 
   3492   1.3  mrg       explicit
   3493   1.3  mrg       uniform_on_sphere_distribution(const param_type& __p)
   3494   1.3  mrg       : _M_param(__p), _M_nd()
   3495   1.3  mrg       { }
   3496   1.3  mrg 
   3497   1.3  mrg       /**
   3498   1.3  mrg        * @brief Resets the distribution state.
   3499   1.3  mrg        */
   3500   1.3  mrg       void
   3501   1.3  mrg       reset()
   3502   1.3  mrg       { _M_nd.reset(); }
   3503   1.3  mrg 
   3504   1.3  mrg       /**
   3505   1.3  mrg        * @brief Returns the parameter set of the distribution.
   3506   1.3  mrg        */
   3507   1.3  mrg       param_type
   3508   1.3  mrg       param() const
   3509   1.3  mrg       { return _M_param; }
   3510   1.3  mrg 
   3511   1.3  mrg       /**
   3512   1.3  mrg        * @brief Sets the parameter set of the distribution.
   3513   1.3  mrg        * @param __param The new parameter set of the distribution.
   3514   1.3  mrg        */
   3515   1.3  mrg       void
   3516   1.3  mrg       param(const param_type& __param)
   3517   1.3  mrg       { _M_param = __param; }
   3518   1.3  mrg 
   3519   1.3  mrg       /**
   3520   1.3  mrg        * @brief Returns the greatest lower bound value of the distribution.
   3521   1.3  mrg        * This function makes no sense for this distribution.
   3522   1.3  mrg        */
   3523   1.3  mrg       result_type
   3524   1.3  mrg       min() const
   3525   1.3  mrg       {
   3526   1.3  mrg 	result_type __res;
   3527   1.3  mrg 	__res.fill(0);
   3528   1.3  mrg 	return __res;
   3529   1.3  mrg       }
   3530   1.3  mrg 
   3531   1.3  mrg       /**
   3532   1.3  mrg        * @brief Returns the least upper bound value of the distribution.
   3533   1.3  mrg        * This function makes no sense for this distribution.
   3534   1.3  mrg        */
   3535   1.3  mrg       result_type
   3536   1.3  mrg       max() const
   3537   1.3  mrg       {
   3538   1.3  mrg 	result_type __res;
   3539   1.3  mrg 	__res.fill(0);
   3540   1.3  mrg 	return __res;
   3541   1.3  mrg       }
   3542   1.3  mrg 
   3543   1.3  mrg       /**
   3544   1.3  mrg        * @brief Generating functions.
   3545   1.3  mrg        */
   3546   1.3  mrg       template<typename _UniformRandomNumberGenerator>
   3547   1.3  mrg 	result_type
   3548   1.3  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
   3549   1.3  mrg 	{ return this->operator()(__urng, _M_param); }
   3550   1.3  mrg 
   3551   1.3  mrg       template<typename _UniformRandomNumberGenerator>
   3552   1.3  mrg 	result_type
   3553   1.3  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
   3554   1.3  mrg 		   const param_type& __p);
   3555   1.3  mrg 
   3556   1.3  mrg       template<typename _ForwardIterator,
   3557   1.3  mrg 	       typename _UniformRandomNumberGenerator>
   3558   1.3  mrg 	void
   3559   1.3  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   3560   1.3  mrg 		   _UniformRandomNumberGenerator& __urng)
   3561   1.3  mrg 	{ this->__generate(__f, __t, __urng, this->param()); }
   3562   1.3  mrg 
   3563   1.3  mrg       template<typename _ForwardIterator,
   3564   1.3  mrg 	       typename _UniformRandomNumberGenerator>
   3565   1.3  mrg 	void
   3566   1.3  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   3567   1.3  mrg 		   _UniformRandomNumberGenerator& __urng,
   3568   1.3  mrg 		   const param_type& __p)
   3569   1.3  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   3570   1.3  mrg 
   3571   1.3  mrg       template<typename _UniformRandomNumberGenerator>
   3572   1.3  mrg 	void
   3573   1.3  mrg 	__generate(result_type* __f, result_type* __t,
   3574   1.3  mrg 		   _UniformRandomNumberGenerator& __urng,
   3575   1.3  mrg 		   const param_type& __p)
   3576   1.3  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   3577   1.3  mrg 
   3578   1.3  mrg       /**
   3579   1.3  mrg        * @brief Return true if two uniform on sphere distributions have
   3580   1.3  mrg        *        the same parameters and the sequences that would be
   3581   1.3  mrg        *        generated are equal.
   3582   1.3  mrg        */
   3583   1.3  mrg       friend bool
   3584   1.3  mrg       operator==(const uniform_on_sphere_distribution& __d1,
   3585   1.3  mrg 		 const uniform_on_sphere_distribution& __d2)
   3586   1.3  mrg       { return __d1._M_nd == __d2._M_nd; }
   3587   1.3  mrg 
   3588   1.3  mrg       /**
   3589   1.3  mrg        * @brief Inserts a %uniform_on_sphere_distribution random number
   3590   1.3  mrg        *        distribution @p __x into the output stream @p __os.
   3591   1.3  mrg        *
   3592   1.3  mrg        * @param __os An output stream.
   3593   1.3  mrg        * @param __x  A %uniform_on_sphere_distribution random number
   3594   1.3  mrg        *             distribution.
   3595   1.3  mrg        *
   3596   1.3  mrg        * @returns The output stream with the state of @p __x inserted or in
   3597   1.3  mrg        * an error state.
   3598   1.3  mrg        */
   3599   1.3  mrg       template<size_t _Dimen1, typename _RealType1, typename _CharT,
   3600   1.3  mrg 	       typename _Traits>
   3601   1.3  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   3602   1.3  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   3603   1.3  mrg 		   const __gnu_cxx::uniform_on_sphere_distribution<_Dimen1,
   3604   1.3  mrg 								   _RealType1>&
   3605   1.3  mrg 		   __x);
   3606   1.3  mrg 
   3607   1.3  mrg       /**
   3608   1.3  mrg        * @brief Extracts a %uniform_on_sphere_distribution random number
   3609   1.3  mrg        *        distribution
   3610   1.3  mrg        * @p __x from the input stream @p __is.
   3611   1.3  mrg        *
   3612   1.3  mrg        * @param __is An input stream.
   3613   1.3  mrg        * @param __x  A %uniform_on_sphere_distribution random number
   3614   1.3  mrg        *             generator engine.
   3615   1.3  mrg        *
   3616   1.3  mrg        * @returns The input stream with @p __x extracted or in an error state.
   3617   1.3  mrg        */
   3618   1.3  mrg       template<std::size_t _Dimen1, typename _RealType1, typename _CharT,
   3619   1.3  mrg 	       typename _Traits>
   3620   1.3  mrg 	friend std::basic_istream<_CharT, _Traits>&
   3621   1.3  mrg 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
   3622   1.3  mrg 		   __gnu_cxx::uniform_on_sphere_distribution<_Dimen1,
   3623   1.3  mrg 							     _RealType1>& __x);
   3624   1.3  mrg 
   3625   1.3  mrg     private:
   3626   1.3  mrg       template<typename _ForwardIterator,
   3627   1.3  mrg 	       typename _UniformRandomNumberGenerator>
   3628   1.3  mrg 	void
   3629   1.3  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   3630   1.3  mrg 			_UniformRandomNumberGenerator& __urng,
   3631   1.3  mrg 			const param_type& __p);
   3632   1.3  mrg 
   3633   1.3  mrg       param_type _M_param;
   3634   1.3  mrg       std::normal_distribution<_RealType> _M_nd;
   3635   1.3  mrg     };
   3636   1.3  mrg 
   3637   1.3  mrg   /**
   3638   1.3  mrg    * @brief Return true if two uniform on sphere distributions are different.
   3639   1.3  mrg    */
   3640   1.3  mrg   template<std::size_t _Dimen, typename _RealType>
   3641   1.3  mrg     inline bool
   3642   1.3  mrg     operator!=(const __gnu_cxx::uniform_on_sphere_distribution<_Dimen,
   3643   1.3  mrg 	       _RealType>& __d1,
   3644   1.3  mrg 	       const __gnu_cxx::uniform_on_sphere_distribution<_Dimen,
   3645   1.3  mrg 	       _RealType>& __d2)
   3646   1.3  mrg     { return !(__d1 == __d2); }
   3647   1.1  mrg 
   3648   1.6  mrg 
   3649   1.6  mrg   /**
   3650   1.6  mrg    * @brief A distribution for random coordinates inside a unit sphere.
   3651   1.6  mrg    */
   3652   1.6  mrg   template<std::size_t _Dimen, typename _RealType = double>
   3653   1.6  mrg     class uniform_inside_sphere_distribution
   3654   1.6  mrg     {
   3655   1.6  mrg       static_assert(std::is_floating_point<_RealType>::value,
   3656   1.6  mrg 		    "template argument not a floating point type");
   3657   1.6  mrg       static_assert(_Dimen != 0, "dimension is zero");
   3658   1.6  mrg 
   3659   1.6  mrg     public:
   3660   1.6  mrg       /** The type of the range of the distribution. */
   3661   1.6  mrg       using result_type = std::array<_RealType, _Dimen>;
   3662   1.6  mrg 
   3663   1.6  mrg       /** Parameter type. */
   3664   1.6  mrg       struct param_type
   3665   1.6  mrg       {
   3666   1.6  mrg 	using distribution_type
   3667   1.6  mrg 	  = uniform_inside_sphere_distribution<_Dimen, _RealType>;
   3668   1.6  mrg 	friend class uniform_inside_sphere_distribution<_Dimen, _RealType>;
   3669   1.6  mrg 
   3670   1.8  mrg 	param_type() : param_type(1.0) { }
   3671   1.8  mrg 
   3672   1.6  mrg 	explicit
   3673   1.8  mrg 	param_type(_RealType __radius)
   3674   1.6  mrg 	: _M_radius(__radius)
   3675   1.6  mrg 	{
   3676   1.6  mrg 	  __glibcxx_assert(_M_radius > _RealType(0));
   3677   1.6  mrg 	}
   3678   1.6  mrg 
   3679   1.6  mrg 	_RealType
   3680   1.6  mrg 	radius() const
   3681   1.6  mrg 	{ return _M_radius; }
   3682   1.6  mrg 
   3683   1.6  mrg 	friend bool
   3684   1.6  mrg 	operator==(const param_type& __p1, const param_type& __p2)
   3685   1.6  mrg 	{ return __p1._M_radius == __p2._M_radius; }
   3686   1.6  mrg 
   3687   1.6  mrg 	friend bool
   3688   1.6  mrg 	operator!=(const param_type& __p1, const param_type& __p2)
   3689   1.6  mrg 	{ return !(__p1 == __p2); }
   3690   1.6  mrg 
   3691   1.6  mrg       private:
   3692   1.6  mrg 	_RealType _M_radius;
   3693   1.6  mrg       };
   3694   1.6  mrg 
   3695   1.6  mrg       /**
   3696   1.6  mrg        * @brief Constructors.
   3697   1.8  mrg        * @{
   3698   1.6  mrg        */
   3699   1.8  mrg 
   3700   1.8  mrg       uniform_inside_sphere_distribution()
   3701   1.8  mrg       : uniform_inside_sphere_distribution(1.0)
   3702   1.8  mrg       { }
   3703   1.8  mrg 
   3704   1.6  mrg       explicit
   3705   1.8  mrg       uniform_inside_sphere_distribution(_RealType __radius)
   3706   1.6  mrg       : _M_param(__radius), _M_uosd()
   3707   1.6  mrg       { }
   3708   1.6  mrg 
   3709   1.6  mrg       explicit
   3710   1.6  mrg       uniform_inside_sphere_distribution(const param_type& __p)
   3711   1.6  mrg       : _M_param(__p), _M_uosd()
   3712   1.6  mrg       { }
   3713   1.6  mrg 
   3714   1.9  mrg       /// @}
   3715   1.8  mrg 
   3716   1.6  mrg       /**
   3717   1.6  mrg        * @brief Resets the distribution state.
   3718   1.6  mrg        */
   3719   1.6  mrg       void
   3720   1.6  mrg       reset()
   3721   1.6  mrg       { _M_uosd.reset(); }
   3722   1.6  mrg 
   3723   1.6  mrg       /**
   3724   1.6  mrg        * @brief Returns the @f$radius@f$ of the distribution.
   3725   1.6  mrg        */
   3726   1.6  mrg       _RealType
   3727   1.6  mrg       radius() const
   3728   1.6  mrg       { return _M_param.radius(); }
   3729   1.6  mrg 
   3730   1.6  mrg       /**
   3731   1.6  mrg        * @brief Returns the parameter set of the distribution.
   3732   1.6  mrg        */
   3733   1.6  mrg       param_type
   3734   1.6  mrg       param() const
   3735   1.6  mrg       { return _M_param; }
   3736   1.6  mrg 
   3737   1.6  mrg       /**
   3738   1.6  mrg        * @brief Sets the parameter set of the distribution.
   3739   1.6  mrg        * @param __param The new parameter set of the distribution.
   3740   1.6  mrg        */
   3741   1.6  mrg       void
   3742   1.6  mrg       param(const param_type& __param)
   3743   1.6  mrg       { _M_param = __param; }
   3744   1.6  mrg 
   3745   1.6  mrg       /**
   3746   1.6  mrg        * @brief Returns the greatest lower bound value of the distribution.
   3747   1.6  mrg        * This function makes no sense for this distribution.
   3748   1.6  mrg        */
   3749   1.6  mrg       result_type
   3750   1.6  mrg       min() const
   3751   1.6  mrg       {
   3752   1.6  mrg 	result_type __res;
   3753   1.6  mrg 	__res.fill(0);
   3754   1.6  mrg 	return __res;
   3755   1.6  mrg       }
   3756   1.6  mrg 
   3757   1.6  mrg       /**
   3758   1.6  mrg        * @brief Returns the least upper bound value of the distribution.
   3759   1.6  mrg        * This function makes no sense for this distribution.
   3760   1.6  mrg        */
   3761   1.6  mrg       result_type
   3762   1.6  mrg       max() const
   3763   1.6  mrg       {
   3764   1.6  mrg 	result_type __res;
   3765   1.6  mrg 	__res.fill(0);
   3766   1.6  mrg 	return __res;
   3767   1.6  mrg       }
   3768   1.6  mrg 
   3769   1.6  mrg       /**
   3770   1.6  mrg        * @brief Generating functions.
   3771   1.6  mrg        */
   3772   1.6  mrg       template<typename _UniformRandomNumberGenerator>
   3773   1.6  mrg 	result_type
   3774   1.6  mrg 	operator()(_UniformRandomNumberGenerator& __urng)
   3775   1.6  mrg 	{ return this->operator()(__urng, _M_param); }
   3776   1.6  mrg 
   3777   1.6  mrg       template<typename _UniformRandomNumberGenerator>
   3778   1.6  mrg 	result_type
   3779   1.6  mrg 	operator()(_UniformRandomNumberGenerator& __urng,
   3780   1.6  mrg 		   const param_type& __p);
   3781   1.6  mrg 
   3782   1.6  mrg       template<typename _ForwardIterator,
   3783   1.6  mrg 	       typename _UniformRandomNumberGenerator>
   3784   1.6  mrg 	void
   3785   1.6  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   3786   1.6  mrg 		   _UniformRandomNumberGenerator& __urng)
   3787   1.6  mrg 	{ this->__generate(__f, __t, __urng, this->param()); }
   3788   1.6  mrg 
   3789   1.6  mrg       template<typename _ForwardIterator,
   3790   1.6  mrg 	       typename _UniformRandomNumberGenerator>
   3791   1.6  mrg 	void
   3792   1.6  mrg 	__generate(_ForwardIterator __f, _ForwardIterator __t,
   3793   1.6  mrg 		   _UniformRandomNumberGenerator& __urng,
   3794   1.6  mrg 		   const param_type& __p)
   3795   1.6  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   3796   1.6  mrg 
   3797   1.6  mrg       template<typename _UniformRandomNumberGenerator>
   3798   1.6  mrg 	void
   3799   1.6  mrg 	__generate(result_type* __f, result_type* __t,
   3800   1.6  mrg 		   _UniformRandomNumberGenerator& __urng,
   3801   1.6  mrg 		   const param_type& __p)
   3802   1.6  mrg 	{ this->__generate_impl(__f, __t, __urng, __p); }
   3803   1.6  mrg 
   3804   1.6  mrg       /**
   3805   1.6  mrg        * @brief Return true if two uniform on sphere distributions have
   3806   1.6  mrg        *        the same parameters and the sequences that would be
   3807   1.6  mrg        *        generated are equal.
   3808   1.6  mrg        */
   3809   1.6  mrg       friend bool
   3810   1.6  mrg       operator==(const uniform_inside_sphere_distribution& __d1,
   3811   1.6  mrg 		 const uniform_inside_sphere_distribution& __d2)
   3812   1.6  mrg       { return __d1._M_param == __d2._M_param && __d1._M_uosd == __d2._M_uosd; }
   3813   1.6  mrg 
   3814   1.6  mrg       /**
   3815   1.6  mrg        * @brief Inserts a %uniform_inside_sphere_distribution random number
   3816   1.6  mrg        *        distribution @p __x into the output stream @p __os.
   3817   1.6  mrg        *
   3818   1.6  mrg        * @param __os An output stream.
   3819   1.6  mrg        * @param __x  A %uniform_inside_sphere_distribution random number
   3820   1.6  mrg        *             distribution.
   3821   1.6  mrg        *
   3822   1.6  mrg        * @returns The output stream with the state of @p __x inserted or in
   3823   1.6  mrg        * an error state.
   3824   1.6  mrg        */
   3825   1.6  mrg       template<size_t _Dimen1, typename _RealType1, typename _CharT,
   3826   1.6  mrg 	       typename _Traits>
   3827   1.6  mrg 	friend std::basic_ostream<_CharT, _Traits>&
   3828   1.6  mrg 	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   3829   1.6  mrg 		   const __gnu_cxx::uniform_inside_sphere_distribution<_Dimen1,
   3830   1.6  mrg 								   _RealType1>&
   3831   1.6  mrg 		   );
   3832   1.6  mrg 
   3833   1.6  mrg       /**
   3834   1.6  mrg        * @brief Extracts a %uniform_inside_sphere_distribution random number
   3835   1.6  mrg        *        distribution
   3836   1.6  mrg        * @p __x from the input stream @p __is.
   3837   1.6  mrg        *
   3838   1.6  mrg        * @param __is An input stream.
   3839   1.6  mrg        * @param __x  A %uniform_inside_sphere_distribution random number
   3840   1.6  mrg        *             generator engine.
   3841   1.6  mrg        *
   3842   1.6  mrg        * @returns The input stream with @p __x extracted or in an error state.
   3843   1.6  mrg        */
   3844   1.6  mrg       template<std::size_t _Dimen1, typename _RealType1, typename _CharT,
   3845   1.6  mrg 	       typename _Traits>
   3846   1.6  mrg 	friend std::basic_istream<_CharT, _Traits>&
   3847   1.6  mrg 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
   3848   1.6  mrg 		   __gnu_cxx::uniform_inside_sphere_distribution<_Dimen1,
   3849   1.6  mrg 								 _RealType1>&);
   3850   1.6  mrg 
   3851   1.6  mrg     private:
   3852   1.6  mrg       template<typename _ForwardIterator,
   3853   1.6  mrg 	       typename _UniformRandomNumberGenerator>
   3854   1.6  mrg 	void
   3855   1.6  mrg 	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   3856   1.6  mrg 			_UniformRandomNumberGenerator& __urng,
   3857   1.6  mrg 			const param_type& __p);
   3858   1.6  mrg 
   3859   1.6  mrg       param_type _M_param;
   3860   1.6  mrg       uniform_on_sphere_distribution<_Dimen, _RealType> _M_uosd;
   3861   1.6  mrg     };
   3862   1.6  mrg 
   3863   1.6  mrg   /**
   3864   1.6  mrg    * @brief Return true if two uniform on sphere distributions are different.
   3865   1.6  mrg    */
   3866   1.6  mrg   template<std::size_t _Dimen, typename _RealType>
   3867   1.6  mrg     inline bool
   3868   1.6  mrg     operator!=(const __gnu_cxx::uniform_inside_sphere_distribution<_Dimen,
   3869   1.6  mrg 	       _RealType>& __d1,
   3870   1.6  mrg 	       const __gnu_cxx::uniform_inside_sphere_distribution<_Dimen,
   3871   1.6  mrg 	       _RealType>& __d2)
   3872   1.6  mrg     { return !(__d1 == __d2); }
   3873   1.6  mrg 
   3874   1.1  mrg _GLIBCXX_END_NAMESPACE_VERSION
   3875   1.1  mrg } // namespace __gnu_cxx
   3876   1.1  mrg 
   3877   1.7  mrg #include <ext/opt_random.h>
   3878   1.7  mrg #include <ext/random.tcc>
   3879   1.1  mrg 
   3880   1.4  mrg #endif // _GLIBCXX_USE_C99_STDINT_TR1 && UINT32_C
   3881   1.1  mrg 
   3882   1.1  mrg #endif // C++11
   3883   1.1  mrg 
   3884   1.1  mrg #endif // _EXT_RANDOM
   3885