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