1 // -*- C++ -*- 2 //===--------------------------- random -----------------------------------===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is dual licensed under the MIT and the University of Illinois Open 7 // Source Licenses. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 #ifndef _LIBCPP_RANDOM 12 #define _LIBCPP_RANDOM 13 14 /* 15 random synopsis 16 17 #include <initializer_list> 18 19 namespace std 20 { 21 22 // Engines 23 24 template <class UIntType, UIntType a, UIntType c, UIntType m> 25 class linear_congruential_engine 26 { 27 public: 28 // types 29 typedef UIntType result_type; 30 31 // engine characteristics 32 static constexpr result_type multiplier = a; 33 static constexpr result_type increment = c; 34 static constexpr result_type modulus = m; 35 static constexpr result_type min() { return c == 0u ? 1u: 0u;} 36 static constexpr result_type max() { return m - 1u;} 37 static constexpr result_type default_seed = 1u; 38 39 // constructors and seeding functions 40 explicit linear_congruential_engine(result_type s = default_seed); 41 template<class Sseq> explicit linear_congruential_engine(Sseq& q); 42 void seed(result_type s = default_seed); 43 template<class Sseq> void seed(Sseq& q); 44 45 // generating functions 46 result_type operator()(); 47 void discard(unsigned long long z); 48 }; 49 50 template <class UIntType, UIntType a, UIntType c, UIntType m> 51 bool 52 operator==(const linear_congruential_engine<UIntType, a, c, m>& x, 53 const linear_congruential_engine<UIntType, a, c, m>& y); 54 55 template <class UIntType, UIntType a, UIntType c, UIntType m> 56 bool 57 operator!=(const linear_congruential_engine<UIntType, a, c, m>& x, 58 const linear_congruential_engine<UIntType, a, c, m>& y); 59 60 template <class charT, class traits, 61 class UIntType, UIntType a, UIntType c, UIntType m> 62 basic_ostream<charT, traits>& 63 operator<<(basic_ostream<charT, traits>& os, 64 const linear_congruential_engine<UIntType, a, c, m>& x); 65 66 template <class charT, class traits, 67 class UIntType, UIntType a, UIntType c, UIntType m> 68 basic_istream<charT, traits>& 69 operator>>(basic_istream<charT, traits>& is, 70 linear_congruential_engine<UIntType, a, c, m>& x); 71 72 template <class UIntType, size_t w, size_t n, size_t m, size_t r, 73 UIntType a, size_t u, UIntType d, size_t s, 74 UIntType b, size_t t, UIntType c, size_t l, UIntType f> 75 class mersenne_twister_engine 76 { 77 public: 78 // types 79 typedef UIntType result_type; 80 81 // engine characteristics 82 static constexpr size_t word_size = w; 83 static constexpr size_t state_size = n; 84 static constexpr size_t shift_size = m; 85 static constexpr size_t mask_bits = r; 86 static constexpr result_type xor_mask = a; 87 static constexpr size_t tempering_u = u; 88 static constexpr result_type tempering_d = d; 89 static constexpr size_t tempering_s = s; 90 static constexpr result_type tempering_b = b; 91 static constexpr size_t tempering_t = t; 92 static constexpr result_type tempering_c = c; 93 static constexpr size_t tempering_l = l; 94 static constexpr result_type initialization_multiplier = f; 95 static constexpr result_type min () { return 0; } 96 static constexpr result_type max() { return 2^w - 1; } 97 static constexpr result_type default_seed = 5489u; 98 99 // constructors and seeding functions 100 explicit mersenne_twister_engine(result_type value = default_seed); 101 template<class Sseq> explicit mersenne_twister_engine(Sseq& q); 102 void seed(result_type value = default_seed); 103 template<class Sseq> void seed(Sseq& q); 104 105 // generating functions 106 result_type operator()(); 107 void discard(unsigned long long z); 108 }; 109 110 template <class UIntType, size_t w, size_t n, size_t m, size_t r, 111 UIntType a, size_t u, UIntType d, size_t s, 112 UIntType b, size_t t, UIntType c, size_t l, UIntType f> 113 bool 114 operator==( 115 const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x, 116 const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& y); 117 118 template <class UIntType, size_t w, size_t n, size_t m, size_t r, 119 UIntType a, size_t u, UIntType d, size_t s, 120 UIntType b, size_t t, UIntType c, size_t l, UIntType f> 121 bool 122 operator!=( 123 const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x, 124 const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& y); 125 126 template <class charT, class traits, 127 class UIntType, size_t w, size_t n, size_t m, size_t r, 128 UIntType a, size_t u, UIntType d, size_t s, 129 UIntType b, size_t t, UIntType c, size_t l, UIntType f> 130 basic_ostream<charT, traits>& 131 operator<<(basic_ostream<charT, traits>& os, 132 const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x); 133 134 template <class charT, class traits, 135 class UIntType, size_t w, size_t n, size_t m, size_t r, 136 UIntType a, size_t u, UIntType d, size_t s, 137 UIntType b, size_t t, UIntType c, size_t l, UIntType f> 138 basic_istream<charT, traits>& 139 operator>>(basic_istream<charT, traits>& is, 140 mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x); 141 142 template<class UIntType, size_t w, size_t s, size_t r> 143 class subtract_with_carry_engine 144 { 145 public: 146 // types 147 typedef UIntType result_type; 148 149 // engine characteristics 150 static constexpr size_t word_size = w; 151 static constexpr size_t short_lag = s; 152 static constexpr size_t long_lag = r; 153 static constexpr result_type min() { return 0; } 154 static constexpr result_type max() { return m-1; } 155 static constexpr result_type default_seed = 19780503u; 156 157 // constructors and seeding functions 158 explicit subtract_with_carry_engine(result_type value = default_seed); 159 template<class Sseq> explicit subtract_with_carry_engine(Sseq& q); 160 void seed(result_type value = default_seed); 161 template<class Sseq> void seed(Sseq& q); 162 163 // generating functions 164 result_type operator()(); 165 void discard(unsigned long long z); 166 }; 167 168 template<class UIntType, size_t w, size_t s, size_t r> 169 bool 170 operator==( 171 const subtract_with_carry_engine<UIntType, w, s, r>& x, 172 const subtract_with_carry_engine<UIntType, w, s, r>& y); 173 174 template<class UIntType, size_t w, size_t s, size_t r> 175 bool 176 operator!=( 177 const subtract_with_carry_engine<UIntType, w, s, r>& x, 178 const subtract_with_carry_engine<UIntType, w, s, r>& y); 179 180 template <class charT, class traits, 181 class UIntType, size_t w, size_t s, size_t r> 182 basic_ostream<charT, traits>& 183 operator<<(basic_ostream<charT, traits>& os, 184 const subtract_with_carry_engine<UIntType, w, s, r>& x); 185 186 template <class charT, class traits, 187 class UIntType, size_t w, size_t s, size_t r> 188 basic_istream<charT, traits>& 189 operator>>(basic_istream<charT, traits>& is, 190 subtract_with_carry_engine<UIntType, w, s, r>& x); 191 192 template<class Engine, size_t p, size_t r> 193 class discard_block_engine 194 { 195 public: 196 // types 197 typedef typename Engine::result_type result_type; 198 199 // engine characteristics 200 static constexpr size_t block_size = p; 201 static constexpr size_t used_block = r; 202 static constexpr result_type min() { return Engine::min(); } 203 static constexpr result_type max() { return Engine::max(); } 204 205 // constructors and seeding functions 206 discard_block_engine(); 207 explicit discard_block_engine(const Engine& e); 208 explicit discard_block_engine(Engine&& e); 209 explicit discard_block_engine(result_type s); 210 template<class Sseq> explicit discard_block_engine(Sseq& q); 211 void seed(); 212 void seed(result_type s); 213 template<class Sseq> void seed(Sseq& q); 214 215 // generating functions 216 result_type operator()(); 217 void discard(unsigned long long z); 218 219 // property functions 220 const Engine& base() const noexcept; 221 }; 222 223 template<class Engine, size_t p, size_t r> 224 bool 225 operator==( 226 const discard_block_engine<Engine, p, r>& x, 227 const discard_block_engine<Engine, p, r>& y); 228 229 template<class Engine, size_t p, size_t r> 230 bool 231 operator!=( 232 const discard_block_engine<Engine, p, r>& x, 233 const discard_block_engine<Engine, p, r>& y); 234 235 template <class charT, class traits, 236 class Engine, size_t p, size_t r> 237 basic_ostream<charT, traits>& 238 operator<<(basic_ostream<charT, traits>& os, 239 const discard_block_engine<Engine, p, r>& x); 240 241 template <class charT, class traits, 242 class Engine, size_t p, size_t r> 243 basic_istream<charT, traits>& 244 operator>>(basic_istream<charT, traits>& is, 245 discard_block_engine<Engine, p, r>& x); 246 247 template<class Engine, size_t w, class UIntType> 248 class independent_bits_engine 249 { 250 public: 251 // types 252 typedef UIntType result_type; 253 254 // engine characteristics 255 static constexpr result_type min() { return 0; } 256 static constexpr result_type max() { return 2^w - 1; } 257 258 // constructors and seeding functions 259 independent_bits_engine(); 260 explicit independent_bits_engine(const Engine& e); 261 explicit independent_bits_engine(Engine&& e); 262 explicit independent_bits_engine(result_type s); 263 template<class Sseq> explicit independent_bits_engine(Sseq& q); 264 void seed(); 265 void seed(result_type s); 266 template<class Sseq> void seed(Sseq& q); 267 268 // generating functions 269 result_type operator()(); void discard(unsigned long long z); 270 271 // property functions 272 const Engine& base() const noexcept; 273 }; 274 275 template<class Engine, size_t w, class UIntType> 276 bool 277 operator==( 278 const independent_bits_engine<Engine, w, UIntType>& x, 279 const independent_bits_engine<Engine, w, UIntType>& y); 280 281 template<class Engine, size_t w, class UIntType> 282 bool 283 operator!=( 284 const independent_bits_engine<Engine, w, UIntType>& x, 285 const independent_bits_engine<Engine, w, UIntType>& y); 286 287 template <class charT, class traits, 288 class Engine, size_t w, class UIntType> 289 basic_ostream<charT, traits>& 290 operator<<(basic_ostream<charT, traits>& os, 291 const independent_bits_engine<Engine, w, UIntType>& x); 292 293 template <class charT, class traits, 294 class Engine, size_t w, class UIntType> 295 basic_istream<charT, traits>& 296 operator>>(basic_istream<charT, traits>& is, 297 independent_bits_engine<Engine, w, UIntType>& x); 298 299 template<class Engine, size_t k> 300 class shuffle_order_engine 301 { 302 public: 303 // types 304 typedef typename Engine::result_type result_type; 305 306 // engine characteristics 307 static constexpr size_t table_size = k; 308 static constexpr result_type min() { return Engine::min; } 309 static constexpr result_type max() { return Engine::max; } 310 311 // constructors and seeding functions 312 shuffle_order_engine(); 313 explicit shuffle_order_engine(const Engine& e); 314 explicit shuffle_order_engine(Engine&& e); 315 explicit shuffle_order_engine(result_type s); 316 template<class Sseq> explicit shuffle_order_engine(Sseq& q); 317 void seed(); 318 void seed(result_type s); 319 template<class Sseq> void seed(Sseq& q); 320 321 // generating functions 322 result_type operator()(); 323 void discard(unsigned long long z); 324 325 // property functions 326 const Engine& base() const noexcept; 327 }; 328 329 template<class Engine, size_t k> 330 bool 331 operator==( 332 const shuffle_order_engine<Engine, k>& x, 333 const shuffle_order_engine<Engine, k>& y); 334 335 template<class Engine, size_t k> 336 bool 337 operator!=( 338 const shuffle_order_engine<Engine, k>& x, 339 const shuffle_order_engine<Engine, k>& y); 340 341 template <class charT, class traits, 342 class Engine, size_t k> 343 basic_ostream<charT, traits>& 344 operator<<(basic_ostream<charT, traits>& os, 345 const shuffle_order_engine<Engine, k>& x); 346 347 template <class charT, class traits, 348 class Engine, size_t k> 349 basic_istream<charT, traits>& 350 operator>>(basic_istream<charT, traits>& is, 351 shuffle_order_engine<Engine, k>& x); 352 353 typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> 354 minstd_rand0; 355 typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647> 356 minstd_rand; 357 typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31, 358 0x9908b0df, 359 11, 0xffffffff, 360 7, 0x9d2c5680, 361 15, 0xefc60000, 362 18, 1812433253> mt19937; 363 typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31, 364 0xb5026f5aa96619e9, 365 29, 0x5555555555555555, 366 17, 0x71d67fffeda60000, 367 37, 0xfff7eee000000000, 368 43, 6364136223846793005> mt19937_64; 369 typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base; 370 typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base; 371 typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; 372 typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; 373 typedef shuffle_order_engine<minstd_rand0, 256> knuth_b; 374 typedef minstd_rand default_random_engine; 375 376 // Generators 377 378 class random_device 379 { 380 public: 381 // types 382 typedef unsigned int result_type; 383 384 // generator characteristics 385 static constexpr result_type min() { return numeric_limits<result_type>::min(); } 386 static constexpr result_type max() { return numeric_limits<result_type>::max(); } 387 388 // constructors 389 explicit random_device(const string& token = "/dev/urandom"); 390 391 // generating functions 392 result_type operator()(); 393 394 // property functions 395 double entropy() const noexcept; 396 397 // no copy functions 398 random_device(const random_device& ) = delete; 399 void operator=(const random_device& ) = delete; 400 }; 401 402 // Utilities 403 404 class seed_seq 405 { 406 public: 407 // types 408 typedef uint_least32_t result_type; 409 410 // constructors 411 seed_seq(); 412 template<class T> 413 seed_seq(initializer_list<T> il); 414 template<class InputIterator> 415 seed_seq(InputIterator begin, InputIterator end); 416 417 // generating functions 418 template<class RandomAccessIterator> 419 void generate(RandomAccessIterator begin, RandomAccessIterator end); 420 421 // property functions 422 size_t size() const; 423 template<class OutputIterator> 424 void param(OutputIterator dest) const; 425 426 // no copy functions 427 seed_seq(const seed_seq&) = delete; 428 void operator=(const seed_seq& ) = delete; 429 }; 430 431 template<class RealType, size_t bits, class URNG> 432 RealType generate_canonical(URNG& g); 433 434 // Distributions 435 436 template<class IntType = int> 437 class uniform_int_distribution 438 { 439 public: 440 // types 441 typedef IntType result_type; 442 443 class param_type 444 { 445 public: 446 typedef uniform_int_distribution distribution_type; 447 448 explicit param_type(IntType a = 0, 449 IntType b = numeric_limits<IntType>::max()); 450 451 result_type a() const; 452 result_type b() const; 453 454 friend bool operator==(const param_type& x, const param_type& y); 455 friend bool operator!=(const param_type& x, const param_type& y); 456 }; 457 458 // constructors and reset functions 459 explicit uniform_int_distribution(IntType a = 0, 460 IntType b = numeric_limits<IntType>::max()); 461 explicit uniform_int_distribution(const param_type& parm); 462 void reset(); 463 464 // generating functions 465 template<class URNG> result_type operator()(URNG& g); 466 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 467 468 // property functions 469 result_type a() const; 470 result_type b() const; 471 472 param_type param() const; 473 void param(const param_type& parm); 474 475 result_type min() const; 476 result_type max() const; 477 478 friend bool operator==(const uniform_int_distribution& x, 479 const uniform_int_distribution& y); 480 friend bool operator!=(const uniform_int_distribution& x, 481 const uniform_int_distribution& y); 482 483 template <class charT, class traits> 484 friend 485 basic_ostream<charT, traits>& 486 operator<<(basic_ostream<charT, traits>& os, 487 const uniform_int_distribution& x); 488 489 template <class charT, class traits> 490 friend 491 basic_istream<charT, traits>& 492 operator>>(basic_istream<charT, traits>& is, 493 uniform_int_distribution& x); 494 }; 495 496 template<class RealType = double> 497 class uniform_real_distribution 498 { 499 public: 500 // types 501 typedef RealType result_type; 502 503 class param_type 504 { 505 public: 506 typedef uniform_real_distribution distribution_type; 507 508 explicit param_type(RealType a = 0, 509 RealType b = 1); 510 511 result_type a() const; 512 result_type b() const; 513 514 friend bool operator==(const param_type& x, const param_type& y); 515 friend bool operator!=(const param_type& x, const param_type& y); 516 }; 517 518 // constructors and reset functions 519 explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0); 520 explicit uniform_real_distribution(const param_type& parm); 521 void reset(); 522 523 // generating functions 524 template<class URNG> result_type operator()(URNG& g); 525 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 526 527 // property functions 528 result_type a() const; 529 result_type b() const; 530 531 param_type param() const; 532 void param(const param_type& parm); 533 534 result_type min() const; 535 result_type max() const; 536 537 friend bool operator==(const uniform_real_distribution& x, 538 const uniform_real_distribution& y); 539 friend bool operator!=(const uniform_real_distribution& x, 540 const uniform_real_distribution& y); 541 542 template <class charT, class traits> 543 friend 544 basic_ostream<charT, traits>& 545 operator<<(basic_ostream<charT, traits>& os, 546 const uniform_real_distribution& x); 547 548 template <class charT, class traits> 549 friend 550 basic_istream<charT, traits>& 551 operator>>(basic_istream<charT, traits>& is, 552 uniform_real_distribution& x); 553 }; 554 555 class bernoulli_distribution 556 { 557 public: 558 // types 559 typedef bool result_type; 560 561 class param_type 562 { 563 public: 564 typedef bernoulli_distribution distribution_type; 565 566 explicit param_type(double p = 0.5); 567 568 double p() const; 569 570 friend bool operator==(const param_type& x, const param_type& y); 571 friend bool operator!=(const param_type& x, const param_type& y); 572 }; 573 574 // constructors and reset functions 575 explicit bernoulli_distribution(double p = 0.5); 576 explicit bernoulli_distribution(const param_type& parm); 577 void reset(); 578 579 // generating functions 580 template<class URNG> result_type operator()(URNG& g); 581 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 582 583 // property functions 584 double p() const; 585 586 param_type param() const; 587 void param(const param_type& parm); 588 589 result_type min() const; 590 result_type max() const; 591 592 friend bool operator==(const bernoulli_distribution& x, 593 const bernoulli_distribution& y); 594 friend bool operator!=(const bernoulli_distribution& x, 595 const bernoulli_distribution& y); 596 597 template <class charT, class traits> 598 friend 599 basic_ostream<charT, traits>& 600 operator<<(basic_ostream<charT, traits>& os, 601 const bernoulli_distribution& x); 602 603 template <class charT, class traits> 604 friend 605 basic_istream<charT, traits>& 606 operator>>(basic_istream<charT, traits>& is, 607 bernoulli_distribution& x); 608 }; 609 610 template<class IntType = int> 611 class binomial_distribution 612 { 613 public: 614 // types 615 typedef IntType result_type; 616 617 class param_type 618 { 619 public: 620 typedef binomial_distribution distribution_type; 621 622 explicit param_type(IntType t = 1, double p = 0.5); 623 624 IntType t() const; 625 double p() const; 626 627 friend bool operator==(const param_type& x, const param_type& y); 628 friend bool operator!=(const param_type& x, const param_type& y); 629 }; 630 631 // constructors and reset functions 632 explicit binomial_distribution(IntType t = 1, double p = 0.5); 633 explicit binomial_distribution(const param_type& parm); 634 void reset(); 635 636 // generating functions 637 template<class URNG> result_type operator()(URNG& g); 638 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 639 640 // property functions 641 IntType t() const; 642 double p() const; 643 644 param_type param() const; 645 void param(const param_type& parm); 646 647 result_type min() const; 648 result_type max() const; 649 650 friend bool operator==(const binomial_distribution& x, 651 const binomial_distribution& y); 652 friend bool operator!=(const binomial_distribution& x, 653 const binomial_distribution& y); 654 655 template <class charT, class traits> 656 friend 657 basic_ostream<charT, traits>& 658 operator<<(basic_ostream<charT, traits>& os, 659 const binomial_distribution& x); 660 661 template <class charT, class traits> 662 friend 663 basic_istream<charT, traits>& 664 operator>>(basic_istream<charT, traits>& is, 665 binomial_distribution& x); 666 }; 667 668 template<class IntType = int> 669 class geometric_distribution 670 { 671 public: 672 // types 673 typedef IntType result_type; 674 675 class param_type 676 { 677 public: 678 typedef geometric_distribution distribution_type; 679 680 explicit param_type(double p = 0.5); 681 682 double p() const; 683 684 friend bool operator==(const param_type& x, const param_type& y); 685 friend bool operator!=(const param_type& x, const param_type& y); 686 }; 687 688 // constructors and reset functions 689 explicit geometric_distribution(double p = 0.5); 690 explicit geometric_distribution(const param_type& parm); 691 void reset(); 692 693 // generating functions 694 template<class URNG> result_type operator()(URNG& g); 695 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 696 697 // property functions 698 double p() const; 699 700 param_type param() const; 701 void param(const param_type& parm); 702 703 result_type min() const; 704 result_type max() const; 705 706 friend bool operator==(const geometric_distribution& x, 707 const geometric_distribution& y); 708 friend bool operator!=(const geometric_distribution& x, 709 const geometric_distribution& y); 710 711 template <class charT, class traits> 712 friend 713 basic_ostream<charT, traits>& 714 operator<<(basic_ostream<charT, traits>& os, 715 const geometric_distribution& x); 716 717 template <class charT, class traits> 718 friend 719 basic_istream<charT, traits>& 720 operator>>(basic_istream<charT, traits>& is, 721 geometric_distribution& x); 722 }; 723 724 template<class IntType = int> 725 class negative_binomial_distribution 726 { 727 public: 728 // types 729 typedef IntType result_type; 730 731 class param_type 732 { 733 public: 734 typedef negative_binomial_distribution distribution_type; 735 736 explicit param_type(result_type k = 1, double p = 0.5); 737 738 result_type k() const; 739 double p() const; 740 741 friend bool operator==(const param_type& x, const param_type& y); 742 friend bool operator!=(const param_type& x, const param_type& y); 743 }; 744 745 // constructor and reset functions 746 explicit negative_binomial_distribution(result_type k = 1, double p = 0.5); 747 explicit negative_binomial_distribution(const param_type& parm); 748 void reset(); 749 750 // generating functions 751 template<class URNG> result_type operator()(URNG& g); 752 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 753 754 // property functions 755 result_type k() const; 756 double p() const; 757 758 param_type param() const; 759 void param(const param_type& parm); 760 761 result_type min() const; 762 result_type max() const; 763 764 friend bool operator==(const negative_binomial_distribution& x, 765 const negative_binomial_distribution& y); 766 friend bool operator!=(const negative_binomial_distribution& x, 767 const negative_binomial_distribution& y); 768 769 template <class charT, class traits> 770 friend 771 basic_ostream<charT, traits>& 772 operator<<(basic_ostream<charT, traits>& os, 773 const negative_binomial_distribution& x); 774 775 template <class charT, class traits> 776 friend 777 basic_istream<charT, traits>& 778 operator>>(basic_istream<charT, traits>& is, 779 negative_binomial_distribution& x); 780 }; 781 782 template<class IntType = int> 783 class poisson_distribution 784 { 785 public: 786 // types 787 typedef IntType result_type; 788 789 class param_type 790 { 791 public: 792 typedef poisson_distribution distribution_type; 793 794 explicit param_type(double mean = 1.0); 795 796 double mean() const; 797 798 friend bool operator==(const param_type& x, const param_type& y); 799 friend bool operator!=(const param_type& x, const param_type& y); 800 }; 801 802 // constructors and reset functions 803 explicit poisson_distribution(double mean = 1.0); 804 explicit poisson_distribution(const param_type& parm); 805 void reset(); 806 807 // generating functions 808 template<class URNG> result_type operator()(URNG& g); 809 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 810 811 // property functions 812 double mean() const; 813 814 param_type param() const; 815 void param(const param_type& parm); 816 817 result_type min() const; 818 result_type max() const; 819 820 friend bool operator==(const poisson_distribution& x, 821 const poisson_distribution& y); 822 friend bool operator!=(const poisson_distribution& x, 823 const poisson_distribution& y); 824 825 template <class charT, class traits> 826 friend 827 basic_ostream<charT, traits>& 828 operator<<(basic_ostream<charT, traits>& os, 829 const poisson_distribution& x); 830 831 template <class charT, class traits> 832 friend 833 basic_istream<charT, traits>& 834 operator>>(basic_istream<charT, traits>& is, 835 poisson_distribution& x); 836 }; 837 838 template<class RealType = double> 839 class exponential_distribution 840 { 841 public: 842 // types 843 typedef RealType result_type; 844 845 class param_type 846 { 847 public: 848 typedef exponential_distribution distribution_type; 849 850 explicit param_type(result_type lambda = 1.0); 851 852 result_type lambda() const; 853 854 friend bool operator==(const param_type& x, const param_type& y); 855 friend bool operator!=(const param_type& x, const param_type& y); 856 }; 857 858 // constructors and reset functions 859 explicit exponential_distribution(result_type lambda = 1.0); 860 explicit exponential_distribution(const param_type& parm); 861 void reset(); 862 863 // generating functions 864 template<class URNG> result_type operator()(URNG& g); 865 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 866 867 // property functions 868 result_type lambda() const; 869 870 param_type param() const; 871 void param(const param_type& parm); 872 873 result_type min() const; 874 result_type max() const; 875 876 friend bool operator==(const exponential_distribution& x, 877 const exponential_distribution& y); 878 friend bool operator!=(const exponential_distribution& x, 879 const exponential_distribution& y); 880 881 template <class charT, class traits> 882 friend 883 basic_ostream<charT, traits>& 884 operator<<(basic_ostream<charT, traits>& os, 885 const exponential_distribution& x); 886 887 template <class charT, class traits> 888 friend 889 basic_istream<charT, traits>& 890 operator>>(basic_istream<charT, traits>& is, 891 exponential_distribution& x); 892 }; 893 894 template<class RealType = double> 895 class gamma_distribution 896 { 897 public: 898 // types 899 typedef RealType result_type; 900 901 class param_type 902 { 903 public: 904 typedef gamma_distribution distribution_type; 905 906 explicit param_type(result_type alpha = 1, result_type beta = 1); 907 908 result_type alpha() const; 909 result_type beta() const; 910 911 friend bool operator==(const param_type& x, const param_type& y); 912 friend bool operator!=(const param_type& x, const param_type& y); 913 }; 914 915 // constructors and reset functions 916 explicit gamma_distribution(result_type alpha = 1, result_type beta = 1); 917 explicit gamma_distribution(const param_type& parm); 918 void reset(); 919 920 // generating functions 921 template<class URNG> result_type operator()(URNG& g); 922 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 923 924 // property functions 925 result_type alpha() const; 926 result_type beta() const; 927 928 param_type param() const; 929 void param(const param_type& parm); 930 931 result_type min() const; 932 result_type max() const; 933 934 friend bool operator==(const gamma_distribution& x, 935 const gamma_distribution& y); 936 friend bool operator!=(const gamma_distribution& x, 937 const gamma_distribution& y); 938 939 template <class charT, class traits> 940 friend 941 basic_ostream<charT, traits>& 942 operator<<(basic_ostream<charT, traits>& os, 943 const gamma_distribution& x); 944 945 template <class charT, class traits> 946 friend 947 basic_istream<charT, traits>& 948 operator>>(basic_istream<charT, traits>& is, 949 gamma_distribution& x); 950 }; 951 952 template<class RealType = double> 953 class weibull_distribution 954 { 955 public: 956 // types 957 typedef RealType result_type; 958 959 class param_type 960 { 961 public: 962 typedef weibull_distribution distribution_type; 963 964 explicit param_type(result_type alpha = 1, result_type beta = 1); 965 966 result_type a() const; 967 result_type b() const; 968 969 friend bool operator==(const param_type& x, const param_type& y); 970 friend bool operator!=(const param_type& x, const param_type& y); 971 }; 972 973 // constructor and reset functions 974 explicit weibull_distribution(result_type a = 1, result_type b = 1); 975 explicit weibull_distribution(const param_type& parm); 976 void reset(); 977 978 // generating functions 979 template<class URNG> result_type operator()(URNG& g); 980 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 981 982 // property functions 983 result_type a() const; 984 result_type b() const; 985 986 param_type param() const; 987 void param(const param_type& parm); 988 989 result_type min() const; 990 result_type max() const; 991 992 friend bool operator==(const weibull_distribution& x, 993 const weibull_distribution& y); 994 friend bool operator!=(const weibull_distribution& x, 995 const weibull_distribution& y); 996 997 template <class charT, class traits> 998 friend 999 basic_ostream<charT, traits>& 1000 operator<<(basic_ostream<charT, traits>& os, 1001 const weibull_distribution& x); 1002 1003 template <class charT, class traits> 1004 friend 1005 basic_istream<charT, traits>& 1006 operator>>(basic_istream<charT, traits>& is, 1007 weibull_distribution& x); 1008 }; 1009 1010 template<class RealType = double> 1011 class extreme_value_distribution 1012 { 1013 public: 1014 // types 1015 typedef RealType result_type; 1016 1017 class param_type 1018 { 1019 public: 1020 typedef extreme_value_distribution distribution_type; 1021 1022 explicit param_type(result_type a = 0, result_type b = 1); 1023 1024 result_type a() const; 1025 result_type b() const; 1026 1027 friend bool operator==(const param_type& x, const param_type& y); 1028 friend bool operator!=(const param_type& x, const param_type& y); 1029 }; 1030 1031 // constructor and reset functions 1032 explicit extreme_value_distribution(result_type a = 0, result_type b = 1); 1033 explicit extreme_value_distribution(const param_type& parm); 1034 void reset(); 1035 1036 // generating functions 1037 template<class URNG> result_type operator()(URNG& g); 1038 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 1039 1040 // property functions 1041 result_type a() const; 1042 result_type b() const; 1043 1044 param_type param() const; 1045 void param(const param_type& parm); 1046 1047 result_type min() const; 1048 result_type max() const; 1049 1050 friend bool operator==(const extreme_value_distribution& x, 1051 const extreme_value_distribution& y); 1052 friend bool operator!=(const extreme_value_distribution& x, 1053 const extreme_value_distribution& y); 1054 1055 template <class charT, class traits> 1056 friend 1057 basic_ostream<charT, traits>& 1058 operator<<(basic_ostream<charT, traits>& os, 1059 const extreme_value_distribution& x); 1060 1061 template <class charT, class traits> 1062 friend 1063 basic_istream<charT, traits>& 1064 operator>>(basic_istream<charT, traits>& is, 1065 extreme_value_distribution& x); 1066 }; 1067 1068 template<class RealType = double> 1069 class normal_distribution 1070 { 1071 public: 1072 // types 1073 typedef RealType result_type; 1074 1075 class param_type 1076 { 1077 public: 1078 typedef normal_distribution distribution_type; 1079 1080 explicit param_type(result_type mean = 0, result_type stddev = 1); 1081 1082 result_type mean() const; 1083 result_type stddev() const; 1084 1085 friend bool operator==(const param_type& x, const param_type& y); 1086 friend bool operator!=(const param_type& x, const param_type& y); 1087 }; 1088 1089 // constructors and reset functions 1090 explicit normal_distribution(result_type mean = 0, result_type stddev = 1); 1091 explicit normal_distribution(const param_type& parm); 1092 void reset(); 1093 1094 // generating functions 1095 template<class URNG> result_type operator()(URNG& g); 1096 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 1097 1098 // property functions 1099 result_type mean() const; 1100 result_type stddev() const; 1101 1102 param_type param() const; 1103 void param(const param_type& parm); 1104 1105 result_type min() const; 1106 result_type max() const; 1107 1108 friend bool operator==(const normal_distribution& x, 1109 const normal_distribution& y); 1110 friend bool operator!=(const normal_distribution& x, 1111 const normal_distribution& y); 1112 1113 template <class charT, class traits> 1114 friend 1115 basic_ostream<charT, traits>& 1116 operator<<(basic_ostream<charT, traits>& os, 1117 const normal_distribution& x); 1118 1119 template <class charT, class traits> 1120 friend 1121 basic_istream<charT, traits>& 1122 operator>>(basic_istream<charT, traits>& is, 1123 normal_distribution& x); 1124 }; 1125 1126 template<class RealType = double> 1127 class lognormal_distribution 1128 { 1129 public: 1130 // types 1131 typedef RealType result_type; 1132 1133 class param_type 1134 { 1135 public: 1136 typedef lognormal_distribution distribution_type; 1137 1138 explicit param_type(result_type m = 0, result_type s = 1); 1139 1140 result_type m() const; 1141 result_type s() const; 1142 1143 friend bool operator==(const param_type& x, const param_type& y); 1144 friend bool operator!=(const param_type& x, const param_type& y); 1145 }; 1146 1147 // constructor and reset functions 1148 explicit lognormal_distribution(result_type m = 0, result_type s = 1); 1149 explicit lognormal_distribution(const param_type& parm); 1150 void reset(); 1151 1152 // generating functions 1153 template<class URNG> result_type operator()(URNG& g); 1154 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 1155 1156 // property functions 1157 result_type m() const; 1158 result_type s() const; 1159 1160 param_type param() const; 1161 void param(const param_type& parm); 1162 1163 result_type min() const; 1164 result_type max() const; 1165 1166 friend bool operator==(const lognormal_distribution& x, 1167 const lognormal_distribution& y); 1168 friend bool operator!=(const lognormal_distribution& x, 1169 const lognormal_distribution& y); 1170 1171 template <class charT, class traits> 1172 friend 1173 basic_ostream<charT, traits>& 1174 operator<<(basic_ostream<charT, traits>& os, 1175 const lognormal_distribution& x); 1176 1177 template <class charT, class traits> 1178 friend 1179 basic_istream<charT, traits>& 1180 operator>>(basic_istream<charT, traits>& is, 1181 lognormal_distribution& x); 1182 }; 1183 1184 template<class RealType = double> 1185 class chi_squared_distribution 1186 { 1187 public: 1188 // types 1189 typedef RealType result_type; 1190 1191 class param_type 1192 { 1193 public: 1194 typedef chi_squared_distribution distribution_type; 1195 1196 explicit param_type(result_type n = 1); 1197 1198 result_type n() const; 1199 1200 friend bool operator==(const param_type& x, const param_type& y); 1201 friend bool operator!=(const param_type& x, const param_type& y); 1202 }; 1203 1204 // constructor and reset functions 1205 explicit chi_squared_distribution(result_type n = 1); 1206 explicit chi_squared_distribution(const param_type& parm); 1207 void reset(); 1208 1209 // generating functions 1210 template<class URNG> result_type operator()(URNG& g); 1211 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 1212 1213 // property functions 1214 result_type n() const; 1215 1216 param_type param() const; 1217 void param(const param_type& parm); 1218 1219 result_type min() const; 1220 result_type max() const; 1221 1222 friend bool operator==(const chi_squared_distribution& x, 1223 const chi_squared_distribution& y); 1224 friend bool operator!=(const chi_squared_distribution& x, 1225 const chi_squared_distribution& y); 1226 1227 template <class charT, class traits> 1228 friend 1229 basic_ostream<charT, traits>& 1230 operator<<(basic_ostream<charT, traits>& os, 1231 const chi_squared_distribution& x); 1232 1233 template <class charT, class traits> 1234 friend 1235 basic_istream<charT, traits>& 1236 operator>>(basic_istream<charT, traits>& is, 1237 chi_squared_distribution& x); 1238 }; 1239 1240 template<class RealType = double> 1241 class cauchy_distribution 1242 { 1243 public: 1244 // types 1245 typedef RealType result_type; 1246 1247 class param_type 1248 { 1249 public: 1250 typedef cauchy_distribution distribution_type; 1251 1252 explicit param_type(result_type a = 0, result_type b = 1); 1253 1254 result_type a() const; 1255 result_type b() const; 1256 1257 friend bool operator==(const param_type& x, const param_type& y); 1258 friend bool operator!=(const param_type& x, const param_type& y); 1259 }; 1260 1261 // constructor and reset functions 1262 explicit cauchy_distribution(result_type a = 0, result_type b = 1); 1263 explicit cauchy_distribution(const param_type& parm); 1264 void reset(); 1265 1266 // generating functions 1267 template<class URNG> result_type operator()(URNG& g); 1268 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 1269 1270 // property functions 1271 result_type a() const; 1272 result_type b() const; 1273 1274 param_type param() const; 1275 void param(const param_type& parm); 1276 1277 result_type min() const; 1278 result_type max() const; 1279 1280 friend bool operator==(const cauchy_distribution& x, 1281 const cauchy_distribution& y); 1282 friend bool operator!=(const cauchy_distribution& x, 1283 const cauchy_distribution& y); 1284 1285 template <class charT, class traits> 1286 friend 1287 basic_ostream<charT, traits>& 1288 operator<<(basic_ostream<charT, traits>& os, 1289 const cauchy_distribution& x); 1290 1291 template <class charT, class traits> 1292 friend 1293 basic_istream<charT, traits>& 1294 operator>>(basic_istream<charT, traits>& is, 1295 cauchy_distribution& x); 1296 }; 1297 1298 template<class RealType = double> 1299 class fisher_f_distribution 1300 { 1301 public: 1302 // types 1303 typedef RealType result_type; 1304 1305 class param_type 1306 { 1307 public: 1308 typedef fisher_f_distribution distribution_type; 1309 1310 explicit param_type(result_type m = 1, result_type n = 1); 1311 1312 result_type m() const; 1313 result_type n() const; 1314 1315 friend bool operator==(const param_type& x, const param_type& y); 1316 friend bool operator!=(const param_type& x, const param_type& y); 1317 }; 1318 1319 // constructor and reset functions 1320 explicit fisher_f_distribution(result_type m = 1, result_type n = 1); 1321 explicit fisher_f_distribution(const param_type& parm); 1322 void reset(); 1323 1324 // generating functions 1325 template<class URNG> result_type operator()(URNG& g); 1326 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 1327 1328 // property functions 1329 result_type m() const; 1330 result_type n() const; 1331 1332 param_type param() const; 1333 void param(const param_type& parm); 1334 1335 result_type min() const; 1336 result_type max() const; 1337 1338 friend bool operator==(const fisher_f_distribution& x, 1339 const fisher_f_distribution& y); 1340 friend bool operator!=(const fisher_f_distribution& x, 1341 const fisher_f_distribution& y); 1342 1343 template <class charT, class traits> 1344 friend 1345 basic_ostream<charT, traits>& 1346 operator<<(basic_ostream<charT, traits>& os, 1347 const fisher_f_distribution& x); 1348 1349 template <class charT, class traits> 1350 friend 1351 basic_istream<charT, traits>& 1352 operator>>(basic_istream<charT, traits>& is, 1353 fisher_f_distribution& x); 1354 }; 1355 1356 template<class RealType = double> 1357 class student_t_distribution 1358 { 1359 public: 1360 // types 1361 typedef RealType result_type; 1362 1363 class param_type 1364 { 1365 public: 1366 typedef student_t_distribution distribution_type; 1367 1368 explicit param_type(result_type n = 1); 1369 1370 result_type n() const; 1371 1372 friend bool operator==(const param_type& x, const param_type& y); 1373 friend bool operator!=(const param_type& x, const param_type& y); 1374 }; 1375 1376 // constructor and reset functions 1377 explicit student_t_distribution(result_type n = 1); 1378 explicit student_t_distribution(const param_type& parm); 1379 void reset(); 1380 1381 // generating functions 1382 template<class URNG> result_type operator()(URNG& g); 1383 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 1384 1385 // property functions 1386 result_type n() const; 1387 1388 param_type param() const; 1389 void param(const param_type& parm); 1390 1391 result_type min() const; 1392 result_type max() const; 1393 1394 friend bool operator==(const student_t_distribution& x, 1395 const student_t_distribution& y); 1396 friend bool operator!=(const student_t_distribution& x, 1397 const student_t_distribution& y); 1398 1399 template <class charT, class traits> 1400 friend 1401 basic_ostream<charT, traits>& 1402 operator<<(basic_ostream<charT, traits>& os, 1403 const student_t_distribution& x); 1404 1405 template <class charT, class traits> 1406 friend 1407 basic_istream<charT, traits>& 1408 operator>>(basic_istream<charT, traits>& is, 1409 student_t_distribution& x); 1410 }; 1411 1412 template<class IntType = int> 1413 class discrete_distribution 1414 { 1415 public: 1416 // types 1417 typedef IntType result_type; 1418 1419 class param_type 1420 { 1421 public: 1422 typedef discrete_distribution distribution_type; 1423 1424 param_type(); 1425 template<class InputIterator> 1426 param_type(InputIterator firstW, InputIterator lastW); 1427 param_type(initializer_list<double> wl); 1428 template<class UnaryOperation> 1429 param_type(size_t nw, double xmin, double xmax, UnaryOperation fw); 1430 1431 vector<double> probabilities() const; 1432 1433 friend bool operator==(const param_type& x, const param_type& y); 1434 friend bool operator!=(const param_type& x, const param_type& y); 1435 }; 1436 1437 // constructor and reset functions 1438 discrete_distribution(); 1439 template<class InputIterator> 1440 discrete_distribution(InputIterator firstW, InputIterator lastW); 1441 discrete_distribution(initializer_list<double> wl); 1442 template<class UnaryOperation> 1443 discrete_distribution(size_t nw, double xmin, double xmax, 1444 UnaryOperation fw); 1445 explicit discrete_distribution(const param_type& parm); 1446 void reset(); 1447 1448 // generating functions 1449 template<class URNG> result_type operator()(URNG& g); 1450 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 1451 1452 // property functions 1453 vector<double> probabilities() const; 1454 1455 param_type param() const; 1456 void param(const param_type& parm); 1457 1458 result_type min() const; 1459 result_type max() const; 1460 1461 friend bool operator==(const discrete_distribution& x, 1462 const discrete_distribution& y); 1463 friend bool operator!=(const discrete_distribution& x, 1464 const discrete_distribution& y); 1465 1466 template <class charT, class traits> 1467 friend 1468 basic_ostream<charT, traits>& 1469 operator<<(basic_ostream<charT, traits>& os, 1470 const discrete_distribution& x); 1471 1472 template <class charT, class traits> 1473 friend 1474 basic_istream<charT, traits>& 1475 operator>>(basic_istream<charT, traits>& is, 1476 discrete_distribution& x); 1477 }; 1478 1479 template<class RealType = double> 1480 class piecewise_constant_distribution 1481 { 1482 // types 1483 typedef RealType result_type; 1484 1485 class param_type 1486 { 1487 public: 1488 typedef piecewise_constant_distribution distribution_type; 1489 1490 param_type(); 1491 template<class InputIteratorB, class InputIteratorW> 1492 param_type(InputIteratorB firstB, InputIteratorB lastB, 1493 InputIteratorW firstW); 1494 template<class UnaryOperation> 1495 param_type(initializer_list<result_type> bl, UnaryOperation fw); 1496 template<class UnaryOperation> 1497 param_type(size_t nw, result_type xmin, result_type xmax, 1498 UnaryOperation fw); 1499 1500 vector<result_type> intervals() const; 1501 vector<result_type> densities() const; 1502 1503 friend bool operator==(const param_type& x, const param_type& y); 1504 friend bool operator!=(const param_type& x, const param_type& y); 1505 }; 1506 1507 // constructor and reset functions 1508 piecewise_constant_distribution(); 1509 template<class InputIteratorB, class InputIteratorW> 1510 piecewise_constant_distribution(InputIteratorB firstB, 1511 InputIteratorB lastB, 1512 InputIteratorW firstW); 1513 template<class UnaryOperation> 1514 piecewise_constant_distribution(initializer_list<result_type> bl, 1515 UnaryOperation fw); 1516 template<class UnaryOperation> 1517 piecewise_constant_distribution(size_t nw, result_type xmin, 1518 result_type xmax, UnaryOperation fw); 1519 explicit piecewise_constant_distribution(const param_type& parm); 1520 void reset(); 1521 1522 // generating functions 1523 template<class URNG> result_type operator()(URNG& g); 1524 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 1525 1526 // property functions 1527 vector<result_type> intervals() const; 1528 vector<result_type> densities() const; 1529 1530 param_type param() const; 1531 void param(const param_type& parm); 1532 1533 result_type min() const; 1534 result_type max() const; 1535 1536 friend bool operator==(const piecewise_constant_distribution& x, 1537 const piecewise_constant_distribution& y); 1538 friend bool operator!=(const piecewise_constant_distribution& x, 1539 const piecewise_constant_distribution& y); 1540 1541 template <class charT, class traits> 1542 friend 1543 basic_ostream<charT, traits>& 1544 operator<<(basic_ostream<charT, traits>& os, 1545 const piecewise_constant_distribution& x); 1546 1547 template <class charT, class traits> 1548 friend 1549 basic_istream<charT, traits>& 1550 operator>>(basic_istream<charT, traits>& is, 1551 piecewise_constant_distribution& x); 1552 }; 1553 1554 template<class RealType = double> 1555 class piecewise_linear_distribution 1556 { 1557 // types 1558 typedef RealType result_type; 1559 1560 class param_type 1561 { 1562 public: 1563 typedef piecewise_linear_distribution distribution_type; 1564 1565 param_type(); 1566 template<class InputIteratorB, class InputIteratorW> 1567 param_type(InputIteratorB firstB, InputIteratorB lastB, 1568 InputIteratorW firstW); 1569 template<class UnaryOperation> 1570 param_type(initializer_list<result_type> bl, UnaryOperation fw); 1571 template<class UnaryOperation> 1572 param_type(size_t nw, result_type xmin, result_type xmax, 1573 UnaryOperation fw); 1574 1575 vector<result_type> intervals() const; 1576 vector<result_type> densities() const; 1577 1578 friend bool operator==(const param_type& x, const param_type& y); 1579 friend bool operator!=(const param_type& x, const param_type& y); 1580 }; 1581 1582 // constructor and reset functions 1583 piecewise_linear_distribution(); 1584 template<class InputIteratorB, class InputIteratorW> 1585 piecewise_linear_distribution(InputIteratorB firstB, 1586 InputIteratorB lastB, 1587 InputIteratorW firstW); 1588 1589 template<class UnaryOperation> 1590 piecewise_linear_distribution(initializer_list<result_type> bl, 1591 UnaryOperation fw); 1592 1593 template<class UnaryOperation> 1594 piecewise_linear_distribution(size_t nw, result_type xmin, 1595 result_type xmax, UnaryOperation fw); 1596 1597 explicit piecewise_linear_distribution(const param_type& parm); 1598 void reset(); 1599 1600 // generating functions 1601 template<class URNG> result_type operator()(URNG& g); 1602 template<class URNG> result_type operator()(URNG& g, const param_type& parm); 1603 1604 // property functions 1605 vector<result_type> intervals() const; 1606 vector<result_type> densities() const; 1607 1608 param_type param() const; 1609 void param(const param_type& parm); 1610 1611 result_type min() const; 1612 result_type max() const; 1613 1614 friend bool operator==(const piecewise_linear_distribution& x, 1615 const piecewise_linear_distribution& y); 1616 friend bool operator!=(const piecewise_linear_distribution& x, 1617 const piecewise_linear_distribution& y); 1618 1619 template <class charT, class traits> 1620 friend 1621 basic_ostream<charT, traits>& 1622 operator<<(basic_ostream<charT, traits>& os, 1623 const piecewise_linear_distribution& x); 1624 1625 template <class charT, class traits> 1626 friend 1627 basic_istream<charT, traits>& 1628 operator>>(basic_istream<charT, traits>& is, 1629 piecewise_linear_distribution& x); 1630 }; 1631 1632 } // std 1633 */ 1634 1635 #include <__config> 1636 #include <cstddef> 1637 #include <cstdint> 1638 #include <cmath> 1639 #include <type_traits> 1640 #include <initializer_list> 1641 #include <limits> 1642 #include <algorithm> 1643 #include <numeric> 1644 #include <vector> 1645 #include <string> 1646 #include <istream> 1647 #include <ostream> 1648 1649 #include <__undef_min_max> 1650 1651 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1652 #pragma GCC system_header 1653 #endif 1654 1655 _LIBCPP_BEGIN_NAMESPACE_STD 1656 1657 // __is_seed_sequence 1658 1659 template <class _Sseq, class _Engine> 1660 struct __is_seed_sequence 1661 { 1662 static _LIBCPP_CONSTEXPR const bool value = 1663 !is_convertible<_Sseq, typename _Engine::result_type>::value && 1664 !is_same<typename remove_cv<_Sseq>::type, _Engine>::value; 1665 }; 1666 1667 // linear_congruential_engine 1668 1669 template <unsigned long long __a, unsigned long long __c, 1670 unsigned long long __m, unsigned long long _Mp, 1671 bool _MightOverflow = (__a != 0 && __m != 0 && __m-1 > (_Mp-__c)/__a)> 1672 struct __lce_ta; 1673 1674 // 64 1675 1676 template <unsigned long long __a, unsigned long long __c, unsigned long long __m> 1677 struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), true> 1678 { 1679 typedef unsigned long long result_type; 1680 _LIBCPP_INLINE_VISIBILITY 1681 static result_type next(result_type __x) 1682 { 1683 // Schrage's algorithm 1684 const result_type __q = __m / __a; 1685 const result_type __r = __m % __a; 1686 const result_type __t0 = __a * (__x % __q); 1687 const result_type __t1 = __r * (__x / __q); 1688 __x = __t0 + (__t0 < __t1) * __m - __t1; 1689 __x += __c - (__x >= __m - __c) * __m; 1690 return __x; 1691 } 1692 }; 1693 1694 template <unsigned long long __a, unsigned long long __m> 1695 struct __lce_ta<__a, 0, __m, (unsigned long long)(~0), true> 1696 { 1697 typedef unsigned long long result_type; 1698 _LIBCPP_INLINE_VISIBILITY 1699 static result_type next(result_type __x) 1700 { 1701 // Schrage's algorithm 1702 const result_type __q = __m / __a; 1703 const result_type __r = __m % __a; 1704 const result_type __t0 = __a * (__x % __q); 1705 const result_type __t1 = __r * (__x / __q); 1706 __x = __t0 + (__t0 < __t1) * __m - __t1; 1707 return __x; 1708 } 1709 }; 1710 1711 template <unsigned long long __a, unsigned long long __c, unsigned long long __m> 1712 struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), false> 1713 { 1714 typedef unsigned long long result_type; 1715 _LIBCPP_INLINE_VISIBILITY 1716 static result_type next(result_type __x) 1717 { 1718 return (__a * __x + __c) % __m; 1719 } 1720 }; 1721 1722 template <unsigned long long __a, unsigned long long __c> 1723 struct __lce_ta<__a, __c, 0, (unsigned long long)(~0), false> 1724 { 1725 typedef unsigned long long result_type; 1726 _LIBCPP_INLINE_VISIBILITY 1727 static result_type next(result_type __x) 1728 { 1729 return __a * __x + __c; 1730 } 1731 }; 1732 1733 // 32 1734 1735 template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp> 1736 struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), true> 1737 { 1738 typedef unsigned result_type; 1739 _LIBCPP_INLINE_VISIBILITY 1740 static result_type next(result_type __x) 1741 { 1742 const result_type __a = static_cast<result_type>(_Ap); 1743 const result_type __c = static_cast<result_type>(_Cp); 1744 const result_type __m = static_cast<result_type>(_Mp); 1745 // Schrage's algorithm 1746 const result_type __q = __m / __a; 1747 const result_type __r = __m % __a; 1748 const result_type __t0 = __a * (__x % __q); 1749 const result_type __t1 = __r * (__x / __q); 1750 __x = __t0 + (__t0 < __t1) * __m - __t1; 1751 __x += __c - (__x >= __m - __c) * __m; 1752 return __x; 1753 } 1754 }; 1755 1756 template <unsigned long long _Ap, unsigned long long _Mp> 1757 struct __lce_ta<_Ap, 0, _Mp, unsigned(~0), true> 1758 { 1759 typedef unsigned result_type; 1760 _LIBCPP_INLINE_VISIBILITY 1761 static result_type next(result_type __x) 1762 { 1763 const result_type __a = static_cast<result_type>(_Ap); 1764 const result_type __m = static_cast<result_type>(_Mp); 1765 // Schrage's algorithm 1766 const result_type __q = __m / __a; 1767 const result_type __r = __m % __a; 1768 const result_type __t0 = __a * (__x % __q); 1769 const result_type __t1 = __r * (__x / __q); 1770 __x = __t0 + (__t0 < __t1) * __m - __t1; 1771 return __x; 1772 } 1773 }; 1774 1775 template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp> 1776 struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), false> 1777 { 1778 typedef unsigned result_type; 1779 _LIBCPP_INLINE_VISIBILITY 1780 static result_type next(result_type __x) 1781 { 1782 const result_type __a = static_cast<result_type>(_Ap); 1783 const result_type __c = static_cast<result_type>(_Cp); 1784 const result_type __m = static_cast<result_type>(_Mp); 1785 return (__a * __x + __c) % __m; 1786 } 1787 }; 1788 1789 template <unsigned long long _Ap, unsigned long long _Cp> 1790 struct __lce_ta<_Ap, _Cp, 0, unsigned(~0), false> 1791 { 1792 typedef unsigned result_type; 1793 _LIBCPP_INLINE_VISIBILITY 1794 static result_type next(result_type __x) 1795 { 1796 const result_type __a = static_cast<result_type>(_Ap); 1797 const result_type __c = static_cast<result_type>(_Cp); 1798 return __a * __x + __c; 1799 } 1800 }; 1801 1802 // 16 1803 1804 template <unsigned long long __a, unsigned long long __c, unsigned long long __m, bool __b> 1805 struct __lce_ta<__a, __c, __m, (unsigned short)(~0), __b> 1806 { 1807 typedef unsigned short result_type; 1808 _LIBCPP_INLINE_VISIBILITY 1809 static result_type next(result_type __x) 1810 { 1811 return static_cast<result_type>(__lce_ta<__a, __c, __m, unsigned(~0)>::next(__x)); 1812 } 1813 }; 1814 1815 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 1816 class _LIBCPP_TYPE_VIS_ONLY linear_congruential_engine; 1817 1818 template <class _CharT, class _Traits, 1819 class _Up, _Up _Ap, _Up _Cp, _Up _Np> 1820 _LIBCPP_INLINE_VISIBILITY 1821 basic_ostream<_CharT, _Traits>& 1822 operator<<(basic_ostream<_CharT, _Traits>& __os, 1823 const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&); 1824 1825 template <class _CharT, class _Traits, 1826 class _Up, _Up _Ap, _Up _Cp, _Up _Np> 1827 basic_istream<_CharT, _Traits>& 1828 operator>>(basic_istream<_CharT, _Traits>& __is, 1829 linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x); 1830 1831 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 1832 class _LIBCPP_TYPE_VIS_ONLY linear_congruential_engine 1833 { 1834 public: 1835 // types 1836 typedef _UIntType result_type; 1837 1838 private: 1839 result_type __x_; 1840 1841 static _LIBCPP_CONSTEXPR const result_type _Mp = result_type(~0); 1842 1843 static_assert(__m == 0 || __a < __m, "linear_congruential_engine invalid parameters"); 1844 static_assert(__m == 0 || __c < __m, "linear_congruential_engine invalid parameters"); 1845 public: 1846 static _LIBCPP_CONSTEXPR const result_type _Min = __c == 0u ? 1u: 0u; 1847 static _LIBCPP_CONSTEXPR const result_type _Max = __m - 1u; 1848 static_assert(_Min < _Max, "linear_congruential_engine invalid parameters"); 1849 1850 // engine characteristics 1851 static _LIBCPP_CONSTEXPR const result_type multiplier = __a; 1852 static _LIBCPP_CONSTEXPR const result_type increment = __c; 1853 static _LIBCPP_CONSTEXPR const result_type modulus = __m; 1854 _LIBCPP_INLINE_VISIBILITY 1855 static _LIBCPP_CONSTEXPR result_type min() {return _Min;} 1856 _LIBCPP_INLINE_VISIBILITY 1857 static _LIBCPP_CONSTEXPR result_type max() {return _Max;} 1858 static _LIBCPP_CONSTEXPR const result_type default_seed = 1u; 1859 1860 // constructors and seeding functions 1861 _LIBCPP_INLINE_VISIBILITY 1862 explicit linear_congruential_engine(result_type __s = default_seed) 1863 {seed(__s);} 1864 template<class _Sseq> 1865 _LIBCPP_INLINE_VISIBILITY 1866 explicit linear_congruential_engine(_Sseq& __q, 1867 typename enable_if<__is_seed_sequence<_Sseq, linear_congruential_engine>::value>::type* = 0) 1868 {seed(__q);} 1869 _LIBCPP_INLINE_VISIBILITY 1870 void seed(result_type __s = default_seed) 1871 {seed(integral_constant<bool, __m == 0>(), 1872 integral_constant<bool, __c == 0>(), __s);} 1873 template<class _Sseq> 1874 _LIBCPP_INLINE_VISIBILITY 1875 typename enable_if 1876 < 1877 __is_seed_sequence<_Sseq, linear_congruential_engine>::value, 1878 void 1879 >::type 1880 seed(_Sseq& __q) 1881 {__seed(__q, integral_constant<unsigned, 1882 1 + (__m == 0 ? (sizeof(result_type) * __CHAR_BIT__ - 1)/32 1883 : (__m > 0x100000000ull))>());} 1884 1885 // generating functions 1886 _LIBCPP_INLINE_VISIBILITY 1887 result_type operator()() 1888 {return __x_ = static_cast<result_type>(__lce_ta<__a, __c, __m, _Mp>::next(__x_));} 1889 _LIBCPP_INLINE_VISIBILITY 1890 void discard(unsigned long long __z) {for (; __z; --__z) operator()();} 1891 1892 friend _LIBCPP_INLINE_VISIBILITY 1893 bool operator==(const linear_congruential_engine& __x, 1894 const linear_congruential_engine& __y) 1895 {return __x.__x_ == __y.__x_;} 1896 friend _LIBCPP_INLINE_VISIBILITY 1897 bool operator!=(const linear_congruential_engine& __x, 1898 const linear_congruential_engine& __y) 1899 {return !(__x == __y);} 1900 1901 private: 1902 1903 _LIBCPP_INLINE_VISIBILITY 1904 void seed(true_type, true_type, result_type __s) {__x_ = __s == 0 ? 1 : __s;} 1905 _LIBCPP_INLINE_VISIBILITY 1906 void seed(true_type, false_type, result_type __s) {__x_ = __s;} 1907 _LIBCPP_INLINE_VISIBILITY 1908 void seed(false_type, true_type, result_type __s) {__x_ = __s % __m == 0 ? 1909 1 : __s % __m;} 1910 _LIBCPP_INLINE_VISIBILITY 1911 void seed(false_type, false_type, result_type __s) {__x_ = __s % __m;} 1912 1913 template<class _Sseq> 1914 void __seed(_Sseq& __q, integral_constant<unsigned, 1>); 1915 template<class _Sseq> 1916 void __seed(_Sseq& __q, integral_constant<unsigned, 2>); 1917 1918 template <class _CharT, class _Traits, 1919 class _Up, _Up _Ap, _Up _Cp, _Up _Np> 1920 friend 1921 basic_ostream<_CharT, _Traits>& 1922 operator<<(basic_ostream<_CharT, _Traits>& __os, 1923 const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&); 1924 1925 template <class _CharT, class _Traits, 1926 class _Up, _Up _Ap, _Up _Cp, _Up _Np> 1927 friend 1928 basic_istream<_CharT, _Traits>& 1929 operator>>(basic_istream<_CharT, _Traits>& __is, 1930 linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x); 1931 }; 1932 1933 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 1934 _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type 1935 linear_congruential_engine<_UIntType, __a, __c, __m>::multiplier; 1936 1937 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 1938 _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type 1939 linear_congruential_engine<_UIntType, __a, __c, __m>::increment; 1940 1941 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 1942 _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type 1943 linear_congruential_engine<_UIntType, __a, __c, __m>::modulus; 1944 1945 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 1946 _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type 1947 linear_congruential_engine<_UIntType, __a, __c, __m>::default_seed; 1948 1949 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 1950 template<class _Sseq> 1951 void 1952 linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q, 1953 integral_constant<unsigned, 1>) 1954 { 1955 const unsigned __k = 1; 1956 uint32_t __ar[__k+3]; 1957 __q.generate(__ar, __ar + __k + 3); 1958 result_type __s = static_cast<result_type>(__ar[3] % __m); 1959 __x_ = __c == 0 && __s == 0 ? result_type(1) : __s; 1960 } 1961 1962 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 1963 template<class _Sseq> 1964 void 1965 linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q, 1966 integral_constant<unsigned, 2>) 1967 { 1968 const unsigned __k = 2; 1969 uint32_t __ar[__k+3]; 1970 __q.generate(__ar, __ar + __k + 3); 1971 result_type __s = static_cast<result_type>((__ar[3] + 1972 ((uint64_t)__ar[4] << 32)) % __m); 1973 __x_ = __c == 0 && __s == 0 ? result_type(1) : __s; 1974 } 1975 1976 template <class _CharT, class _Traits, 1977 class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 1978 inline _LIBCPP_INLINE_VISIBILITY 1979 basic_ostream<_CharT, _Traits>& 1980 operator<<(basic_ostream<_CharT, _Traits>& __os, 1981 const linear_congruential_engine<_UIntType, __a, __c, __m>& __x) 1982 { 1983 __save_flags<_CharT, _Traits> __lx(__os); 1984 __os.flags(ios_base::dec | ios_base::left); 1985 __os.fill(__os.widen(' ')); 1986 return __os << __x.__x_; 1987 } 1988 1989 template <class _CharT, class _Traits, 1990 class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 1991 basic_istream<_CharT, _Traits>& 1992 operator>>(basic_istream<_CharT, _Traits>& __is, 1993 linear_congruential_engine<_UIntType, __a, __c, __m>& __x) 1994 { 1995 __save_flags<_CharT, _Traits> __lx(__is); 1996 __is.flags(ios_base::dec | ios_base::skipws); 1997 _UIntType __t; 1998 __is >> __t; 1999 if (!__is.fail()) 2000 __x.__x_ = __t; 2001 return __is; 2002 } 2003 2004 typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> 2005 minstd_rand0; 2006 typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647> 2007 minstd_rand; 2008 typedef minstd_rand default_random_engine; 2009 // mersenne_twister_engine 2010 2011 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2012 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2013 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2014 class _LIBCPP_TYPE_VIS_ONLY mersenne_twister_engine; 2015 2016 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2017 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2018 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2019 bool 2020 operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2021 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2022 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2023 _Bp, _Tp, _Cp, _Lp, _Fp>& __y); 2024 2025 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2026 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2027 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2028 _LIBCPP_INLINE_VISIBILITY 2029 bool 2030 operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2031 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2032 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2033 _Bp, _Tp, _Cp, _Lp, _Fp>& __y); 2034 2035 template <class _CharT, class _Traits, 2036 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2037 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2038 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2039 basic_ostream<_CharT, _Traits>& 2040 operator<<(basic_ostream<_CharT, _Traits>& __os, 2041 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2042 _Bp, _Tp, _Cp, _Lp, _Fp>& __x); 2043 2044 template <class _CharT, class _Traits, 2045 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2046 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2047 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2048 basic_istream<_CharT, _Traits>& 2049 operator>>(basic_istream<_CharT, _Traits>& __is, 2050 mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2051 _Bp, _Tp, _Cp, _Lp, _Fp>& __x); 2052 2053 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2054 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2055 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2056 class _LIBCPP_TYPE_VIS_ONLY mersenne_twister_engine 2057 { 2058 public: 2059 // types 2060 typedef _UIntType result_type; 2061 2062 private: 2063 result_type __x_[__n]; 2064 size_t __i_; 2065 2066 static_assert( 0 < __m, "mersenne_twister_engine invalid parameters"); 2067 static_assert(__m <= __n, "mersenne_twister_engine invalid parameters"); 2068 static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; 2069 static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters"); 2070 static_assert( 2 <= __w, "mersenne_twister_engine invalid parameters"); 2071 static_assert(__r <= __w, "mersenne_twister_engine invalid parameters"); 2072 static_assert(__u <= __w, "mersenne_twister_engine invalid parameters"); 2073 static_assert(__s <= __w, "mersenne_twister_engine invalid parameters"); 2074 static_assert(__t <= __w, "mersenne_twister_engine invalid parameters"); 2075 static_assert(__l <= __w, "mersenne_twister_engine invalid parameters"); 2076 public: 2077 static _LIBCPP_CONSTEXPR const result_type _Min = 0; 2078 static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : 2079 (result_type(1) << __w) - result_type(1); 2080 static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters"); 2081 static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters"); 2082 static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters"); 2083 static_assert(__c <= _Max, "mersenne_twister_engine invalid parameters"); 2084 static_assert(__d <= _Max, "mersenne_twister_engine invalid parameters"); 2085 static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters"); 2086 2087 // engine characteristics 2088 static _LIBCPP_CONSTEXPR const size_t word_size = __w; 2089 static _LIBCPP_CONSTEXPR const size_t state_size = __n; 2090 static _LIBCPP_CONSTEXPR const size_t shift_size = __m; 2091 static _LIBCPP_CONSTEXPR const size_t mask_bits = __r; 2092 static _LIBCPP_CONSTEXPR const result_type xor_mask = __a; 2093 static _LIBCPP_CONSTEXPR const size_t tempering_u = __u; 2094 static _LIBCPP_CONSTEXPR const result_type tempering_d = __d; 2095 static _LIBCPP_CONSTEXPR const size_t tempering_s = __s; 2096 static _LIBCPP_CONSTEXPR const result_type tempering_b = __b; 2097 static _LIBCPP_CONSTEXPR const size_t tempering_t = __t; 2098 static _LIBCPP_CONSTEXPR const result_type tempering_c = __c; 2099 static _LIBCPP_CONSTEXPR const size_t tempering_l = __l; 2100 static _LIBCPP_CONSTEXPR const result_type initialization_multiplier = __f; 2101 _LIBCPP_INLINE_VISIBILITY 2102 static _LIBCPP_CONSTEXPR result_type min() { return _Min; } 2103 _LIBCPP_INLINE_VISIBILITY 2104 static _LIBCPP_CONSTEXPR result_type max() { return _Max; } 2105 static _LIBCPP_CONSTEXPR const result_type default_seed = 5489u; 2106 2107 // constructors and seeding functions 2108 _LIBCPP_INLINE_VISIBILITY 2109 explicit mersenne_twister_engine(result_type __sd = default_seed) 2110 {seed(__sd);} 2111 template<class _Sseq> 2112 _LIBCPP_INLINE_VISIBILITY 2113 explicit mersenne_twister_engine(_Sseq& __q, 2114 typename enable_if<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value>::type* = 0) 2115 {seed(__q);} 2116 void seed(result_type __sd = default_seed); 2117 template<class _Sseq> 2118 _LIBCPP_INLINE_VISIBILITY 2119 typename enable_if 2120 < 2121 __is_seed_sequence<_Sseq, mersenne_twister_engine>::value, 2122 void 2123 >::type 2124 seed(_Sseq& __q) 2125 {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} 2126 2127 // generating functions 2128 result_type operator()(); 2129 _LIBCPP_INLINE_VISIBILITY 2130 void discard(unsigned long long __z) {for (; __z; --__z) operator()();} 2131 2132 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2133 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2134 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2135 friend 2136 bool 2137 operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2138 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2139 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2140 _Bp, _Tp, _Cp, _Lp, _Fp>& __y); 2141 2142 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2143 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2144 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2145 friend 2146 bool 2147 operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2148 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2149 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2150 _Bp, _Tp, _Cp, _Lp, _Fp>& __y); 2151 2152 template <class _CharT, class _Traits, 2153 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2154 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2155 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2156 friend 2157 basic_ostream<_CharT, _Traits>& 2158 operator<<(basic_ostream<_CharT, _Traits>& __os, 2159 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2160 _Bp, _Tp, _Cp, _Lp, _Fp>& __x); 2161 2162 template <class _CharT, class _Traits, 2163 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2164 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2165 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2166 friend 2167 basic_istream<_CharT, _Traits>& 2168 operator>>(basic_istream<_CharT, _Traits>& __is, 2169 mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2170 _Bp, _Tp, _Cp, _Lp, _Fp>& __x); 2171 private: 2172 2173 template<class _Sseq> 2174 void __seed(_Sseq& __q, integral_constant<unsigned, 1>); 2175 template<class _Sseq> 2176 void __seed(_Sseq& __q, integral_constant<unsigned, 2>); 2177 2178 template <size_t __count> 2179 _LIBCPP_INLINE_VISIBILITY 2180 static 2181 typename enable_if 2182 < 2183 __count < __w, 2184 result_type 2185 >::type 2186 __lshift(result_type __x) {return (__x << __count) & _Max;} 2187 2188 template <size_t __count> 2189 _LIBCPP_INLINE_VISIBILITY 2190 static 2191 typename enable_if 2192 < 2193 (__count >= __w), 2194 result_type 2195 >::type 2196 __lshift(result_type) {return result_type(0);} 2197 2198 template <size_t __count> 2199 _LIBCPP_INLINE_VISIBILITY 2200 static 2201 typename enable_if 2202 < 2203 __count < _Dt, 2204 result_type 2205 >::type 2206 __rshift(result_type __x) {return __x >> __count;} 2207 2208 template <size_t __count> 2209 _LIBCPP_INLINE_VISIBILITY 2210 static 2211 typename enable_if 2212 < 2213 (__count >= _Dt), 2214 result_type 2215 >::type 2216 __rshift(result_type) {return result_type(0);} 2217 }; 2218 2219 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2220 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2221 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2222 _LIBCPP_CONSTEXPR const size_t 2223 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::word_size; 2224 2225 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2226 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2227 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2228 _LIBCPP_CONSTEXPR const size_t 2229 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::state_size; 2230 2231 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2232 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2233 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2234 _LIBCPP_CONSTEXPR const size_t 2235 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::shift_size; 2236 2237 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2238 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2239 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2240 _LIBCPP_CONSTEXPR const size_t 2241 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::mask_bits; 2242 2243 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2244 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2245 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2246 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2247 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::xor_mask; 2248 2249 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2250 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2251 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2252 _LIBCPP_CONSTEXPR const size_t 2253 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_u; 2254 2255 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2256 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2257 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2258 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2259 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_d; 2260 2261 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2262 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2263 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2264 _LIBCPP_CONSTEXPR const size_t 2265 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_s; 2266 2267 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2268 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2269 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2270 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2271 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_b; 2272 2273 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2274 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2275 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2276 _LIBCPP_CONSTEXPR const size_t 2277 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_t; 2278 2279 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2280 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2281 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2282 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2283 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_c; 2284 2285 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2286 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2287 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2288 _LIBCPP_CONSTEXPR const size_t 2289 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_l; 2290 2291 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2292 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2293 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2294 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2295 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::initialization_multiplier; 2296 2297 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2298 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2299 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2300 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2301 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::default_seed; 2302 2303 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2304 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2305 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2306 void 2307 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, 2308 __t, __c, __l, __f>::seed(result_type __sd) 2309 { // __w >= 2 2310 __x_[0] = __sd & _Max; 2311 for (size_t __i = 1; __i < __n; ++__i) 2312 __x_[__i] = (__f * (__x_[__i-1] ^ __rshift<__w - 2>(__x_[__i-1])) + __i) & _Max; 2313 __i_ = 0; 2314 } 2315 2316 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2317 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2318 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2319 template<class _Sseq> 2320 void 2321 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, 2322 __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 1>) 2323 { 2324 const unsigned __k = 1; 2325 uint32_t __ar[__n * __k]; 2326 __q.generate(__ar, __ar + __n * __k); 2327 for (size_t __i = 0; __i < __n; ++__i) 2328 __x_[__i] = static_cast<result_type>(__ar[__i] & _Max); 2329 const result_type __mask = __r == _Dt ? result_type(~0) : 2330 (result_type(1) << __r) - result_type(1); 2331 __i_ = 0; 2332 if ((__x_[0] & ~__mask) == 0) 2333 { 2334 for (size_t __i = 1; __i < __n; ++__i) 2335 if (__x_[__i] != 0) 2336 return; 2337 __x_[0] = _Max; 2338 } 2339 } 2340 2341 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2342 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2343 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2344 template<class _Sseq> 2345 void 2346 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, 2347 __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 2>) 2348 { 2349 const unsigned __k = 2; 2350 uint32_t __ar[__n * __k]; 2351 __q.generate(__ar, __ar + __n * __k); 2352 for (size_t __i = 0; __i < __n; ++__i) 2353 __x_[__i] = static_cast<result_type>( 2354 (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); 2355 const result_type __mask = __r == _Dt ? result_type(~0) : 2356 (result_type(1) << __r) - result_type(1); 2357 __i_ = 0; 2358 if ((__x_[0] & ~__mask) == 0) 2359 { 2360 for (size_t __i = 1; __i < __n; ++__i) 2361 if (__x_[__i] != 0) 2362 return; 2363 __x_[0] = _Max; 2364 } 2365 } 2366 2367 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2368 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2369 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2370 _UIntType 2371 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, 2372 __t, __c, __l, __f>::operator()() 2373 { 2374 const size_t __j = (__i_ + 1) % __n; 2375 const result_type __mask = __r == _Dt ? result_type(~0) : 2376 (result_type(1) << __r) - result_type(1); 2377 const result_type _Yp = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask); 2378 const size_t __k = (__i_ + __m) % __n; 2379 __x_[__i_] = __x_[__k] ^ __rshift<1>(_Yp) ^ (__a * (_Yp & 1)); 2380 result_type __z = __x_[__i_] ^ (__rshift<__u>(__x_[__i_]) & __d); 2381 __i_ = __j; 2382 __z ^= __lshift<__s>(__z) & __b; 2383 __z ^= __lshift<__t>(__z) & __c; 2384 return __z ^ __rshift<__l>(__z); 2385 } 2386 2387 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2388 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2389 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2390 bool 2391 operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2392 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2393 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2394 _Bp, _Tp, _Cp, _Lp, _Fp>& __y) 2395 { 2396 if (__x.__i_ == __y.__i_) 2397 return _VSTD::equal(__x.__x_, __x.__x_ + _Np, __y.__x_); 2398 if (__x.__i_ == 0 || __y.__i_ == 0) 2399 { 2400 size_t __j = _VSTD::min(_Np - __x.__i_, _Np - __y.__i_); 2401 if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, 2402 __y.__x_ + __y.__i_)) 2403 return false; 2404 if (__x.__i_ == 0) 2405 return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Np, __y.__x_); 2406 return _VSTD::equal(__x.__x_, __x.__x_ + (_Np - __j), __y.__x_ + __j); 2407 } 2408 if (__x.__i_ < __y.__i_) 2409 { 2410 size_t __j = _Np - __y.__i_; 2411 if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), 2412 __y.__x_ + __y.__i_)) 2413 return false; 2414 if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Np, 2415 __y.__x_)) 2416 return false; 2417 return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, 2418 __y.__x_ + (_Np - (__x.__i_ + __j))); 2419 } 2420 size_t __j = _Np - __x.__i_; 2421 if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), 2422 __x.__x_ + __x.__i_)) 2423 return false; 2424 if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Np, 2425 __x.__x_)) 2426 return false; 2427 return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, 2428 __x.__x_ + (_Np - (__y.__i_ + __j))); 2429 } 2430 2431 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2432 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2433 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2434 inline _LIBCPP_INLINE_VISIBILITY 2435 bool 2436 operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2437 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2438 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2439 _Bp, _Tp, _Cp, _Lp, _Fp>& __y) 2440 { 2441 return !(__x == __y); 2442 } 2443 2444 template <class _CharT, class _Traits, 2445 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2446 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2447 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2448 basic_ostream<_CharT, _Traits>& 2449 operator<<(basic_ostream<_CharT, _Traits>& __os, 2450 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2451 _Bp, _Tp, _Cp, _Lp, _Fp>& __x) 2452 { 2453 __save_flags<_CharT, _Traits> __lx(__os); 2454 __os.flags(ios_base::dec | ios_base::left); 2455 _CharT __sp = __os.widen(' '); 2456 __os.fill(__sp); 2457 __os << __x.__x_[__x.__i_]; 2458 for (size_t __j = __x.__i_ + 1; __j < _Np; ++__j) 2459 __os << __sp << __x.__x_[__j]; 2460 for (size_t __j = 0; __j < __x.__i_; ++__j) 2461 __os << __sp << __x.__x_[__j]; 2462 return __os; 2463 } 2464 2465 template <class _CharT, class _Traits, 2466 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2467 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2468 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2469 basic_istream<_CharT, _Traits>& 2470 operator>>(basic_istream<_CharT, _Traits>& __is, 2471 mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2472 _Bp, _Tp, _Cp, _Lp, _Fp>& __x) 2473 { 2474 __save_flags<_CharT, _Traits> __lx(__is); 2475 __is.flags(ios_base::dec | ios_base::skipws); 2476 _UI __t[_Np]; 2477 for (size_t __i = 0; __i < _Np; ++__i) 2478 __is >> __t[__i]; 2479 if (!__is.fail()) 2480 { 2481 for (size_t __i = 0; __i < _Np; ++__i) 2482 __x.__x_[__i] = __t[__i]; 2483 __x.__i_ = 0; 2484 } 2485 return __is; 2486 } 2487 2488 typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31, 2489 0x9908b0df, 11, 0xffffffff, 2490 7, 0x9d2c5680, 2491 15, 0xefc60000, 2492 18, 1812433253> mt19937; 2493 typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31, 2494 0xb5026f5aa96619e9ULL, 29, 0x5555555555555555ULL, 2495 17, 0x71d67fffeda60000ULL, 2496 37, 0xfff7eee000000000ULL, 2497 43, 6364136223846793005ULL> mt19937_64; 2498 2499 // subtract_with_carry_engine 2500 2501 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2502 class _LIBCPP_TYPE_VIS_ONLY subtract_with_carry_engine; 2503 2504 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2505 bool 2506 operator==( 2507 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2508 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); 2509 2510 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2511 _LIBCPP_INLINE_VISIBILITY 2512 bool 2513 operator!=( 2514 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2515 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); 2516 2517 template <class _CharT, class _Traits, 2518 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2519 basic_ostream<_CharT, _Traits>& 2520 operator<<(basic_ostream<_CharT, _Traits>& __os, 2521 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); 2522 2523 template <class _CharT, class _Traits, 2524 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2525 basic_istream<_CharT, _Traits>& 2526 operator>>(basic_istream<_CharT, _Traits>& __is, 2527 subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); 2528 2529 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2530 class _LIBCPP_TYPE_VIS_ONLY subtract_with_carry_engine 2531 { 2532 public: 2533 // types 2534 typedef _UIntType result_type; 2535 2536 private: 2537 result_type __x_[__r]; 2538 result_type __c_; 2539 size_t __i_; 2540 2541 static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; 2542 static_assert( 0 < __w, "subtract_with_carry_engine invalid parameters"); 2543 static_assert(__w <= _Dt, "subtract_with_carry_engine invalid parameters"); 2544 static_assert( 0 < __s, "subtract_with_carry_engine invalid parameters"); 2545 static_assert(__s < __r, "subtract_with_carry_engine invalid parameters"); 2546 public: 2547 static _LIBCPP_CONSTEXPR const result_type _Min = 0; 2548 static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : 2549 (result_type(1) << __w) - result_type(1); 2550 static_assert(_Min < _Max, "subtract_with_carry_engine invalid parameters"); 2551 2552 // engine characteristics 2553 static _LIBCPP_CONSTEXPR const size_t word_size = __w; 2554 static _LIBCPP_CONSTEXPR const size_t short_lag = __s; 2555 static _LIBCPP_CONSTEXPR const size_t long_lag = __r; 2556 _LIBCPP_INLINE_VISIBILITY 2557 static _LIBCPP_CONSTEXPR result_type min() { return _Min; } 2558 _LIBCPP_INLINE_VISIBILITY 2559 static _LIBCPP_CONSTEXPR result_type max() { return _Max; } 2560 static _LIBCPP_CONSTEXPR const result_type default_seed = 19780503u; 2561 2562 // constructors and seeding functions 2563 _LIBCPP_INLINE_VISIBILITY 2564 explicit subtract_with_carry_engine(result_type __sd = default_seed) 2565 {seed(__sd);} 2566 template<class _Sseq> 2567 _LIBCPP_INLINE_VISIBILITY 2568 explicit subtract_with_carry_engine(_Sseq& __q, 2569 typename enable_if<__is_seed_sequence<_Sseq, subtract_with_carry_engine>::value>::type* = 0) 2570 {seed(__q);} 2571 _LIBCPP_INLINE_VISIBILITY 2572 void seed(result_type __sd = default_seed) 2573 {seed(__sd, integral_constant<unsigned, 1 + (__w - 1) / 32>());} 2574 template<class _Sseq> 2575 _LIBCPP_INLINE_VISIBILITY 2576 typename enable_if 2577 < 2578 __is_seed_sequence<_Sseq, subtract_with_carry_engine>::value, 2579 void 2580 >::type 2581 seed(_Sseq& __q) 2582 {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} 2583 2584 // generating functions 2585 result_type operator()(); 2586 _LIBCPP_INLINE_VISIBILITY 2587 void discard(unsigned long long __z) {for (; __z; --__z) operator()();} 2588 2589 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2590 friend 2591 bool 2592 operator==( 2593 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2594 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); 2595 2596 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2597 friend 2598 bool 2599 operator!=( 2600 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2601 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); 2602 2603 template <class _CharT, class _Traits, 2604 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2605 friend 2606 basic_ostream<_CharT, _Traits>& 2607 operator<<(basic_ostream<_CharT, _Traits>& __os, 2608 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); 2609 2610 template <class _CharT, class _Traits, 2611 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2612 friend 2613 basic_istream<_CharT, _Traits>& 2614 operator>>(basic_istream<_CharT, _Traits>& __is, 2615 subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); 2616 2617 private: 2618 2619 void seed(result_type __sd, integral_constant<unsigned, 1>); 2620 void seed(result_type __sd, integral_constant<unsigned, 2>); 2621 template<class _Sseq> 2622 void __seed(_Sseq& __q, integral_constant<unsigned, 1>); 2623 template<class _Sseq> 2624 void __seed(_Sseq& __q, integral_constant<unsigned, 2>); 2625 }; 2626 2627 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2628 _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::word_size; 2629 2630 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2631 _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::short_lag; 2632 2633 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2634 _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::long_lag; 2635 2636 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2637 _LIBCPP_CONSTEXPR const typename subtract_with_carry_engine<_UIntType, __w, __s, __r>::result_type 2638 subtract_with_carry_engine<_UIntType, __w, __s, __r>::default_seed; 2639 2640 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2641 void 2642 subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, 2643 integral_constant<unsigned, 1>) 2644 { 2645 linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> 2646 __e(__sd == 0u ? default_seed : __sd); 2647 for (size_t __i = 0; __i < __r; ++__i) 2648 __x_[__i] = static_cast<result_type>(__e() & _Max); 2649 __c_ = __x_[__r-1] == 0; 2650 __i_ = 0; 2651 } 2652 2653 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2654 void 2655 subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, 2656 integral_constant<unsigned, 2>) 2657 { 2658 linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> 2659 __e(__sd == 0u ? default_seed : __sd); 2660 for (size_t __i = 0; __i < __r; ++__i) 2661 { 2662 result_type __e0 = __e(); 2663 __x_[__i] = static_cast<result_type>( 2664 (__e0 + ((uint64_t)__e() << 32)) & _Max); 2665 } 2666 __c_ = __x_[__r-1] == 0; 2667 __i_ = 0; 2668 } 2669 2670 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2671 template<class _Sseq> 2672 void 2673 subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, 2674 integral_constant<unsigned, 1>) 2675 { 2676 const unsigned __k = 1; 2677 uint32_t __ar[__r * __k]; 2678 __q.generate(__ar, __ar + __r * __k); 2679 for (size_t __i = 0; __i < __r; ++__i) 2680 __x_[__i] = static_cast<result_type>(__ar[__i] & _Max); 2681 __c_ = __x_[__r-1] == 0; 2682 __i_ = 0; 2683 } 2684 2685 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2686 template<class _Sseq> 2687 void 2688 subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, 2689 integral_constant<unsigned, 2>) 2690 { 2691 const unsigned __k = 2; 2692 uint32_t __ar[__r * __k]; 2693 __q.generate(__ar, __ar + __r * __k); 2694 for (size_t __i = 0; __i < __r; ++__i) 2695 __x_[__i] = static_cast<result_type>( 2696 (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); 2697 __c_ = __x_[__r-1] == 0; 2698 __i_ = 0; 2699 } 2700 2701 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2702 _UIntType 2703 subtract_with_carry_engine<_UIntType, __w, __s, __r>::operator()() 2704 { 2705 const result_type& __xs = __x_[(__i_ + (__r - __s)) % __r]; 2706 result_type& __xr = __x_[__i_]; 2707 result_type __new_c = __c_ == 0 ? __xs < __xr : __xs != 0 ? __xs <= __xr : 1; 2708 __xr = (__xs - __xr - __c_) & _Max; 2709 __c_ = __new_c; 2710 __i_ = (__i_ + 1) % __r; 2711 return __xr; 2712 } 2713 2714 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2715 bool 2716 operator==( 2717 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2718 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y) 2719 { 2720 if (__x.__c_ != __y.__c_) 2721 return false; 2722 if (__x.__i_ == __y.__i_) 2723 return _VSTD::equal(__x.__x_, __x.__x_ + _Rp, __y.__x_); 2724 if (__x.__i_ == 0 || __y.__i_ == 0) 2725 { 2726 size_t __j = _VSTD::min(_Rp - __x.__i_, _Rp - __y.__i_); 2727 if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, 2728 __y.__x_ + __y.__i_)) 2729 return false; 2730 if (__x.__i_ == 0) 2731 return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Rp, __y.__x_); 2732 return _VSTD::equal(__x.__x_, __x.__x_ + (_Rp - __j), __y.__x_ + __j); 2733 } 2734 if (__x.__i_ < __y.__i_) 2735 { 2736 size_t __j = _Rp - __y.__i_; 2737 if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), 2738 __y.__x_ + __y.__i_)) 2739 return false; 2740 if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Rp, 2741 __y.__x_)) 2742 return false; 2743 return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, 2744 __y.__x_ + (_Rp - (__x.__i_ + __j))); 2745 } 2746 size_t __j = _Rp - __x.__i_; 2747 if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), 2748 __x.__x_ + __x.__i_)) 2749 return false; 2750 if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Rp, 2751 __x.__x_)) 2752 return false; 2753 return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, 2754 __x.__x_ + (_Rp - (__y.__i_ + __j))); 2755 } 2756 2757 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2758 inline _LIBCPP_INLINE_VISIBILITY 2759 bool 2760 operator!=( 2761 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2762 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y) 2763 { 2764 return !(__x == __y); 2765 } 2766 2767 template <class _CharT, class _Traits, 2768 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2769 basic_ostream<_CharT, _Traits>& 2770 operator<<(basic_ostream<_CharT, _Traits>& __os, 2771 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x) 2772 { 2773 __save_flags<_CharT, _Traits> __lx(__os); 2774 __os.flags(ios_base::dec | ios_base::left); 2775 _CharT __sp = __os.widen(' '); 2776 __os.fill(__sp); 2777 __os << __x.__x_[__x.__i_]; 2778 for (size_t __j = __x.__i_ + 1; __j < _Rp; ++__j) 2779 __os << __sp << __x.__x_[__j]; 2780 for (size_t __j = 0; __j < __x.__i_; ++__j) 2781 __os << __sp << __x.__x_[__j]; 2782 __os << __sp << __x.__c_; 2783 return __os; 2784 } 2785 2786 template <class _CharT, class _Traits, 2787 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2788 basic_istream<_CharT, _Traits>& 2789 operator>>(basic_istream<_CharT, _Traits>& __is, 2790 subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x) 2791 { 2792 __save_flags<_CharT, _Traits> __lx(__is); 2793 __is.flags(ios_base::dec | ios_base::skipws); 2794 _UI __t[_Rp+1]; 2795 for (size_t __i = 0; __i < _Rp+1; ++__i) 2796 __is >> __t[__i]; 2797 if (!__is.fail()) 2798 { 2799 for (size_t __i = 0; __i < _Rp; ++__i) 2800 __x.__x_[__i] = __t[__i]; 2801 __x.__c_ = __t[_Rp]; 2802 __x.__i_ = 0; 2803 } 2804 return __is; 2805 } 2806 2807 typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base; 2808 typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base; 2809 2810 // discard_block_engine 2811 2812 template<class _Engine, size_t __p, size_t __r> 2813 class _LIBCPP_TYPE_VIS_ONLY discard_block_engine 2814 { 2815 _Engine __e_; 2816 int __n_; 2817 2818 static_assert( 0 < __r, "discard_block_engine invalid parameters"); 2819 static_assert(__r <= __p, "discard_block_engine invalid parameters"); 2820 public: 2821 // types 2822 typedef typename _Engine::result_type result_type; 2823 2824 // engine characteristics 2825 static _LIBCPP_CONSTEXPR const size_t block_size = __p; 2826 static _LIBCPP_CONSTEXPR const size_t used_block = __r; 2827 2828 #ifdef _LIBCPP_HAS_NO_CONSTEXPR 2829 static const result_type _Min = _Engine::_Min; 2830 static const result_type _Max = _Engine::_Max; 2831 #else 2832 static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min(); 2833 static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max(); 2834 #endif 2835 2836 _LIBCPP_INLINE_VISIBILITY 2837 static _LIBCPP_CONSTEXPR result_type min() { return _Engine::min(); } 2838 _LIBCPP_INLINE_VISIBILITY 2839 static _LIBCPP_CONSTEXPR result_type max() { return _Engine::max(); } 2840 2841 // constructors and seeding functions 2842 _LIBCPP_INLINE_VISIBILITY 2843 discard_block_engine() : __n_(0) {} 2844 _LIBCPP_INLINE_VISIBILITY 2845 explicit discard_block_engine(const _Engine& __e) 2846 : __e_(__e), __n_(0) {} 2847 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2848 _LIBCPP_INLINE_VISIBILITY 2849 explicit discard_block_engine(_Engine&& __e) 2850 : __e_(_VSTD::move(__e)), __n_(0) {} 2851 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 2852 _LIBCPP_INLINE_VISIBILITY 2853 explicit discard_block_engine(result_type __sd) : __e_(__sd), __n_(0) {} 2854 template<class _Sseq> 2855 _LIBCPP_INLINE_VISIBILITY 2856 explicit discard_block_engine(_Sseq& __q, 2857 typename enable_if<__is_seed_sequence<_Sseq, discard_block_engine>::value && 2858 !is_convertible<_Sseq, _Engine>::value>::type* = 0) 2859 : __e_(__q), __n_(0) {} 2860 _LIBCPP_INLINE_VISIBILITY 2861 void seed() {__e_.seed(); __n_ = 0;} 2862 _LIBCPP_INLINE_VISIBILITY 2863 void seed(result_type __sd) {__e_.seed(__sd); __n_ = 0;} 2864 template<class _Sseq> 2865 _LIBCPP_INLINE_VISIBILITY 2866 typename enable_if 2867 < 2868 __is_seed_sequence<_Sseq, discard_block_engine>::value, 2869 void 2870 >::type 2871 seed(_Sseq& __q) {__e_.seed(__q); __n_ = 0;} 2872 2873 // generating functions 2874 result_type operator()(); 2875 _LIBCPP_INLINE_VISIBILITY 2876 void discard(unsigned long long __z) {for (; __z; --__z) operator()();} 2877 2878 // property functions 2879 _LIBCPP_INLINE_VISIBILITY 2880 const _Engine& base() const _NOEXCEPT {return __e_;} 2881 2882 template<class _Eng, size_t _Pp, size_t _Rp> 2883 friend 2884 bool 2885 operator==( 2886 const discard_block_engine<_Eng, _Pp, _Rp>& __x, 2887 const discard_block_engine<_Eng, _Pp, _Rp>& __y); 2888 2889 template<class _Eng, size_t _Pp, size_t _Rp> 2890 friend 2891 bool 2892 operator!=( 2893 const discard_block_engine<_Eng, _Pp, _Rp>& __x, 2894 const discard_block_engine<_Eng, _Pp, _Rp>& __y); 2895 2896 template <class _CharT, class _Traits, 2897 class _Eng, size_t _Pp, size_t _Rp> 2898 friend 2899 basic_ostream<_CharT, _Traits>& 2900 operator<<(basic_ostream<_CharT, _Traits>& __os, 2901 const discard_block_engine<_Eng, _Pp, _Rp>& __x); 2902 2903 template <class _CharT, class _Traits, 2904 class _Eng, size_t _Pp, size_t _Rp> 2905 friend 2906 basic_istream<_CharT, _Traits>& 2907 operator>>(basic_istream<_CharT, _Traits>& __is, 2908 discard_block_engine<_Eng, _Pp, _Rp>& __x); 2909 }; 2910 2911 template<class _Engine, size_t __p, size_t __r> 2912 _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::block_size; 2913 2914 template<class _Engine, size_t __p, size_t __r> 2915 _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::used_block; 2916 2917 template<class _Engine, size_t __p, size_t __r> 2918 typename discard_block_engine<_Engine, __p, __r>::result_type 2919 discard_block_engine<_Engine, __p, __r>::operator()() 2920 { 2921 if (__n_ >= __r) 2922 { 2923 __e_.discard(__p - __r); 2924 __n_ = 0; 2925 } 2926 ++__n_; 2927 return __e_(); 2928 } 2929 2930 template<class _Eng, size_t _Pp, size_t _Rp> 2931 inline _LIBCPP_INLINE_VISIBILITY 2932 bool 2933 operator==(const discard_block_engine<_Eng, _Pp, _Rp>& __x, 2934 const discard_block_engine<_Eng, _Pp, _Rp>& __y) 2935 { 2936 return __x.__n_ == __y.__n_ && __x.__e_ == __y.__e_; 2937 } 2938 2939 template<class _Eng, size_t _Pp, size_t _Rp> 2940 inline _LIBCPP_INLINE_VISIBILITY 2941 bool 2942 operator!=(const discard_block_engine<_Eng, _Pp, _Rp>& __x, 2943 const discard_block_engine<_Eng, _Pp, _Rp>& __y) 2944 { 2945 return !(__x == __y); 2946 } 2947 2948 template <class _CharT, class _Traits, 2949 class _Eng, size_t _Pp, size_t _Rp> 2950 basic_ostream<_CharT, _Traits>& 2951 operator<<(basic_ostream<_CharT, _Traits>& __os, 2952 const discard_block_engine<_Eng, _Pp, _Rp>& __x) 2953 { 2954 __save_flags<_CharT, _Traits> __lx(__os); 2955 __os.flags(ios_base::dec | ios_base::left); 2956 _CharT __sp = __os.widen(' '); 2957 __os.fill(__sp); 2958 return __os << __x.__e_ << __sp << __x.__n_; 2959 } 2960 2961 template <class _CharT, class _Traits, 2962 class _Eng, size_t _Pp, size_t _Rp> 2963 basic_istream<_CharT, _Traits>& 2964 operator>>(basic_istream<_CharT, _Traits>& __is, 2965 discard_block_engine<_Eng, _Pp, _Rp>& __x) 2966 { 2967 __save_flags<_CharT, _Traits> __lx(__is); 2968 __is.flags(ios_base::dec | ios_base::skipws); 2969 _Eng __e; 2970 int __n; 2971 __is >> __e >> __n; 2972 if (!__is.fail()) 2973 { 2974 __x.__e_ = __e; 2975 __x.__n_ = __n; 2976 } 2977 return __is; 2978 } 2979 2980 typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; 2981 typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; 2982 2983 // independent_bits_engine 2984 2985 template<class _Engine, size_t __w, class _UIntType> 2986 class _LIBCPP_TYPE_VIS_ONLY independent_bits_engine 2987 { 2988 template <class _UI, _UI _R0, size_t _Wp, size_t _Mp> 2989 class __get_n 2990 { 2991 static _LIBCPP_CONSTEXPR const size_t _Dt = numeric_limits<_UI>::digits; 2992 static _LIBCPP_CONSTEXPR const size_t _Np = _Wp / _Mp + (_Wp % _Mp != 0); 2993 static _LIBCPP_CONSTEXPR const size_t _W0 = _Wp / _Np; 2994 static _LIBCPP_CONSTEXPR const _UI _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0; 2995 public: 2996 static _LIBCPP_CONSTEXPR const size_t value = _R0 - _Y0 > _Y0 / _Np ? _Np + 1 : _Np; 2997 }; 2998 public: 2999 // types 3000 typedef _UIntType result_type; 3001 3002 private: 3003 _Engine __e_; 3004 3005 static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; 3006 static_assert( 0 < __w, "independent_bits_engine invalid parameters"); 3007 static_assert(__w <= _Dt, "independent_bits_engine invalid parameters"); 3008 3009 typedef typename _Engine::result_type _Engine_result_type; 3010 typedef typename conditional 3011 < 3012 sizeof(_Engine_result_type) <= sizeof(result_type), 3013 result_type, 3014 _Engine_result_type 3015 >::type _Working_result_type; 3016 #ifdef _LIBCPP_HAS_NO_CONSTEXPR 3017 static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min 3018 + _Working_result_type(1); 3019 #else 3020 static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min() 3021 + _Working_result_type(1); 3022 #endif 3023 static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value; 3024 static _LIBCPP_CONSTEXPR const size_t __n = __get_n<_Working_result_type, _Rp, __w, __m>::value; 3025 static _LIBCPP_CONSTEXPR const size_t __w0 = __w / __n; 3026 static _LIBCPP_CONSTEXPR const size_t __n0 = __n - __w % __n; 3027 static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits; 3028 static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits; 3029 static _LIBCPP_CONSTEXPR const _Working_result_type __y0 = __w0 >= _WDt ? 0 : 3030 (_Rp >> __w0) << __w0; 3031 static _LIBCPP_CONSTEXPR const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 : 3032 (_Rp >> (__w0+1)) << (__w0+1); 3033 static _LIBCPP_CONSTEXPR const _Engine_result_type __mask0 = __w0 > 0 ? 3034 _Engine_result_type(~0) >> (_EDt - __w0) : 3035 _Engine_result_type(0); 3036 static _LIBCPP_CONSTEXPR const _Engine_result_type __mask1 = __w0 < _EDt - 1 ? 3037 _Engine_result_type(~0) >> (_EDt - (__w0 + 1)) : 3038 _Engine_result_type(~0); 3039 public: 3040 static _LIBCPP_CONSTEXPR const result_type _Min = 0; 3041 static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : 3042 (result_type(1) << __w) - result_type(1); 3043 static_assert(_Min < _Max, "independent_bits_engine invalid parameters"); 3044 3045 // engine characteristics 3046 _LIBCPP_INLINE_VISIBILITY 3047 static _LIBCPP_CONSTEXPR result_type min() { return _Min; } 3048 _LIBCPP_INLINE_VISIBILITY 3049 static _LIBCPP_CONSTEXPR result_type max() { return _Max; } 3050 3051 // constructors and seeding functions 3052 _LIBCPP_INLINE_VISIBILITY 3053 independent_bits_engine() {} 3054 _LIBCPP_INLINE_VISIBILITY 3055 explicit independent_bits_engine(const _Engine& __e) 3056 : __e_(__e) {} 3057 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3058 _LIBCPP_INLINE_VISIBILITY 3059 explicit independent_bits_engine(_Engine&& __e) 3060 : __e_(_VSTD::move(__e)) {} 3061 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3062 _LIBCPP_INLINE_VISIBILITY 3063 explicit independent_bits_engine(result_type __sd) : __e_(__sd) {} 3064 template<class _Sseq> 3065 _LIBCPP_INLINE_VISIBILITY 3066 explicit independent_bits_engine(_Sseq& __q, 3067 typename enable_if<__is_seed_sequence<_Sseq, independent_bits_engine>::value && 3068 !is_convertible<_Sseq, _Engine>::value>::type* = 0) 3069 : __e_(__q) {} 3070 _LIBCPP_INLINE_VISIBILITY 3071 void seed() {__e_.seed();} 3072 _LIBCPP_INLINE_VISIBILITY 3073 void seed(result_type __sd) {__e_.seed(__sd);} 3074 template<class _Sseq> 3075 _LIBCPP_INLINE_VISIBILITY 3076 typename enable_if 3077 < 3078 __is_seed_sequence<_Sseq, independent_bits_engine>::value, 3079 void 3080 >::type 3081 seed(_Sseq& __q) {__e_.seed(__q);} 3082 3083 // generating functions 3084 _LIBCPP_INLINE_VISIBILITY 3085 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} 3086 _LIBCPP_INLINE_VISIBILITY 3087 void discard(unsigned long long __z) {for (; __z; --__z) operator()();} 3088 3089 // property functions 3090 _LIBCPP_INLINE_VISIBILITY 3091 const _Engine& base() const _NOEXCEPT {return __e_;} 3092 3093 template<class _Eng, size_t _Wp, class _UI> 3094 friend 3095 bool 3096 operator==( 3097 const independent_bits_engine<_Eng, _Wp, _UI>& __x, 3098 const independent_bits_engine<_Eng, _Wp, _UI>& __y); 3099 3100 template<class _Eng, size_t _Wp, class _UI> 3101 friend 3102 bool 3103 operator!=( 3104 const independent_bits_engine<_Eng, _Wp, _UI>& __x, 3105 const independent_bits_engine<_Eng, _Wp, _UI>& __y); 3106 3107 template <class _CharT, class _Traits, 3108 class _Eng, size_t _Wp, class _UI> 3109 friend 3110 basic_ostream<_CharT, _Traits>& 3111 operator<<(basic_ostream<_CharT, _Traits>& __os, 3112 const independent_bits_engine<_Eng, _Wp, _UI>& __x); 3113 3114 template <class _CharT, class _Traits, 3115 class _Eng, size_t _Wp, class _UI> 3116 friend 3117 basic_istream<_CharT, _Traits>& 3118 operator>>(basic_istream<_CharT, _Traits>& __is, 3119 independent_bits_engine<_Eng, _Wp, _UI>& __x); 3120 3121 private: 3122 _LIBCPP_INLINE_VISIBILITY 3123 result_type __eval(false_type); 3124 result_type __eval(true_type); 3125 3126 template <size_t __count> 3127 _LIBCPP_INLINE_VISIBILITY 3128 static 3129 typename enable_if 3130 < 3131 __count < _Dt, 3132 result_type 3133 >::type 3134 __lshift(result_type __x) {return __x << __count;} 3135 3136 template <size_t __count> 3137 _LIBCPP_INLINE_VISIBILITY 3138 static 3139 typename enable_if 3140 < 3141 (__count >= _Dt), 3142 result_type 3143 >::type 3144 __lshift(result_type) {return result_type(0);} 3145 }; 3146 3147 template<class _Engine, size_t __w, class _UIntType> 3148 inline 3149 _UIntType 3150 independent_bits_engine<_Engine, __w, _UIntType>::__eval(false_type) 3151 { 3152 return static_cast<result_type>(__e_() & __mask0); 3153 } 3154 3155 template<class _Engine, size_t __w, class _UIntType> 3156 _UIntType 3157 independent_bits_engine<_Engine, __w, _UIntType>::__eval(true_type) 3158 { 3159 result_type _Sp = 0; 3160 for (size_t __k = 0; __k < __n0; ++__k) 3161 { 3162 _Engine_result_type __u; 3163 do 3164 { 3165 __u = __e_() - _Engine::min(); 3166 } while (__u >= __y0); 3167 _Sp = static_cast<result_type>(__lshift<__w0>(_Sp) + (__u & __mask0)); 3168 } 3169 for (size_t __k = __n0; __k < __n; ++__k) 3170 { 3171 _Engine_result_type __u; 3172 do 3173 { 3174 __u = __e_() - _Engine::min(); 3175 } while (__u >= __y1); 3176 _Sp = static_cast<result_type>(__lshift<__w0+1>(_Sp) + (__u & __mask1)); 3177 } 3178 return _Sp; 3179 } 3180 3181 template<class _Eng, size_t _Wp, class _UI> 3182 inline _LIBCPP_INLINE_VISIBILITY 3183 bool 3184 operator==( 3185 const independent_bits_engine<_Eng, _Wp, _UI>& __x, 3186 const independent_bits_engine<_Eng, _Wp, _UI>& __y) 3187 { 3188 return __x.base() == __y.base(); 3189 } 3190 3191 template<class _Eng, size_t _Wp, class _UI> 3192 inline _LIBCPP_INLINE_VISIBILITY 3193 bool 3194 operator!=( 3195 const independent_bits_engine<_Eng, _Wp, _UI>& __x, 3196 const independent_bits_engine<_Eng, _Wp, _UI>& __y) 3197 { 3198 return !(__x == __y); 3199 } 3200 3201 template <class _CharT, class _Traits, 3202 class _Eng, size_t _Wp, class _UI> 3203 basic_ostream<_CharT, _Traits>& 3204 operator<<(basic_ostream<_CharT, _Traits>& __os, 3205 const independent_bits_engine<_Eng, _Wp, _UI>& __x) 3206 { 3207 return __os << __x.base(); 3208 } 3209 3210 template <class _CharT, class _Traits, 3211 class _Eng, size_t _Wp, class _UI> 3212 basic_istream<_CharT, _Traits>& 3213 operator>>(basic_istream<_CharT, _Traits>& __is, 3214 independent_bits_engine<_Eng, _Wp, _UI>& __x) 3215 { 3216 _Eng __e; 3217 __is >> __e; 3218 if (!__is.fail()) 3219 __x.__e_ = __e; 3220 return __is; 3221 } 3222 3223 // shuffle_order_engine 3224 3225 template <uint64_t _Xp, uint64_t _Yp> 3226 struct __ugcd 3227 { 3228 static _LIBCPP_CONSTEXPR const uint64_t value = __ugcd<_Yp, _Xp % _Yp>::value; 3229 }; 3230 3231 template <uint64_t _Xp> 3232 struct __ugcd<_Xp, 0> 3233 { 3234 static _LIBCPP_CONSTEXPR const uint64_t value = _Xp; 3235 }; 3236 3237 template <uint64_t _Np, uint64_t _Dp> 3238 class __uratio 3239 { 3240 static_assert(_Dp != 0, "__uratio divide by 0"); 3241 static _LIBCPP_CONSTEXPR const uint64_t __gcd = __ugcd<_Np, _Dp>::value; 3242 public: 3243 static _LIBCPP_CONSTEXPR const uint64_t num = _Np / __gcd; 3244 static _LIBCPP_CONSTEXPR const uint64_t den = _Dp / __gcd; 3245 3246 typedef __uratio<num, den> type; 3247 }; 3248 3249 template<class _Engine, size_t __k> 3250 class _LIBCPP_TYPE_VIS_ONLY shuffle_order_engine 3251 { 3252 static_assert(0 < __k, "shuffle_order_engine invalid parameters"); 3253 public: 3254 // types 3255 typedef typename _Engine::result_type result_type; 3256 3257 private: 3258 _Engine __e_; 3259 result_type _V_[__k]; 3260 result_type _Y_; 3261 3262 public: 3263 // engine characteristics 3264 static _LIBCPP_CONSTEXPR const size_t table_size = __k; 3265 3266 #ifdef _LIBCPP_HAS_NO_CONSTEXPR 3267 static const result_type _Min = _Engine::_Min; 3268 static const result_type _Max = _Engine::_Max; 3269 #else 3270 static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min(); 3271 static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max(); 3272 #endif 3273 static_assert(_Min < _Max, "shuffle_order_engine invalid parameters"); 3274 _LIBCPP_INLINE_VISIBILITY 3275 static _LIBCPP_CONSTEXPR result_type min() { return _Min; } 3276 _LIBCPP_INLINE_VISIBILITY 3277 static _LIBCPP_CONSTEXPR result_type max() { return _Max; } 3278 3279 static _LIBCPP_CONSTEXPR const unsigned long long _Rp = _Max - _Min + 1ull; 3280 3281 // constructors and seeding functions 3282 _LIBCPP_INLINE_VISIBILITY 3283 shuffle_order_engine() {__init();} 3284 _LIBCPP_INLINE_VISIBILITY 3285 explicit shuffle_order_engine(const _Engine& __e) 3286 : __e_(__e) {__init();} 3287 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3288 _LIBCPP_INLINE_VISIBILITY 3289 explicit shuffle_order_engine(_Engine&& __e) 3290 : __e_(_VSTD::move(__e)) {__init();} 3291 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3292 _LIBCPP_INLINE_VISIBILITY 3293 explicit shuffle_order_engine(result_type __sd) : __e_(__sd) {__init();} 3294 template<class _Sseq> 3295 _LIBCPP_INLINE_VISIBILITY 3296 explicit shuffle_order_engine(_Sseq& __q, 3297 typename enable_if<__is_seed_sequence<_Sseq, shuffle_order_engine>::value && 3298 !is_convertible<_Sseq, _Engine>::value>::type* = 0) 3299 : __e_(__q) {__init();} 3300 _LIBCPP_INLINE_VISIBILITY 3301 void seed() {__e_.seed(); __init();} 3302 _LIBCPP_INLINE_VISIBILITY 3303 void seed(result_type __sd) {__e_.seed(__sd); __init();} 3304 template<class _Sseq> 3305 _LIBCPP_INLINE_VISIBILITY 3306 typename enable_if 3307 < 3308 __is_seed_sequence<_Sseq, shuffle_order_engine>::value, 3309 void 3310 >::type 3311 seed(_Sseq& __q) {__e_.seed(__q); __init();} 3312 3313 // generating functions 3314 _LIBCPP_INLINE_VISIBILITY 3315 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} 3316 _LIBCPP_INLINE_VISIBILITY 3317 void discard(unsigned long long __z) {for (; __z; --__z) operator()();} 3318 3319 // property functions 3320 _LIBCPP_INLINE_VISIBILITY 3321 const _Engine& base() const _NOEXCEPT {return __e_;} 3322 3323 private: 3324 template<class _Eng, size_t _Kp> 3325 friend 3326 bool 3327 operator==( 3328 const shuffle_order_engine<_Eng, _Kp>& __x, 3329 const shuffle_order_engine<_Eng, _Kp>& __y); 3330 3331 template<class _Eng, size_t _Kp> 3332 friend 3333 bool 3334 operator!=( 3335 const shuffle_order_engine<_Eng, _Kp>& __x, 3336 const shuffle_order_engine<_Eng, _Kp>& __y); 3337 3338 template <class _CharT, class _Traits, 3339 class _Eng, size_t _Kp> 3340 friend 3341 basic_ostream<_CharT, _Traits>& 3342 operator<<(basic_ostream<_CharT, _Traits>& __os, 3343 const shuffle_order_engine<_Eng, _Kp>& __x); 3344 3345 template <class _CharT, class _Traits, 3346 class _Eng, size_t _Kp> 3347 friend 3348 basic_istream<_CharT, _Traits>& 3349 operator>>(basic_istream<_CharT, _Traits>& __is, 3350 shuffle_order_engine<_Eng, _Kp>& __x); 3351 3352 _LIBCPP_INLINE_VISIBILITY 3353 void __init() 3354 { 3355 for (size_t __i = 0; __i < __k; ++__i) 3356 _V_[__i] = __e_(); 3357 _Y_ = __e_(); 3358 } 3359 3360 _LIBCPP_INLINE_VISIBILITY 3361 result_type __eval(false_type) {return __eval2(integral_constant<bool, __k & 1>());} 3362 _LIBCPP_INLINE_VISIBILITY 3363 result_type __eval(true_type) {return __eval(__uratio<__k, _Rp>());} 3364 3365 _LIBCPP_INLINE_VISIBILITY 3366 result_type __eval2(false_type) {return __eval(__uratio<__k/2, 0x8000000000000000ull>());} 3367 _LIBCPP_INLINE_VISIBILITY 3368 result_type __eval2(true_type) {return __evalf<__k, 0>();} 3369 3370 template <uint64_t _Np, uint64_t _Dp> 3371 _LIBCPP_INLINE_VISIBILITY 3372 typename enable_if 3373 < 3374 (__uratio<_Np, _Dp>::num > 0xFFFFFFFFFFFFFFFFull / (_Max - _Min)), 3375 result_type 3376 >::type 3377 __eval(__uratio<_Np, _Dp>) 3378 {return __evalf<__uratio<_Np, _Dp>::num, __uratio<_Np, _Dp>::den>();} 3379 3380 template <uint64_t _Np, uint64_t _Dp> 3381 _LIBCPP_INLINE_VISIBILITY 3382 typename enable_if 3383 < 3384 __uratio<_Np, _Dp>::num <= 0xFFFFFFFFFFFFFFFFull / (_Max - _Min), 3385 result_type 3386 >::type 3387 __eval(__uratio<_Np, _Dp>) 3388 { 3389 const size_t __j = static_cast<size_t>(__uratio<_Np, _Dp>::num * (_Y_ - _Min) 3390 / __uratio<_Np, _Dp>::den); 3391 _Y_ = _V_[__j]; 3392 _V_[__j] = __e_(); 3393 return _Y_; 3394 } 3395 3396 template <uint64_t __n, uint64_t __d> 3397 _LIBCPP_INLINE_VISIBILITY 3398 result_type __evalf() 3399 { 3400 const double _Fp = __d == 0 ? 3401 __n / (2. * 0x8000000000000000ull) : 3402 __n / (double)__d; 3403 const size_t __j = static_cast<size_t>(_Fp * (_Y_ - _Min)); 3404 _Y_ = _V_[__j]; 3405 _V_[__j] = __e_(); 3406 return _Y_; 3407 } 3408 }; 3409 3410 template<class _Engine, size_t __k> 3411 _LIBCPP_CONSTEXPR const size_t shuffle_order_engine<_Engine, __k>::table_size; 3412 3413 template<class _Eng, size_t _Kp> 3414 bool 3415 operator==( 3416 const shuffle_order_engine<_Eng, _Kp>& __x, 3417 const shuffle_order_engine<_Eng, _Kp>& __y) 3418 { 3419 return __x._Y_ == __y._Y_ && _VSTD::equal(__x._V_, __x._V_ + _Kp, __y._V_) && 3420 __x.__e_ == __y.__e_; 3421 } 3422 3423 template<class _Eng, size_t _Kp> 3424 inline _LIBCPP_INLINE_VISIBILITY 3425 bool 3426 operator!=( 3427 const shuffle_order_engine<_Eng, _Kp>& __x, 3428 const shuffle_order_engine<_Eng, _Kp>& __y) 3429 { 3430 return !(__x == __y); 3431 } 3432 3433 template <class _CharT, class _Traits, 3434 class _Eng, size_t _Kp> 3435 basic_ostream<_CharT, _Traits>& 3436 operator<<(basic_ostream<_CharT, _Traits>& __os, 3437 const shuffle_order_engine<_Eng, _Kp>& __x) 3438 { 3439 __save_flags<_CharT, _Traits> __lx(__os); 3440 __os.flags(ios_base::dec | ios_base::left); 3441 _CharT __sp = __os.widen(' '); 3442 __os.fill(__sp); 3443 __os << __x.__e_ << __sp << __x._V_[0]; 3444 for (size_t __i = 1; __i < _Kp; ++__i) 3445 __os << __sp << __x._V_[__i]; 3446 return __os << __sp << __x._Y_; 3447 } 3448 3449 template <class _CharT, class _Traits, 3450 class _Eng, size_t _Kp> 3451 basic_istream<_CharT, _Traits>& 3452 operator>>(basic_istream<_CharT, _Traits>& __is, 3453 shuffle_order_engine<_Eng, _Kp>& __x) 3454 { 3455 typedef typename shuffle_order_engine<_Eng, _Kp>::result_type result_type; 3456 __save_flags<_CharT, _Traits> __lx(__is); 3457 __is.flags(ios_base::dec | ios_base::skipws); 3458 _Eng __e; 3459 result_type _Vp[_Kp+1]; 3460 __is >> __e; 3461 for (size_t __i = 0; __i < _Kp+1; ++__i) 3462 __is >> _Vp[__i]; 3463 if (!__is.fail()) 3464 { 3465 __x.__e_ = __e; 3466 for (size_t __i = 0; __i < _Kp; ++__i) 3467 __x._V_[__i] = _Vp[__i]; 3468 __x._Y_ = _Vp[_Kp]; 3469 } 3470 return __is; 3471 } 3472 3473 typedef shuffle_order_engine<minstd_rand0, 256> knuth_b; 3474 3475 // random_device 3476 3477 class _LIBCPP_TYPE_VIS random_device 3478 { 3479 #ifdef _LIBCPP_USING_DEV_RANDOM 3480 int __f_; 3481 #endif // defined(_LIBCPP_USING_DEV_RANDOM) 3482 public: 3483 // types 3484 typedef unsigned result_type; 3485 3486 // generator characteristics 3487 static _LIBCPP_CONSTEXPR const result_type _Min = 0; 3488 static _LIBCPP_CONSTEXPR const result_type _Max = 0xFFFFFFFFu; 3489 3490 _LIBCPP_INLINE_VISIBILITY 3491 static _LIBCPP_CONSTEXPR result_type min() { return _Min;} 3492 _LIBCPP_INLINE_VISIBILITY 3493 static _LIBCPP_CONSTEXPR result_type max() { return _Max;} 3494 3495 // constructors 3496 explicit random_device(const string& __token = "/dev/urandom"); 3497 ~random_device(); 3498 3499 // generating functions 3500 result_type operator()(); 3501 3502 // property functions 3503 double entropy() const _NOEXCEPT; 3504 3505 private: 3506 // no copy functions 3507 random_device(const random_device&); // = delete; 3508 random_device& operator=(const random_device&); // = delete; 3509 }; 3510 3511 // seed_seq 3512 3513 class _LIBCPP_TYPE_VIS_ONLY seed_seq 3514 { 3515 public: 3516 // types 3517 typedef uint32_t result_type; 3518 3519 private: 3520 vector<result_type> __v_; 3521 3522 template<class _InputIterator> 3523 void init(_InputIterator __first, _InputIterator __last); 3524 public: 3525 // constructors 3526 _LIBCPP_INLINE_VISIBILITY 3527 seed_seq() _NOEXCEPT {} 3528 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 3529 template<class _Tp> 3530 _LIBCPP_INLINE_VISIBILITY 3531 seed_seq(initializer_list<_Tp> __il) {init(__il.begin(), __il.end());} 3532 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 3533 3534 template<class _InputIterator> 3535 _LIBCPP_INLINE_VISIBILITY 3536 seed_seq(_InputIterator __first, _InputIterator __last) 3537 {init(__first, __last);} 3538 3539 // generating functions 3540 template<class _RandomAccessIterator> 3541 void generate(_RandomAccessIterator __first, _RandomAccessIterator __last); 3542 3543 // property functions 3544 _LIBCPP_INLINE_VISIBILITY 3545 size_t size() const _NOEXCEPT {return __v_.size();} 3546 template<class _OutputIterator> 3547 _LIBCPP_INLINE_VISIBILITY 3548 void param(_OutputIterator __dest) const 3549 {_VSTD::copy(__v_.begin(), __v_.end(), __dest);} 3550 3551 private: 3552 // no copy functions 3553 seed_seq(const seed_seq&); // = delete; 3554 void operator=(const seed_seq&); // = delete; 3555 3556 _LIBCPP_INLINE_VISIBILITY 3557 static result_type _Tp(result_type __x) {return __x ^ (__x >> 27);} 3558 }; 3559 3560 template<class _InputIterator> 3561 void 3562 seed_seq::init(_InputIterator __first, _InputIterator __last) 3563 { 3564 for (_InputIterator __s = __first; __s != __last; ++__s) 3565 __v_.push_back(*__s & 0xFFFFFFFF); 3566 } 3567 3568 template<class _RandomAccessIterator> 3569 void 3570 seed_seq::generate(_RandomAccessIterator __first, _RandomAccessIterator __last) 3571 { 3572 if (__first != __last) 3573 { 3574 _VSTD::fill(__first, __last, 0x8b8b8b8b); 3575 const size_t __n = static_cast<size_t>(__last - __first); 3576 const size_t __s = __v_.size(); 3577 const size_t __t = (__n >= 623) ? 11 3578 : (__n >= 68) ? 7 3579 : (__n >= 39) ? 5 3580 : (__n >= 7) ? 3 3581 : (__n - 1) / 2; 3582 const size_t __p = (__n - __t) / 2; 3583 const size_t __q = __p + __t; 3584 const size_t __m = _VSTD::max(__s + 1, __n); 3585 // __k = 0; 3586 { 3587 result_type __r = 1664525 * _Tp(__first[0] ^ __first[__p] 3588 ^ __first[__n - 1]); 3589 __first[__p] += __r; 3590 __r += __s; 3591 __first[__q] += __r; 3592 __first[0] = __r; 3593 } 3594 for (size_t __k = 1; __k <= __s; ++__k) 3595 { 3596 const size_t __kmodn = __k % __n; 3597 const size_t __kpmodn = (__k + __p) % __n; 3598 result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] 3599 ^ __first[(__k - 1) % __n]); 3600 __first[__kpmodn] += __r; 3601 __r += __kmodn + __v_[__k-1]; 3602 __first[(__k + __q) % __n] += __r; 3603 __first[__kmodn] = __r; 3604 } 3605 for (size_t __k = __s + 1; __k < __m; ++__k) 3606 { 3607 const size_t __kmodn = __k % __n; 3608 const size_t __kpmodn = (__k + __p) % __n; 3609 result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] 3610 ^ __first[(__k - 1) % __n]); 3611 __first[__kpmodn] += __r; 3612 __r += __kmodn; 3613 __first[(__k + __q) % __n] += __r; 3614 __first[__kmodn] = __r; 3615 } 3616 for (size_t __k = __m; __k < __m + __n; ++__k) 3617 { 3618 const size_t __kmodn = __k % __n; 3619 const size_t __kpmodn = (__k + __p) % __n; 3620 result_type __r = 1566083941 * _Tp(__first[__kmodn] + 3621 __first[__kpmodn] + 3622 __first[(__k - 1) % __n]); 3623 __first[__kpmodn] ^= __r; 3624 __r -= __kmodn; 3625 __first[(__k + __q) % __n] ^= __r; 3626 __first[__kmodn] = __r; 3627 } 3628 } 3629 } 3630 3631 // generate_canonical 3632 3633 template<class _RealType, size_t __bits, class _URNG> 3634 _RealType 3635 generate_canonical(_URNG& __g) 3636 { 3637 const size_t _Dt = numeric_limits<_RealType>::digits; 3638 const size_t __b = _Dt < __bits ? _Dt : __bits; 3639 #ifdef _LIBCPP_HAS_NO_CONSTEXPR 3640 const size_t __logR = __log2<uint64_t, _URNG::_Max - _URNG::_Min + uint64_t(1)>::value; 3641 #else 3642 const size_t __logR = __log2<uint64_t, _URNG::max() - _URNG::min() + uint64_t(1)>::value; 3643 #endif 3644 const size_t __k = __b / __logR + (__b % __logR != 0) + (__b == 0); 3645 const _RealType _Rp = _URNG::max() - _URNG::min() + _RealType(1); 3646 _RealType __base = _Rp; 3647 _RealType _Sp = __g() - _URNG::min(); 3648 for (size_t __i = 1; __i < __k; ++__i, __base *= _Rp) 3649 _Sp += (__g() - _URNG::min()) * __base; 3650 return _Sp / __base; 3651 } 3652 3653 // uniform_int_distribution 3654 3655 // in <algorithm> 3656 3657 template <class _CharT, class _Traits, class _IT> 3658 basic_ostream<_CharT, _Traits>& 3659 operator<<(basic_ostream<_CharT, _Traits>& __os, 3660 const uniform_int_distribution<_IT>& __x) 3661 { 3662 __save_flags<_CharT, _Traits> __lx(__os); 3663 __os.flags(ios_base::dec | ios_base::left); 3664 _CharT __sp = __os.widen(' '); 3665 __os.fill(__sp); 3666 return __os << __x.a() << __sp << __x.b(); 3667 } 3668 3669 template <class _CharT, class _Traits, class _IT> 3670 basic_istream<_CharT, _Traits>& 3671 operator>>(basic_istream<_CharT, _Traits>& __is, 3672 uniform_int_distribution<_IT>& __x) 3673 { 3674 typedef uniform_int_distribution<_IT> _Eng; 3675 typedef typename _Eng::result_type result_type; 3676 typedef typename _Eng::param_type param_type; 3677 __save_flags<_CharT, _Traits> __lx(__is); 3678 __is.flags(ios_base::dec | ios_base::skipws); 3679 result_type __a; 3680 result_type __b; 3681 __is >> __a >> __b; 3682 if (!__is.fail()) 3683 __x.param(param_type(__a, __b)); 3684 return __is; 3685 } 3686 3687 // uniform_real_distribution 3688 3689 template<class _RealType = double> 3690 class _LIBCPP_TYPE_VIS_ONLY uniform_real_distribution 3691 { 3692 public: 3693 // types 3694 typedef _RealType result_type; 3695 3696 class _LIBCPP_TYPE_VIS_ONLY param_type 3697 { 3698 result_type __a_; 3699 result_type __b_; 3700 public: 3701 typedef uniform_real_distribution distribution_type; 3702 3703 _LIBCPP_INLINE_VISIBILITY 3704 explicit param_type(result_type __a = 0, 3705 result_type __b = 1) 3706 : __a_(__a), __b_(__b) {} 3707 3708 _LIBCPP_INLINE_VISIBILITY 3709 result_type a() const {return __a_;} 3710 _LIBCPP_INLINE_VISIBILITY 3711 result_type b() const {return __b_;} 3712 3713 friend _LIBCPP_INLINE_VISIBILITY 3714 bool operator==(const param_type& __x, const param_type& __y) 3715 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} 3716 friend _LIBCPP_INLINE_VISIBILITY 3717 bool operator!=(const param_type& __x, const param_type& __y) 3718 {return !(__x == __y);} 3719 }; 3720 3721 private: 3722 param_type __p_; 3723 3724 public: 3725 // constructors and reset functions 3726 _LIBCPP_INLINE_VISIBILITY 3727 explicit uniform_real_distribution(result_type __a = 0, result_type __b = 1) 3728 : __p_(param_type(__a, __b)) {} 3729 _LIBCPP_INLINE_VISIBILITY 3730 explicit uniform_real_distribution(const param_type& __p) : __p_(__p) {} 3731 _LIBCPP_INLINE_VISIBILITY 3732 void reset() {} 3733 3734 // generating functions 3735 template<class _URNG> 3736 _LIBCPP_INLINE_VISIBILITY 3737 result_type operator()(_URNG& __g) 3738 {return (*this)(__g, __p_);} 3739 template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p); 3740 3741 // property functions 3742 _LIBCPP_INLINE_VISIBILITY 3743 result_type a() const {return __p_.a();} 3744 _LIBCPP_INLINE_VISIBILITY 3745 result_type b() const {return __p_.b();} 3746 3747 _LIBCPP_INLINE_VISIBILITY 3748 param_type param() const {return __p_;} 3749 _LIBCPP_INLINE_VISIBILITY 3750 void param(const param_type& __p) {__p_ = __p;} 3751 3752 _LIBCPP_INLINE_VISIBILITY 3753 result_type min() const {return a();} 3754 _LIBCPP_INLINE_VISIBILITY 3755 result_type max() const {return b();} 3756 3757 friend _LIBCPP_INLINE_VISIBILITY 3758 bool operator==(const uniform_real_distribution& __x, 3759 const uniform_real_distribution& __y) 3760 {return __x.__p_ == __y.__p_;} 3761 friend _LIBCPP_INLINE_VISIBILITY 3762 bool operator!=(const uniform_real_distribution& __x, 3763 const uniform_real_distribution& __y) 3764 {return !(__x == __y);} 3765 }; 3766 3767 template<class _RealType> 3768 template<class _URNG> 3769 inline 3770 typename uniform_real_distribution<_RealType>::result_type 3771 uniform_real_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 3772 { 3773 return (__p.b() - __p.a()) 3774 * _VSTD::generate_canonical<_RealType, numeric_limits<_RealType>::digits>(__g) 3775 + __p.a(); 3776 } 3777 3778 template <class _CharT, class _Traits, class _RT> 3779 basic_ostream<_CharT, _Traits>& 3780 operator<<(basic_ostream<_CharT, _Traits>& __os, 3781 const uniform_real_distribution<_RT>& __x) 3782 { 3783 __save_flags<_CharT, _Traits> __lx(__os); 3784 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 3785 ios_base::scientific); 3786 _CharT __sp = __os.widen(' '); 3787 __os.fill(__sp); 3788 return __os << __x.a() << __sp << __x.b(); 3789 } 3790 3791 template <class _CharT, class _Traits, class _RT> 3792 basic_istream<_CharT, _Traits>& 3793 operator>>(basic_istream<_CharT, _Traits>& __is, 3794 uniform_real_distribution<_RT>& __x) 3795 { 3796 typedef uniform_real_distribution<_RT> _Eng; 3797 typedef typename _Eng::result_type result_type; 3798 typedef typename _Eng::param_type param_type; 3799 __save_flags<_CharT, _Traits> __lx(__is); 3800 __is.flags(ios_base::dec | ios_base::skipws); 3801 result_type __a; 3802 result_type __b; 3803 __is >> __a >> __b; 3804 if (!__is.fail()) 3805 __x.param(param_type(__a, __b)); 3806 return __is; 3807 } 3808 3809 // bernoulli_distribution 3810 3811 class _LIBCPP_TYPE_VIS_ONLY bernoulli_distribution 3812 { 3813 public: 3814 // types 3815 typedef bool result_type; 3816 3817 class _LIBCPP_TYPE_VIS_ONLY param_type 3818 { 3819 double __p_; 3820 public: 3821 typedef bernoulli_distribution distribution_type; 3822 3823 _LIBCPP_INLINE_VISIBILITY 3824 explicit param_type(double __p = 0.5) : __p_(__p) {} 3825 3826 _LIBCPP_INLINE_VISIBILITY 3827 double p() const {return __p_;} 3828 3829 friend _LIBCPP_INLINE_VISIBILITY 3830 bool operator==(const param_type& __x, const param_type& __y) 3831 {return __x.__p_ == __y.__p_;} 3832 friend _LIBCPP_INLINE_VISIBILITY 3833 bool operator!=(const param_type& __x, const param_type& __y) 3834 {return !(__x == __y);} 3835 }; 3836 3837 private: 3838 param_type __p_; 3839 3840 public: 3841 // constructors and reset functions 3842 _LIBCPP_INLINE_VISIBILITY 3843 explicit bernoulli_distribution(double __p = 0.5) 3844 : __p_(param_type(__p)) {} 3845 _LIBCPP_INLINE_VISIBILITY 3846 explicit bernoulli_distribution(const param_type& __p) : __p_(__p) {} 3847 _LIBCPP_INLINE_VISIBILITY 3848 void reset() {} 3849 3850 // generating functions 3851 template<class _URNG> 3852 _LIBCPP_INLINE_VISIBILITY 3853 result_type operator()(_URNG& __g) 3854 {return (*this)(__g, __p_);} 3855 template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p); 3856 3857 // property functions 3858 _LIBCPP_INLINE_VISIBILITY 3859 double p() const {return __p_.p();} 3860 3861 _LIBCPP_INLINE_VISIBILITY 3862 param_type param() const {return __p_;} 3863 _LIBCPP_INLINE_VISIBILITY 3864 void param(const param_type& __p) {__p_ = __p;} 3865 3866 _LIBCPP_INLINE_VISIBILITY 3867 result_type min() const {return false;} 3868 _LIBCPP_INLINE_VISIBILITY 3869 result_type max() const {return true;} 3870 3871 friend _LIBCPP_INLINE_VISIBILITY 3872 bool operator==(const bernoulli_distribution& __x, 3873 const bernoulli_distribution& __y) 3874 {return __x.__p_ == __y.__p_;} 3875 friend _LIBCPP_INLINE_VISIBILITY 3876 bool operator!=(const bernoulli_distribution& __x, 3877 const bernoulli_distribution& __y) 3878 {return !(__x == __y);} 3879 }; 3880 3881 template<class _URNG> 3882 inline 3883 bernoulli_distribution::result_type 3884 bernoulli_distribution::operator()(_URNG& __g, const param_type& __p) 3885 { 3886 uniform_real_distribution<double> __gen; 3887 return __gen(__g) < __p.p(); 3888 } 3889 3890 template <class _CharT, class _Traits> 3891 basic_ostream<_CharT, _Traits>& 3892 operator<<(basic_ostream<_CharT, _Traits>& __os, const bernoulli_distribution& __x) 3893 { 3894 __save_flags<_CharT, _Traits> __lx(__os); 3895 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 3896 ios_base::scientific); 3897 _CharT __sp = __os.widen(' '); 3898 __os.fill(__sp); 3899 return __os << __x.p(); 3900 } 3901 3902 template <class _CharT, class _Traits> 3903 basic_istream<_CharT, _Traits>& 3904 operator>>(basic_istream<_CharT, _Traits>& __is, bernoulli_distribution& __x) 3905 { 3906 typedef bernoulli_distribution _Eng; 3907 typedef typename _Eng::param_type param_type; 3908 __save_flags<_CharT, _Traits> __lx(__is); 3909 __is.flags(ios_base::dec | ios_base::skipws); 3910 double __p; 3911 __is >> __p; 3912 if (!__is.fail()) 3913 __x.param(param_type(__p)); 3914 return __is; 3915 } 3916 3917 // binomial_distribution 3918 3919 template<class _IntType = int> 3920 class _LIBCPP_TYPE_VIS_ONLY binomial_distribution 3921 { 3922 public: 3923 // types 3924 typedef _IntType result_type; 3925 3926 class _LIBCPP_TYPE_VIS_ONLY param_type 3927 { 3928 result_type __t_; 3929 double __p_; 3930 double __pr_; 3931 double __odds_ratio_; 3932 result_type __r0_; 3933 public: 3934 typedef binomial_distribution distribution_type; 3935 3936 explicit param_type(result_type __t = 1, double __p = 0.5); 3937 3938 _LIBCPP_INLINE_VISIBILITY 3939 result_type t() const {return __t_;} 3940 _LIBCPP_INLINE_VISIBILITY 3941 double p() const {return __p_;} 3942 3943 friend _LIBCPP_INLINE_VISIBILITY 3944 bool operator==(const param_type& __x, const param_type& __y) 3945 {return __x.__t_ == __y.__t_ && __x.__p_ == __y.__p_;} 3946 friend _LIBCPP_INLINE_VISIBILITY 3947 bool operator!=(const param_type& __x, const param_type& __y) 3948 {return !(__x == __y);} 3949 3950 friend class binomial_distribution; 3951 }; 3952 3953 private: 3954 param_type __p_; 3955 3956 public: 3957 // constructors and reset functions 3958 _LIBCPP_INLINE_VISIBILITY 3959 explicit binomial_distribution(result_type __t = 1, double __p = 0.5) 3960 : __p_(param_type(__t, __p)) {} 3961 _LIBCPP_INLINE_VISIBILITY 3962 explicit binomial_distribution(const param_type& __p) : __p_(__p) {} 3963 _LIBCPP_INLINE_VISIBILITY 3964 void reset() {} 3965 3966 // generating functions 3967 template<class _URNG> 3968 _LIBCPP_INLINE_VISIBILITY 3969 result_type operator()(_URNG& __g) 3970 {return (*this)(__g, __p_);} 3971 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 3972 3973 // property functions 3974 _LIBCPP_INLINE_VISIBILITY 3975 result_type t() const {return __p_.t();} 3976 _LIBCPP_INLINE_VISIBILITY 3977 double p() const {return __p_.p();} 3978 3979 _LIBCPP_INLINE_VISIBILITY 3980 param_type param() const {return __p_;} 3981 _LIBCPP_INLINE_VISIBILITY 3982 void param(const param_type& __p) {__p_ = __p;} 3983 3984 _LIBCPP_INLINE_VISIBILITY 3985 result_type min() const {return 0;} 3986 _LIBCPP_INLINE_VISIBILITY 3987 result_type max() const {return t();} 3988 3989 friend _LIBCPP_INLINE_VISIBILITY 3990 bool operator==(const binomial_distribution& __x, 3991 const binomial_distribution& __y) 3992 {return __x.__p_ == __y.__p_;} 3993 friend _LIBCPP_INLINE_VISIBILITY 3994 bool operator!=(const binomial_distribution& __x, 3995 const binomial_distribution& __y) 3996 {return !(__x == __y);} 3997 }; 3998 3999 template<class _IntType> 4000 binomial_distribution<_IntType>::param_type::param_type(result_type __t, double __p) 4001 : __t_(__t), __p_(__p) 4002 { 4003 if (0 < __p_ && __p_ < 1) 4004 { 4005 __r0_ = static_cast<result_type>((__t_ + 1) * __p_); 4006 __pr_ = _VSTD::exp(_VSTD::lgamma(__t_ + 1.) - _VSTD::lgamma(__r0_ + 1.) - 4007 _VSTD::lgamma(__t_ - __r0_ + 1.) + __r0_ * _VSTD::log(__p_) + 4008 (__t_ - __r0_) * _VSTD::log(1 - __p_)); 4009 __odds_ratio_ = __p_ / (1 - __p_); 4010 } 4011 } 4012 4013 // Reference: Kemp, C.D. (1986). `A modal method for generating binomial 4014 // variables', Commun. Statist. - Theor. Meth. 15(3), 805-813. 4015 template<class _IntType> 4016 template<class _URNG> 4017 _IntType 4018 binomial_distribution<_IntType>::operator()(_URNG& __g, const param_type& __pr) 4019 { 4020 if (__pr.__t_ == 0 || __pr.__p_ == 0) 4021 return 0; 4022 if (__pr.__p_ == 1) 4023 return __pr.__t_; 4024 uniform_real_distribution<double> __gen; 4025 double __u = __gen(__g) - __pr.__pr_; 4026 if (__u < 0) 4027 return __pr.__r0_; 4028 double __pu = __pr.__pr_; 4029 double __pd = __pu; 4030 result_type __ru = __pr.__r0_; 4031 result_type __rd = __ru; 4032 while (true) 4033 { 4034 if (__rd >= 1) 4035 { 4036 __pd *= __rd / (__pr.__odds_ratio_ * (__pr.__t_ - __rd + 1)); 4037 __u -= __pd; 4038 if (__u < 0) 4039 return __rd - 1; 4040 } 4041 if ( __rd != 0 ) 4042 --__rd; 4043 ++__ru; 4044 if (__ru <= __pr.__t_) 4045 { 4046 __pu *= (__pr.__t_ - __ru + 1) * __pr.__odds_ratio_ / __ru; 4047 __u -= __pu; 4048 if (__u < 0) 4049 return __ru; 4050 } 4051 } 4052 } 4053 4054 template <class _CharT, class _Traits, class _IntType> 4055 basic_ostream<_CharT, _Traits>& 4056 operator<<(basic_ostream<_CharT, _Traits>& __os, 4057 const binomial_distribution<_IntType>& __x) 4058 { 4059 __save_flags<_CharT, _Traits> __lx(__os); 4060 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4061 ios_base::scientific); 4062 _CharT __sp = __os.widen(' '); 4063 __os.fill(__sp); 4064 return __os << __x.t() << __sp << __x.p(); 4065 } 4066 4067 template <class _CharT, class _Traits, class _IntType> 4068 basic_istream<_CharT, _Traits>& 4069 operator>>(basic_istream<_CharT, _Traits>& __is, 4070 binomial_distribution<_IntType>& __x) 4071 { 4072 typedef binomial_distribution<_IntType> _Eng; 4073 typedef typename _Eng::result_type result_type; 4074 typedef typename _Eng::param_type param_type; 4075 __save_flags<_CharT, _Traits> __lx(__is); 4076 __is.flags(ios_base::dec | ios_base::skipws); 4077 result_type __t; 4078 double __p; 4079 __is >> __t >> __p; 4080 if (!__is.fail()) 4081 __x.param(param_type(__t, __p)); 4082 return __is; 4083 } 4084 4085 // exponential_distribution 4086 4087 template<class _RealType = double> 4088 class _LIBCPP_TYPE_VIS_ONLY exponential_distribution 4089 { 4090 public: 4091 // types 4092 typedef _RealType result_type; 4093 4094 class _LIBCPP_TYPE_VIS_ONLY param_type 4095 { 4096 result_type __lambda_; 4097 public: 4098 typedef exponential_distribution distribution_type; 4099 4100 _LIBCPP_INLINE_VISIBILITY 4101 explicit param_type(result_type __lambda = 1) : __lambda_(__lambda) {} 4102 4103 _LIBCPP_INLINE_VISIBILITY 4104 result_type lambda() const {return __lambda_;} 4105 4106 friend _LIBCPP_INLINE_VISIBILITY 4107 bool operator==(const param_type& __x, const param_type& __y) 4108 {return __x.__lambda_ == __y.__lambda_;} 4109 friend _LIBCPP_INLINE_VISIBILITY 4110 bool operator!=(const param_type& __x, const param_type& __y) 4111 {return !(__x == __y);} 4112 }; 4113 4114 private: 4115 param_type __p_; 4116 4117 public: 4118 // constructors and reset functions 4119 _LIBCPP_INLINE_VISIBILITY 4120 explicit exponential_distribution(result_type __lambda = 1) 4121 : __p_(param_type(__lambda)) {} 4122 _LIBCPP_INLINE_VISIBILITY 4123 explicit exponential_distribution(const param_type& __p) : __p_(__p) {} 4124 _LIBCPP_INLINE_VISIBILITY 4125 void reset() {} 4126 4127 // generating functions 4128 template<class _URNG> 4129 _LIBCPP_INLINE_VISIBILITY 4130 result_type operator()(_URNG& __g) 4131 {return (*this)(__g, __p_);} 4132 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 4133 4134 // property functions 4135 _LIBCPP_INLINE_VISIBILITY 4136 result_type lambda() const {return __p_.lambda();} 4137 4138 _LIBCPP_INLINE_VISIBILITY 4139 param_type param() const {return __p_;} 4140 _LIBCPP_INLINE_VISIBILITY 4141 void param(const param_type& __p) {__p_ = __p;} 4142 4143 _LIBCPP_INLINE_VISIBILITY 4144 result_type min() const {return 0;} 4145 _LIBCPP_INLINE_VISIBILITY 4146 result_type max() const {return numeric_limits<result_type>::infinity();} 4147 4148 friend _LIBCPP_INLINE_VISIBILITY 4149 bool operator==(const exponential_distribution& __x, 4150 const exponential_distribution& __y) 4151 {return __x.__p_ == __y.__p_;} 4152 friend _LIBCPP_INLINE_VISIBILITY 4153 bool operator!=(const exponential_distribution& __x, 4154 const exponential_distribution& __y) 4155 {return !(__x == __y);} 4156 }; 4157 4158 template <class _RealType> 4159 template<class _URNG> 4160 _RealType 4161 exponential_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 4162 { 4163 return -_VSTD::log 4164 ( 4165 result_type(1) - 4166 _VSTD::generate_canonical<result_type, 4167 numeric_limits<result_type>::digits>(__g) 4168 ) 4169 / __p.lambda(); 4170 } 4171 4172 template <class _CharT, class _Traits, class _RealType> 4173 basic_ostream<_CharT, _Traits>& 4174 operator<<(basic_ostream<_CharT, _Traits>& __os, 4175 const exponential_distribution<_RealType>& __x) 4176 { 4177 __save_flags<_CharT, _Traits> __lx(__os); 4178 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4179 ios_base::scientific); 4180 return __os << __x.lambda(); 4181 } 4182 4183 template <class _CharT, class _Traits, class _RealType> 4184 basic_istream<_CharT, _Traits>& 4185 operator>>(basic_istream<_CharT, _Traits>& __is, 4186 exponential_distribution<_RealType>& __x) 4187 { 4188 typedef exponential_distribution<_RealType> _Eng; 4189 typedef typename _Eng::result_type result_type; 4190 typedef typename _Eng::param_type param_type; 4191 __save_flags<_CharT, _Traits> __lx(__is); 4192 __is.flags(ios_base::dec | ios_base::skipws); 4193 result_type __lambda; 4194 __is >> __lambda; 4195 if (!__is.fail()) 4196 __x.param(param_type(__lambda)); 4197 return __is; 4198 } 4199 4200 // normal_distribution 4201 4202 template<class _RealType = double> 4203 class _LIBCPP_TYPE_VIS_ONLY normal_distribution 4204 { 4205 public: 4206 // types 4207 typedef _RealType result_type; 4208 4209 class _LIBCPP_TYPE_VIS_ONLY param_type 4210 { 4211 result_type __mean_; 4212 result_type __stddev_; 4213 public: 4214 typedef normal_distribution distribution_type; 4215 4216 _LIBCPP_INLINE_VISIBILITY 4217 explicit param_type(result_type __mean = 0, result_type __stddev = 1) 4218 : __mean_(__mean), __stddev_(__stddev) {} 4219 4220 _LIBCPP_INLINE_VISIBILITY 4221 result_type mean() const {return __mean_;} 4222 _LIBCPP_INLINE_VISIBILITY 4223 result_type stddev() const {return __stddev_;} 4224 4225 friend _LIBCPP_INLINE_VISIBILITY 4226 bool operator==(const param_type& __x, const param_type& __y) 4227 {return __x.__mean_ == __y.__mean_ && __x.__stddev_ == __y.__stddev_;} 4228 friend _LIBCPP_INLINE_VISIBILITY 4229 bool operator!=(const param_type& __x, const param_type& __y) 4230 {return !(__x == __y);} 4231 }; 4232 4233 private: 4234 param_type __p_; 4235 result_type _V_; 4236 bool _V_hot_; 4237 4238 public: 4239 // constructors and reset functions 4240 _LIBCPP_INLINE_VISIBILITY 4241 explicit normal_distribution(result_type __mean = 0, result_type __stddev = 1) 4242 : __p_(param_type(__mean, __stddev)), _V_hot_(false) {} 4243 _LIBCPP_INLINE_VISIBILITY 4244 explicit normal_distribution(const param_type& __p) 4245 : __p_(__p), _V_hot_(false) {} 4246 _LIBCPP_INLINE_VISIBILITY 4247 void reset() {_V_hot_ = false;} 4248 4249 // generating functions 4250 template<class _URNG> 4251 _LIBCPP_INLINE_VISIBILITY 4252 result_type operator()(_URNG& __g) 4253 {return (*this)(__g, __p_);} 4254 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 4255 4256 // property functions 4257 _LIBCPP_INLINE_VISIBILITY 4258 result_type mean() const {return __p_.mean();} 4259 _LIBCPP_INLINE_VISIBILITY 4260 result_type stddev() const {return __p_.stddev();} 4261 4262 _LIBCPP_INLINE_VISIBILITY 4263 param_type param() const {return __p_;} 4264 _LIBCPP_INLINE_VISIBILITY 4265 void param(const param_type& __p) {__p_ = __p;} 4266 4267 _LIBCPP_INLINE_VISIBILITY 4268 result_type min() const {return -numeric_limits<result_type>::infinity();} 4269 _LIBCPP_INLINE_VISIBILITY 4270 result_type max() const {return numeric_limits<result_type>::infinity();} 4271 4272 friend _LIBCPP_INLINE_VISIBILITY 4273 bool operator==(const normal_distribution& __x, 4274 const normal_distribution& __y) 4275 {return __x.__p_ == __y.__p_ && __x._V_hot_ == __y._V_hot_ && 4276 (!__x._V_hot_ || __x._V_ == __y._V_);} 4277 friend _LIBCPP_INLINE_VISIBILITY 4278 bool operator!=(const normal_distribution& __x, 4279 const normal_distribution& __y) 4280 {return !(__x == __y);} 4281 4282 template <class _CharT, class _Traits, class _RT> 4283 friend 4284 basic_ostream<_CharT, _Traits>& 4285 operator<<(basic_ostream<_CharT, _Traits>& __os, 4286 const normal_distribution<_RT>& __x); 4287 4288 template <class _CharT, class _Traits, class _RT> 4289 friend 4290 basic_istream<_CharT, _Traits>& 4291 operator>>(basic_istream<_CharT, _Traits>& __is, 4292 normal_distribution<_RT>& __x); 4293 }; 4294 4295 template <class _RealType> 4296 template<class _URNG> 4297 _RealType 4298 normal_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 4299 { 4300 result_type _Up; 4301 if (_V_hot_) 4302 { 4303 _V_hot_ = false; 4304 _Up = _V_; 4305 } 4306 else 4307 { 4308 uniform_real_distribution<result_type> _Uni(-1, 1); 4309 result_type __u; 4310 result_type __v; 4311 result_type __s; 4312 do 4313 { 4314 __u = _Uni(__g); 4315 __v = _Uni(__g); 4316 __s = __u * __u + __v * __v; 4317 } while (__s > 1 || __s == 0); 4318 result_type _Fp = _VSTD::sqrt(-2 * _VSTD::log(__s) / __s); 4319 _V_ = __v * _Fp; 4320 _V_hot_ = true; 4321 _Up = __u * _Fp; 4322 } 4323 return _Up * __p.stddev() + __p.mean(); 4324 } 4325 4326 template <class _CharT, class _Traits, class _RT> 4327 basic_ostream<_CharT, _Traits>& 4328 operator<<(basic_ostream<_CharT, _Traits>& __os, 4329 const normal_distribution<_RT>& __x) 4330 { 4331 __save_flags<_CharT, _Traits> __lx(__os); 4332 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4333 ios_base::scientific); 4334 _CharT __sp = __os.widen(' '); 4335 __os.fill(__sp); 4336 __os << __x.mean() << __sp << __x.stddev() << __sp << __x._V_hot_; 4337 if (__x._V_hot_) 4338 __os << __sp << __x._V_; 4339 return __os; 4340 } 4341 4342 template <class _CharT, class _Traits, class _RT> 4343 basic_istream<_CharT, _Traits>& 4344 operator>>(basic_istream<_CharT, _Traits>& __is, 4345 normal_distribution<_RT>& __x) 4346 { 4347 typedef normal_distribution<_RT> _Eng; 4348 typedef typename _Eng::result_type result_type; 4349 typedef typename _Eng::param_type param_type; 4350 __save_flags<_CharT, _Traits> __lx(__is); 4351 __is.flags(ios_base::dec | ios_base::skipws); 4352 result_type __mean; 4353 result_type __stddev; 4354 result_type _Vp = 0; 4355 bool _V_hot = false; 4356 __is >> __mean >> __stddev >> _V_hot; 4357 if (_V_hot) 4358 __is >> _Vp; 4359 if (!__is.fail()) 4360 { 4361 __x.param(param_type(__mean, __stddev)); 4362 __x._V_hot_ = _V_hot; 4363 __x._V_ = _Vp; 4364 } 4365 return __is; 4366 } 4367 4368 // lognormal_distribution 4369 4370 template<class _RealType = double> 4371 class _LIBCPP_TYPE_VIS_ONLY lognormal_distribution 4372 { 4373 public: 4374 // types 4375 typedef _RealType result_type; 4376 4377 class _LIBCPP_TYPE_VIS_ONLY param_type 4378 { 4379 normal_distribution<result_type> __nd_; 4380 public: 4381 typedef lognormal_distribution distribution_type; 4382 4383 _LIBCPP_INLINE_VISIBILITY 4384 explicit param_type(result_type __m = 0, result_type __s = 1) 4385 : __nd_(__m, __s) {} 4386 4387 _LIBCPP_INLINE_VISIBILITY 4388 result_type m() const {return __nd_.mean();} 4389 _LIBCPP_INLINE_VISIBILITY 4390 result_type s() const {return __nd_.stddev();} 4391 4392 friend _LIBCPP_INLINE_VISIBILITY 4393 bool operator==(const param_type& __x, const param_type& __y) 4394 {return __x.__nd_ == __y.__nd_;} 4395 friend _LIBCPP_INLINE_VISIBILITY 4396 bool operator!=(const param_type& __x, const param_type& __y) 4397 {return !(__x == __y);} 4398 friend class lognormal_distribution; 4399 4400 template <class _CharT, class _Traits, class _RT> 4401 friend 4402 basic_ostream<_CharT, _Traits>& 4403 operator<<(basic_ostream<_CharT, _Traits>& __os, 4404 const lognormal_distribution<_RT>& __x); 4405 4406 template <class _CharT, class _Traits, class _RT> 4407 friend 4408 basic_istream<_CharT, _Traits>& 4409 operator>>(basic_istream<_CharT, _Traits>& __is, 4410 lognormal_distribution<_RT>& __x); 4411 }; 4412 4413 private: 4414 param_type __p_; 4415 4416 public: 4417 // constructor and reset functions 4418 _LIBCPP_INLINE_VISIBILITY 4419 explicit lognormal_distribution(result_type __m = 0, result_type __s = 1) 4420 : __p_(param_type(__m, __s)) {} 4421 _LIBCPP_INLINE_VISIBILITY 4422 explicit lognormal_distribution(const param_type& __p) 4423 : __p_(__p) {} 4424 _LIBCPP_INLINE_VISIBILITY 4425 void reset() {__p_.__nd_.reset();} 4426 4427 // generating functions 4428 template<class _URNG> 4429 _LIBCPP_INLINE_VISIBILITY 4430 result_type operator()(_URNG& __g) 4431 {return (*this)(__g, __p_);} 4432 template<class _URNG> 4433 _LIBCPP_INLINE_VISIBILITY 4434 result_type operator()(_URNG& __g, const param_type& __p) 4435 {return _VSTD::exp(const_cast<normal_distribution<result_type>&>(__p.__nd_)(__g));} 4436 4437 // property functions 4438 _LIBCPP_INLINE_VISIBILITY 4439 result_type m() const {return __p_.m();} 4440 _LIBCPP_INLINE_VISIBILITY 4441 result_type s() const {return __p_.s();} 4442 4443 _LIBCPP_INLINE_VISIBILITY 4444 param_type param() const {return __p_;} 4445 _LIBCPP_INLINE_VISIBILITY 4446 void param(const param_type& __p) {__p_ = __p;} 4447 4448 _LIBCPP_INLINE_VISIBILITY 4449 result_type min() const {return 0;} 4450 _LIBCPP_INLINE_VISIBILITY 4451 result_type max() const {return numeric_limits<result_type>::infinity();} 4452 4453 friend _LIBCPP_INLINE_VISIBILITY 4454 bool operator==(const lognormal_distribution& __x, 4455 const lognormal_distribution& __y) 4456 {return __x.__p_ == __y.__p_;} 4457 friend _LIBCPP_INLINE_VISIBILITY 4458 bool operator!=(const lognormal_distribution& __x, 4459 const lognormal_distribution& __y) 4460 {return !(__x == __y);} 4461 4462 template <class _CharT, class _Traits, class _RT> 4463 friend 4464 basic_ostream<_CharT, _Traits>& 4465 operator<<(basic_ostream<_CharT, _Traits>& __os, 4466 const lognormal_distribution<_RT>& __x); 4467 4468 template <class _CharT, class _Traits, class _RT> 4469 friend 4470 basic_istream<_CharT, _Traits>& 4471 operator>>(basic_istream<_CharT, _Traits>& __is, 4472 lognormal_distribution<_RT>& __x); 4473 }; 4474 4475 template <class _CharT, class _Traits, class _RT> 4476 inline _LIBCPP_INLINE_VISIBILITY 4477 basic_ostream<_CharT, _Traits>& 4478 operator<<(basic_ostream<_CharT, _Traits>& __os, 4479 const lognormal_distribution<_RT>& __x) 4480 { 4481 return __os << __x.__p_.__nd_; 4482 } 4483 4484 template <class _CharT, class _Traits, class _RT> 4485 inline _LIBCPP_INLINE_VISIBILITY 4486 basic_istream<_CharT, _Traits>& 4487 operator>>(basic_istream<_CharT, _Traits>& __is, 4488 lognormal_distribution<_RT>& __x) 4489 { 4490 return __is >> __x.__p_.__nd_; 4491 } 4492 4493 // poisson_distribution 4494 4495 template<class _IntType = int> 4496 class _LIBCPP_TYPE_VIS_ONLY poisson_distribution 4497 { 4498 public: 4499 // types 4500 typedef _IntType result_type; 4501 4502 class _LIBCPP_TYPE_VIS_ONLY param_type 4503 { 4504 double __mean_; 4505 double __s_; 4506 double __d_; 4507 double __l_; 4508 double __omega_; 4509 double __c0_; 4510 double __c1_; 4511 double __c2_; 4512 double __c3_; 4513 double __c_; 4514 4515 public: 4516 typedef poisson_distribution distribution_type; 4517 4518 explicit param_type(double __mean = 1.0); 4519 4520 _LIBCPP_INLINE_VISIBILITY 4521 double mean() const {return __mean_;} 4522 4523 friend _LIBCPP_INLINE_VISIBILITY 4524 bool operator==(const param_type& __x, const param_type& __y) 4525 {return __x.__mean_ == __y.__mean_;} 4526 friend _LIBCPP_INLINE_VISIBILITY 4527 bool operator!=(const param_type& __x, const param_type& __y) 4528 {return !(__x == __y);} 4529 4530 friend class poisson_distribution; 4531 }; 4532 4533 private: 4534 param_type __p_; 4535 4536 public: 4537 // constructors and reset functions 4538 _LIBCPP_INLINE_VISIBILITY 4539 explicit poisson_distribution(double __mean = 1.0) : __p_(__mean) {} 4540 _LIBCPP_INLINE_VISIBILITY 4541 explicit poisson_distribution(const param_type& __p) : __p_(__p) {} 4542 _LIBCPP_INLINE_VISIBILITY 4543 void reset() {} 4544 4545 // generating functions 4546 template<class _URNG> 4547 _LIBCPP_INLINE_VISIBILITY 4548 result_type operator()(_URNG& __g) 4549 {return (*this)(__g, __p_);} 4550 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 4551 4552 // property functions 4553 _LIBCPP_INLINE_VISIBILITY 4554 double mean() const {return __p_.mean();} 4555 4556 _LIBCPP_INLINE_VISIBILITY 4557 param_type param() const {return __p_;} 4558 _LIBCPP_INLINE_VISIBILITY 4559 void param(const param_type& __p) {__p_ = __p;} 4560 4561 _LIBCPP_INLINE_VISIBILITY 4562 result_type min() const {return 0;} 4563 _LIBCPP_INLINE_VISIBILITY 4564 result_type max() const {return numeric_limits<result_type>::max();} 4565 4566 friend _LIBCPP_INLINE_VISIBILITY 4567 bool operator==(const poisson_distribution& __x, 4568 const poisson_distribution& __y) 4569 {return __x.__p_ == __y.__p_;} 4570 friend _LIBCPP_INLINE_VISIBILITY 4571 bool operator!=(const poisson_distribution& __x, 4572 const poisson_distribution& __y) 4573 {return !(__x == __y);} 4574 }; 4575 4576 template<class _IntType> 4577 poisson_distribution<_IntType>::param_type::param_type(double __mean) 4578 : __mean_(__mean) 4579 { 4580 if (__mean_ < 10) 4581 { 4582 __s_ = 0; 4583 __d_ = 0; 4584 __l_ = _VSTD::exp(-__mean_); 4585 __omega_ = 0; 4586 __c3_ = 0; 4587 __c2_ = 0; 4588 __c1_ = 0; 4589 __c0_ = 0; 4590 __c_ = 0; 4591 } 4592 else 4593 { 4594 __s_ = _VSTD::sqrt(__mean_); 4595 __d_ = 6 * __mean_ * __mean_; 4596 __l_ = static_cast<result_type>(__mean_ - 1.1484); 4597 __omega_ = .3989423 / __s_; 4598 double __b1_ = .4166667E-1 / __mean_; 4599 double __b2_ = .3 * __b1_ * __b1_; 4600 __c3_ = .1428571 * __b1_ * __b2_; 4601 __c2_ = __b2_ - 15. * __c3_; 4602 __c1_ = __b1_ - 6. * __b2_ + 45. * __c3_; 4603 __c0_ = 1. - __b1_ + 3. * __b2_ - 15. * __c3_; 4604 __c_ = .1069 / __mean_; 4605 } 4606 } 4607 4608 template <class _IntType> 4609 template<class _URNG> 4610 _IntType 4611 poisson_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr) 4612 { 4613 result_type __x; 4614 uniform_real_distribution<double> __urd; 4615 if (__pr.__mean_ < 10) 4616 { 4617 __x = 0; 4618 for (double __p = __urd(__urng); __p > __pr.__l_; ++__x) 4619 __p *= __urd(__urng); 4620 } 4621 else 4622 { 4623 double __difmuk; 4624 double __g = __pr.__mean_ + __pr.__s_ * normal_distribution<double>()(__urng); 4625 double __u; 4626 if (__g > 0) 4627 { 4628 __x = static_cast<result_type>(__g); 4629 if (__x >= __pr.__l_) 4630 return __x; 4631 __difmuk = __pr.__mean_ - __x; 4632 __u = __urd(__urng); 4633 if (__pr.__d_ * __u >= __difmuk * __difmuk * __difmuk) 4634 return __x; 4635 } 4636 exponential_distribution<double> __edist; 4637 for (bool __using_exp_dist = false; true; __using_exp_dist = true) 4638 { 4639 double __e; 4640 if (__using_exp_dist || __g < 0) 4641 { 4642 double __t; 4643 do 4644 { 4645 __e = __edist(__urng); 4646 __u = __urd(__urng); 4647 __u += __u - 1; 4648 __t = 1.8 + (__u < 0 ? -__e : __e); 4649 } while (__t <= -.6744); 4650 __x = __pr.__mean_ + __pr.__s_ * __t; 4651 __difmuk = __pr.__mean_ - __x; 4652 __using_exp_dist = true; 4653 } 4654 double __px; 4655 double __py; 4656 if (__x < 10) 4657 { 4658 const result_type __fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, 4659 40320, 362880}; 4660 __px = -__pr.__mean_; 4661 __py = _VSTD::pow(__pr.__mean_, (double)__x) / __fac[__x]; 4662 } 4663 else 4664 { 4665 double __del = .8333333E-1 / __x; 4666 __del -= 4.8 * __del * __del * __del; 4667 double __v = __difmuk / __x; 4668 if (_VSTD::abs(__v) > 0.25) 4669 __px = __x * _VSTD::log(1 + __v) - __difmuk - __del; 4670 else 4671 __px = __x * __v * __v * (((((((.1250060 * __v + -.1384794) * 4672 __v + .1421878) * __v + -.1661269) * __v + .2000118) * 4673 __v + -.2500068) * __v + .3333333) * __v + -.5) - __del; 4674 __py = .3989423 / _VSTD::sqrt(__x); 4675 } 4676 double __r = (0.5 - __difmuk) / __pr.__s_; 4677 double __r2 = __r * __r; 4678 double __fx = -0.5 * __r2; 4679 double __fy = __pr.__omega_ * (((__pr.__c3_ * __r2 + __pr.__c2_) * 4680 __r2 + __pr.__c1_) * __r2 + __pr.__c0_); 4681 if (__using_exp_dist) 4682 { 4683 if (__pr.__c_ * _VSTD::abs(__u) <= __py * _VSTD::exp(__px + __e) - 4684 __fy * _VSTD::exp(__fx + __e)) 4685 break; 4686 } 4687 else 4688 { 4689 if (__fy - __u * __fy <= __py * _VSTD::exp(__px - __fx)) 4690 break; 4691 } 4692 } 4693 } 4694 return __x; 4695 } 4696 4697 template <class _CharT, class _Traits, class _IntType> 4698 basic_ostream<_CharT, _Traits>& 4699 operator<<(basic_ostream<_CharT, _Traits>& __os, 4700 const poisson_distribution<_IntType>& __x) 4701 { 4702 __save_flags<_CharT, _Traits> __lx(__os); 4703 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4704 ios_base::scientific); 4705 return __os << __x.mean(); 4706 } 4707 4708 template <class _CharT, class _Traits, class _IntType> 4709 basic_istream<_CharT, _Traits>& 4710 operator>>(basic_istream<_CharT, _Traits>& __is, 4711 poisson_distribution<_IntType>& __x) 4712 { 4713 typedef poisson_distribution<_IntType> _Eng; 4714 typedef typename _Eng::param_type param_type; 4715 __save_flags<_CharT, _Traits> __lx(__is); 4716 __is.flags(ios_base::dec | ios_base::skipws); 4717 double __mean; 4718 __is >> __mean; 4719 if (!__is.fail()) 4720 __x.param(param_type(__mean)); 4721 return __is; 4722 } 4723 4724 // weibull_distribution 4725 4726 template<class _RealType = double> 4727 class _LIBCPP_TYPE_VIS_ONLY weibull_distribution 4728 { 4729 public: 4730 // types 4731 typedef _RealType result_type; 4732 4733 class _LIBCPP_TYPE_VIS_ONLY param_type 4734 { 4735 result_type __a_; 4736 result_type __b_; 4737 public: 4738 typedef weibull_distribution distribution_type; 4739 4740 _LIBCPP_INLINE_VISIBILITY 4741 explicit param_type(result_type __a = 1, result_type __b = 1) 4742 : __a_(__a), __b_(__b) {} 4743 4744 _LIBCPP_INLINE_VISIBILITY 4745 result_type a() const {return __a_;} 4746 _LIBCPP_INLINE_VISIBILITY 4747 result_type b() const {return __b_;} 4748 4749 friend _LIBCPP_INLINE_VISIBILITY 4750 bool operator==(const param_type& __x, const param_type& __y) 4751 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} 4752 friend _LIBCPP_INLINE_VISIBILITY 4753 bool operator!=(const param_type& __x, const param_type& __y) 4754 {return !(__x == __y);} 4755 }; 4756 4757 private: 4758 param_type __p_; 4759 4760 public: 4761 // constructor and reset functions 4762 _LIBCPP_INLINE_VISIBILITY 4763 explicit weibull_distribution(result_type __a = 1, result_type __b = 1) 4764 : __p_(param_type(__a, __b)) {} 4765 _LIBCPP_INLINE_VISIBILITY 4766 explicit weibull_distribution(const param_type& __p) 4767 : __p_(__p) {} 4768 _LIBCPP_INLINE_VISIBILITY 4769 void reset() {} 4770 4771 // generating functions 4772 template<class _URNG> 4773 _LIBCPP_INLINE_VISIBILITY 4774 result_type operator()(_URNG& __g) 4775 {return (*this)(__g, __p_);} 4776 template<class _URNG> 4777 _LIBCPP_INLINE_VISIBILITY 4778 result_type operator()(_URNG& __g, const param_type& __p) 4779 {return __p.b() * 4780 _VSTD::pow(exponential_distribution<result_type>()(__g), 1/__p.a());} 4781 4782 // property functions 4783 _LIBCPP_INLINE_VISIBILITY 4784 result_type a() const {return __p_.a();} 4785 _LIBCPP_INLINE_VISIBILITY 4786 result_type b() const {return __p_.b();} 4787 4788 _LIBCPP_INLINE_VISIBILITY 4789 param_type param() const {return __p_;} 4790 _LIBCPP_INLINE_VISIBILITY 4791 void param(const param_type& __p) {__p_ = __p;} 4792 4793 _LIBCPP_INLINE_VISIBILITY 4794 result_type min() const {return 0;} 4795 _LIBCPP_INLINE_VISIBILITY 4796 result_type max() const {return numeric_limits<result_type>::infinity();} 4797 4798 friend _LIBCPP_INLINE_VISIBILITY 4799 bool operator==(const weibull_distribution& __x, 4800 const weibull_distribution& __y) 4801 {return __x.__p_ == __y.__p_;} 4802 friend _LIBCPP_INLINE_VISIBILITY 4803 bool operator!=(const weibull_distribution& __x, 4804 const weibull_distribution& __y) 4805 {return !(__x == __y);} 4806 }; 4807 4808 template <class _CharT, class _Traits, class _RT> 4809 basic_ostream<_CharT, _Traits>& 4810 operator<<(basic_ostream<_CharT, _Traits>& __os, 4811 const weibull_distribution<_RT>& __x) 4812 { 4813 __save_flags<_CharT, _Traits> __lx(__os); 4814 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4815 ios_base::scientific); 4816 _CharT __sp = __os.widen(' '); 4817 __os.fill(__sp); 4818 __os << __x.a() << __sp << __x.b(); 4819 return __os; 4820 } 4821 4822 template <class _CharT, class _Traits, class _RT> 4823 basic_istream<_CharT, _Traits>& 4824 operator>>(basic_istream<_CharT, _Traits>& __is, 4825 weibull_distribution<_RT>& __x) 4826 { 4827 typedef weibull_distribution<_RT> _Eng; 4828 typedef typename _Eng::result_type result_type; 4829 typedef typename _Eng::param_type param_type; 4830 __save_flags<_CharT, _Traits> __lx(__is); 4831 __is.flags(ios_base::dec | ios_base::skipws); 4832 result_type __a; 4833 result_type __b; 4834 __is >> __a >> __b; 4835 if (!__is.fail()) 4836 __x.param(param_type(__a, __b)); 4837 return __is; 4838 } 4839 4840 template<class _RealType = double> 4841 class _LIBCPP_TYPE_VIS_ONLY extreme_value_distribution 4842 { 4843 public: 4844 // types 4845 typedef _RealType result_type; 4846 4847 class _LIBCPP_TYPE_VIS_ONLY param_type 4848 { 4849 result_type __a_; 4850 result_type __b_; 4851 public: 4852 typedef extreme_value_distribution distribution_type; 4853 4854 _LIBCPP_INLINE_VISIBILITY 4855 explicit param_type(result_type __a = 0, result_type __b = 1) 4856 : __a_(__a), __b_(__b) {} 4857 4858 _LIBCPP_INLINE_VISIBILITY 4859 result_type a() const {return __a_;} 4860 _LIBCPP_INLINE_VISIBILITY 4861 result_type b() const {return __b_;} 4862 4863 friend _LIBCPP_INLINE_VISIBILITY 4864 bool operator==(const param_type& __x, const param_type& __y) 4865 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} 4866 friend _LIBCPP_INLINE_VISIBILITY 4867 bool operator!=(const param_type& __x, const param_type& __y) 4868 {return !(__x == __y);} 4869 }; 4870 4871 private: 4872 param_type __p_; 4873 4874 public: 4875 // constructor and reset functions 4876 _LIBCPP_INLINE_VISIBILITY 4877 explicit extreme_value_distribution(result_type __a = 0, result_type __b = 1) 4878 : __p_(param_type(__a, __b)) {} 4879 _LIBCPP_INLINE_VISIBILITY 4880 explicit extreme_value_distribution(const param_type& __p) 4881 : __p_(__p) {} 4882 _LIBCPP_INLINE_VISIBILITY 4883 void reset() {} 4884 4885 // generating functions 4886 template<class _URNG> 4887 _LIBCPP_INLINE_VISIBILITY 4888 result_type operator()(_URNG& __g) 4889 {return (*this)(__g, __p_);} 4890 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 4891 4892 // property functions 4893 _LIBCPP_INLINE_VISIBILITY 4894 result_type a() const {return __p_.a();} 4895 _LIBCPP_INLINE_VISIBILITY 4896 result_type b() const {return __p_.b();} 4897 4898 _LIBCPP_INLINE_VISIBILITY 4899 param_type param() const {return __p_;} 4900 _LIBCPP_INLINE_VISIBILITY 4901 void param(const param_type& __p) {__p_ = __p;} 4902 4903 _LIBCPP_INLINE_VISIBILITY 4904 result_type min() const {return -numeric_limits<result_type>::infinity();} 4905 _LIBCPP_INLINE_VISIBILITY 4906 result_type max() const {return numeric_limits<result_type>::infinity();} 4907 4908 friend _LIBCPP_INLINE_VISIBILITY 4909 bool operator==(const extreme_value_distribution& __x, 4910 const extreme_value_distribution& __y) 4911 {return __x.__p_ == __y.__p_;} 4912 friend _LIBCPP_INLINE_VISIBILITY 4913 bool operator!=(const extreme_value_distribution& __x, 4914 const extreme_value_distribution& __y) 4915 {return !(__x == __y);} 4916 }; 4917 4918 template<class _RealType> 4919 template<class _URNG> 4920 _RealType 4921 extreme_value_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 4922 { 4923 return __p.a() - __p.b() * 4924 _VSTD::log(-_VSTD::log(1-uniform_real_distribution<result_type>()(__g))); 4925 } 4926 4927 template <class _CharT, class _Traits, class _RT> 4928 basic_ostream<_CharT, _Traits>& 4929 operator<<(basic_ostream<_CharT, _Traits>& __os, 4930 const extreme_value_distribution<_RT>& __x) 4931 { 4932 __save_flags<_CharT, _Traits> __lx(__os); 4933 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4934 ios_base::scientific); 4935 _CharT __sp = __os.widen(' '); 4936 __os.fill(__sp); 4937 __os << __x.a() << __sp << __x.b(); 4938 return __os; 4939 } 4940 4941 template <class _CharT, class _Traits, class _RT> 4942 basic_istream<_CharT, _Traits>& 4943 operator>>(basic_istream<_CharT, _Traits>& __is, 4944 extreme_value_distribution<_RT>& __x) 4945 { 4946 typedef extreme_value_distribution<_RT> _Eng; 4947 typedef typename _Eng::result_type result_type; 4948 typedef typename _Eng::param_type param_type; 4949 __save_flags<_CharT, _Traits> __lx(__is); 4950 __is.flags(ios_base::dec | ios_base::skipws); 4951 result_type __a; 4952 result_type __b; 4953 __is >> __a >> __b; 4954 if (!__is.fail()) 4955 __x.param(param_type(__a, __b)); 4956 return __is; 4957 } 4958 4959 // gamma_distribution 4960 4961 template<class _RealType = double> 4962 class _LIBCPP_TYPE_VIS_ONLY gamma_distribution 4963 { 4964 public: 4965 // types 4966 typedef _RealType result_type; 4967 4968 class _LIBCPP_TYPE_VIS_ONLY param_type 4969 { 4970 result_type __alpha_; 4971 result_type __beta_; 4972 public: 4973 typedef gamma_distribution distribution_type; 4974 4975 _LIBCPP_INLINE_VISIBILITY 4976 explicit param_type(result_type __alpha = 1, result_type __beta = 1) 4977 : __alpha_(__alpha), __beta_(__beta) {} 4978 4979 _LIBCPP_INLINE_VISIBILITY 4980 result_type alpha() const {return __alpha_;} 4981 _LIBCPP_INLINE_VISIBILITY 4982 result_type beta() const {return __beta_;} 4983 4984 friend _LIBCPP_INLINE_VISIBILITY 4985 bool operator==(const param_type& __x, const param_type& __y) 4986 {return __x.__alpha_ == __y.__alpha_ && __x.__beta_ == __y.__beta_;} 4987 friend _LIBCPP_INLINE_VISIBILITY 4988 bool operator!=(const param_type& __x, const param_type& __y) 4989 {return !(__x == __y);} 4990 }; 4991 4992 private: 4993 param_type __p_; 4994 4995 public: 4996 // constructors and reset functions 4997 _LIBCPP_INLINE_VISIBILITY 4998 explicit gamma_distribution(result_type __alpha = 1, result_type __beta = 1) 4999 : __p_(param_type(__alpha, __beta)) {} 5000 _LIBCPP_INLINE_VISIBILITY 5001 explicit gamma_distribution(const param_type& __p) 5002 : __p_(__p) {} 5003 _LIBCPP_INLINE_VISIBILITY 5004 void reset() {} 5005 5006 // generating functions 5007 template<class _URNG> 5008 _LIBCPP_INLINE_VISIBILITY 5009 result_type operator()(_URNG& __g) 5010 {return (*this)(__g, __p_);} 5011 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 5012 5013 // property functions 5014 _LIBCPP_INLINE_VISIBILITY 5015 result_type alpha() const {return __p_.alpha();} 5016 _LIBCPP_INLINE_VISIBILITY 5017 result_type beta() const {return __p_.beta();} 5018 5019 _LIBCPP_INLINE_VISIBILITY 5020 param_type param() const {return __p_;} 5021 _LIBCPP_INLINE_VISIBILITY 5022 void param(const param_type& __p) {__p_ = __p;} 5023 5024 _LIBCPP_INLINE_VISIBILITY 5025 result_type min() const {return 0;} 5026 _LIBCPP_INLINE_VISIBILITY 5027 result_type max() const {return numeric_limits<result_type>::infinity();} 5028 5029 friend _LIBCPP_INLINE_VISIBILITY 5030 bool operator==(const gamma_distribution& __x, 5031 const gamma_distribution& __y) 5032 {return __x.__p_ == __y.__p_;} 5033 friend _LIBCPP_INLINE_VISIBILITY 5034 bool operator!=(const gamma_distribution& __x, 5035 const gamma_distribution& __y) 5036 {return !(__x == __y);} 5037 }; 5038 5039 template <class _RealType> 5040 template<class _URNG> 5041 _RealType 5042 gamma_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 5043 { 5044 result_type __a = __p.alpha(); 5045 uniform_real_distribution<result_type> __gen(0, 1); 5046 exponential_distribution<result_type> __egen; 5047 result_type __x; 5048 if (__a == 1) 5049 __x = __egen(__g); 5050 else if (__a > 1) 5051 { 5052 const result_type __b = __a - 1; 5053 const result_type __c = 3 * __a - result_type(0.75); 5054 while (true) 5055 { 5056 const result_type __u = __gen(__g); 5057 const result_type __v = __gen(__g); 5058 const result_type __w = __u * (1 - __u); 5059 if (__w != 0) 5060 { 5061 const result_type __y = _VSTD::sqrt(__c / __w) * 5062 (__u - result_type(0.5)); 5063 __x = __b + __y; 5064 if (__x >= 0) 5065 { 5066 const result_type __z = 64 * __w * __w * __w * __v * __v; 5067 if (__z <= 1 - 2 * __y * __y / __x) 5068 break; 5069 if (_VSTD::log(__z) <= 2 * (__b * _VSTD::log(__x / __b) - __y)) 5070 break; 5071 } 5072 } 5073 } 5074 } 5075 else // __a < 1 5076 { 5077 while (true) 5078 { 5079 const result_type __u = __gen(__g); 5080 const result_type __es = __egen(__g); 5081 if (__u <= 1 - __a) 5082 { 5083 __x = _VSTD::pow(__u, 1 / __a); 5084 if (__x <= __es) 5085 break; 5086 } 5087 else 5088 { 5089 const result_type __e = -_VSTD::log((1-__u)/__a); 5090 __x = _VSTD::pow(1 - __a + __a * __e, 1 / __a); 5091 if (__x <= __e + __es) 5092 break; 5093 } 5094 } 5095 } 5096 return __x * __p.beta(); 5097 } 5098 5099 template <class _CharT, class _Traits, class _RT> 5100 basic_ostream<_CharT, _Traits>& 5101 operator<<(basic_ostream<_CharT, _Traits>& __os, 5102 const gamma_distribution<_RT>& __x) 5103 { 5104 __save_flags<_CharT, _Traits> __lx(__os); 5105 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5106 ios_base::scientific); 5107 _CharT __sp = __os.widen(' '); 5108 __os.fill(__sp); 5109 __os << __x.alpha() << __sp << __x.beta(); 5110 return __os; 5111 } 5112 5113 template <class _CharT, class _Traits, class _RT> 5114 basic_istream<_CharT, _Traits>& 5115 operator>>(basic_istream<_CharT, _Traits>& __is, 5116 gamma_distribution<_RT>& __x) 5117 { 5118 typedef gamma_distribution<_RT> _Eng; 5119 typedef typename _Eng::result_type result_type; 5120 typedef typename _Eng::param_type param_type; 5121 __save_flags<_CharT, _Traits> __lx(__is); 5122 __is.flags(ios_base::dec | ios_base::skipws); 5123 result_type __alpha; 5124 result_type __beta; 5125 __is >> __alpha >> __beta; 5126 if (!__is.fail()) 5127 __x.param(param_type(__alpha, __beta)); 5128 return __is; 5129 } 5130 5131 // negative_binomial_distribution 5132 5133 template<class _IntType = int> 5134 class _LIBCPP_TYPE_VIS_ONLY negative_binomial_distribution 5135 { 5136 public: 5137 // types 5138 typedef _IntType result_type; 5139 5140 class _LIBCPP_TYPE_VIS_ONLY param_type 5141 { 5142 result_type __k_; 5143 double __p_; 5144 public: 5145 typedef negative_binomial_distribution distribution_type; 5146 5147 _LIBCPP_INLINE_VISIBILITY 5148 explicit param_type(result_type __k = 1, double __p = 0.5) 5149 : __k_(__k), __p_(__p) {} 5150 5151 _LIBCPP_INLINE_VISIBILITY 5152 result_type k() const {return __k_;} 5153 _LIBCPP_INLINE_VISIBILITY 5154 double p() const {return __p_;} 5155 5156 friend _LIBCPP_INLINE_VISIBILITY 5157 bool operator==(const param_type& __x, const param_type& __y) 5158 {return __x.__k_ == __y.__k_ && __x.__p_ == __y.__p_;} 5159 friend _LIBCPP_INLINE_VISIBILITY 5160 bool operator!=(const param_type& __x, const param_type& __y) 5161 {return !(__x == __y);} 5162 }; 5163 5164 private: 5165 param_type __p_; 5166 5167 public: 5168 // constructor and reset functions 5169 _LIBCPP_INLINE_VISIBILITY 5170 explicit negative_binomial_distribution(result_type __k = 1, double __p = 0.5) 5171 : __p_(__k, __p) {} 5172 _LIBCPP_INLINE_VISIBILITY 5173 explicit negative_binomial_distribution(const param_type& __p) : __p_(__p) {} 5174 _LIBCPP_INLINE_VISIBILITY 5175 void reset() {} 5176 5177 // generating functions 5178 template<class _URNG> 5179 _LIBCPP_INLINE_VISIBILITY 5180 result_type operator()(_URNG& __g) 5181 {return (*this)(__g, __p_);} 5182 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 5183 5184 // property functions 5185 _LIBCPP_INLINE_VISIBILITY 5186 result_type k() const {return __p_.k();} 5187 _LIBCPP_INLINE_VISIBILITY 5188 double p() const {return __p_.p();} 5189 5190 _LIBCPP_INLINE_VISIBILITY 5191 param_type param() const {return __p_;} 5192 _LIBCPP_INLINE_VISIBILITY 5193 void param(const param_type& __p) {__p_ = __p;} 5194 5195 _LIBCPP_INLINE_VISIBILITY 5196 result_type min() const {return 0;} 5197 _LIBCPP_INLINE_VISIBILITY 5198 result_type max() const {return numeric_limits<result_type>::max();} 5199 5200 friend _LIBCPP_INLINE_VISIBILITY 5201 bool operator==(const negative_binomial_distribution& __x, 5202 const negative_binomial_distribution& __y) 5203 {return __x.__p_ == __y.__p_;} 5204 friend _LIBCPP_INLINE_VISIBILITY 5205 bool operator!=(const negative_binomial_distribution& __x, 5206 const negative_binomial_distribution& __y) 5207 {return !(__x == __y);} 5208 }; 5209 5210 template <class _IntType> 5211 template<class _URNG> 5212 _IntType 5213 negative_binomial_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr) 5214 { 5215 result_type __k = __pr.k(); 5216 double __p = __pr.p(); 5217 if (__k <= 21 * __p) 5218 { 5219 bernoulli_distribution __gen(__p); 5220 result_type __f = 0; 5221 result_type __s = 0; 5222 while (__s < __k) 5223 { 5224 if (__gen(__urng)) 5225 ++__s; 5226 else 5227 ++__f; 5228 } 5229 return __f; 5230 } 5231 return poisson_distribution<result_type>(gamma_distribution<double> 5232 (__k, (1-__p)/__p)(__urng))(__urng); 5233 } 5234 5235 template <class _CharT, class _Traits, class _IntType> 5236 basic_ostream<_CharT, _Traits>& 5237 operator<<(basic_ostream<_CharT, _Traits>& __os, 5238 const negative_binomial_distribution<_IntType>& __x) 5239 { 5240 __save_flags<_CharT, _Traits> __lx(__os); 5241 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5242 ios_base::scientific); 5243 _CharT __sp = __os.widen(' '); 5244 __os.fill(__sp); 5245 return __os << __x.k() << __sp << __x.p(); 5246 } 5247 5248 template <class _CharT, class _Traits, class _IntType> 5249 basic_istream<_CharT, _Traits>& 5250 operator>>(basic_istream<_CharT, _Traits>& __is, 5251 negative_binomial_distribution<_IntType>& __x) 5252 { 5253 typedef negative_binomial_distribution<_IntType> _Eng; 5254 typedef typename _Eng::result_type result_type; 5255 typedef typename _Eng::param_type param_type; 5256 __save_flags<_CharT, _Traits> __lx(__is); 5257 __is.flags(ios_base::dec | ios_base::skipws); 5258 result_type __k; 5259 double __p; 5260 __is >> __k >> __p; 5261 if (!__is.fail()) 5262 __x.param(param_type(__k, __p)); 5263 return __is; 5264 } 5265 5266 // geometric_distribution 5267 5268 template<class _IntType = int> 5269 class _LIBCPP_TYPE_VIS_ONLY geometric_distribution 5270 { 5271 public: 5272 // types 5273 typedef _IntType result_type; 5274 5275 class _LIBCPP_TYPE_VIS_ONLY param_type 5276 { 5277 double __p_; 5278 public: 5279 typedef geometric_distribution distribution_type; 5280 5281 _LIBCPP_INLINE_VISIBILITY 5282 explicit param_type(double __p = 0.5) : __p_(__p) {} 5283 5284 _LIBCPP_INLINE_VISIBILITY 5285 double p() const {return __p_;} 5286 5287 friend _LIBCPP_INLINE_VISIBILITY 5288 bool operator==(const param_type& __x, const param_type& __y) 5289 {return __x.__p_ == __y.__p_;} 5290 friend _LIBCPP_INLINE_VISIBILITY 5291 bool operator!=(const param_type& __x, const param_type& __y) 5292 {return !(__x == __y);} 5293 }; 5294 5295 private: 5296 param_type __p_; 5297 5298 public: 5299 // constructors and reset functions 5300 _LIBCPP_INLINE_VISIBILITY 5301 explicit geometric_distribution(double __p = 0.5) : __p_(__p) {} 5302 _LIBCPP_INLINE_VISIBILITY 5303 explicit geometric_distribution(const param_type& __p) : __p_(__p) {} 5304 _LIBCPP_INLINE_VISIBILITY 5305 void reset() {} 5306 5307 // generating functions 5308 template<class _URNG> 5309 _LIBCPP_INLINE_VISIBILITY 5310 result_type operator()(_URNG& __g) 5311 {return (*this)(__g, __p_);} 5312 template<class _URNG> 5313 _LIBCPP_INLINE_VISIBILITY 5314 result_type operator()(_URNG& __g, const param_type& __p) 5315 {return negative_binomial_distribution<result_type>(1, __p.p())(__g);} 5316 5317 // property functions 5318 _LIBCPP_INLINE_VISIBILITY 5319 double p() const {return __p_.p();} 5320 5321 _LIBCPP_INLINE_VISIBILITY 5322 param_type param() const {return __p_;} 5323 _LIBCPP_INLINE_VISIBILITY 5324 void param(const param_type& __p) {__p_ = __p;} 5325 5326 _LIBCPP_INLINE_VISIBILITY 5327 result_type min() const {return 0;} 5328 _LIBCPP_INLINE_VISIBILITY 5329 result_type max() const {return numeric_limits<result_type>::max();} 5330 5331 friend _LIBCPP_INLINE_VISIBILITY 5332 bool operator==(const geometric_distribution& __x, 5333 const geometric_distribution& __y) 5334 {return __x.__p_ == __y.__p_;} 5335 friend _LIBCPP_INLINE_VISIBILITY 5336 bool operator!=(const geometric_distribution& __x, 5337 const geometric_distribution& __y) 5338 {return !(__x == __y);} 5339 }; 5340 5341 template <class _CharT, class _Traits, class _IntType> 5342 basic_ostream<_CharT, _Traits>& 5343 operator<<(basic_ostream<_CharT, _Traits>& __os, 5344 const geometric_distribution<_IntType>& __x) 5345 { 5346 __save_flags<_CharT, _Traits> __lx(__os); 5347 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5348 ios_base::scientific); 5349 return __os << __x.p(); 5350 } 5351 5352 template <class _CharT, class _Traits, class _IntType> 5353 basic_istream<_CharT, _Traits>& 5354 operator>>(basic_istream<_CharT, _Traits>& __is, 5355 geometric_distribution<_IntType>& __x) 5356 { 5357 typedef geometric_distribution<_IntType> _Eng; 5358 typedef typename _Eng::param_type param_type; 5359 __save_flags<_CharT, _Traits> __lx(__is); 5360 __is.flags(ios_base::dec | ios_base::skipws); 5361 double __p; 5362 __is >> __p; 5363 if (!__is.fail()) 5364 __x.param(param_type(__p)); 5365 return __is; 5366 } 5367 5368 // chi_squared_distribution 5369 5370 template<class _RealType = double> 5371 class _LIBCPP_TYPE_VIS_ONLY chi_squared_distribution 5372 { 5373 public: 5374 // types 5375 typedef _RealType result_type; 5376 5377 class _LIBCPP_TYPE_VIS_ONLY param_type 5378 { 5379 result_type __n_; 5380 public: 5381 typedef chi_squared_distribution distribution_type; 5382 5383 _LIBCPP_INLINE_VISIBILITY 5384 explicit param_type(result_type __n = 1) : __n_(__n) {} 5385 5386 _LIBCPP_INLINE_VISIBILITY 5387 result_type n() const {return __n_;} 5388 5389 friend _LIBCPP_INLINE_VISIBILITY 5390 bool operator==(const param_type& __x, const param_type& __y) 5391 {return __x.__n_ == __y.__n_;} 5392 friend _LIBCPP_INLINE_VISIBILITY 5393 bool operator!=(const param_type& __x, const param_type& __y) 5394 {return !(__x == __y);} 5395 }; 5396 5397 private: 5398 param_type __p_; 5399 5400 public: 5401 // constructor and reset functions 5402 _LIBCPP_INLINE_VISIBILITY 5403 explicit chi_squared_distribution(result_type __n = 1) 5404 : __p_(param_type(__n)) {} 5405 _LIBCPP_INLINE_VISIBILITY 5406 explicit chi_squared_distribution(const param_type& __p) 5407 : __p_(__p) {} 5408 _LIBCPP_INLINE_VISIBILITY 5409 void reset() {} 5410 5411 // generating functions 5412 template<class _URNG> 5413 _LIBCPP_INLINE_VISIBILITY 5414 result_type operator()(_URNG& __g) 5415 {return (*this)(__g, __p_);} 5416 template<class _URNG> 5417 _LIBCPP_INLINE_VISIBILITY 5418 result_type operator()(_URNG& __g, const param_type& __p) 5419 {return gamma_distribution<result_type>(__p.n() / 2, 2)(__g);} 5420 5421 // property functions 5422 _LIBCPP_INLINE_VISIBILITY 5423 result_type n() const {return __p_.n();} 5424 5425 _LIBCPP_INLINE_VISIBILITY 5426 param_type param() const {return __p_;} 5427 _LIBCPP_INLINE_VISIBILITY 5428 void param(const param_type& __p) {__p_ = __p;} 5429 5430 _LIBCPP_INLINE_VISIBILITY 5431 result_type min() const {return 0;} 5432 _LIBCPP_INLINE_VISIBILITY 5433 result_type max() const {return numeric_limits<result_type>::infinity();} 5434 5435 friend _LIBCPP_INLINE_VISIBILITY 5436 bool operator==(const chi_squared_distribution& __x, 5437 const chi_squared_distribution& __y) 5438 {return __x.__p_ == __y.__p_;} 5439 friend _LIBCPP_INLINE_VISIBILITY 5440 bool operator!=(const chi_squared_distribution& __x, 5441 const chi_squared_distribution& __y) 5442 {return !(__x == __y);} 5443 }; 5444 5445 template <class _CharT, class _Traits, class _RT> 5446 basic_ostream<_CharT, _Traits>& 5447 operator<<(basic_ostream<_CharT, _Traits>& __os, 5448 const chi_squared_distribution<_RT>& __x) 5449 { 5450 __save_flags<_CharT, _Traits> __lx(__os); 5451 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5452 ios_base::scientific); 5453 __os << __x.n(); 5454 return __os; 5455 } 5456 5457 template <class _CharT, class _Traits, class _RT> 5458 basic_istream<_CharT, _Traits>& 5459 operator>>(basic_istream<_CharT, _Traits>& __is, 5460 chi_squared_distribution<_RT>& __x) 5461 { 5462 typedef chi_squared_distribution<_RT> _Eng; 5463 typedef typename _Eng::result_type result_type; 5464 typedef typename _Eng::param_type param_type; 5465 __save_flags<_CharT, _Traits> __lx(__is); 5466 __is.flags(ios_base::dec | ios_base::skipws); 5467 result_type __n; 5468 __is >> __n; 5469 if (!__is.fail()) 5470 __x.param(param_type(__n)); 5471 return __is; 5472 } 5473 5474 // cauchy_distribution 5475 5476 template<class _RealType = double> 5477 class _LIBCPP_TYPE_VIS_ONLY cauchy_distribution 5478 { 5479 public: 5480 // types 5481 typedef _RealType result_type; 5482 5483 class _LIBCPP_TYPE_VIS_ONLY param_type 5484 { 5485 result_type __a_; 5486 result_type __b_; 5487 public: 5488 typedef cauchy_distribution distribution_type; 5489 5490 _LIBCPP_INLINE_VISIBILITY 5491 explicit param_type(result_type __a = 0, result_type __b = 1) 5492 : __a_(__a), __b_(__b) {} 5493 5494 _LIBCPP_INLINE_VISIBILITY 5495 result_type a() const {return __a_;} 5496 _LIBCPP_INLINE_VISIBILITY 5497 result_type b() const {return __b_;} 5498 5499 friend _LIBCPP_INLINE_VISIBILITY 5500 bool operator==(const param_type& __x, const param_type& __y) 5501 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} 5502 friend _LIBCPP_INLINE_VISIBILITY 5503 bool operator!=(const param_type& __x, const param_type& __y) 5504 {return !(__x == __y);} 5505 }; 5506 5507 private: 5508 param_type __p_; 5509 5510 public: 5511 // constructor and reset functions 5512 _LIBCPP_INLINE_VISIBILITY 5513 explicit cauchy_distribution(result_type __a = 0, result_type __b = 1) 5514 : __p_(param_type(__a, __b)) {} 5515 _LIBCPP_INLINE_VISIBILITY 5516 explicit cauchy_distribution(const param_type& __p) 5517 : __p_(__p) {} 5518 _LIBCPP_INLINE_VISIBILITY 5519 void reset() {} 5520 5521 // generating functions 5522 template<class _URNG> 5523 _LIBCPP_INLINE_VISIBILITY 5524 result_type operator()(_URNG& __g) 5525 {return (*this)(__g, __p_);} 5526 template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p); 5527 5528 // property functions 5529 _LIBCPP_INLINE_VISIBILITY 5530 result_type a() const {return __p_.a();} 5531 _LIBCPP_INLINE_VISIBILITY 5532 result_type b() const {return __p_.b();} 5533 5534 _LIBCPP_INLINE_VISIBILITY 5535 param_type param() const {return __p_;} 5536 _LIBCPP_INLINE_VISIBILITY 5537 void param(const param_type& __p) {__p_ = __p;} 5538 5539 _LIBCPP_INLINE_VISIBILITY 5540 result_type min() const {return -numeric_limits<result_type>::infinity();} 5541 _LIBCPP_INLINE_VISIBILITY 5542 result_type max() const {return numeric_limits<result_type>::infinity();} 5543 5544 friend _LIBCPP_INLINE_VISIBILITY 5545 bool operator==(const cauchy_distribution& __x, 5546 const cauchy_distribution& __y) 5547 {return __x.__p_ == __y.__p_;} 5548 friend _LIBCPP_INLINE_VISIBILITY 5549 bool operator!=(const cauchy_distribution& __x, 5550 const cauchy_distribution& __y) 5551 {return !(__x == __y);} 5552 }; 5553 5554 template <class _RealType> 5555 template<class _URNG> 5556 inline 5557 _RealType 5558 cauchy_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 5559 { 5560 uniform_real_distribution<result_type> __gen; 5561 // purposefully let tan arg get as close to pi/2 as it wants, tan will return a finite 5562 return __p.a() + __p.b() * _VSTD::tan(3.1415926535897932384626433832795 * __gen(__g)); 5563 } 5564 5565 template <class _CharT, class _Traits, class _RT> 5566 basic_ostream<_CharT, _Traits>& 5567 operator<<(basic_ostream<_CharT, _Traits>& __os, 5568 const cauchy_distribution<_RT>& __x) 5569 { 5570 __save_flags<_CharT, _Traits> __lx(__os); 5571 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5572 ios_base::scientific); 5573 _CharT __sp = __os.widen(' '); 5574 __os.fill(__sp); 5575 __os << __x.a() << __sp << __x.b(); 5576 return __os; 5577 } 5578 5579 template <class _CharT, class _Traits, class _RT> 5580 basic_istream<_CharT, _Traits>& 5581 operator>>(basic_istream<_CharT, _Traits>& __is, 5582 cauchy_distribution<_RT>& __x) 5583 { 5584 typedef cauchy_distribution<_RT> _Eng; 5585 typedef typename _Eng::result_type result_type; 5586 typedef typename _Eng::param_type param_type; 5587 __save_flags<_CharT, _Traits> __lx(__is); 5588 __is.flags(ios_base::dec | ios_base::skipws); 5589 result_type __a; 5590 result_type __b; 5591 __is >> __a >> __b; 5592 if (!__is.fail()) 5593 __x.param(param_type(__a, __b)); 5594 return __is; 5595 } 5596 5597 // fisher_f_distribution 5598 5599 template<class _RealType = double> 5600 class _LIBCPP_TYPE_VIS_ONLY fisher_f_distribution 5601 { 5602 public: 5603 // types 5604 typedef _RealType result_type; 5605 5606 class _LIBCPP_TYPE_VIS_ONLY param_type 5607 { 5608 result_type __m_; 5609 result_type __n_; 5610 public: 5611 typedef fisher_f_distribution distribution_type; 5612 5613 _LIBCPP_INLINE_VISIBILITY 5614 explicit param_type(result_type __m = 1, result_type __n = 1) 5615 : __m_(__m), __n_(__n) {} 5616 5617 _LIBCPP_INLINE_VISIBILITY 5618 result_type m() const {return __m_;} 5619 _LIBCPP_INLINE_VISIBILITY 5620 result_type n() const {return __n_;} 5621 5622 friend _LIBCPP_INLINE_VISIBILITY 5623 bool operator==(const param_type& __x, const param_type& __y) 5624 {return __x.__m_ == __y.__m_ && __x.__n_ == __y.__n_;} 5625 friend _LIBCPP_INLINE_VISIBILITY 5626 bool operator!=(const param_type& __x, const param_type& __y) 5627 {return !(__x == __y);} 5628 }; 5629 5630 private: 5631 param_type __p_; 5632 5633 public: 5634 // constructor and reset functions 5635 _LIBCPP_INLINE_VISIBILITY 5636 explicit fisher_f_distribution(result_type __m = 1, result_type __n = 1) 5637 : __p_(param_type(__m, __n)) {} 5638 _LIBCPP_INLINE_VISIBILITY 5639 explicit fisher_f_distribution(const param_type& __p) 5640 : __p_(__p) {} 5641 _LIBCPP_INLINE_VISIBILITY 5642 void reset() {} 5643 5644 // generating functions 5645 template<class _URNG> 5646 _LIBCPP_INLINE_VISIBILITY 5647 result_type operator()(_URNG& __g) 5648 {return (*this)(__g, __p_);} 5649 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 5650 5651 // property functions 5652 _LIBCPP_INLINE_VISIBILITY 5653 result_type m() const {return __p_.m();} 5654 _LIBCPP_INLINE_VISIBILITY 5655 result_type n() const {return __p_.n();} 5656 5657 _LIBCPP_INLINE_VISIBILITY 5658 param_type param() const {return __p_;} 5659 _LIBCPP_INLINE_VISIBILITY 5660 void param(const param_type& __p) {__p_ = __p;} 5661 5662 _LIBCPP_INLINE_VISIBILITY 5663 result_type min() const {return 0;} 5664 _LIBCPP_INLINE_VISIBILITY 5665 result_type max() const {return numeric_limits<result_type>::infinity();} 5666 5667 friend _LIBCPP_INLINE_VISIBILITY 5668 bool operator==(const fisher_f_distribution& __x, 5669 const fisher_f_distribution& __y) 5670 {return __x.__p_ == __y.__p_;} 5671 friend _LIBCPP_INLINE_VISIBILITY 5672 bool operator!=(const fisher_f_distribution& __x, 5673 const fisher_f_distribution& __y) 5674 {return !(__x == __y);} 5675 }; 5676 5677 template <class _RealType> 5678 template<class _URNG> 5679 _RealType 5680 fisher_f_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 5681 { 5682 gamma_distribution<result_type> __gdm(__p.m() * result_type(.5)); 5683 gamma_distribution<result_type> __gdn(__p.n() * result_type(.5)); 5684 return __p.n() * __gdm(__g) / (__p.m() * __gdn(__g)); 5685 } 5686 5687 template <class _CharT, class _Traits, class _RT> 5688 basic_ostream<_CharT, _Traits>& 5689 operator<<(basic_ostream<_CharT, _Traits>& __os, 5690 const fisher_f_distribution<_RT>& __x) 5691 { 5692 __save_flags<_CharT, _Traits> __lx(__os); 5693 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5694 ios_base::scientific); 5695 _CharT __sp = __os.widen(' '); 5696 __os.fill(__sp); 5697 __os << __x.m() << __sp << __x.n(); 5698 return __os; 5699 } 5700 5701 template <class _CharT, class _Traits, class _RT> 5702 basic_istream<_CharT, _Traits>& 5703 operator>>(basic_istream<_CharT, _Traits>& __is, 5704 fisher_f_distribution<_RT>& __x) 5705 { 5706 typedef fisher_f_distribution<_RT> _Eng; 5707 typedef typename _Eng::result_type result_type; 5708 typedef typename _Eng::param_type param_type; 5709 __save_flags<_CharT, _Traits> __lx(__is); 5710 __is.flags(ios_base::dec | ios_base::skipws); 5711 result_type __m; 5712 result_type __n; 5713 __is >> __m >> __n; 5714 if (!__is.fail()) 5715 __x.param(param_type(__m, __n)); 5716 return __is; 5717 } 5718 5719 // student_t_distribution 5720 5721 template<class _RealType = double> 5722 class _LIBCPP_TYPE_VIS_ONLY student_t_distribution 5723 { 5724 public: 5725 // types 5726 typedef _RealType result_type; 5727 5728 class _LIBCPP_TYPE_VIS_ONLY param_type 5729 { 5730 result_type __n_; 5731 public: 5732 typedef student_t_distribution distribution_type; 5733 5734 _LIBCPP_INLINE_VISIBILITY 5735 explicit param_type(result_type __n = 1) : __n_(__n) {} 5736 5737 _LIBCPP_INLINE_VISIBILITY 5738 result_type n() const {return __n_;} 5739 5740 friend _LIBCPP_INLINE_VISIBILITY 5741 bool operator==(const param_type& __x, const param_type& __y) 5742 {return __x.__n_ == __y.__n_;} 5743 friend _LIBCPP_INLINE_VISIBILITY 5744 bool operator!=(const param_type& __x, const param_type& __y) 5745 {return !(__x == __y);} 5746 }; 5747 5748 private: 5749 param_type __p_; 5750 normal_distribution<result_type> __nd_; 5751 5752 public: 5753 // constructor and reset functions 5754 _LIBCPP_INLINE_VISIBILITY 5755 explicit student_t_distribution(result_type __n = 1) 5756 : __p_(param_type(__n)) {} 5757 _LIBCPP_INLINE_VISIBILITY 5758 explicit student_t_distribution(const param_type& __p) 5759 : __p_(__p) {} 5760 _LIBCPP_INLINE_VISIBILITY 5761 void reset() {__nd_.reset();} 5762 5763 // generating functions 5764 template<class _URNG> 5765 _LIBCPP_INLINE_VISIBILITY 5766 result_type operator()(_URNG& __g) 5767 {return (*this)(__g, __p_);} 5768 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 5769 5770 // property functions 5771 _LIBCPP_INLINE_VISIBILITY 5772 result_type n() const {return __p_.n();} 5773 5774 _LIBCPP_INLINE_VISIBILITY 5775 param_type param() const {return __p_;} 5776 _LIBCPP_INLINE_VISIBILITY 5777 void param(const param_type& __p) {__p_ = __p;} 5778 5779 _LIBCPP_INLINE_VISIBILITY 5780 result_type min() const {return -numeric_limits<result_type>::infinity();} 5781 _LIBCPP_INLINE_VISIBILITY 5782 result_type max() const {return numeric_limits<result_type>::infinity();} 5783 5784 friend _LIBCPP_INLINE_VISIBILITY 5785 bool operator==(const student_t_distribution& __x, 5786 const student_t_distribution& __y) 5787 {return __x.__p_ == __y.__p_;} 5788 friend _LIBCPP_INLINE_VISIBILITY 5789 bool operator!=(const student_t_distribution& __x, 5790 const student_t_distribution& __y) 5791 {return !(__x == __y);} 5792 }; 5793 5794 template <class _RealType> 5795 template<class _URNG> 5796 _RealType 5797 student_t_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 5798 { 5799 gamma_distribution<result_type> __gd(__p.n() * .5, 2); 5800 return __nd_(__g) * _VSTD::sqrt(__p.n()/__gd(__g)); 5801 } 5802 5803 template <class _CharT, class _Traits, class _RT> 5804 basic_ostream<_CharT, _Traits>& 5805 operator<<(basic_ostream<_CharT, _Traits>& __os, 5806 const student_t_distribution<_RT>& __x) 5807 { 5808 __save_flags<_CharT, _Traits> __lx(__os); 5809 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5810 ios_base::scientific); 5811 __os << __x.n(); 5812 return __os; 5813 } 5814 5815 template <class _CharT, class _Traits, class _RT> 5816 basic_istream<_CharT, _Traits>& 5817 operator>>(basic_istream<_CharT, _Traits>& __is, 5818 student_t_distribution<_RT>& __x) 5819 { 5820 typedef student_t_distribution<_RT> _Eng; 5821 typedef typename _Eng::result_type result_type; 5822 typedef typename _Eng::param_type param_type; 5823 __save_flags<_CharT, _Traits> __lx(__is); 5824 __is.flags(ios_base::dec | ios_base::skipws); 5825 result_type __n; 5826 __is >> __n; 5827 if (!__is.fail()) 5828 __x.param(param_type(__n)); 5829 return __is; 5830 } 5831 5832 // discrete_distribution 5833 5834 template<class _IntType = int> 5835 class _LIBCPP_TYPE_VIS_ONLY discrete_distribution 5836 { 5837 public: 5838 // types 5839 typedef _IntType result_type; 5840 5841 class _LIBCPP_TYPE_VIS_ONLY param_type 5842 { 5843 vector<double> __p_; 5844 public: 5845 typedef discrete_distribution distribution_type; 5846 5847 _LIBCPP_INLINE_VISIBILITY 5848 param_type() {} 5849 template<class _InputIterator> 5850 _LIBCPP_INLINE_VISIBILITY 5851 param_type(_InputIterator __f, _InputIterator __l) 5852 : __p_(__f, __l) {__init();} 5853 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 5854 _LIBCPP_INLINE_VISIBILITY 5855 param_type(initializer_list<double> __wl) 5856 : __p_(__wl.begin(), __wl.end()) {__init();} 5857 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 5858 template<class _UnaryOperation> 5859 param_type(size_t __nw, double __xmin, double __xmax, 5860 _UnaryOperation __fw); 5861 5862 vector<double> probabilities() const; 5863 5864 friend _LIBCPP_INLINE_VISIBILITY 5865 bool operator==(const param_type& __x, const param_type& __y) 5866 {return __x.__p_ == __y.__p_;} 5867 friend _LIBCPP_INLINE_VISIBILITY 5868 bool operator!=(const param_type& __x, const param_type& __y) 5869 {return !(__x == __y);} 5870 5871 private: 5872 void __init(); 5873 5874 friend class discrete_distribution; 5875 5876 template <class _CharT, class _Traits, class _IT> 5877 friend 5878 basic_ostream<_CharT, _Traits>& 5879 operator<<(basic_ostream<_CharT, _Traits>& __os, 5880 const discrete_distribution<_IT>& __x); 5881 5882 template <class _CharT, class _Traits, class _IT> 5883 friend 5884 basic_istream<_CharT, _Traits>& 5885 operator>>(basic_istream<_CharT, _Traits>& __is, 5886 discrete_distribution<_IT>& __x); 5887 }; 5888 5889 private: 5890 param_type __p_; 5891 5892 public: 5893 // constructor and reset functions 5894 _LIBCPP_INLINE_VISIBILITY 5895 discrete_distribution() {} 5896 template<class _InputIterator> 5897 _LIBCPP_INLINE_VISIBILITY 5898 discrete_distribution(_InputIterator __f, _InputIterator __l) 5899 : __p_(__f, __l) {} 5900 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 5901 _LIBCPP_INLINE_VISIBILITY 5902 discrete_distribution(initializer_list<double> __wl) 5903 : __p_(__wl) {} 5904 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 5905 template<class _UnaryOperation> 5906 _LIBCPP_INLINE_VISIBILITY 5907 discrete_distribution(size_t __nw, double __xmin, double __xmax, 5908 _UnaryOperation __fw) 5909 : __p_(__nw, __xmin, __xmax, __fw) {} 5910 _LIBCPP_INLINE_VISIBILITY 5911 explicit discrete_distribution(const param_type& __p) 5912 : __p_(__p) {} 5913 _LIBCPP_INLINE_VISIBILITY 5914 void reset() {} 5915 5916 // generating functions 5917 template<class _URNG> 5918 _LIBCPP_INLINE_VISIBILITY 5919 result_type operator()(_URNG& __g) 5920 {return (*this)(__g, __p_);} 5921 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 5922 5923 // property functions 5924 _LIBCPP_INLINE_VISIBILITY 5925 vector<double> probabilities() const {return __p_.probabilities();} 5926 5927 _LIBCPP_INLINE_VISIBILITY 5928 param_type param() const {return __p_;} 5929 _LIBCPP_INLINE_VISIBILITY 5930 void param(const param_type& __p) {__p_ = __p;} 5931 5932 _LIBCPP_INLINE_VISIBILITY 5933 result_type min() const {return 0;} 5934 _LIBCPP_INLINE_VISIBILITY 5935 result_type max() const {return __p_.__p_.size();} 5936 5937 friend _LIBCPP_INLINE_VISIBILITY 5938 bool operator==(const discrete_distribution& __x, 5939 const discrete_distribution& __y) 5940 {return __x.__p_ == __y.__p_;} 5941 friend _LIBCPP_INLINE_VISIBILITY 5942 bool operator!=(const discrete_distribution& __x, 5943 const discrete_distribution& __y) 5944 {return !(__x == __y);} 5945 5946 template <class _CharT, class _Traits, class _IT> 5947 friend 5948 basic_ostream<_CharT, _Traits>& 5949 operator<<(basic_ostream<_CharT, _Traits>& __os, 5950 const discrete_distribution<_IT>& __x); 5951 5952 template <class _CharT, class _Traits, class _IT> 5953 friend 5954 basic_istream<_CharT, _Traits>& 5955 operator>>(basic_istream<_CharT, _Traits>& __is, 5956 discrete_distribution<_IT>& __x); 5957 }; 5958 5959 template<class _IntType> 5960 template<class _UnaryOperation> 5961 discrete_distribution<_IntType>::param_type::param_type(size_t __nw, 5962 double __xmin, 5963 double __xmax, 5964 _UnaryOperation __fw) 5965 { 5966 if (__nw > 1) 5967 { 5968 __p_.reserve(__nw - 1); 5969 double __d = (__xmax - __xmin) / __nw; 5970 double __d2 = __d / 2; 5971 for (size_t __k = 0; __k < __nw; ++__k) 5972 __p_.push_back(__fw(__xmin + __k * __d + __d2)); 5973 __init(); 5974 } 5975 } 5976 5977 template<class _IntType> 5978 void 5979 discrete_distribution<_IntType>::param_type::__init() 5980 { 5981 if (!__p_.empty()) 5982 { 5983 if (__p_.size() > 1) 5984 { 5985 double __s = _VSTD::accumulate(__p_.begin(), __p_.end(), 0.0); 5986 for (_VSTD::vector<double>::iterator __i = __p_.begin(), __e = __p_.end(); 5987 __i < __e; ++__i) 5988 *__i /= __s; 5989 vector<double> __t(__p_.size() - 1); 5990 _VSTD::partial_sum(__p_.begin(), __p_.end() - 1, __t.begin()); 5991 swap(__p_, __t); 5992 } 5993 else 5994 { 5995 __p_.clear(); 5996 __p_.shrink_to_fit(); 5997 } 5998 } 5999 } 6000 6001 template<class _IntType> 6002 vector<double> 6003 discrete_distribution<_IntType>::param_type::probabilities() const 6004 { 6005 size_t __n = __p_.size(); 6006 _VSTD::vector<double> __p(__n+1); 6007 _VSTD::adjacent_difference(__p_.begin(), __p_.end(), __p.begin()); 6008 if (__n > 0) 6009 __p[__n] = 1 - __p_[__n-1]; 6010 else 6011 __p[0] = 1; 6012 return __p; 6013 } 6014 6015 template<class _IntType> 6016 template<class _URNG> 6017 _IntType 6018 discrete_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p) 6019 { 6020 uniform_real_distribution<double> __gen; 6021 return static_cast<_IntType>( 6022 _VSTD::upper_bound(__p.__p_.begin(), __p.__p_.end(), __gen(__g)) - 6023 __p.__p_.begin()); 6024 } 6025 6026 template <class _CharT, class _Traits, class _IT> 6027 basic_ostream<_CharT, _Traits>& 6028 operator<<(basic_ostream<_CharT, _Traits>& __os, 6029 const discrete_distribution<_IT>& __x) 6030 { 6031 __save_flags<_CharT, _Traits> __lx(__os); 6032 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 6033 ios_base::scientific); 6034 _CharT __sp = __os.widen(' '); 6035 __os.fill(__sp); 6036 size_t __n = __x.__p_.__p_.size(); 6037 __os << __n; 6038 for (size_t __i = 0; __i < __n; ++__i) 6039 __os << __sp << __x.__p_.__p_[__i]; 6040 return __os; 6041 } 6042 6043 template <class _CharT, class _Traits, class _IT> 6044 basic_istream<_CharT, _Traits>& 6045 operator>>(basic_istream<_CharT, _Traits>& __is, 6046 discrete_distribution<_IT>& __x) 6047 { 6048 __save_flags<_CharT, _Traits> __lx(__is); 6049 __is.flags(ios_base::dec | ios_base::skipws); 6050 size_t __n; 6051 __is >> __n; 6052 vector<double> __p(__n); 6053 for (size_t __i = 0; __i < __n; ++__i) 6054 __is >> __p[__i]; 6055 if (!__is.fail()) 6056 swap(__x.__p_.__p_, __p); 6057 return __is; 6058 } 6059 6060 // piecewise_constant_distribution 6061 6062 template<class _RealType = double> 6063 class _LIBCPP_TYPE_VIS_ONLY piecewise_constant_distribution 6064 { 6065 public: 6066 // types 6067 typedef _RealType result_type; 6068 6069 class _LIBCPP_TYPE_VIS_ONLY param_type 6070 { 6071 vector<result_type> __b_; 6072 vector<result_type> __densities_; 6073 vector<result_type> __areas_; 6074 public: 6075 typedef piecewise_constant_distribution distribution_type; 6076 6077 param_type(); 6078 template<class _InputIteratorB, class _InputIteratorW> 6079 param_type(_InputIteratorB __fB, _InputIteratorB __lB, 6080 _InputIteratorW __fW); 6081 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6082 template<class _UnaryOperation> 6083 param_type(initializer_list<result_type> __bl, _UnaryOperation __fw); 6084 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6085 template<class _UnaryOperation> 6086 param_type(size_t __nw, result_type __xmin, result_type __xmax, 6087 _UnaryOperation __fw); 6088 param_type & operator=(const param_type& __rhs); 6089 6090 _LIBCPP_INLINE_VISIBILITY 6091 vector<result_type> intervals() const {return __b_;} 6092 _LIBCPP_INLINE_VISIBILITY 6093 vector<result_type> densities() const {return __densities_;} 6094 6095 friend _LIBCPP_INLINE_VISIBILITY 6096 bool operator==(const param_type& __x, const param_type& __y) 6097 {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;} 6098 friend _LIBCPP_INLINE_VISIBILITY 6099 bool operator!=(const param_type& __x, const param_type& __y) 6100 {return !(__x == __y);} 6101 6102 private: 6103 void __init(); 6104 6105 friend class piecewise_constant_distribution; 6106 6107 template <class _CharT, class _Traits, class _RT> 6108 friend 6109 basic_ostream<_CharT, _Traits>& 6110 operator<<(basic_ostream<_CharT, _Traits>& __os, 6111 const piecewise_constant_distribution<_RT>& __x); 6112 6113 template <class _CharT, class _Traits, class _RT> 6114 friend 6115 basic_istream<_CharT, _Traits>& 6116 operator>>(basic_istream<_CharT, _Traits>& __is, 6117 piecewise_constant_distribution<_RT>& __x); 6118 }; 6119 6120 private: 6121 param_type __p_; 6122 6123 public: 6124 // constructor and reset functions 6125 _LIBCPP_INLINE_VISIBILITY 6126 piecewise_constant_distribution() {} 6127 template<class _InputIteratorB, class _InputIteratorW> 6128 _LIBCPP_INLINE_VISIBILITY 6129 piecewise_constant_distribution(_InputIteratorB __fB, 6130 _InputIteratorB __lB, 6131 _InputIteratorW __fW) 6132 : __p_(__fB, __lB, __fW) {} 6133 6134 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6135 template<class _UnaryOperation> 6136 _LIBCPP_INLINE_VISIBILITY 6137 piecewise_constant_distribution(initializer_list<result_type> __bl, 6138 _UnaryOperation __fw) 6139 : __p_(__bl, __fw) {} 6140 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6141 6142 template<class _UnaryOperation> 6143 _LIBCPP_INLINE_VISIBILITY 6144 piecewise_constant_distribution(size_t __nw, result_type __xmin, 6145 result_type __xmax, _UnaryOperation __fw) 6146 : __p_(__nw, __xmin, __xmax, __fw) {} 6147 6148 _LIBCPP_INLINE_VISIBILITY 6149 explicit piecewise_constant_distribution(const param_type& __p) 6150 : __p_(__p) {} 6151 6152 _LIBCPP_INLINE_VISIBILITY 6153 void reset() {} 6154 6155 // generating functions 6156 template<class _URNG> 6157 _LIBCPP_INLINE_VISIBILITY 6158 result_type operator()(_URNG& __g) 6159 {return (*this)(__g, __p_);} 6160 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 6161 6162 // property functions 6163 _LIBCPP_INLINE_VISIBILITY 6164 vector<result_type> intervals() const {return __p_.intervals();} 6165 _LIBCPP_INLINE_VISIBILITY 6166 vector<result_type> densities() const {return __p_.densities();} 6167 6168 _LIBCPP_INLINE_VISIBILITY 6169 param_type param() const {return __p_;} 6170 _LIBCPP_INLINE_VISIBILITY 6171 void param(const param_type& __p) {__p_ = __p;} 6172 6173 _LIBCPP_INLINE_VISIBILITY 6174 result_type min() const {return __p_.__b_.front();} 6175 _LIBCPP_INLINE_VISIBILITY 6176 result_type max() const {return __p_.__b_.back();} 6177 6178 friend _LIBCPP_INLINE_VISIBILITY 6179 bool operator==(const piecewise_constant_distribution& __x, 6180 const piecewise_constant_distribution& __y) 6181 {return __x.__p_ == __y.__p_;} 6182 friend _LIBCPP_INLINE_VISIBILITY 6183 bool operator!=(const piecewise_constant_distribution& __x, 6184 const piecewise_constant_distribution& __y) 6185 {return !(__x == __y);} 6186 6187 template <class _CharT, class _Traits, class _RT> 6188 friend 6189 basic_ostream<_CharT, _Traits>& 6190 operator<<(basic_ostream<_CharT, _Traits>& __os, 6191 const piecewise_constant_distribution<_RT>& __x); 6192 6193 template <class _CharT, class _Traits, class _RT> 6194 friend 6195 basic_istream<_CharT, _Traits>& 6196 operator>>(basic_istream<_CharT, _Traits>& __is, 6197 piecewise_constant_distribution<_RT>& __x); 6198 }; 6199 6200 template<class _RealType> 6201 typename piecewise_constant_distribution<_RealType>::param_type & 6202 piecewise_constant_distribution<_RealType>::param_type::operator= 6203 (const param_type& __rhs) 6204 { 6205 // These can throw 6206 __b_.reserve (__rhs.__b_.size ()); 6207 __densities_.reserve(__rhs.__densities_.size()); 6208 __areas_.reserve (__rhs.__areas_.size()); 6209 6210 // These can not throw 6211 __b_ = __rhs.__b_; 6212 __densities_ = __rhs.__densities_; 6213 __areas_ = __rhs.__areas_; 6214 return *this; 6215 } 6216 6217 template<class _RealType> 6218 void 6219 piecewise_constant_distribution<_RealType>::param_type::__init() 6220 { 6221 // __densities_ contains non-normalized areas 6222 result_type __total_area = _VSTD::accumulate(__densities_.begin(), 6223 __densities_.end(), 6224 result_type()); 6225 for (size_t __i = 0; __i < __densities_.size(); ++__i) 6226 __densities_[__i] /= __total_area; 6227 // __densities_ contains normalized areas 6228 __areas_.assign(__densities_.size(), result_type()); 6229 _VSTD::partial_sum(__densities_.begin(), __densities_.end() - 1, 6230 __areas_.begin() + 1); 6231 // __areas_ contains partial sums of normalized areas: [0, __densities_ - 1] 6232 __densities_.back() = 1 - __areas_.back(); // correct round off error 6233 for (size_t __i = 0; __i < __densities_.size(); ++__i) 6234 __densities_[__i] /= (__b_[__i+1] - __b_[__i]); 6235 // __densities_ now contains __densities_ 6236 } 6237 6238 template<class _RealType> 6239 piecewise_constant_distribution<_RealType>::param_type::param_type() 6240 : __b_(2), 6241 __densities_(1, 1.0), 6242 __areas_(1, 0.0) 6243 { 6244 __b_[1] = 1; 6245 } 6246 6247 template<class _RealType> 6248 template<class _InputIteratorB, class _InputIteratorW> 6249 piecewise_constant_distribution<_RealType>::param_type::param_type( 6250 _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW) 6251 : __b_(__fB, __lB) 6252 { 6253 if (__b_.size() < 2) 6254 { 6255 __b_.resize(2); 6256 __b_[0] = 0; 6257 __b_[1] = 1; 6258 __densities_.assign(1, 1.0); 6259 __areas_.assign(1, 0.0); 6260 } 6261 else 6262 { 6263 __densities_.reserve(__b_.size() - 1); 6264 for (size_t __i = 0; __i < __b_.size() - 1; ++__i, ++__fW) 6265 __densities_.push_back(*__fW); 6266 __init(); 6267 } 6268 } 6269 6270 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6271 6272 template<class _RealType> 6273 template<class _UnaryOperation> 6274 piecewise_constant_distribution<_RealType>::param_type::param_type( 6275 initializer_list<result_type> __bl, _UnaryOperation __fw) 6276 : __b_(__bl.begin(), __bl.end()) 6277 { 6278 if (__b_.size() < 2) 6279 { 6280 __b_.resize(2); 6281 __b_[0] = 0; 6282 __b_[1] = 1; 6283 __densities_.assign(1, 1.0); 6284 __areas_.assign(1, 0.0); 6285 } 6286 else 6287 { 6288 __densities_.reserve(__b_.size() - 1); 6289 for (size_t __i = 0; __i < __b_.size() - 1; ++__i) 6290 __densities_.push_back(__fw((__b_[__i+1] + __b_[__i])*.5)); 6291 __init(); 6292 } 6293 } 6294 6295 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6296 6297 template<class _RealType> 6298 template<class _UnaryOperation> 6299 piecewise_constant_distribution<_RealType>::param_type::param_type( 6300 size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw) 6301 : __b_(__nw == 0 ? 2 : __nw + 1) 6302 { 6303 size_t __n = __b_.size() - 1; 6304 result_type __d = (__xmax - __xmin) / __n; 6305 __densities_.reserve(__n); 6306 for (size_t __i = 0; __i < __n; ++__i) 6307 { 6308 __b_[__i] = __xmin + __i * __d; 6309 __densities_.push_back(__fw(__b_[__i] + __d*.5)); 6310 } 6311 __b_[__n] = __xmax; 6312 __init(); 6313 } 6314 6315 template<class _RealType> 6316 template<class _URNG> 6317 _RealType 6318 piecewise_constant_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 6319 { 6320 typedef uniform_real_distribution<result_type> _Gen; 6321 result_type __u = _Gen()(__g); 6322 ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(), 6323 __u) - __p.__areas_.begin() - 1; 6324 return (__u - __p.__areas_[__k]) / __p.__densities_[__k] + __p.__b_[__k]; 6325 } 6326 6327 template <class _CharT, class _Traits, class _RT> 6328 basic_ostream<_CharT, _Traits>& 6329 operator<<(basic_ostream<_CharT, _Traits>& __os, 6330 const piecewise_constant_distribution<_RT>& __x) 6331 { 6332 __save_flags<_CharT, _Traits> __lx(__os); 6333 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 6334 ios_base::scientific); 6335 _CharT __sp = __os.widen(' '); 6336 __os.fill(__sp); 6337 size_t __n = __x.__p_.__b_.size(); 6338 __os << __n; 6339 for (size_t __i = 0; __i < __n; ++__i) 6340 __os << __sp << __x.__p_.__b_[__i]; 6341 __n = __x.__p_.__densities_.size(); 6342 __os << __sp << __n; 6343 for (size_t __i = 0; __i < __n; ++__i) 6344 __os << __sp << __x.__p_.__densities_[__i]; 6345 __n = __x.__p_.__areas_.size(); 6346 __os << __sp << __n; 6347 for (size_t __i = 0; __i < __n; ++__i) 6348 __os << __sp << __x.__p_.__areas_[__i]; 6349 return __os; 6350 } 6351 6352 template <class _CharT, class _Traits, class _RT> 6353 basic_istream<_CharT, _Traits>& 6354 operator>>(basic_istream<_CharT, _Traits>& __is, 6355 piecewise_constant_distribution<_RT>& __x) 6356 { 6357 typedef piecewise_constant_distribution<_RT> _Eng; 6358 typedef typename _Eng::result_type result_type; 6359 __save_flags<_CharT, _Traits> __lx(__is); 6360 __is.flags(ios_base::dec | ios_base::skipws); 6361 size_t __n; 6362 __is >> __n; 6363 vector<result_type> __b(__n); 6364 for (size_t __i = 0; __i < __n; ++__i) 6365 __is >> __b[__i]; 6366 __is >> __n; 6367 vector<result_type> __densities(__n); 6368 for (size_t __i = 0; __i < __n; ++__i) 6369 __is >> __densities[__i]; 6370 __is >> __n; 6371 vector<result_type> __areas(__n); 6372 for (size_t __i = 0; __i < __n; ++__i) 6373 __is >> __areas[__i]; 6374 if (!__is.fail()) 6375 { 6376 swap(__x.__p_.__b_, __b); 6377 swap(__x.__p_.__densities_, __densities); 6378 swap(__x.__p_.__areas_, __areas); 6379 } 6380 return __is; 6381 } 6382 6383 // piecewise_linear_distribution 6384 6385 template<class _RealType = double> 6386 class _LIBCPP_TYPE_VIS_ONLY piecewise_linear_distribution 6387 { 6388 public: 6389 // types 6390 typedef _RealType result_type; 6391 6392 class _LIBCPP_TYPE_VIS_ONLY param_type 6393 { 6394 vector<result_type> __b_; 6395 vector<result_type> __densities_; 6396 vector<result_type> __areas_; 6397 public: 6398 typedef piecewise_linear_distribution distribution_type; 6399 6400 param_type(); 6401 template<class _InputIteratorB, class _InputIteratorW> 6402 param_type(_InputIteratorB __fB, _InputIteratorB __lB, 6403 _InputIteratorW __fW); 6404 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6405 template<class _UnaryOperation> 6406 param_type(initializer_list<result_type> __bl, _UnaryOperation __fw); 6407 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6408 template<class _UnaryOperation> 6409 param_type(size_t __nw, result_type __xmin, result_type __xmax, 6410 _UnaryOperation __fw); 6411 param_type & operator=(const param_type& __rhs); 6412 6413 _LIBCPP_INLINE_VISIBILITY 6414 vector<result_type> intervals() const {return __b_;} 6415 _LIBCPP_INLINE_VISIBILITY 6416 vector<result_type> densities() const {return __densities_;} 6417 6418 friend _LIBCPP_INLINE_VISIBILITY 6419 bool operator==(const param_type& __x, const param_type& __y) 6420 {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;} 6421 friend _LIBCPP_INLINE_VISIBILITY 6422 bool operator!=(const param_type& __x, const param_type& __y) 6423 {return !(__x == __y);} 6424 6425 private: 6426 void __init(); 6427 6428 friend class piecewise_linear_distribution; 6429 6430 template <class _CharT, class _Traits, class _RT> 6431 friend 6432 basic_ostream<_CharT, _Traits>& 6433 operator<<(basic_ostream<_CharT, _Traits>& __os, 6434 const piecewise_linear_distribution<_RT>& __x); 6435 6436 template <class _CharT, class _Traits, class _RT> 6437 friend 6438 basic_istream<_CharT, _Traits>& 6439 operator>>(basic_istream<_CharT, _Traits>& __is, 6440 piecewise_linear_distribution<_RT>& __x); 6441 }; 6442 6443 private: 6444 param_type __p_; 6445 6446 public: 6447 // constructor and reset functions 6448 _LIBCPP_INLINE_VISIBILITY 6449 piecewise_linear_distribution() {} 6450 template<class _InputIteratorB, class _InputIteratorW> 6451 _LIBCPP_INLINE_VISIBILITY 6452 piecewise_linear_distribution(_InputIteratorB __fB, 6453 _InputIteratorB __lB, 6454 _InputIteratorW __fW) 6455 : __p_(__fB, __lB, __fW) {} 6456 6457 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6458 template<class _UnaryOperation> 6459 _LIBCPP_INLINE_VISIBILITY 6460 piecewise_linear_distribution(initializer_list<result_type> __bl, 6461 _UnaryOperation __fw) 6462 : __p_(__bl, __fw) {} 6463 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6464 6465 template<class _UnaryOperation> 6466 _LIBCPP_INLINE_VISIBILITY 6467 piecewise_linear_distribution(size_t __nw, result_type __xmin, 6468 result_type __xmax, _UnaryOperation __fw) 6469 : __p_(__nw, __xmin, __xmax, __fw) {} 6470 6471 _LIBCPP_INLINE_VISIBILITY 6472 explicit piecewise_linear_distribution(const param_type& __p) 6473 : __p_(__p) {} 6474 6475 _LIBCPP_INLINE_VISIBILITY 6476 void reset() {} 6477 6478 // generating functions 6479 template<class _URNG> 6480 _LIBCPP_INLINE_VISIBILITY 6481 result_type operator()(_URNG& __g) 6482 {return (*this)(__g, __p_);} 6483 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 6484 6485 // property functions 6486 _LIBCPP_INLINE_VISIBILITY 6487 vector<result_type> intervals() const {return __p_.intervals();} 6488 _LIBCPP_INLINE_VISIBILITY 6489 vector<result_type> densities() const {return __p_.densities();} 6490 6491 _LIBCPP_INLINE_VISIBILITY 6492 param_type param() const {return __p_;} 6493 _LIBCPP_INLINE_VISIBILITY 6494 void param(const param_type& __p) {__p_ = __p;} 6495 6496 _LIBCPP_INLINE_VISIBILITY 6497 result_type min() const {return __p_.__b_.front();} 6498 _LIBCPP_INLINE_VISIBILITY 6499 result_type max() const {return __p_.__b_.back();} 6500 6501 friend _LIBCPP_INLINE_VISIBILITY 6502 bool operator==(const piecewise_linear_distribution& __x, 6503 const piecewise_linear_distribution& __y) 6504 {return __x.__p_ == __y.__p_;} 6505 friend _LIBCPP_INLINE_VISIBILITY 6506 bool operator!=(const piecewise_linear_distribution& __x, 6507 const piecewise_linear_distribution& __y) 6508 {return !(__x == __y);} 6509 6510 template <class _CharT, class _Traits, class _RT> 6511 friend 6512 basic_ostream<_CharT, _Traits>& 6513 operator<<(basic_ostream<_CharT, _Traits>& __os, 6514 const piecewise_linear_distribution<_RT>& __x); 6515 6516 template <class _CharT, class _Traits, class _RT> 6517 friend 6518 basic_istream<_CharT, _Traits>& 6519 operator>>(basic_istream<_CharT, _Traits>& __is, 6520 piecewise_linear_distribution<_RT>& __x); 6521 }; 6522 6523 template<class _RealType> 6524 typename piecewise_linear_distribution<_RealType>::param_type & 6525 piecewise_linear_distribution<_RealType>::param_type::operator= 6526 (const param_type& __rhs) 6527 { 6528 // These can throw 6529 __b_.reserve (__rhs.__b_.size ()); 6530 __densities_.reserve(__rhs.__densities_.size()); 6531 __areas_.reserve (__rhs.__areas_.size()); 6532 6533 // These can not throw 6534 __b_ = __rhs.__b_; 6535 __densities_ = __rhs.__densities_; 6536 __areas_ = __rhs.__areas_; 6537 return *this; 6538 } 6539 6540 6541 template<class _RealType> 6542 void 6543 piecewise_linear_distribution<_RealType>::param_type::__init() 6544 { 6545 __areas_.assign(__densities_.size() - 1, result_type()); 6546 result_type _Sp = 0; 6547 for (size_t __i = 0; __i < __areas_.size(); ++__i) 6548 { 6549 __areas_[__i] = (__densities_[__i+1] + __densities_[__i]) * 6550 (__b_[__i+1] - __b_[__i]) * .5; 6551 _Sp += __areas_[__i]; 6552 } 6553 for (size_t __i = __areas_.size(); __i > 1;) 6554 { 6555 --__i; 6556 __areas_[__i] = __areas_[__i-1] / _Sp; 6557 } 6558 __areas_[0] = 0; 6559 for (size_t __i = 1; __i < __areas_.size(); ++__i) 6560 __areas_[__i] += __areas_[__i-1]; 6561 for (size_t __i = 0; __i < __densities_.size(); ++__i) 6562 __densities_[__i] /= _Sp; 6563 } 6564 6565 template<class _RealType> 6566 piecewise_linear_distribution<_RealType>::param_type::param_type() 6567 : __b_(2), 6568 __densities_(2, 1.0), 6569 __areas_(1, 0.0) 6570 { 6571 __b_[1] = 1; 6572 } 6573 6574 template<class _RealType> 6575 template<class _InputIteratorB, class _InputIteratorW> 6576 piecewise_linear_distribution<_RealType>::param_type::param_type( 6577 _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW) 6578 : __b_(__fB, __lB) 6579 { 6580 if (__b_.size() < 2) 6581 { 6582 __b_.resize(2); 6583 __b_[0] = 0; 6584 __b_[1] = 1; 6585 __densities_.assign(2, 1.0); 6586 __areas_.assign(1, 0.0); 6587 } 6588 else 6589 { 6590 __densities_.reserve(__b_.size()); 6591 for (size_t __i = 0; __i < __b_.size(); ++__i, ++__fW) 6592 __densities_.push_back(*__fW); 6593 __init(); 6594 } 6595 } 6596 6597 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6598 6599 template<class _RealType> 6600 template<class _UnaryOperation> 6601 piecewise_linear_distribution<_RealType>::param_type::param_type( 6602 initializer_list<result_type> __bl, _UnaryOperation __fw) 6603 : __b_(__bl.begin(), __bl.end()) 6604 { 6605 if (__b_.size() < 2) 6606 { 6607 __b_.resize(2); 6608 __b_[0] = 0; 6609 __b_[1] = 1; 6610 __densities_.assign(2, 1.0); 6611 __areas_.assign(1, 0.0); 6612 } 6613 else 6614 { 6615 __densities_.reserve(__b_.size()); 6616 for (size_t __i = 0; __i < __b_.size(); ++__i) 6617 __densities_.push_back(__fw(__b_[__i])); 6618 __init(); 6619 } 6620 } 6621 6622 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6623 6624 template<class _RealType> 6625 template<class _UnaryOperation> 6626 piecewise_linear_distribution<_RealType>::param_type::param_type( 6627 size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw) 6628 : __b_(__nw == 0 ? 2 : __nw + 1) 6629 { 6630 size_t __n = __b_.size() - 1; 6631 result_type __d = (__xmax - __xmin) / __n; 6632 __densities_.reserve(__b_.size()); 6633 for (size_t __i = 0; __i < __n; ++__i) 6634 { 6635 __b_[__i] = __xmin + __i * __d; 6636 __densities_.push_back(__fw(__b_[__i])); 6637 } 6638 __b_[__n] = __xmax; 6639 __densities_.push_back(__fw(__b_[__n])); 6640 __init(); 6641 } 6642 6643 template<class _RealType> 6644 template<class _URNG> 6645 _RealType 6646 piecewise_linear_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 6647 { 6648 typedef uniform_real_distribution<result_type> _Gen; 6649 result_type __u = _Gen()(__g); 6650 ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(), 6651 __u) - __p.__areas_.begin() - 1; 6652 __u -= __p.__areas_[__k]; 6653 const result_type __dk = __p.__densities_[__k]; 6654 const result_type __dk1 = __p.__densities_[__k+1]; 6655 const result_type __deltad = __dk1 - __dk; 6656 const result_type __bk = __p.__b_[__k]; 6657 if (__deltad == 0) 6658 return __u / __dk + __bk; 6659 const result_type __bk1 = __p.__b_[__k+1]; 6660 const result_type __deltab = __bk1 - __bk; 6661 return (__bk * __dk1 - __bk1 * __dk + 6662 _VSTD::sqrt(__deltab * (__deltab * __dk * __dk + 2 * __deltad * __u))) / 6663 __deltad; 6664 } 6665 6666 template <class _CharT, class _Traits, class _RT> 6667 basic_ostream<_CharT, _Traits>& 6668 operator<<(basic_ostream<_CharT, _Traits>& __os, 6669 const piecewise_linear_distribution<_RT>& __x) 6670 { 6671 __save_flags<_CharT, _Traits> __lx(__os); 6672 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 6673 ios_base::scientific); 6674 _CharT __sp = __os.widen(' '); 6675 __os.fill(__sp); 6676 size_t __n = __x.__p_.__b_.size(); 6677 __os << __n; 6678 for (size_t __i = 0; __i < __n; ++__i) 6679 __os << __sp << __x.__p_.__b_[__i]; 6680 __n = __x.__p_.__densities_.size(); 6681 __os << __sp << __n; 6682 for (size_t __i = 0; __i < __n; ++__i) 6683 __os << __sp << __x.__p_.__densities_[__i]; 6684 __n = __x.__p_.__areas_.size(); 6685 __os << __sp << __n; 6686 for (size_t __i = 0; __i < __n; ++__i) 6687 __os << __sp << __x.__p_.__areas_[__i]; 6688 return __os; 6689 } 6690 6691 template <class _CharT, class _Traits, class _RT> 6692 basic_istream<_CharT, _Traits>& 6693 operator>>(basic_istream<_CharT, _Traits>& __is, 6694 piecewise_linear_distribution<_RT>& __x) 6695 { 6696 typedef piecewise_linear_distribution<_RT> _Eng; 6697 typedef typename _Eng::result_type result_type; 6698 __save_flags<_CharT, _Traits> __lx(__is); 6699 __is.flags(ios_base::dec | ios_base::skipws); 6700 size_t __n; 6701 __is >> __n; 6702 vector<result_type> __b(__n); 6703 for (size_t __i = 0; __i < __n; ++__i) 6704 __is >> __b[__i]; 6705 __is >> __n; 6706 vector<result_type> __densities(__n); 6707 for (size_t __i = 0; __i < __n; ++__i) 6708 __is >> __densities[__i]; 6709 __is >> __n; 6710 vector<result_type> __areas(__n); 6711 for (size_t __i = 0; __i < __n; ++__i) 6712 __is >> __areas[__i]; 6713 if (!__is.fail()) 6714 { 6715 swap(__x.__p_.__b_, __b); 6716 swap(__x.__p_.__densities_, __densities); 6717 swap(__x.__p_.__areas_, __areas); 6718 } 6719 return __is; 6720 } 6721 6722 _LIBCPP_END_NAMESPACE_STD 6723 6724 #endif // _LIBCPP_RANDOM 6725