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.tcc
     26   1.1  mrg  *  This is an internal header file, included by other library headers.
     27   1.1  mrg  *  Do not attempt to use it directly. @headername{ext/random}
     28   1.1  mrg  */
     29   1.1  mrg 
     30   1.1  mrg #ifndef _EXT_RANDOM_TCC
     31   1.1  mrg #define _EXT_RANDOM_TCC 1
     32   1.1  mrg 
     33   1.1  mrg #pragma GCC system_header
     34   1.1  mrg 
     35   1.1  mrg namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
     36   1.1  mrg {
     37   1.1  mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
     38   1.1  mrg 
     39   1.1  mrg #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
     40   1.1  mrg 
     41   1.1  mrg   template<typename _UIntType, size_t __m,
     42   1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
     43   1.1  mrg 	   size_t __sr1, size_t __sr2,
     44   1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
     45   1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
     46   1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
     47   1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
     48   1.1  mrg     void simd_fast_mersenne_twister_engine<_UIntType, __m,
     49   1.1  mrg 					   __pos1, __sl1, __sl2, __sr1, __sr2,
     50   1.1  mrg 					   __msk1, __msk2, __msk3, __msk4,
     51   1.1  mrg 					   __parity1, __parity2, __parity3,
     52   1.1  mrg 					   __parity4>::
     53   1.1  mrg     seed(_UIntType __seed)
     54   1.1  mrg     {
     55   1.1  mrg       _M_state32[0] = static_cast<uint32_t>(__seed);
     56   1.1  mrg       for (size_t __i = 1; __i < _M_nstate32; ++__i)
     57   1.1  mrg 	_M_state32[__i] = (1812433253UL
     58   1.1  mrg 			   * (_M_state32[__i - 1] ^ (_M_state32[__i - 1] >> 30))
     59   1.1  mrg 			   + __i);
     60   1.1  mrg       _M_pos = state_size;
     61   1.1  mrg       _M_period_certification();
     62   1.1  mrg     }
     63   1.1  mrg 
     64   1.1  mrg 
     65   1.1  mrg   namespace {
     66   1.1  mrg 
     67   1.1  mrg     inline uint32_t _Func1(uint32_t __x)
     68   1.1  mrg     {
     69   1.1  mrg       return (__x ^ (__x >> 27)) * UINT32_C(1664525);
     70   1.1  mrg     }
     71   1.1  mrg 
     72   1.1  mrg     inline uint32_t _Func2(uint32_t __x)
     73   1.1  mrg     {
     74   1.1  mrg       return (__x ^ (__x >> 27)) * UINT32_C(1566083941);
     75   1.1  mrg     }
     76   1.1  mrg 
     77   1.1  mrg   }
     78   1.1  mrg 
     79   1.1  mrg 
     80   1.1  mrg   template<typename _UIntType, size_t __m,
     81   1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
     82   1.1  mrg 	   size_t __sr1, size_t __sr2,
     83   1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
     84   1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
     85   1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
     86   1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
     87   1.1  mrg     template<typename _Sseq>
     88   1.8  mrg       auto
     89   1.1  mrg       simd_fast_mersenne_twister_engine<_UIntType, __m,
     90   1.1  mrg 					__pos1, __sl1, __sl2, __sr1, __sr2,
     91   1.1  mrg 					__msk1, __msk2, __msk3, __msk4,
     92   1.1  mrg 					__parity1, __parity2, __parity3,
     93   1.1  mrg 					__parity4>::
     94   1.1  mrg       seed(_Sseq& __q)
     95   1.8  mrg       -> _If_seed_seq<_Sseq>
     96   1.1  mrg       {
     97   1.1  mrg 	size_t __lag;
     98   1.1  mrg 
     99   1.1  mrg 	if (_M_nstate32 >= 623)
    100   1.1  mrg 	  __lag = 11;
    101   1.1  mrg 	else if (_M_nstate32 >= 68)
    102   1.1  mrg 	  __lag = 7;
    103   1.1  mrg 	else if (_M_nstate32 >= 39)
    104   1.1  mrg 	  __lag = 5;
    105   1.1  mrg 	else
    106   1.1  mrg 	  __lag = 3;
    107   1.1  mrg 	const size_t __mid = (_M_nstate32 - __lag) / 2;
    108   1.1  mrg 
    109   1.1  mrg 	std::fill(_M_state32, _M_state32 + _M_nstate32, UINT32_C(0x8b8b8b8b));
    110   1.1  mrg 	uint32_t __arr[_M_nstate32];
    111   1.1  mrg 	__q.generate(__arr + 0, __arr + _M_nstate32);
    112   1.1  mrg 
    113   1.1  mrg 	uint32_t __r = _Func1(_M_state32[0] ^ _M_state32[__mid]
    114   1.1  mrg 			      ^ _M_state32[_M_nstate32  - 1]);
    115   1.1  mrg 	_M_state32[__mid] += __r;
    116   1.1  mrg 	__r += _M_nstate32;
    117   1.1  mrg 	_M_state32[__mid + __lag] += __r;
    118   1.1  mrg 	_M_state32[0] = __r;
    119   1.1  mrg 
    120   1.1  mrg 	for (size_t __i = 1, __j = 0; __j < _M_nstate32; ++__j)
    121   1.1  mrg 	  {
    122   1.1  mrg 	    __r = _Func1(_M_state32[__i]
    123   1.1  mrg 			 ^ _M_state32[(__i + __mid) % _M_nstate32]
    124   1.1  mrg 			 ^ _M_state32[(__i + _M_nstate32 - 1) % _M_nstate32]);
    125   1.1  mrg 	    _M_state32[(__i + __mid) % _M_nstate32] += __r;
    126   1.1  mrg 	    __r += __arr[__j] + __i;
    127   1.1  mrg 	    _M_state32[(__i + __mid + __lag) % _M_nstate32] += __r;
    128   1.1  mrg 	    _M_state32[__i] = __r;
    129   1.1  mrg 	    __i = (__i + 1) % _M_nstate32;
    130   1.1  mrg 	  }
    131   1.1  mrg 	for (size_t __j = 0; __j < _M_nstate32; ++__j)
    132   1.1  mrg 	  {
    133   1.1  mrg 	    const size_t __i = (__j + 1) % _M_nstate32;
    134   1.1  mrg 	    __r = _Func2(_M_state32[__i]
    135   1.1  mrg 			 + _M_state32[(__i + __mid) % _M_nstate32]
    136   1.1  mrg 			 + _M_state32[(__i + _M_nstate32 - 1) % _M_nstate32]);
    137   1.1  mrg 	    _M_state32[(__i + __mid) % _M_nstate32] ^= __r;
    138   1.1  mrg 	    __r -= __i;
    139   1.1  mrg 	    _M_state32[(__i + __mid + __lag) % _M_nstate32] ^= __r;
    140   1.1  mrg 	    _M_state32[__i] = __r;
    141   1.1  mrg 	  }
    142   1.1  mrg 
    143   1.1  mrg 	_M_pos = state_size;
    144   1.1  mrg 	_M_period_certification();
    145   1.1  mrg       }
    146   1.1  mrg 
    147   1.1  mrg 
    148   1.1  mrg   template<typename _UIntType, size_t __m,
    149   1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    150   1.1  mrg 	   size_t __sr1, size_t __sr2,
    151   1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    152   1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    153   1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    154   1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
    155   1.1  mrg     void simd_fast_mersenne_twister_engine<_UIntType, __m,
    156   1.1  mrg 					   __pos1, __sl1, __sl2, __sr1, __sr2,
    157   1.1  mrg 					   __msk1, __msk2, __msk3, __msk4,
    158   1.1  mrg 					   __parity1, __parity2, __parity3,
    159   1.1  mrg 					   __parity4>::
    160   1.1  mrg     _M_period_certification(void)
    161   1.1  mrg     {
    162   1.1  mrg       static const uint32_t __parity[4] = { __parity1, __parity2,
    163   1.1  mrg 					    __parity3, __parity4 };
    164   1.1  mrg       uint32_t __inner = 0;
    165   1.1  mrg       for (size_t __i = 0; __i < 4; ++__i)
    166   1.1  mrg 	if (__parity[__i] != 0)
    167   1.1  mrg 	  __inner ^= _M_state32[__i] & __parity[__i];
    168   1.1  mrg 
    169   1.1  mrg       if (__builtin_parity(__inner) & 1)
    170   1.1  mrg 	return;
    171   1.1  mrg       for (size_t __i = 0; __i < 4; ++__i)
    172   1.1  mrg 	if (__parity[__i] != 0)
    173   1.1  mrg 	  {
    174   1.1  mrg 	    _M_state32[__i] ^= 1 << (__builtin_ffs(__parity[__i]) - 1);
    175   1.1  mrg 	    return;
    176   1.1  mrg 	  }
    177   1.1  mrg       __builtin_unreachable();
    178   1.1  mrg     }
    179   1.1  mrg 
    180   1.1  mrg 
    181   1.1  mrg   template<typename _UIntType, size_t __m,
    182   1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    183   1.1  mrg 	   size_t __sr1, size_t __sr2,
    184   1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    185   1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    186   1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    187   1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
    188   1.1  mrg     void simd_fast_mersenne_twister_engine<_UIntType, __m,
    189   1.1  mrg 					   __pos1, __sl1, __sl2, __sr1, __sr2,
    190   1.1  mrg 					   __msk1, __msk2, __msk3, __msk4,
    191   1.1  mrg 					   __parity1, __parity2, __parity3,
    192   1.1  mrg 					   __parity4>::
    193   1.1  mrg     discard(unsigned long long __z)
    194   1.1  mrg     {
    195   1.1  mrg       while (__z > state_size - _M_pos)
    196   1.1  mrg 	{
    197   1.1  mrg 	  __z -= state_size - _M_pos;
    198   1.1  mrg 
    199   1.1  mrg 	  _M_gen_rand();
    200   1.1  mrg 	}
    201   1.1  mrg 
    202   1.1  mrg       _M_pos += __z;
    203   1.1  mrg     }
    204   1.1  mrg 
    205   1.1  mrg 
    206   1.1  mrg #ifndef  _GLIBCXX_OPT_HAVE_RANDOM_SFMT_GEN_READ
    207   1.1  mrg 
    208   1.1  mrg   namespace {
    209   1.1  mrg 
    210   1.1  mrg     template<size_t __shift>
    211   1.1  mrg       inline void __rshift(uint32_t *__out, const uint32_t *__in)
    212   1.1  mrg       {
    213   1.1  mrg 	uint64_t __th = ((static_cast<uint64_t>(__in[3]) << 32)
    214   1.1  mrg 			 | static_cast<uint64_t>(__in[2]));
    215   1.1  mrg 	uint64_t __tl = ((static_cast<uint64_t>(__in[1]) << 32)
    216   1.1  mrg 			 | static_cast<uint64_t>(__in[0]));
    217   1.1  mrg 
    218   1.1  mrg 	uint64_t __oh = __th >> (__shift * 8);
    219   1.1  mrg 	uint64_t __ol = __tl >> (__shift * 8);
    220   1.1  mrg 	__ol |= __th << (64 - __shift * 8);
    221   1.1  mrg 	__out[1] = static_cast<uint32_t>(__ol >> 32);
    222   1.1  mrg 	__out[0] = static_cast<uint32_t>(__ol);
    223   1.1  mrg 	__out[3] = static_cast<uint32_t>(__oh >> 32);
    224   1.1  mrg 	__out[2] = static_cast<uint32_t>(__oh);
    225   1.1  mrg       }
    226   1.1  mrg 
    227   1.1  mrg 
    228   1.1  mrg     template<size_t __shift>
    229   1.1  mrg       inline void __lshift(uint32_t *__out, const uint32_t *__in)
    230   1.1  mrg       {
    231   1.1  mrg 	uint64_t __th = ((static_cast<uint64_t>(__in[3]) << 32)
    232   1.1  mrg 			 | static_cast<uint64_t>(__in[2]));
    233   1.1  mrg 	uint64_t __tl = ((static_cast<uint64_t>(__in[1]) << 32)
    234   1.1  mrg 			 | static_cast<uint64_t>(__in[0]));
    235   1.1  mrg 
    236   1.1  mrg 	uint64_t __oh = __th << (__shift * 8);
    237   1.1  mrg 	uint64_t __ol = __tl << (__shift * 8);
    238   1.1  mrg 	__oh |= __tl >> (64 - __shift * 8);
    239   1.1  mrg 	__out[1] = static_cast<uint32_t>(__ol >> 32);
    240   1.1  mrg 	__out[0] = static_cast<uint32_t>(__ol);
    241   1.1  mrg 	__out[3] = static_cast<uint32_t>(__oh >> 32);
    242   1.1  mrg 	__out[2] = static_cast<uint32_t>(__oh);
    243   1.1  mrg       }
    244   1.1  mrg 
    245   1.1  mrg 
    246   1.1  mrg     template<size_t __sl1, size_t __sl2, size_t __sr1, size_t __sr2,
    247   1.1  mrg 	     uint32_t __msk1, uint32_t __msk2, uint32_t __msk3, uint32_t __msk4>
    248   1.1  mrg       inline void __recursion(uint32_t *__r,
    249   1.1  mrg 			      const uint32_t *__a, const uint32_t *__b,
    250   1.1  mrg 			      const uint32_t *__c, const uint32_t *__d)
    251   1.1  mrg       {
    252   1.1  mrg 	uint32_t __x[4];
    253   1.1  mrg 	uint32_t __y[4];
    254   1.1  mrg 
    255   1.1  mrg 	__lshift<__sl2>(__x, __a);
    256   1.1  mrg 	__rshift<__sr2>(__y, __c);
    257   1.1  mrg 	__r[0] = (__a[0] ^ __x[0] ^ ((__b[0] >> __sr1) & __msk1)
    258   1.1  mrg 		  ^ __y[0] ^ (__d[0] << __sl1));
    259   1.1  mrg 	__r[1] = (__a[1] ^ __x[1] ^ ((__b[1] >> __sr1) & __msk2)
    260   1.1  mrg 		  ^ __y[1] ^ (__d[1] << __sl1));
    261   1.1  mrg 	__r[2] = (__a[2] ^ __x[2] ^ ((__b[2] >> __sr1) & __msk3)
    262   1.1  mrg 		  ^ __y[2] ^ (__d[2] << __sl1));
    263   1.1  mrg 	__r[3] = (__a[3] ^ __x[3] ^ ((__b[3] >> __sr1) & __msk4)
    264   1.1  mrg 		  ^ __y[3] ^ (__d[3] << __sl1));
    265   1.1  mrg       }
    266   1.1  mrg 
    267   1.1  mrg   }
    268   1.1  mrg 
    269   1.1  mrg 
    270   1.1  mrg   template<typename _UIntType, size_t __m,
    271   1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    272   1.1  mrg 	   size_t __sr1, size_t __sr2,
    273   1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    274   1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    275   1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    276   1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
    277   1.1  mrg     void simd_fast_mersenne_twister_engine<_UIntType, __m,
    278   1.1  mrg 					   __pos1, __sl1, __sl2, __sr1, __sr2,
    279   1.1  mrg 					   __msk1, __msk2, __msk3, __msk4,
    280   1.1  mrg 					   __parity1, __parity2, __parity3,
    281   1.1  mrg 					   __parity4>::
    282   1.1  mrg     _M_gen_rand(void)
    283   1.1  mrg     {
    284   1.1  mrg       const uint32_t *__r1 = &_M_state32[_M_nstate32 - 8];
    285   1.1  mrg       const uint32_t *__r2 = &_M_state32[_M_nstate32 - 4];
    286   1.1  mrg       static constexpr size_t __pos1_32 = __pos1 * 4;
    287   1.1  mrg 
    288   1.1  mrg       size_t __i;
    289   1.1  mrg       for (__i = 0; __i < _M_nstate32 - __pos1_32; __i += 4)
    290   1.1  mrg 	{
    291   1.1  mrg 	  __recursion<__sl1, __sl2, __sr1, __sr2,
    292   1.1  mrg 		      __msk1, __msk2, __msk3, __msk4>
    293   1.1  mrg 	    (&_M_state32[__i], &_M_state32[__i],
    294   1.1  mrg 	     &_M_state32[__i + __pos1_32], __r1, __r2);
    295   1.1  mrg 	  __r1 = __r2;
    296   1.1  mrg 	  __r2 = &_M_state32[__i];
    297   1.1  mrg 	}
    298   1.1  mrg 
    299   1.1  mrg       for (; __i < _M_nstate32; __i += 4)
    300   1.1  mrg 	{
    301   1.1  mrg 	  __recursion<__sl1, __sl2, __sr1, __sr2,
    302   1.1  mrg 		      __msk1, __msk2, __msk3, __msk4>
    303   1.1  mrg 	    (&_M_state32[__i], &_M_state32[__i],
    304   1.1  mrg 	     &_M_state32[__i + __pos1_32 - _M_nstate32], __r1, __r2);
    305   1.1  mrg 	  __r1 = __r2;
    306   1.1  mrg 	  __r2 = &_M_state32[__i];
    307   1.1  mrg 	}
    308   1.1  mrg 
    309   1.1  mrg       _M_pos = 0;
    310   1.1  mrg     }
    311   1.1  mrg 
    312   1.1  mrg #endif
    313   1.1  mrg 
    314   1.1  mrg #ifndef _GLIBCXX_OPT_HAVE_RANDOM_SFMT_OPERATOREQUAL
    315   1.1  mrg   template<typename _UIntType, size_t __m,
    316   1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    317   1.1  mrg 	   size_t __sr1, size_t __sr2,
    318   1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    319   1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    320   1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    321   1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
    322   1.1  mrg     bool
    323   1.1  mrg     operator==(const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    324   1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
    325   1.1  mrg 	       __msk1, __msk2, __msk3, __msk4,
    326   1.1  mrg 	       __parity1, __parity2, __parity3, __parity4>& __lhs,
    327   1.1  mrg 	       const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    328   1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
    329   1.1  mrg 	       __msk1, __msk2, __msk3, __msk4,
    330   1.1  mrg 	       __parity1, __parity2, __parity3, __parity4>& __rhs)
    331   1.1  mrg     {
    332   1.1  mrg       typedef __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    333   1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
    334   1.1  mrg 	       __msk1, __msk2, __msk3, __msk4,
    335   1.1  mrg 	       __parity1, __parity2, __parity3, __parity4> __engine;
    336   1.1  mrg       return (std::equal(__lhs._M_stateT,
    337   1.1  mrg 			 __lhs._M_stateT + __engine::state_size,
    338   1.1  mrg 			 __rhs._M_stateT)
    339   1.1  mrg 	      && __lhs._M_pos == __rhs._M_pos);
    340   1.1  mrg     }
    341   1.1  mrg #endif
    342   1.1  mrg 
    343   1.1  mrg   template<typename _UIntType, size_t __m,
    344   1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    345   1.1  mrg 	   size_t __sr1, size_t __sr2,
    346   1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    347   1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    348   1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    349   1.1  mrg 	   uint32_t __parity3, uint32_t __parity4,
    350   1.1  mrg 	   typename _CharT, typename _Traits>
    351   1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    352   1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    353   1.1  mrg 	       const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    354   1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
    355   1.1  mrg 	       __msk1, __msk2, __msk3, __msk4,
    356   1.1  mrg 	       __parity1, __parity2, __parity3, __parity4>& __x)
    357   1.1  mrg     {
    358   1.1  mrg       typedef std::basic_ostream<_CharT, _Traits> __ostream_type;
    359   1.1  mrg       typedef typename __ostream_type::ios_base __ios_base;
    360   1.1  mrg 
    361   1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    362   1.1  mrg       const _CharT __fill = __os.fill();
    363   1.1  mrg       const _CharT __space = __os.widen(' ');
    364   1.1  mrg       __os.flags(__ios_base::dec | __ios_base::fixed | __ios_base::left);
    365   1.1  mrg       __os.fill(__space);
    366   1.1  mrg 
    367   1.1  mrg       for (size_t __i = 0; __i < __x._M_nstate32; ++__i)
    368   1.1  mrg 	__os << __x._M_state32[__i] << __space;
    369   1.1  mrg       __os << __x._M_pos;
    370   1.1  mrg 
    371   1.1  mrg       __os.flags(__flags);
    372   1.1  mrg       __os.fill(__fill);
    373   1.1  mrg       return __os;
    374   1.1  mrg     }
    375   1.1  mrg 
    376   1.1  mrg 
    377   1.1  mrg   template<typename _UIntType, size_t __m,
    378   1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    379   1.1  mrg 	   size_t __sr1, size_t __sr2,
    380   1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    381   1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    382   1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    383   1.1  mrg 	   uint32_t __parity3, uint32_t __parity4,
    384   1.1  mrg 	   typename _CharT, typename _Traits>
    385   1.1  mrg     std::basic_istream<_CharT, _Traits>&
    386   1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    387   1.1  mrg 	       __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    388   1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
    389   1.1  mrg 	       __msk1, __msk2, __msk3, __msk4,
    390   1.1  mrg 	       __parity1, __parity2, __parity3, __parity4>& __x)
    391   1.1  mrg     {
    392   1.1  mrg       typedef std::basic_istream<_CharT, _Traits> __istream_type;
    393   1.1  mrg       typedef typename __istream_type::ios_base __ios_base;
    394   1.1  mrg 
    395   1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    396   1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    397   1.1  mrg 
    398   1.1  mrg       for (size_t __i = 0; __i < __x._M_nstate32; ++__i)
    399   1.1  mrg 	__is >> __x._M_state32[__i];
    400   1.1  mrg       __is >> __x._M_pos;
    401   1.1  mrg 
    402   1.1  mrg       __is.flags(__flags);
    403   1.1  mrg       return __is;
    404   1.1  mrg     }
    405   1.1  mrg 
    406   1.1  mrg #endif // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
    407   1.1  mrg 
    408   1.1  mrg   /**
    409   1.1  mrg    * Iteration method due to M.D. J<o:>hnk.
    410   1.1  mrg    *
    411   1.1  mrg    * M.D. J<o:>hnk, Erzeugung von betaverteilten und gammaverteilten
    412   1.1  mrg    * Zufallszahlen, Metrika, Volume 8, 1964
    413   1.1  mrg    */
    414   1.1  mrg   template<typename _RealType>
    415   1.1  mrg     template<typename _UniformRandomNumberGenerator>
    416   1.1  mrg       typename beta_distribution<_RealType>::result_type
    417   1.1  mrg       beta_distribution<_RealType>::
    418   1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng,
    419   1.1  mrg 		 const param_type& __param)
    420   1.1  mrg       {
    421   1.1  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
    422   1.1  mrg 	  __aurng(__urng);
    423   1.1  mrg 
    424   1.1  mrg 	result_type __x, __y;
    425   1.1  mrg 	do
    426   1.1  mrg 	  {
    427   1.1  mrg 	    __x = std::exp(std::log(__aurng()) / __param.alpha());
    428   1.1  mrg 	    __y = std::exp(std::log(__aurng()) / __param.beta());
    429   1.1  mrg 	  }
    430   1.1  mrg 	while (__x + __y > result_type(1));
    431   1.1  mrg 
    432   1.1  mrg 	return __x / (__x + __y);
    433   1.1  mrg       }
    434   1.1  mrg 
    435   1.1  mrg   template<typename _RealType>
    436   1.1  mrg     template<typename _OutputIterator,
    437   1.1  mrg 	     typename _UniformRandomNumberGenerator>
    438   1.1  mrg       void
    439   1.1  mrg       beta_distribution<_RealType>::
    440   1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
    441   1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    442   1.1  mrg 		      const param_type& __param)
    443   1.1  mrg       {
    444   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    445   1.6  mrg 	    result_type>)
    446   1.1  mrg 
    447   1.1  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
    448   1.1  mrg 	  __aurng(__urng);
    449   1.1  mrg 
    450   1.1  mrg 	while (__f != __t)
    451   1.1  mrg 	  {
    452   1.1  mrg 	    result_type __x, __y;
    453   1.1  mrg 	    do
    454   1.1  mrg 	      {
    455   1.1  mrg 		__x = std::exp(std::log(__aurng()) / __param.alpha());
    456   1.1  mrg 		__y = std::exp(std::log(__aurng()) / __param.beta());
    457   1.1  mrg 	      }
    458   1.1  mrg 	    while (__x + __y > result_type(1));
    459   1.1  mrg 
    460   1.1  mrg 	    *__f++ = __x / (__x + __y);
    461   1.1  mrg 	  }
    462   1.1  mrg       }
    463   1.1  mrg 
    464   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    465   1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    466   1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    467   1.1  mrg 	       const __gnu_cxx::beta_distribution<_RealType>& __x)
    468   1.1  mrg     {
    469   1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    470   1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    471   1.1  mrg 
    472   1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    473   1.1  mrg       const _CharT __fill = __os.fill();
    474   1.1  mrg       const std::streamsize __precision = __os.precision();
    475   1.1  mrg       const _CharT __space = __os.widen(' ');
    476   1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    477   1.1  mrg       __os.fill(__space);
    478   1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    479   1.1  mrg 
    480   1.1  mrg       __os << __x.alpha() << __space << __x.beta();
    481   1.1  mrg 
    482   1.1  mrg       __os.flags(__flags);
    483   1.1  mrg       __os.fill(__fill);
    484   1.1  mrg       __os.precision(__precision);
    485   1.1  mrg       return __os;
    486   1.1  mrg     }
    487   1.1  mrg 
    488   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    489   1.1  mrg     std::basic_istream<_CharT, _Traits>&
    490   1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    491   1.1  mrg 	       __gnu_cxx::beta_distribution<_RealType>& __x)
    492   1.1  mrg     {
    493   1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
    494   1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
    495   1.1  mrg 
    496   1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    497   1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    498   1.1  mrg 
    499   1.1  mrg       _RealType __alpha_val, __beta_val;
    500   1.1  mrg       __is >> __alpha_val >> __beta_val;
    501   1.1  mrg       __x.param(typename __gnu_cxx::beta_distribution<_RealType>::
    502   1.1  mrg 		param_type(__alpha_val, __beta_val));
    503   1.1  mrg 
    504   1.1  mrg       __is.flags(__flags);
    505   1.1  mrg       return __is;
    506   1.1  mrg     }
    507   1.1  mrg 
    508   1.1  mrg 
    509   1.1  mrg   template<std::size_t _Dimen, typename _RealType>
    510   1.1  mrg     template<typename _InputIterator1, typename _InputIterator2>
    511   1.1  mrg       void
    512   1.1  mrg       normal_mv_distribution<_Dimen, _RealType>::param_type::
    513   1.1  mrg       _M_init_full(_InputIterator1 __meanbegin, _InputIterator1 __meanend,
    514   1.1  mrg 		   _InputIterator2 __varcovbegin, _InputIterator2 __varcovend)
    515   1.1  mrg       {
    516   1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    517   1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    518   1.1  mrg 	std::fill(std::copy(__meanbegin, __meanend, _M_mean.begin()),
    519   1.1  mrg 		  _M_mean.end(), _RealType(0));
    520   1.1  mrg 
    521   1.1  mrg 	// Perform the Cholesky decomposition
    522   1.1  mrg 	auto __w = _M_t.begin();
    523   1.1  mrg 	for (size_t __j = 0; __j < _Dimen; ++__j)
    524   1.1  mrg 	  {
    525   1.1  mrg 	    _RealType __sum = _RealType(0);
    526   1.1  mrg 
    527   1.1  mrg 	    auto __slitbegin = __w;
    528   1.1  mrg 	    auto __cit = _M_t.begin();
    529   1.1  mrg 	    for (size_t __i = 0; __i < __j; ++__i)
    530   1.1  mrg 	      {
    531   1.1  mrg 		auto __slit = __slitbegin;
    532   1.1  mrg 		_RealType __s = *__varcovbegin++;
    533   1.1  mrg 		for (size_t __k = 0; __k < __i; ++__k)
    534   1.1  mrg 		  __s -= *__slit++ * *__cit++;
    535   1.1  mrg 
    536   1.1  mrg 		*__w++ = __s /= *__cit++;
    537   1.1  mrg 		__sum += __s * __s;
    538   1.1  mrg 	      }
    539   1.1  mrg 
    540   1.1  mrg 	    __sum = *__varcovbegin - __sum;
    541   1.1  mrg 	    if (__builtin_expect(__sum <= _RealType(0), 0))
    542   1.1  mrg 	      std::__throw_runtime_error(__N("normal_mv_distribution::"
    543   1.1  mrg 					     "param_type::_M_init_full"));
    544   1.1  mrg 	    *__w++ = std::sqrt(__sum);
    545   1.1  mrg 
    546   1.1  mrg 	    std::advance(__varcovbegin, _Dimen - __j);
    547   1.1  mrg 	  }
    548   1.1  mrg       }
    549   1.1  mrg 
    550   1.1  mrg   template<std::size_t _Dimen, typename _RealType>
    551   1.1  mrg     template<typename _InputIterator1, typename _InputIterator2>
    552   1.1  mrg       void
    553   1.1  mrg       normal_mv_distribution<_Dimen, _RealType>::param_type::
    554   1.1  mrg       _M_init_lower(_InputIterator1 __meanbegin, _InputIterator1 __meanend,
    555   1.1  mrg 		    _InputIterator2 __varcovbegin, _InputIterator2 __varcovend)
    556   1.1  mrg       {
    557   1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    558   1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    559   1.1  mrg 	std::fill(std::copy(__meanbegin, __meanend, _M_mean.begin()),
    560   1.1  mrg 		  _M_mean.end(), _RealType(0));
    561   1.1  mrg 
    562   1.1  mrg 	// Perform the Cholesky decomposition
    563   1.1  mrg 	auto __w = _M_t.begin();
    564   1.1  mrg 	for (size_t __j = 0; __j < _Dimen; ++__j)
    565   1.1  mrg 	  {
    566   1.1  mrg 	    _RealType __sum = _RealType(0);
    567   1.1  mrg 
    568   1.1  mrg 	    auto __slitbegin = __w;
    569   1.1  mrg 	    auto __cit = _M_t.begin();
    570   1.1  mrg 	    for (size_t __i = 0; __i < __j; ++__i)
    571   1.1  mrg 	      {
    572   1.1  mrg 		auto __slit = __slitbegin;
    573   1.1  mrg 		_RealType __s = *__varcovbegin++;
    574   1.1  mrg 		for (size_t __k = 0; __k < __i; ++__k)
    575   1.1  mrg 		  __s -= *__slit++ * *__cit++;
    576   1.1  mrg 
    577   1.1  mrg 		*__w++ = __s /= *__cit++;
    578   1.1  mrg 		__sum += __s * __s;
    579   1.1  mrg 	      }
    580   1.1  mrg 
    581   1.1  mrg 	    __sum = *__varcovbegin++ - __sum;
    582   1.1  mrg 	    if (__builtin_expect(__sum <= _RealType(0), 0))
    583   1.1  mrg 	      std::__throw_runtime_error(__N("normal_mv_distribution::"
    584   1.9  mrg 					     "param_type::_M_init_lower"));
    585   1.1  mrg 	    *__w++ = std::sqrt(__sum);
    586   1.1  mrg 	  }
    587   1.1  mrg       }
    588   1.1  mrg 
    589   1.1  mrg   template<std::size_t _Dimen, typename _RealType>
    590   1.1  mrg     template<typename _InputIterator1, typename _InputIterator2>
    591   1.1  mrg       void
    592   1.1  mrg       normal_mv_distribution<_Dimen, _RealType>::param_type::
    593   1.1  mrg       _M_init_diagonal(_InputIterator1 __meanbegin, _InputIterator1 __meanend,
    594   1.1  mrg 		       _InputIterator2 __varbegin, _InputIterator2 __varend)
    595   1.1  mrg       {
    596   1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    597   1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    598   1.1  mrg 	std::fill(std::copy(__meanbegin, __meanend, _M_mean.begin()),
    599   1.1  mrg 		  _M_mean.end(), _RealType(0));
    600   1.1  mrg 
    601   1.1  mrg 	auto __w = _M_t.begin();
    602   1.1  mrg 	size_t __step = 0;
    603   1.1  mrg 	while (__varbegin != __varend)
    604   1.1  mrg 	  {
    605   1.1  mrg 	    std::fill_n(__w, __step, _RealType(0));
    606   1.1  mrg 	    __w += __step++;
    607   1.1  mrg 	    if (__builtin_expect(*__varbegin < _RealType(0), 0))
    608   1.1  mrg 	      std::__throw_runtime_error(__N("normal_mv_distribution::"
    609   1.1  mrg 					     "param_type::_M_init_diagonal"));
    610   1.1  mrg 	    *__w++ = std::sqrt(*__varbegin++);
    611   1.1  mrg 	  }
    612   1.1  mrg       }
    613   1.1  mrg 
    614   1.1  mrg   template<std::size_t _Dimen, typename _RealType>
    615   1.1  mrg     template<typename _UniformRandomNumberGenerator>
    616   1.1  mrg       typename normal_mv_distribution<_Dimen, _RealType>::result_type
    617   1.1  mrg       normal_mv_distribution<_Dimen, _RealType>::
    618   1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng,
    619   1.1  mrg 		 const param_type& __param)
    620   1.1  mrg       {
    621   1.1  mrg 	result_type __ret;
    622   1.1  mrg 
    623   1.1  mrg 	_M_nd.__generate(__ret.begin(), __ret.end(), __urng);
    624   1.1  mrg 
    625   1.1  mrg 	auto __t_it = __param._M_t.crbegin();
    626   1.1  mrg 	for (size_t __i = _Dimen; __i > 0; --__i)
    627   1.1  mrg 	  {
    628   1.1  mrg 	    _RealType __sum = _RealType(0);
    629   1.1  mrg 	    for (size_t __j = __i; __j > 0; --__j)
    630   1.1  mrg 	      __sum += __ret[__j - 1] * *__t_it++;
    631   1.1  mrg 	    __ret[__i - 1] = __sum;
    632   1.1  mrg 	  }
    633   1.1  mrg 
    634   1.1  mrg 	return __ret;
    635   1.1  mrg       }
    636   1.1  mrg 
    637   1.1  mrg   template<std::size_t _Dimen, typename _RealType>
    638   1.1  mrg     template<typename _ForwardIterator, typename _UniformRandomNumberGenerator>
    639   1.1  mrg       void
    640   1.1  mrg       normal_mv_distribution<_Dimen, _RealType>::
    641   1.1  mrg       __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
    642   1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    643   1.1  mrg 		      const param_type& __param)
    644   1.1  mrg       {
    645   1.1  mrg 	__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
    646   1.1  mrg 				    _ForwardIterator>)
    647   1.1  mrg 	while (__f != __t)
    648   1.1  mrg 	  *__f++ = this->operator()(__urng, __param);
    649   1.1  mrg       }
    650   1.1  mrg 
    651   1.1  mrg   template<size_t _Dimen, typename _RealType>
    652   1.1  mrg     bool
    653   1.1  mrg     operator==(const __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>&
    654   1.1  mrg 	       __d1,
    655   1.1  mrg 	       const __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>&
    656   1.1  mrg 	       __d2)
    657   1.1  mrg     {
    658   1.1  mrg       return __d1._M_param == __d2._M_param && __d1._M_nd == __d2._M_nd;
    659   1.1  mrg     }
    660   1.1  mrg 
    661   1.1  mrg   template<size_t _Dimen, typename _RealType, typename _CharT, typename _Traits>
    662   1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    663   1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    664   1.1  mrg 	       const __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>& __x)
    665   1.1  mrg     {
    666   1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    667   1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    668   1.1  mrg 
    669   1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    670   1.1  mrg       const _CharT __fill = __os.fill();
    671   1.1  mrg       const std::streamsize __precision = __os.precision();
    672   1.1  mrg       const _CharT __space = __os.widen(' ');
    673   1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    674   1.1  mrg       __os.fill(__space);
    675   1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    676   1.1  mrg 
    677   1.1  mrg       auto __mean = __x._M_param.mean();
    678   1.1  mrg       for (auto __it : __mean)
    679   1.1  mrg 	__os << __it << __space;
    680   1.1  mrg       auto __t = __x._M_param.varcov();
    681   1.1  mrg       for (auto __it : __t)
    682   1.1  mrg 	__os << __it << __space;
    683   1.1  mrg 
    684   1.1  mrg       __os << __x._M_nd;
    685   1.1  mrg 
    686   1.1  mrg       __os.flags(__flags);
    687   1.1  mrg       __os.fill(__fill);
    688   1.1  mrg       __os.precision(__precision);
    689   1.1  mrg       return __os;
    690   1.1  mrg     }
    691   1.1  mrg 
    692   1.1  mrg   template<size_t _Dimen, typename _RealType, typename _CharT, typename _Traits>
    693   1.1  mrg     std::basic_istream<_CharT, _Traits>&
    694   1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    695   1.1  mrg 	       __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>& __x)
    696   1.1  mrg     {
    697   1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
    698   1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
    699   1.1  mrg 
    700   1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    701   1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    702   1.1  mrg 
    703   1.1  mrg       std::array<_RealType, _Dimen> __mean;
    704   1.1  mrg       for (auto& __it : __mean)
    705   1.1  mrg 	__is >> __it;
    706   1.1  mrg       std::array<_RealType, _Dimen * (_Dimen + 1) / 2> __varcov;
    707   1.1  mrg       for (auto& __it : __varcov)
    708   1.1  mrg 	__is >> __it;
    709   1.1  mrg 
    710   1.1  mrg       __is >> __x._M_nd;
    711   1.1  mrg 
    712   1.9  mrg       // The param_type temporary is built with a private constructor,
    713   1.9  mrg       // to skip the Cholesky decomposition that would be performed
    714   1.9  mrg       // otherwise.
    715   1.1  mrg       __x.param(typename normal_mv_distribution<_Dimen, _RealType>::
    716   1.9  mrg 		param_type(__mean, __varcov));
    717   1.1  mrg 
    718   1.1  mrg       __is.flags(__flags);
    719   1.1  mrg       return __is;
    720   1.1  mrg     }
    721   1.1  mrg 
    722   1.1  mrg 
    723   1.1  mrg   template<typename _RealType>
    724   1.1  mrg     template<typename _OutputIterator,
    725   1.1  mrg 	     typename _UniformRandomNumberGenerator>
    726   1.1  mrg       void
    727   1.1  mrg       rice_distribution<_RealType>::
    728   1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
    729   1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    730   1.1  mrg 		      const param_type& __p)
    731   1.1  mrg       {
    732   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    733   1.6  mrg 	    result_type>)
    734   1.1  mrg 
    735   1.1  mrg 	while (__f != __t)
    736   1.1  mrg 	  {
    737   1.1  mrg 	    typename std::normal_distribution<result_type>::param_type
    738   1.1  mrg 	      __px(__p.nu(), __p.sigma()), __py(result_type(0), __p.sigma());
    739   1.1  mrg 	    result_type __x = this->_M_ndx(__px, __urng);
    740   1.1  mrg 	    result_type __y = this->_M_ndy(__py, __urng);
    741   1.1  mrg #if _GLIBCXX_USE_C99_MATH_TR1
    742   1.1  mrg 	    *__f++ = std::hypot(__x, __y);
    743   1.1  mrg #else
    744   1.1  mrg 	    *__f++ = std::sqrt(__x * __x + __y * __y);
    745   1.1  mrg #endif
    746   1.1  mrg 	  }
    747   1.1  mrg       }
    748   1.1  mrg 
    749   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    750   1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    751   1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    752   1.1  mrg 	       const rice_distribution<_RealType>& __x)
    753   1.1  mrg     {
    754   1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    755   1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    756   1.1  mrg 
    757   1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    758   1.1  mrg       const _CharT __fill = __os.fill();
    759   1.1  mrg       const std::streamsize __precision = __os.precision();
    760   1.1  mrg       const _CharT __space = __os.widen(' ');
    761   1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    762   1.1  mrg       __os.fill(__space);
    763   1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    764   1.1  mrg 
    765   1.1  mrg       __os << __x.nu() << __space << __x.sigma();
    766   1.1  mrg       __os << __space << __x._M_ndx;
    767   1.1  mrg       __os << __space << __x._M_ndy;
    768   1.1  mrg 
    769   1.1  mrg       __os.flags(__flags);
    770   1.1  mrg       __os.fill(__fill);
    771   1.1  mrg       __os.precision(__precision);
    772   1.1  mrg       return __os;
    773   1.1  mrg     }
    774   1.1  mrg 
    775   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    776   1.1  mrg     std::basic_istream<_CharT, _Traits>&
    777   1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    778   1.1  mrg 	       rice_distribution<_RealType>& __x)
    779   1.1  mrg     {
    780   1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
    781   1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
    782   1.1  mrg 
    783   1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    784   1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    785   1.1  mrg 
    786   1.1  mrg       _RealType __nu_val, __sigma_val;
    787   1.1  mrg       __is >> __nu_val >> __sigma_val;
    788   1.1  mrg       __is >> __x._M_ndx;
    789   1.1  mrg       __is >> __x._M_ndy;
    790   1.1  mrg       __x.param(typename rice_distribution<_RealType>::
    791   1.1  mrg 		param_type(__nu_val, __sigma_val));
    792   1.1  mrg 
    793   1.1  mrg       __is.flags(__flags);
    794   1.1  mrg       return __is;
    795   1.1  mrg     }
    796   1.1  mrg 
    797   1.1  mrg 
    798   1.1  mrg   template<typename _RealType>
    799   1.1  mrg     template<typename _OutputIterator,
    800   1.1  mrg 	     typename _UniformRandomNumberGenerator>
    801   1.1  mrg       void
    802   1.1  mrg       nakagami_distribution<_RealType>::
    803   1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
    804   1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    805   1.1  mrg 		      const param_type& __p)
    806   1.1  mrg       {
    807   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    808   1.6  mrg 	    result_type>)
    809   1.1  mrg 
    810   1.1  mrg 	typename std::gamma_distribution<result_type>::param_type
    811   1.1  mrg 	  __pg(__p.mu(), __p.omega() / __p.mu());
    812   1.1  mrg 	while (__f != __t)
    813   1.1  mrg 	  *__f++ = std::sqrt(this->_M_gd(__pg, __urng));
    814   1.1  mrg       }
    815   1.1  mrg 
    816   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    817   1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    818   1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    819   1.1  mrg 	       const nakagami_distribution<_RealType>& __x)
    820   1.1  mrg     {
    821   1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    822   1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    823   1.1  mrg 
    824   1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    825   1.1  mrg       const _CharT __fill = __os.fill();
    826   1.1  mrg       const std::streamsize __precision = __os.precision();
    827   1.1  mrg       const _CharT __space = __os.widen(' ');
    828   1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    829   1.1  mrg       __os.fill(__space);
    830   1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    831   1.1  mrg 
    832   1.1  mrg       __os << __x.mu() << __space << __x.omega();
    833   1.1  mrg       __os << __space << __x._M_gd;
    834   1.1  mrg 
    835   1.1  mrg       __os.flags(__flags);
    836   1.1  mrg       __os.fill(__fill);
    837   1.1  mrg       __os.precision(__precision);
    838   1.1  mrg       return __os;
    839   1.1  mrg     }
    840   1.1  mrg 
    841   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    842   1.1  mrg     std::basic_istream<_CharT, _Traits>&
    843   1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    844   1.1  mrg 	       nakagami_distribution<_RealType>& __x)
    845   1.1  mrg     {
    846   1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
    847   1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
    848   1.1  mrg 
    849   1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    850   1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    851   1.1  mrg 
    852   1.1  mrg       _RealType __mu_val, __omega_val;
    853   1.1  mrg       __is >> __mu_val >> __omega_val;
    854   1.1  mrg       __is >> __x._M_gd;
    855   1.1  mrg       __x.param(typename nakagami_distribution<_RealType>::
    856   1.1  mrg 		param_type(__mu_val, __omega_val));
    857   1.1  mrg 
    858   1.1  mrg       __is.flags(__flags);
    859   1.1  mrg       return __is;
    860   1.1  mrg     }
    861   1.1  mrg 
    862   1.1  mrg 
    863   1.1  mrg   template<typename _RealType>
    864   1.1  mrg     template<typename _OutputIterator,
    865   1.1  mrg 	     typename _UniformRandomNumberGenerator>
    866   1.1  mrg       void
    867   1.1  mrg       pareto_distribution<_RealType>::
    868   1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
    869   1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    870   1.1  mrg 		      const param_type& __p)
    871   1.1  mrg       {
    872   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    873   1.6  mrg 	    result_type>)
    874   1.1  mrg 
    875   1.1  mrg 	result_type __mu_val = __p.mu();
    876   1.1  mrg 	result_type __malphinv = -result_type(1) / __p.alpha();
    877   1.1  mrg 	while (__f != __t)
    878   1.1  mrg 	  *__f++ = __mu_val * std::pow(this->_M_ud(__urng), __malphinv);
    879   1.1  mrg       }
    880   1.1  mrg 
    881   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    882   1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    883   1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    884   1.1  mrg 	       const pareto_distribution<_RealType>& __x)
    885   1.1  mrg     {
    886   1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    887   1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    888   1.1  mrg 
    889   1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    890   1.1  mrg       const _CharT __fill = __os.fill();
    891   1.1  mrg       const std::streamsize __precision = __os.precision();
    892   1.1  mrg       const _CharT __space = __os.widen(' ');
    893   1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    894   1.1  mrg       __os.fill(__space);
    895   1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    896   1.1  mrg 
    897   1.1  mrg       __os << __x.alpha() << __space << __x.mu();
    898   1.1  mrg       __os << __space << __x._M_ud;
    899   1.1  mrg 
    900   1.1  mrg       __os.flags(__flags);
    901   1.1  mrg       __os.fill(__fill);
    902   1.1  mrg       __os.precision(__precision);
    903   1.1  mrg       return __os;
    904   1.1  mrg     }
    905   1.1  mrg 
    906   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    907   1.1  mrg     std::basic_istream<_CharT, _Traits>&
    908   1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    909   1.1  mrg 	       pareto_distribution<_RealType>& __x)
    910   1.1  mrg     {
    911   1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
    912   1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
    913   1.1  mrg 
    914   1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    915   1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    916   1.1  mrg 
    917   1.1  mrg       _RealType __alpha_val, __mu_val;
    918   1.1  mrg       __is >> __alpha_val >> __mu_val;
    919   1.1  mrg       __is >> __x._M_ud;
    920   1.1  mrg       __x.param(typename pareto_distribution<_RealType>::
    921   1.1  mrg 		param_type(__alpha_val, __mu_val));
    922   1.1  mrg 
    923   1.1  mrg       __is.flags(__flags);
    924   1.1  mrg       return __is;
    925   1.1  mrg     }
    926   1.1  mrg 
    927   1.1  mrg 
    928   1.1  mrg   template<typename _RealType>
    929   1.1  mrg     template<typename _UniformRandomNumberGenerator>
    930   1.1  mrg       typename k_distribution<_RealType>::result_type
    931   1.1  mrg       k_distribution<_RealType>::
    932   1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng)
    933   1.1  mrg       {
    934   1.1  mrg 	result_type __x = this->_M_gd1(__urng);
    935   1.1  mrg 	result_type __y = this->_M_gd2(__urng);
    936   1.1  mrg 	return std::sqrt(__x * __y);
    937   1.1  mrg       }
    938   1.1  mrg 
    939   1.1  mrg   template<typename _RealType>
    940   1.1  mrg     template<typename _UniformRandomNumberGenerator>
    941   1.1  mrg       typename k_distribution<_RealType>::result_type
    942   1.1  mrg       k_distribution<_RealType>::
    943   1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng,
    944   1.1  mrg 		 const param_type& __p)
    945   1.1  mrg       {
    946   1.1  mrg 	typename std::gamma_distribution<result_type>::param_type
    947   1.1  mrg 	  __p1(__p.lambda(), result_type(1) / __p.lambda()),
    948   1.1  mrg 	  __p2(__p.nu(), __p.mu() / __p.nu());
    949   1.1  mrg 	result_type __x = this->_M_gd1(__p1, __urng);
    950   1.1  mrg 	result_type __y = this->_M_gd2(__p2, __urng);
    951   1.1  mrg 	return std::sqrt(__x * __y);
    952   1.1  mrg       }
    953   1.1  mrg 
    954   1.1  mrg   template<typename _RealType>
    955   1.1  mrg     template<typename _OutputIterator,
    956   1.1  mrg 	     typename _UniformRandomNumberGenerator>
    957   1.1  mrg       void
    958   1.1  mrg       k_distribution<_RealType>::
    959   1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
    960   1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    961   1.1  mrg 		      const param_type& __p)
    962   1.1  mrg       {
    963   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    964   1.6  mrg 	    result_type>)
    965   1.1  mrg 
    966   1.1  mrg 	typename std::gamma_distribution<result_type>::param_type
    967   1.1  mrg 	  __p1(__p.lambda(), result_type(1) / __p.lambda()),
    968   1.1  mrg 	  __p2(__p.nu(), __p.mu() / __p.nu());
    969   1.1  mrg 	while (__f != __t)
    970   1.1  mrg 	  {
    971   1.1  mrg 	    result_type __x = this->_M_gd1(__p1, __urng);
    972   1.1  mrg 	    result_type __y = this->_M_gd2(__p2, __urng);
    973   1.1  mrg 	    *__f++ = std::sqrt(__x * __y);
    974   1.1  mrg 	  }
    975   1.1  mrg       }
    976   1.1  mrg 
    977   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    978   1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    979   1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    980   1.1  mrg 	       const k_distribution<_RealType>& __x)
    981   1.1  mrg     {
    982   1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    983   1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    984   1.1  mrg 
    985   1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    986   1.1  mrg       const _CharT __fill = __os.fill();
    987   1.1  mrg       const std::streamsize __precision = __os.precision();
    988   1.1  mrg       const _CharT __space = __os.widen(' ');
    989   1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    990   1.1  mrg       __os.fill(__space);
    991   1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    992   1.1  mrg 
    993   1.1  mrg       __os << __x.lambda() << __space << __x.mu() << __space << __x.nu();
    994   1.1  mrg       __os << __space << __x._M_gd1;
    995   1.1  mrg       __os << __space << __x._M_gd2;
    996   1.1  mrg 
    997   1.1  mrg       __os.flags(__flags);
    998   1.1  mrg       __os.fill(__fill);
    999   1.1  mrg       __os.precision(__precision);
   1000   1.1  mrg       return __os;
   1001   1.1  mrg     }
   1002   1.1  mrg 
   1003   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1004   1.1  mrg     std::basic_istream<_CharT, _Traits>&
   1005   1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1006   1.1  mrg 	       k_distribution<_RealType>& __x)
   1007   1.1  mrg     {
   1008   1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1009   1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1010   1.1  mrg 
   1011   1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1012   1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1013   1.1  mrg 
   1014   1.1  mrg       _RealType __lambda_val, __mu_val, __nu_val;
   1015   1.1  mrg       __is >> __lambda_val >> __mu_val >> __nu_val;
   1016   1.1  mrg       __is >> __x._M_gd1;
   1017   1.1  mrg       __is >> __x._M_gd2;
   1018   1.1  mrg       __x.param(typename k_distribution<_RealType>::
   1019   1.1  mrg 		param_type(__lambda_val, __mu_val, __nu_val));
   1020   1.1  mrg 
   1021   1.1  mrg       __is.flags(__flags);
   1022   1.1  mrg       return __is;
   1023   1.1  mrg     }
   1024   1.1  mrg 
   1025   1.1  mrg 
   1026   1.1  mrg   template<typename _RealType>
   1027   1.1  mrg     template<typename _OutputIterator,
   1028   1.1  mrg 	     typename _UniformRandomNumberGenerator>
   1029   1.1  mrg       void
   1030   1.1  mrg       arcsine_distribution<_RealType>::
   1031   1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1032   1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
   1033   1.1  mrg 		      const param_type& __p)
   1034   1.1  mrg       {
   1035   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1036   1.6  mrg 	    result_type>)
   1037   1.1  mrg 
   1038   1.1  mrg 	result_type __dif = __p.b() - __p.a();
   1039   1.1  mrg 	result_type __sum = __p.a() + __p.b();
   1040   1.1  mrg 	while (__f != __t)
   1041   1.1  mrg 	  {
   1042   1.1  mrg 	    result_type __x = std::sin(this->_M_ud(__urng));
   1043   1.1  mrg 	    *__f++ = (__x * __dif + __sum) / result_type(2);
   1044   1.1  mrg 	  }
   1045   1.1  mrg       }
   1046   1.1  mrg 
   1047   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1048   1.1  mrg     std::basic_ostream<_CharT, _Traits>&
   1049   1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1050   1.1  mrg 	       const arcsine_distribution<_RealType>& __x)
   1051   1.1  mrg     {
   1052   1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1053   1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1054   1.1  mrg 
   1055   1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1056   1.1  mrg       const _CharT __fill = __os.fill();
   1057   1.1  mrg       const std::streamsize __precision = __os.precision();
   1058   1.1  mrg       const _CharT __space = __os.widen(' ');
   1059   1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1060   1.1  mrg       __os.fill(__space);
   1061   1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1062   1.1  mrg 
   1063   1.1  mrg       __os << __x.a() << __space << __x.b();
   1064   1.1  mrg       __os << __space << __x._M_ud;
   1065   1.1  mrg 
   1066   1.1  mrg       __os.flags(__flags);
   1067   1.1  mrg       __os.fill(__fill);
   1068   1.1  mrg       __os.precision(__precision);
   1069   1.1  mrg       return __os;
   1070   1.1  mrg     }
   1071   1.1  mrg 
   1072   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1073   1.1  mrg     std::basic_istream<_CharT, _Traits>&
   1074   1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1075   1.1  mrg 	       arcsine_distribution<_RealType>& __x)
   1076   1.1  mrg     {
   1077   1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1078   1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1079   1.1  mrg 
   1080   1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1081   1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1082   1.1  mrg 
   1083   1.1  mrg       _RealType __a, __b;
   1084   1.1  mrg       __is >> __a >> __b;
   1085   1.1  mrg       __is >> __x._M_ud;
   1086   1.1  mrg       __x.param(typename arcsine_distribution<_RealType>::
   1087   1.1  mrg 		param_type(__a, __b));
   1088   1.1  mrg 
   1089   1.1  mrg       __is.flags(__flags);
   1090   1.1  mrg       return __is;
   1091   1.1  mrg     }
   1092   1.1  mrg 
   1093   1.1  mrg 
   1094   1.1  mrg   template<typename _RealType>
   1095   1.1  mrg     template<typename _UniformRandomNumberGenerator>
   1096   1.1  mrg       typename hoyt_distribution<_RealType>::result_type
   1097   1.1  mrg       hoyt_distribution<_RealType>::
   1098   1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng)
   1099   1.1  mrg       {
   1100   1.1  mrg 	result_type __x = this->_M_ad(__urng);
   1101   1.1  mrg 	result_type __y = this->_M_ed(__urng);
   1102   1.1  mrg 	return (result_type(2) * this->q()
   1103   1.1  mrg 		  / (result_type(1) + this->q() * this->q()))
   1104   1.1  mrg 	       * std::sqrt(this->omega() * __x * __y);
   1105   1.1  mrg       }
   1106   1.1  mrg 
   1107   1.1  mrg   template<typename _RealType>
   1108   1.1  mrg     template<typename _UniformRandomNumberGenerator>
   1109   1.1  mrg       typename hoyt_distribution<_RealType>::result_type
   1110   1.1  mrg       hoyt_distribution<_RealType>::
   1111   1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1112   1.1  mrg 		 const param_type& __p)
   1113   1.1  mrg       {
   1114   1.1  mrg 	result_type __q2 = __p.q() * __p.q();
   1115   1.1  mrg 	result_type __num = result_type(0.5L) * (result_type(1) + __q2);
   1116   1.1  mrg 	typename __gnu_cxx::arcsine_distribution<result_type>::param_type
   1117   1.1  mrg 	  __pa(__num, __num / __q2);
   1118   1.1  mrg 	result_type __x = this->_M_ad(__pa, __urng);
   1119   1.1  mrg 	result_type __y = this->_M_ed(__urng);
   1120   1.1  mrg 	return (result_type(2) * __p.q() / (result_type(1) + __q2))
   1121   1.1  mrg 	       * std::sqrt(__p.omega() * __x * __y);
   1122   1.1  mrg       }
   1123   1.1  mrg 
   1124   1.1  mrg   template<typename _RealType>
   1125   1.1  mrg     template<typename _OutputIterator,
   1126   1.1  mrg 	     typename _UniformRandomNumberGenerator>
   1127   1.1  mrg       void
   1128   1.1  mrg       hoyt_distribution<_RealType>::
   1129   1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1130   1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
   1131   1.1  mrg 		      const param_type& __p)
   1132   1.1  mrg       {
   1133   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1134   1.6  mrg 	    result_type>)
   1135   1.1  mrg 
   1136   1.1  mrg 	result_type __2q = result_type(2) * __p.q();
   1137   1.1  mrg 	result_type __q2 = __p.q() * __p.q();
   1138   1.1  mrg 	result_type __q2p1 = result_type(1) + __q2;
   1139   1.1  mrg 	result_type __num = result_type(0.5L) * __q2p1;
   1140   1.1  mrg 	result_type __omega = __p.omega();
   1141   1.1  mrg 	typename __gnu_cxx::arcsine_distribution<result_type>::param_type
   1142   1.1  mrg 	  __pa(__num, __num / __q2);
   1143   1.1  mrg 	while (__f != __t)
   1144   1.1  mrg 	  {
   1145   1.1  mrg 	    result_type __x = this->_M_ad(__pa, __urng);
   1146   1.1  mrg 	    result_type __y = this->_M_ed(__urng);
   1147   1.1  mrg 	    *__f++ = (__2q / __q2p1) * std::sqrt(__omega * __x * __y);
   1148   1.1  mrg 	  }
   1149   1.1  mrg       }
   1150   1.1  mrg 
   1151   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1152   1.1  mrg     std::basic_ostream<_CharT, _Traits>&
   1153   1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1154   1.1  mrg 	       const hoyt_distribution<_RealType>& __x)
   1155   1.1  mrg     {
   1156   1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1157   1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1158   1.1  mrg 
   1159   1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1160   1.1  mrg       const _CharT __fill = __os.fill();
   1161   1.1  mrg       const std::streamsize __precision = __os.precision();
   1162   1.1  mrg       const _CharT __space = __os.widen(' ');
   1163   1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1164   1.1  mrg       __os.fill(__space);
   1165   1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1166   1.1  mrg 
   1167   1.1  mrg       __os << __x.q() << __space << __x.omega();
   1168   1.1  mrg       __os << __space << __x._M_ad;
   1169   1.1  mrg       __os << __space << __x._M_ed;
   1170   1.1  mrg 
   1171   1.1  mrg       __os.flags(__flags);
   1172   1.1  mrg       __os.fill(__fill);
   1173   1.1  mrg       __os.precision(__precision);
   1174   1.1  mrg       return __os;
   1175   1.1  mrg     }
   1176   1.1  mrg 
   1177   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1178   1.1  mrg     std::basic_istream<_CharT, _Traits>&
   1179   1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1180   1.1  mrg 	       hoyt_distribution<_RealType>& __x)
   1181   1.1  mrg     {
   1182   1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1183   1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1184   1.1  mrg 
   1185   1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1186   1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1187   1.1  mrg 
   1188   1.1  mrg       _RealType __q, __omega;
   1189   1.1  mrg       __is >> __q >> __omega;
   1190   1.1  mrg       __is >> __x._M_ad;
   1191   1.1  mrg       __is >> __x._M_ed;
   1192   1.1  mrg       __x.param(typename hoyt_distribution<_RealType>::
   1193   1.1  mrg 		param_type(__q, __omega));
   1194   1.1  mrg 
   1195   1.1  mrg       __is.flags(__flags);
   1196   1.1  mrg       return __is;
   1197   1.1  mrg     }
   1198   1.1  mrg 
   1199   1.1  mrg 
   1200   1.1  mrg   template<typename _RealType>
   1201   1.1  mrg     template<typename _OutputIterator,
   1202   1.1  mrg 	     typename _UniformRandomNumberGenerator>
   1203   1.1  mrg       void
   1204   1.1  mrg       triangular_distribution<_RealType>::
   1205   1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1206   1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
   1207   1.1  mrg 		      const param_type& __param)
   1208   1.1  mrg       {
   1209   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1210   1.6  mrg 	    result_type>)
   1211   1.1  mrg 
   1212   1.1  mrg 	while (__f != __t)
   1213   1.1  mrg 	  *__f++ = this->operator()(__urng, __param);
   1214   1.1  mrg       }
   1215   1.1  mrg 
   1216   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1217   1.1  mrg     std::basic_ostream<_CharT, _Traits>&
   1218   1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1219   1.1  mrg 	       const __gnu_cxx::triangular_distribution<_RealType>& __x)
   1220   1.1  mrg     {
   1221   1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1222   1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1223   1.1  mrg 
   1224   1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1225   1.1  mrg       const _CharT __fill = __os.fill();
   1226   1.1  mrg       const std::streamsize __precision = __os.precision();
   1227   1.1  mrg       const _CharT __space = __os.widen(' ');
   1228   1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1229   1.1  mrg       __os.fill(__space);
   1230   1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1231   1.1  mrg 
   1232   1.1  mrg       __os << __x.a() << __space << __x.b() << __space << __x.c();
   1233   1.1  mrg 
   1234   1.1  mrg       __os.flags(__flags);
   1235   1.1  mrg       __os.fill(__fill);
   1236   1.1  mrg       __os.precision(__precision);
   1237   1.1  mrg       return __os;
   1238   1.1  mrg     }
   1239   1.1  mrg 
   1240   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1241   1.1  mrg     std::basic_istream<_CharT, _Traits>&
   1242   1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1243   1.1  mrg 	       __gnu_cxx::triangular_distribution<_RealType>& __x)
   1244   1.1  mrg     {
   1245   1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1246   1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1247   1.1  mrg 
   1248   1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1249   1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1250   1.1  mrg 
   1251   1.1  mrg       _RealType __a, __b, __c;
   1252   1.1  mrg       __is >> __a >> __b >> __c;
   1253   1.1  mrg       __x.param(typename __gnu_cxx::triangular_distribution<_RealType>::
   1254   1.1  mrg 		param_type(__a, __b, __c));
   1255   1.1  mrg 
   1256   1.1  mrg       __is.flags(__flags);
   1257   1.1  mrg       return __is;
   1258   1.1  mrg     }
   1259   1.1  mrg 
   1260   1.1  mrg 
   1261   1.1  mrg   template<typename _RealType>
   1262   1.3  mrg     template<typename _UniformRandomNumberGenerator>
   1263   1.3  mrg       typename von_mises_distribution<_RealType>::result_type
   1264   1.3  mrg       von_mises_distribution<_RealType>::
   1265   1.3  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1266   1.3  mrg 		 const param_type& __p)
   1267   1.3  mrg       {
   1268   1.3  mrg 	const result_type __pi
   1269   1.3  mrg 	  = __gnu_cxx::__math_constants<result_type>::__pi;
   1270   1.3  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
   1271   1.3  mrg 	  __aurng(__urng);
   1272   1.3  mrg 
   1273   1.3  mrg 	result_type __f;
   1274   1.3  mrg 	while (1)
   1275   1.3  mrg 	  {
   1276   1.3  mrg 	    result_type __rnd = std::cos(__pi * __aurng());
   1277   1.3  mrg 	    __f = (result_type(1) + __p._M_r * __rnd) / (__p._M_r + __rnd);
   1278   1.3  mrg 	    result_type __c = __p._M_kappa * (__p._M_r - __f);
   1279   1.3  mrg 
   1280   1.3  mrg 	    result_type __rnd2 = __aurng();
   1281   1.3  mrg 	    if (__c * (result_type(2) - __c) > __rnd2)
   1282   1.3  mrg 	      break;
   1283   1.3  mrg 	    if (std::log(__c / __rnd2) >= __c - result_type(1))
   1284   1.3  mrg 	      break;
   1285   1.3  mrg 	  }
   1286   1.3  mrg 
   1287   1.3  mrg 	result_type __res = std::acos(__f);
   1288   1.3  mrg #if _GLIBCXX_USE_C99_MATH_TR1
   1289   1.3  mrg 	__res = std::copysign(__res, __aurng() - result_type(0.5));
   1290   1.3  mrg #else
   1291   1.3  mrg 	if (__aurng() < result_type(0.5))
   1292   1.3  mrg 	  __res = -__res;
   1293   1.3  mrg #endif
   1294   1.3  mrg 	__res += __p._M_mu;
   1295   1.3  mrg 	if (__res > __pi)
   1296   1.3  mrg 	  __res -= result_type(2) * __pi;
   1297   1.3  mrg 	else if (__res < -__pi)
   1298   1.3  mrg 	  __res += result_type(2) * __pi;
   1299   1.3  mrg 	return __res;
   1300   1.3  mrg       }
   1301   1.3  mrg 
   1302   1.3  mrg   template<typename _RealType>
   1303   1.1  mrg     template<typename _OutputIterator,
   1304   1.1  mrg 	     typename _UniformRandomNumberGenerator>
   1305   1.1  mrg       void
   1306   1.1  mrg       von_mises_distribution<_RealType>::
   1307   1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1308   1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
   1309   1.1  mrg 		      const param_type& __param)
   1310   1.1  mrg       {
   1311   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1312   1.6  mrg 	    result_type>)
   1313   1.1  mrg 
   1314   1.1  mrg 	while (__f != __t)
   1315   1.1  mrg 	  *__f++ = this->operator()(__urng, __param);
   1316   1.1  mrg       }
   1317   1.1  mrg 
   1318   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1319   1.1  mrg     std::basic_ostream<_CharT, _Traits>&
   1320   1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1321   1.1  mrg 	       const __gnu_cxx::von_mises_distribution<_RealType>& __x)
   1322   1.1  mrg     {
   1323   1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1324   1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1325   1.1  mrg 
   1326   1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1327   1.1  mrg       const _CharT __fill = __os.fill();
   1328   1.1  mrg       const std::streamsize __precision = __os.precision();
   1329   1.1  mrg       const _CharT __space = __os.widen(' ');
   1330   1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1331   1.1  mrg       __os.fill(__space);
   1332   1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1333   1.1  mrg 
   1334   1.1  mrg       __os << __x.mu() << __space << __x.kappa();
   1335   1.1  mrg 
   1336   1.1  mrg       __os.flags(__flags);
   1337   1.1  mrg       __os.fill(__fill);
   1338   1.1  mrg       __os.precision(__precision);
   1339   1.1  mrg       return __os;
   1340   1.1  mrg     }
   1341   1.1  mrg 
   1342   1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1343   1.1  mrg     std::basic_istream<_CharT, _Traits>&
   1344   1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1345   1.1  mrg 	       __gnu_cxx::von_mises_distribution<_RealType>& __x)
   1346   1.1  mrg     {
   1347   1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1348   1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1349   1.1  mrg 
   1350   1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1351   1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1352   1.1  mrg 
   1353   1.1  mrg       _RealType __mu, __kappa;
   1354   1.1  mrg       __is >> __mu >> __kappa;
   1355   1.1  mrg       __x.param(typename __gnu_cxx::von_mises_distribution<_RealType>::
   1356   1.1  mrg 		param_type(__mu, __kappa));
   1357   1.1  mrg 
   1358   1.1  mrg       __is.flags(__flags);
   1359   1.1  mrg       return __is;
   1360   1.1  mrg     }
   1361   1.1  mrg 
   1362   1.3  mrg 
   1363   1.3  mrg   template<typename _UIntType>
   1364   1.3  mrg     template<typename _UniformRandomNumberGenerator>
   1365   1.3  mrg       typename hypergeometric_distribution<_UIntType>::result_type
   1366   1.3  mrg       hypergeometric_distribution<_UIntType>::
   1367   1.3  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1368   1.3  mrg 		 const param_type& __param)
   1369   1.3  mrg       {
   1370   1.3  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, double>
   1371   1.3  mrg 	  __aurng(__urng);
   1372   1.3  mrg 
   1373   1.3  mrg 	result_type __a = __param.successful_size();
   1374   1.3  mrg 	result_type __b = __param.total_size();
   1375   1.3  mrg 	result_type __k = 0;
   1376   1.3  mrg 
   1377   1.3  mrg 	if (__param.total_draws() < __param.total_size() / 2)
   1378   1.3  mrg 	  {
   1379   1.3  mrg 	    for (result_type __i = 0; __i < __param.total_draws(); ++__i)
   1380   1.3  mrg 	      {
   1381   1.3  mrg 		if (__b * __aurng() < __a)
   1382   1.3  mrg 		  {
   1383   1.3  mrg 		    ++__k;
   1384   1.3  mrg 		    if (__k == __param.successful_size())
   1385   1.3  mrg 		      return __k;
   1386   1.3  mrg 		   --__a;
   1387   1.3  mrg 		  }
   1388   1.3  mrg 		--__b;
   1389   1.3  mrg 	      }
   1390   1.3  mrg 	    return __k;
   1391   1.3  mrg 	  }
   1392   1.3  mrg 	else
   1393   1.3  mrg 	  {
   1394   1.3  mrg 	    for (result_type __i = 0; __i < __param.unsuccessful_size(); ++__i)
   1395   1.3  mrg 	      {
   1396   1.3  mrg 		if (__b * __aurng() < __a)
   1397   1.3  mrg 		  {
   1398   1.3  mrg 		    ++__k;
   1399   1.3  mrg 		    if (__k == __param.successful_size())
   1400   1.3  mrg 		      return __param.successful_size() - __k;
   1401   1.3  mrg 		    --__a;
   1402   1.3  mrg 		  }
   1403   1.3  mrg 		--__b;
   1404   1.3  mrg 	      }
   1405   1.3  mrg 	    return __param.successful_size() - __k;
   1406   1.3  mrg 	  }
   1407   1.3  mrg       }
   1408   1.3  mrg 
   1409   1.3  mrg   template<typename _UIntType>
   1410   1.3  mrg     template<typename _OutputIterator,
   1411   1.3  mrg 	     typename _UniformRandomNumberGenerator>
   1412   1.3  mrg       void
   1413   1.3  mrg       hypergeometric_distribution<_UIntType>::
   1414   1.3  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1415   1.3  mrg 		      _UniformRandomNumberGenerator& __urng,
   1416   1.3  mrg 		      const param_type& __param)
   1417   1.3  mrg       {
   1418   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1419   1.6  mrg 	    result_type>)
   1420   1.3  mrg 
   1421   1.3  mrg 	while (__f != __t)
   1422   1.3  mrg 	  *__f++ = this->operator()(__urng);
   1423   1.3  mrg       }
   1424   1.3  mrg 
   1425   1.3  mrg   template<typename _UIntType, typename _CharT, typename _Traits>
   1426   1.3  mrg     std::basic_ostream<_CharT, _Traits>&
   1427   1.3  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1428   1.3  mrg 	       const __gnu_cxx::hypergeometric_distribution<_UIntType>& __x)
   1429   1.3  mrg     {
   1430   1.3  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1431   1.3  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1432   1.3  mrg 
   1433   1.3  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1434   1.3  mrg       const _CharT __fill = __os.fill();
   1435   1.3  mrg       const std::streamsize __precision = __os.precision();
   1436   1.3  mrg       const _CharT __space = __os.widen(' ');
   1437   1.3  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1438   1.3  mrg       __os.fill(__space);
   1439   1.3  mrg       __os.precision(std::numeric_limits<_UIntType>::max_digits10);
   1440   1.3  mrg 
   1441   1.3  mrg       __os << __x.total_size() << __space << __x.successful_size() << __space
   1442   1.3  mrg 	   << __x.total_draws();
   1443   1.3  mrg 
   1444   1.3  mrg       __os.flags(__flags);
   1445   1.3  mrg       __os.fill(__fill);
   1446   1.3  mrg       __os.precision(__precision);
   1447   1.3  mrg       return __os;
   1448   1.3  mrg     }
   1449   1.3  mrg 
   1450   1.3  mrg   template<typename _UIntType, typename _CharT, typename _Traits>
   1451   1.3  mrg     std::basic_istream<_CharT, _Traits>&
   1452   1.3  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1453   1.3  mrg 	       __gnu_cxx::hypergeometric_distribution<_UIntType>& __x)
   1454   1.3  mrg     {
   1455   1.3  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1456   1.3  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1457   1.3  mrg 
   1458   1.3  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1459   1.3  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1460   1.3  mrg 
   1461   1.3  mrg       _UIntType __total_size, __successful_size, __total_draws;
   1462   1.3  mrg       __is >> __total_size >> __successful_size >> __total_draws;
   1463   1.3  mrg       __x.param(typename __gnu_cxx::hypergeometric_distribution<_UIntType>::
   1464   1.3  mrg 		param_type(__total_size, __successful_size, __total_draws));
   1465   1.3  mrg 
   1466   1.3  mrg       __is.flags(__flags);
   1467   1.3  mrg       return __is;
   1468   1.3  mrg     }
   1469   1.3  mrg 
   1470   1.3  mrg 
   1471   1.3  mrg   template<typename _RealType>
   1472   1.3  mrg     template<typename _UniformRandomNumberGenerator>
   1473   1.3  mrg       typename logistic_distribution<_RealType>::result_type
   1474   1.3  mrg       logistic_distribution<_RealType>::
   1475   1.3  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1476   1.3  mrg 		 const param_type& __p)
   1477   1.3  mrg       {
   1478   1.3  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
   1479   1.3  mrg 	  __aurng(__urng);
   1480   1.3  mrg 
   1481   1.3  mrg 	result_type __arg = result_type(1);
   1482   1.3  mrg 	while (__arg == result_type(1) || __arg == result_type(0))
   1483   1.3  mrg 	  __arg = __aurng();
   1484   1.3  mrg 	return __p.a()
   1485   1.3  mrg 	     + __p.b() * std::log(__arg / (result_type(1) - __arg));
   1486   1.3  mrg       }
   1487   1.3  mrg 
   1488   1.3  mrg   template<typename _RealType>
   1489   1.3  mrg     template<typename _OutputIterator,
   1490   1.3  mrg 	     typename _UniformRandomNumberGenerator>
   1491   1.3  mrg       void
   1492   1.3  mrg       logistic_distribution<_RealType>::
   1493   1.3  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1494   1.3  mrg 		      _UniformRandomNumberGenerator& __urng,
   1495   1.3  mrg 		      const param_type& __p)
   1496   1.3  mrg       {
   1497   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1498   1.6  mrg 	    result_type>)
   1499   1.6  mrg 
   1500   1.3  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
   1501   1.3  mrg 	  __aurng(__urng);
   1502   1.3  mrg 
   1503   1.3  mrg 	while (__f != __t)
   1504   1.3  mrg 	  {
   1505   1.3  mrg 	    result_type __arg = result_type(1);
   1506   1.3  mrg 	    while (__arg == result_type(1) || __arg == result_type(0))
   1507   1.3  mrg 	      __arg = __aurng();
   1508   1.3  mrg 	    *__f++ = __p.a()
   1509   1.3  mrg 		   + __p.b() * std::log(__arg / (result_type(1) - __arg));
   1510   1.3  mrg 	  }
   1511   1.3  mrg       }
   1512   1.3  mrg 
   1513   1.3  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1514   1.3  mrg     std::basic_ostream<_CharT, _Traits>&
   1515   1.3  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1516   1.3  mrg 	       const logistic_distribution<_RealType>& __x)
   1517   1.3  mrg     {
   1518   1.3  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1519   1.3  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1520   1.3  mrg 
   1521   1.3  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1522   1.3  mrg       const _CharT __fill = __os.fill();
   1523   1.3  mrg       const std::streamsize __precision = __os.precision();
   1524   1.3  mrg       const _CharT __space = __os.widen(' ');
   1525   1.3  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1526   1.3  mrg       __os.fill(__space);
   1527   1.3  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1528   1.3  mrg 
   1529   1.3  mrg       __os << __x.a() << __space << __x.b();
   1530   1.3  mrg 
   1531   1.3  mrg       __os.flags(__flags);
   1532   1.3  mrg       __os.fill(__fill);
   1533   1.3  mrg       __os.precision(__precision);
   1534   1.3  mrg       return __os;
   1535   1.3  mrg     }
   1536   1.3  mrg 
   1537   1.3  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1538   1.3  mrg     std::basic_istream<_CharT, _Traits>&
   1539   1.3  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1540   1.3  mrg 	       logistic_distribution<_RealType>& __x)
   1541   1.3  mrg     {
   1542   1.3  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1543   1.3  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1544   1.3  mrg 
   1545   1.3  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1546   1.3  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1547   1.3  mrg 
   1548   1.3  mrg       _RealType __a, __b;
   1549   1.3  mrg       __is >> __a >> __b;
   1550   1.3  mrg       __x.param(typename logistic_distribution<_RealType>::
   1551   1.3  mrg 		param_type(__a, __b));
   1552   1.3  mrg 
   1553   1.3  mrg       __is.flags(__flags);
   1554   1.3  mrg       return __is;
   1555   1.3  mrg     }
   1556   1.3  mrg 
   1557   1.3  mrg 
   1558   1.3  mrg   namespace {
   1559   1.3  mrg 
   1560   1.3  mrg     // Helper class for the uniform_on_sphere_distribution generation
   1561   1.3  mrg     // function.
   1562   1.3  mrg     template<std::size_t _Dimen, typename _RealType>
   1563   1.3  mrg       class uniform_on_sphere_helper
   1564   1.3  mrg       {
   1565   1.3  mrg 	typedef typename uniform_on_sphere_distribution<_Dimen, _RealType>::
   1566   1.3  mrg 	  result_type result_type;
   1567   1.3  mrg 
   1568   1.3  mrg       public:
   1569   1.3  mrg 	template<typename _NormalDistribution,
   1570   1.3  mrg 		 typename _UniformRandomNumberGenerator>
   1571   1.3  mrg 	result_type operator()(_NormalDistribution& __nd,
   1572   1.3  mrg 			       _UniformRandomNumberGenerator& __urng)
   1573   1.3  mrg         {
   1574   1.3  mrg 	  result_type __ret;
   1575   1.3  mrg 	  typename result_type::value_type __norm;
   1576   1.3  mrg 
   1577   1.3  mrg 	  do
   1578   1.3  mrg 	    {
   1579   1.3  mrg 	      auto __sum = _RealType(0);
   1580   1.3  mrg 
   1581   1.3  mrg 	      std::generate(__ret.begin(), __ret.end(),
   1582   1.3  mrg 			    [&__nd, &__urng, &__sum](){
   1583   1.3  mrg 			      _RealType __t = __nd(__urng);
   1584   1.3  mrg 			      __sum += __t * __t;
   1585   1.3  mrg 			      return __t; });
   1586   1.3  mrg 	      __norm = std::sqrt(__sum);
   1587   1.3  mrg 	    }
   1588   1.4  mrg 	  while (__norm == _RealType(0) || ! __builtin_isfinite(__norm));
   1589   1.3  mrg 
   1590   1.3  mrg 	  std::transform(__ret.begin(), __ret.end(), __ret.begin(),
   1591   1.3  mrg 			 [__norm](_RealType __val){ return __val / __norm; });
   1592   1.3  mrg 
   1593   1.3  mrg 	  return __ret;
   1594   1.3  mrg         }
   1595   1.3  mrg       };
   1596   1.3  mrg 
   1597   1.3  mrg 
   1598   1.3  mrg     template<typename _RealType>
   1599   1.3  mrg       class uniform_on_sphere_helper<2, _RealType>
   1600   1.3  mrg       {
   1601   1.3  mrg 	typedef typename uniform_on_sphere_distribution<2, _RealType>::
   1602   1.3  mrg 	  result_type result_type;
   1603   1.3  mrg 
   1604   1.3  mrg       public:
   1605   1.3  mrg 	template<typename _NormalDistribution,
   1606   1.3  mrg 		 typename _UniformRandomNumberGenerator>
   1607   1.3  mrg 	result_type operator()(_NormalDistribution&,
   1608   1.3  mrg 			       _UniformRandomNumberGenerator& __urng)
   1609   1.3  mrg         {
   1610   1.3  mrg 	  result_type __ret;
   1611   1.3  mrg 	  _RealType __sq;
   1612   1.3  mrg 	  std::__detail::_Adaptor<_UniformRandomNumberGenerator,
   1613   1.3  mrg 				  _RealType> __aurng(__urng);
   1614   1.3  mrg 
   1615   1.3  mrg 	  do
   1616   1.3  mrg 	    {
   1617   1.3  mrg 	      __ret[0] = _RealType(2) * __aurng() - _RealType(1);
   1618   1.3  mrg 	      __ret[1] = _RealType(2) * __aurng() - _RealType(1);
   1619   1.3  mrg 
   1620   1.3  mrg 	      __sq = __ret[0] * __ret[0] + __ret[1] * __ret[1];
   1621   1.3  mrg 	    }
   1622   1.3  mrg 	  while (__sq == _RealType(0) || __sq > _RealType(1));
   1623   1.3  mrg 
   1624   1.3  mrg #if _GLIBCXX_USE_C99_MATH_TR1
   1625   1.3  mrg 	  // Yes, we do not just use sqrt(__sq) because hypot() is more
   1626   1.3  mrg 	  // accurate.
   1627   1.3  mrg 	  auto __norm = std::hypot(__ret[0], __ret[1]);
   1628   1.3  mrg #else
   1629   1.3  mrg 	  auto __norm = std::sqrt(__sq);
   1630   1.3  mrg #endif
   1631   1.3  mrg 	  __ret[0] /= __norm;
   1632   1.3  mrg 	  __ret[1] /= __norm;
   1633   1.3  mrg 
   1634   1.3  mrg 	  return __ret;
   1635   1.3  mrg         }
   1636   1.3  mrg       };
   1637   1.3  mrg 
   1638   1.3  mrg   }
   1639   1.3  mrg 
   1640   1.3  mrg 
   1641   1.3  mrg   template<std::size_t _Dimen, typename _RealType>
   1642   1.3  mrg     template<typename _UniformRandomNumberGenerator>
   1643   1.3  mrg       typename uniform_on_sphere_distribution<_Dimen, _RealType>::result_type
   1644   1.3  mrg       uniform_on_sphere_distribution<_Dimen, _RealType>::
   1645   1.3  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1646   1.3  mrg 		 const param_type& __p)
   1647   1.3  mrg       {
   1648   1.3  mrg         uniform_on_sphere_helper<_Dimen, _RealType> __helper;
   1649   1.3  mrg         return __helper(_M_nd, __urng);
   1650   1.3  mrg       }
   1651   1.3  mrg 
   1652   1.3  mrg   template<std::size_t _Dimen, typename _RealType>
   1653   1.3  mrg     template<typename _OutputIterator,
   1654   1.3  mrg 	     typename _UniformRandomNumberGenerator>
   1655   1.3  mrg       void
   1656   1.3  mrg       uniform_on_sphere_distribution<_Dimen, _RealType>::
   1657   1.3  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1658   1.3  mrg 		      _UniformRandomNumberGenerator& __urng,
   1659   1.3  mrg 		      const param_type& __param)
   1660   1.3  mrg       {
   1661   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1662   1.6  mrg 	    result_type>)
   1663   1.3  mrg 
   1664   1.3  mrg 	while (__f != __t)
   1665   1.3  mrg 	  *__f++ = this->operator()(__urng, __param);
   1666   1.3  mrg       }
   1667   1.3  mrg 
   1668   1.3  mrg   template<std::size_t _Dimen, typename _RealType, typename _CharT,
   1669   1.3  mrg 	   typename _Traits>
   1670   1.3  mrg     std::basic_ostream<_CharT, _Traits>&
   1671   1.3  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1672   1.3  mrg 	       const __gnu_cxx::uniform_on_sphere_distribution<_Dimen,
   1673   1.3  mrg 							       _RealType>& __x)
   1674   1.3  mrg     {
   1675   1.3  mrg       return __os << __x._M_nd;
   1676   1.3  mrg     }
   1677   1.3  mrg 
   1678   1.3  mrg   template<std::size_t _Dimen, typename _RealType, typename _CharT,
   1679   1.3  mrg 	   typename _Traits>
   1680   1.3  mrg     std::basic_istream<_CharT, _Traits>&
   1681   1.3  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1682   1.3  mrg 	       __gnu_cxx::uniform_on_sphere_distribution<_Dimen,
   1683   1.3  mrg 							 _RealType>& __x)
   1684   1.3  mrg     {
   1685   1.3  mrg       return __is >> __x._M_nd;
   1686   1.3  mrg     }
   1687   1.3  mrg 
   1688   1.6  mrg 
   1689   1.6  mrg   namespace {
   1690   1.6  mrg 
   1691   1.6  mrg     // Helper class for the uniform_inside_sphere_distribution generation
   1692   1.6  mrg     // function.
   1693   1.6  mrg     template<std::size_t _Dimen, bool _SmallDimen, typename _RealType>
   1694   1.6  mrg       class uniform_inside_sphere_helper;
   1695   1.6  mrg 
   1696   1.6  mrg     template<std::size_t _Dimen, typename _RealType>
   1697   1.6  mrg       class uniform_inside_sphere_helper<_Dimen, false, _RealType>
   1698   1.6  mrg       {
   1699   1.6  mrg 	using result_type
   1700   1.6  mrg 	  = typename uniform_inside_sphere_distribution<_Dimen, _RealType>::
   1701   1.6  mrg 	    result_type;
   1702   1.6  mrg 
   1703   1.6  mrg       public:
   1704   1.6  mrg 	template<typename _UniformOnSphereDistribution,
   1705   1.6  mrg 		 typename _UniformRandomNumberGenerator>
   1706   1.6  mrg 	result_type
   1707   1.6  mrg 	operator()(_UniformOnSphereDistribution& __uosd,
   1708   1.6  mrg 		   _UniformRandomNumberGenerator& __urng,
   1709   1.6  mrg 		   _RealType __radius)
   1710   1.6  mrg         {
   1711   1.6  mrg 	  std::__detail::_Adaptor<_UniformRandomNumberGenerator,
   1712   1.6  mrg 				  _RealType> __aurng(__urng);
   1713   1.6  mrg 
   1714   1.6  mrg 	  _RealType __pow = 1 / _RealType(_Dimen);
   1715   1.6  mrg 	  _RealType __urt = __radius * std::pow(__aurng(), __pow);
   1716   1.6  mrg 	  result_type __ret = __uosd(__aurng);
   1717   1.6  mrg 
   1718   1.6  mrg 	  std::transform(__ret.begin(), __ret.end(), __ret.begin(),
   1719   1.6  mrg 			 [__urt](_RealType __val)
   1720   1.6  mrg 			 { return __val * __urt; });
   1721   1.6  mrg 
   1722   1.6  mrg 	  return __ret;
   1723   1.6  mrg         }
   1724   1.6  mrg       };
   1725   1.6  mrg 
   1726   1.6  mrg     // Helper class for the uniform_inside_sphere_distribution generation
   1727   1.6  mrg     // function specialized for small dimensions.
   1728   1.6  mrg     template<std::size_t _Dimen, typename _RealType>
   1729   1.6  mrg       class uniform_inside_sphere_helper<_Dimen, true, _RealType>
   1730   1.6  mrg       {
   1731   1.6  mrg 	using result_type
   1732   1.6  mrg 	  = typename uniform_inside_sphere_distribution<_Dimen, _RealType>::
   1733   1.6  mrg 	    result_type;
   1734   1.6  mrg 
   1735   1.6  mrg       public:
   1736   1.6  mrg 	template<typename _UniformOnSphereDistribution,
   1737   1.6  mrg 		 typename _UniformRandomNumberGenerator>
   1738   1.6  mrg 	result_type
   1739   1.6  mrg 	operator()(_UniformOnSphereDistribution&,
   1740   1.6  mrg 		   _UniformRandomNumberGenerator& __urng,
   1741   1.6  mrg 		   _RealType __radius)
   1742   1.6  mrg         {
   1743   1.6  mrg 	  result_type __ret;
   1744   1.6  mrg 	  _RealType __sq;
   1745   1.6  mrg 	  _RealType __radsq = __radius * __radius;
   1746   1.6  mrg 	  std::__detail::_Adaptor<_UniformRandomNumberGenerator,
   1747   1.6  mrg 				  _RealType> __aurng(__urng);
   1748   1.6  mrg 
   1749   1.6  mrg 	  do
   1750   1.6  mrg 	    {
   1751   1.6  mrg 	      __sq = _RealType(0);
   1752   1.6  mrg 	      for (int i = 0; i < _Dimen; ++i)
   1753   1.6  mrg 		{
   1754   1.6  mrg 		  __ret[i] = _RealType(2) * __aurng() - _RealType(1);
   1755   1.6  mrg 		  __sq += __ret[i] * __ret[i];
   1756   1.6  mrg 		}
   1757   1.6  mrg 	    }
   1758   1.6  mrg 	  while (__sq > _RealType(1));
   1759   1.6  mrg 
   1760   1.6  mrg 	  for (int i = 0; i < _Dimen; ++i)
   1761   1.6  mrg             __ret[i] *= __radius;
   1762   1.6  mrg 
   1763   1.6  mrg 	  return __ret;
   1764   1.6  mrg         }
   1765   1.6  mrg       };
   1766   1.6  mrg   } // namespace
   1767   1.6  mrg 
   1768   1.6  mrg   //
   1769   1.6  mrg   //  Experiments have shown that rejection is more efficient than transform
   1770   1.6  mrg   //  for dimensions less than 8.
   1771   1.6  mrg   //
   1772   1.6  mrg   template<std::size_t _Dimen, typename _RealType>
   1773   1.6  mrg     template<typename _UniformRandomNumberGenerator>
   1774   1.6  mrg       typename uniform_inside_sphere_distribution<_Dimen, _RealType>::result_type
   1775   1.6  mrg       uniform_inside_sphere_distribution<_Dimen, _RealType>::
   1776   1.6  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1777   1.6  mrg 		 const param_type& __p)
   1778   1.6  mrg       {
   1779   1.6  mrg         uniform_inside_sphere_helper<_Dimen, _Dimen < 8, _RealType> __helper;
   1780   1.6  mrg         return __helper(_M_uosd, __urng, __p.radius());
   1781   1.6  mrg       }
   1782   1.6  mrg 
   1783   1.6  mrg   template<std::size_t _Dimen, typename _RealType>
   1784   1.6  mrg     template<typename _OutputIterator,
   1785   1.6  mrg 	     typename _UniformRandomNumberGenerator>
   1786   1.6  mrg       void
   1787   1.6  mrg       uniform_inside_sphere_distribution<_Dimen, _RealType>::
   1788   1.6  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1789   1.6  mrg 		      _UniformRandomNumberGenerator& __urng,
   1790   1.6  mrg 		      const param_type& __param)
   1791   1.6  mrg       {
   1792   1.6  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1793   1.6  mrg 	    result_type>)
   1794   1.6  mrg 
   1795   1.6  mrg 	while (__f != __t)
   1796   1.6  mrg 	  *__f++ = this->operator()(__urng, __param);
   1797   1.6  mrg       }
   1798   1.6  mrg 
   1799   1.6  mrg   template<std::size_t _Dimen, typename _RealType, typename _CharT,
   1800   1.6  mrg 	   typename _Traits>
   1801   1.6  mrg     std::basic_ostream<_CharT, _Traits>&
   1802   1.6  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1803   1.6  mrg 	       const __gnu_cxx::uniform_inside_sphere_distribution<_Dimen,
   1804   1.6  mrg 								_RealType>& __x)
   1805   1.6  mrg     {
   1806   1.6  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1807   1.6  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1808   1.6  mrg 
   1809   1.6  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1810   1.6  mrg       const _CharT __fill = __os.fill();
   1811   1.6  mrg       const std::streamsize __precision = __os.precision();
   1812   1.6  mrg       const _CharT __space = __os.widen(' ');
   1813   1.6  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1814   1.6  mrg       __os.fill(__space);
   1815   1.6  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1816   1.6  mrg 
   1817   1.6  mrg       __os << __x.radius() << __space << __x._M_uosd;
   1818   1.6  mrg 
   1819   1.6  mrg       __os.flags(__flags);
   1820   1.6  mrg       __os.fill(__fill);
   1821   1.6  mrg       __os.precision(__precision);
   1822   1.6  mrg 
   1823   1.6  mrg       return __os;
   1824   1.6  mrg     }
   1825   1.6  mrg 
   1826   1.6  mrg   template<std::size_t _Dimen, typename _RealType, typename _CharT,
   1827   1.6  mrg 	   typename _Traits>
   1828   1.6  mrg     std::basic_istream<_CharT, _Traits>&
   1829   1.6  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1830   1.6  mrg 	       __gnu_cxx::uniform_inside_sphere_distribution<_Dimen,
   1831   1.6  mrg 							     _RealType>& __x)
   1832   1.6  mrg     {
   1833   1.6  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1834   1.6  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1835   1.6  mrg 
   1836   1.6  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1837   1.6  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1838   1.6  mrg 
   1839   1.6  mrg       _RealType __radius_val;
   1840   1.6  mrg       __is >> __radius_val >> __x._M_uosd;
   1841   1.6  mrg       __x.param(typename uniform_inside_sphere_distribution<_Dimen, _RealType>::
   1842   1.6  mrg 		param_type(__radius_val));
   1843   1.6  mrg 
   1844   1.6  mrg       __is.flags(__flags);
   1845   1.6  mrg 
   1846   1.6  mrg       return __is;
   1847   1.6  mrg     }
   1848   1.6  mrg 
   1849   1.1  mrg _GLIBCXX_END_NAMESPACE_VERSION
   1850   1.6  mrg } // namespace __gnu_cxx
   1851   1.1  mrg 
   1852   1.1  mrg 
   1853   1.1  mrg #endif // _EXT_RANDOM_TCC
   1854