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