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