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