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 <type_traits> 1638 #include <initializer_list> 1639 #include <cstdint> 1640 #include <limits> 1641 #include <algorithm> 1642 #include <numeric> 1643 #include <vector> 1644 #include <string> 1645 #include <istream> 1646 #include <ostream> 1647 #include <cmath> 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_VISIBLE 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_VISIBLE 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-1) / 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 __save_flags 1978 { 1979 typedef basic_ios<_CharT, _Traits> __stream_type; 1980 typedef typename __stream_type::fmtflags fmtflags; 1981 1982 __stream_type& __stream_; 1983 fmtflags __fmtflags_; 1984 _CharT __fill_; 1985 1986 __save_flags(const __save_flags&); 1987 __save_flags& operator=(const __save_flags&); 1988 public: 1989 _LIBCPP_INLINE_VISIBILITY 1990 explicit __save_flags(__stream_type& __stream) 1991 : __stream_(__stream), 1992 __fmtflags_(__stream.flags()), 1993 __fill_(__stream.fill()) 1994 {} 1995 _LIBCPP_INLINE_VISIBILITY 1996 ~__save_flags() 1997 { 1998 __stream_.flags(__fmtflags_); 1999 __stream_.fill(__fill_); 2000 } 2001 }; 2002 2003 template <class _CharT, class _Traits, 2004 class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 2005 inline _LIBCPP_INLINE_VISIBILITY 2006 basic_ostream<_CharT, _Traits>& 2007 operator<<(basic_ostream<_CharT, _Traits>& __os, 2008 const linear_congruential_engine<_UIntType, __a, __c, __m>& __x) 2009 { 2010 __save_flags<_CharT, _Traits> __lx(__os); 2011 __os.flags(ios_base::dec | ios_base::left); 2012 __os.fill(__os.widen(' ')); 2013 return __os << __x.__x_; 2014 } 2015 2016 template <class _CharT, class _Traits, 2017 class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 2018 basic_istream<_CharT, _Traits>& 2019 operator>>(basic_istream<_CharT, _Traits>& __is, 2020 linear_congruential_engine<_UIntType, __a, __c, __m>& __x) 2021 { 2022 __save_flags<_CharT, _Traits> __lx(__is); 2023 __is.flags(ios_base::dec | ios_base::skipws); 2024 _UIntType __t; 2025 __is >> __t; 2026 if (!__is.fail()) 2027 __x.__x_ = __t; 2028 return __is; 2029 } 2030 2031 typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> 2032 minstd_rand0; 2033 typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647> 2034 minstd_rand; 2035 typedef minstd_rand default_random_engine; 2036 // mersenne_twister_engine 2037 2038 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2039 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2040 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2041 class _LIBCPP_VISIBLE mersenne_twister_engine; 2042 2043 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2044 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2045 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2046 bool 2047 operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2048 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2049 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2050 _Bp, _Tp, _Cp, _Lp, _Fp>& __y); 2051 2052 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2053 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2054 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2055 _LIBCPP_INLINE_VISIBILITY 2056 bool 2057 operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2058 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2059 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2060 _Bp, _Tp, _Cp, _Lp, _Fp>& __y); 2061 2062 template <class _CharT, class _Traits, 2063 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2064 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2065 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2066 basic_ostream<_CharT, _Traits>& 2067 operator<<(basic_ostream<_CharT, _Traits>& __os, 2068 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2069 _Bp, _Tp, _Cp, _Lp, _Fp>& __x); 2070 2071 template <class _CharT, class _Traits, 2072 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2073 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2074 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2075 basic_istream<_CharT, _Traits>& 2076 operator>>(basic_istream<_CharT, _Traits>& __is, 2077 mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2078 _Bp, _Tp, _Cp, _Lp, _Fp>& __x); 2079 2080 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2081 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2082 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2083 class _LIBCPP_VISIBLE mersenne_twister_engine 2084 { 2085 public: 2086 // types 2087 typedef _UIntType result_type; 2088 2089 private: 2090 result_type __x_[__n]; 2091 size_t __i_; 2092 2093 static_assert( 0 < __m, "mersenne_twister_engine invalid parameters"); 2094 static_assert(__m <= __n, "mersenne_twister_engine invalid parameters"); 2095 static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; 2096 static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters"); 2097 static_assert( 2 <= __w, "mersenne_twister_engine invalid parameters"); 2098 static_assert(__r <= __w, "mersenne_twister_engine invalid parameters"); 2099 static_assert(__u <= __w, "mersenne_twister_engine invalid parameters"); 2100 static_assert(__s <= __w, "mersenne_twister_engine invalid parameters"); 2101 static_assert(__t <= __w, "mersenne_twister_engine invalid parameters"); 2102 static_assert(__l <= __w, "mersenne_twister_engine invalid parameters"); 2103 public: 2104 static _LIBCPP_CONSTEXPR const result_type _Min = 0; 2105 static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : 2106 (result_type(1) << __w) - result_type(1); 2107 static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters"); 2108 static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters"); 2109 static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters"); 2110 static_assert(__c <= _Max, "mersenne_twister_engine invalid parameters"); 2111 static_assert(__d <= _Max, "mersenne_twister_engine invalid parameters"); 2112 static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters"); 2113 2114 // engine characteristics 2115 static _LIBCPP_CONSTEXPR const size_t word_size = __w; 2116 static _LIBCPP_CONSTEXPR const size_t state_size = __n; 2117 static _LIBCPP_CONSTEXPR const size_t shift_size = __m; 2118 static _LIBCPP_CONSTEXPR const size_t mask_bits = __r; 2119 static _LIBCPP_CONSTEXPR const result_type xor_mask = __a; 2120 static _LIBCPP_CONSTEXPR const size_t tempering_u = __u; 2121 static _LIBCPP_CONSTEXPR const result_type tempering_d = __d; 2122 static _LIBCPP_CONSTEXPR const size_t tempering_s = __s; 2123 static _LIBCPP_CONSTEXPR const result_type tempering_b = __b; 2124 static _LIBCPP_CONSTEXPR const size_t tempering_t = __t; 2125 static _LIBCPP_CONSTEXPR const result_type tempering_c = __c; 2126 static _LIBCPP_CONSTEXPR const size_t tempering_l = __l; 2127 static _LIBCPP_CONSTEXPR const result_type initialization_multiplier = __f; 2128 _LIBCPP_INLINE_VISIBILITY 2129 static _LIBCPP_CONSTEXPR result_type min() { return _Min; } 2130 _LIBCPP_INLINE_VISIBILITY 2131 static _LIBCPP_CONSTEXPR result_type max() { return _Max; } 2132 static _LIBCPP_CONSTEXPR const result_type default_seed = 5489u; 2133 2134 // constructors and seeding functions 2135 _LIBCPP_INLINE_VISIBILITY 2136 explicit mersenne_twister_engine(result_type __sd = default_seed) 2137 {seed(__sd);} 2138 template<class _Sseq> 2139 _LIBCPP_INLINE_VISIBILITY 2140 explicit mersenne_twister_engine(_Sseq& __q, 2141 typename enable_if<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value>::type* = 0) 2142 {seed(__q);} 2143 void seed(result_type __sd = default_seed); 2144 template<class _Sseq> 2145 _LIBCPP_INLINE_VISIBILITY 2146 typename enable_if 2147 < 2148 __is_seed_sequence<_Sseq, mersenne_twister_engine>::value, 2149 void 2150 >::type 2151 seed(_Sseq& __q) 2152 {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} 2153 2154 // generating functions 2155 result_type operator()(); 2156 _LIBCPP_INLINE_VISIBILITY 2157 void discard(unsigned long long __z) {for (; __z; --__z) operator()();} 2158 2159 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2160 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2161 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2162 friend 2163 bool 2164 operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2165 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2166 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2167 _Bp, _Tp, _Cp, _Lp, _Fp>& __y); 2168 2169 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2170 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2171 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2172 friend 2173 bool 2174 operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2175 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2176 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2177 _Bp, _Tp, _Cp, _Lp, _Fp>& __y); 2178 2179 template <class _CharT, class _Traits, 2180 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2181 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2182 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2183 friend 2184 basic_ostream<_CharT, _Traits>& 2185 operator<<(basic_ostream<_CharT, _Traits>& __os, 2186 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2187 _Bp, _Tp, _Cp, _Lp, _Fp>& __x); 2188 2189 template <class _CharT, class _Traits, 2190 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2191 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2192 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2193 friend 2194 basic_istream<_CharT, _Traits>& 2195 operator>>(basic_istream<_CharT, _Traits>& __is, 2196 mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2197 _Bp, _Tp, _Cp, _Lp, _Fp>& __x); 2198 private: 2199 2200 template<class _Sseq> 2201 void __seed(_Sseq& __q, integral_constant<unsigned, 1>); 2202 template<class _Sseq> 2203 void __seed(_Sseq& __q, integral_constant<unsigned, 2>); 2204 2205 template <size_t __count> 2206 _LIBCPP_INLINE_VISIBILITY 2207 static 2208 typename enable_if 2209 < 2210 __count < __w, 2211 result_type 2212 >::type 2213 __lshift(result_type __x) {return (__x << __count) & _Max;} 2214 2215 template <size_t __count> 2216 _LIBCPP_INLINE_VISIBILITY 2217 static 2218 typename enable_if 2219 < 2220 (__count >= __w), 2221 result_type 2222 >::type 2223 __lshift(result_type) {return result_type(0);} 2224 2225 template <size_t __count> 2226 _LIBCPP_INLINE_VISIBILITY 2227 static 2228 typename enable_if 2229 < 2230 __count < _Dt, 2231 result_type 2232 >::type 2233 __rshift(result_type __x) {return __x >> __count;} 2234 2235 template <size_t __count> 2236 _LIBCPP_INLINE_VISIBILITY 2237 static 2238 typename enable_if 2239 < 2240 (__count >= _Dt), 2241 result_type 2242 >::type 2243 __rshift(result_type) {return result_type(0);} 2244 }; 2245 2246 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2247 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2248 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2249 _LIBCPP_CONSTEXPR const size_t 2250 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::word_size; 2251 2252 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2253 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2254 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2255 _LIBCPP_CONSTEXPR const size_t 2256 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::state_size; 2257 2258 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2259 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2260 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2261 _LIBCPP_CONSTEXPR const size_t 2262 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::shift_size; 2263 2264 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2265 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2266 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2267 _LIBCPP_CONSTEXPR const size_t 2268 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::mask_bits; 2269 2270 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2271 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2272 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2273 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2274 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::xor_mask; 2275 2276 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2277 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2278 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2279 _LIBCPP_CONSTEXPR const size_t 2280 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_u; 2281 2282 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2283 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2284 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2285 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2286 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_d; 2287 2288 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2289 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2290 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2291 _LIBCPP_CONSTEXPR const size_t 2292 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_s; 2293 2294 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2295 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2296 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2297 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2298 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_b; 2299 2300 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2301 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2302 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2303 _LIBCPP_CONSTEXPR const size_t 2304 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_t; 2305 2306 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2307 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2308 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2309 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2310 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_c; 2311 2312 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2313 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2314 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2315 _LIBCPP_CONSTEXPR const size_t 2316 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_l; 2317 2318 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2319 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2320 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2321 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2322 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::initialization_multiplier; 2323 2324 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2325 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2326 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2327 _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type 2328 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::default_seed; 2329 2330 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2331 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2332 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2333 void 2334 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, 2335 __t, __c, __l, __f>::seed(result_type __sd) 2336 { // __w >= 2 2337 __x_[0] = __sd & _Max; 2338 for (size_t __i = 1; __i < __n; ++__i) 2339 __x_[__i] = (__f * (__x_[__i-1] ^ __rshift<__w - 2>(__x_[__i-1])) + __i) & _Max; 2340 __i_ = 0; 2341 } 2342 2343 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2344 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2345 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2346 template<class _Sseq> 2347 void 2348 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, 2349 __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 1>) 2350 { 2351 const unsigned __k = 1; 2352 uint32_t __ar[__n * __k]; 2353 __q.generate(__ar, __ar + __n * __k); 2354 for (size_t __i = 0; __i < __n; ++__i) 2355 __x_[__i] = static_cast<result_type>(__ar[__i] & _Max); 2356 const result_type __mask = __r == _Dt ? result_type(~0) : 2357 (result_type(1) << __r) - result_type(1); 2358 __i_ = 0; 2359 if ((__x_[0] & ~__mask) == 0) 2360 { 2361 for (size_t __i = 1; __i < __n; ++__i) 2362 if (__x_[__i] != 0) 2363 return; 2364 __x_[0] = _Max; 2365 } 2366 } 2367 2368 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2369 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2370 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2371 template<class _Sseq> 2372 void 2373 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, 2374 __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 2>) 2375 { 2376 const unsigned __k = 2; 2377 uint32_t __ar[__n * __k]; 2378 __q.generate(__ar, __ar + __n * __k); 2379 for (size_t __i = 0; __i < __n; ++__i) 2380 __x_[__i] = static_cast<result_type>( 2381 (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); 2382 const result_type __mask = __r == _Dt ? result_type(~0) : 2383 (result_type(1) << __r) - result_type(1); 2384 __i_ = 0; 2385 if ((__x_[0] & ~__mask) == 0) 2386 { 2387 for (size_t __i = 1; __i < __n; ++__i) 2388 if (__x_[__i] != 0) 2389 return; 2390 __x_[0] = _Max; 2391 } 2392 } 2393 2394 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, 2395 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 2396 _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> 2397 _UIntType 2398 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, 2399 __t, __c, __l, __f>::operator()() 2400 { 2401 const size_t __j = (__i_ + 1) % __n; 2402 const result_type __mask = __r == _Dt ? result_type(~0) : 2403 (result_type(1) << __r) - result_type(1); 2404 const result_type _Yp = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask); 2405 const size_t __k = (__i_ + __m) % __n; 2406 __x_[__i_] = __x_[__k] ^ __rshift<1>(_Yp) ^ (__a * (_Yp & 1)); 2407 result_type __z = __x_[__i_] ^ (__rshift<__u>(__x_[__i_]) & __d); 2408 __i_ = __j; 2409 __z ^= __lshift<__s>(__z) & __b; 2410 __z ^= __lshift<__t>(__z) & __c; 2411 return __z ^ __rshift<__l>(__z); 2412 } 2413 2414 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2415 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2416 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2417 bool 2418 operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2419 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2420 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2421 _Bp, _Tp, _Cp, _Lp, _Fp>& __y) 2422 { 2423 if (__x.__i_ == __y.__i_) 2424 return _VSTD::equal(__x.__x_, __x.__x_ + _Np, __y.__x_); 2425 if (__x.__i_ == 0 || __y.__i_ == 0) 2426 { 2427 size_t __j = _VSTD::min(_Np - __x.__i_, _Np - __y.__i_); 2428 if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, 2429 __y.__x_ + __y.__i_)) 2430 return false; 2431 if (__x.__i_ == 0) 2432 return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Np, __y.__x_); 2433 return _VSTD::equal(__x.__x_, __x.__x_ + (_Np - __j), __y.__x_ + __j); 2434 } 2435 if (__x.__i_ < __y.__i_) 2436 { 2437 size_t __j = _Np - __y.__i_; 2438 if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), 2439 __y.__x_ + __y.__i_)) 2440 return false; 2441 if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Np, 2442 __y.__x_)) 2443 return false; 2444 return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, 2445 __y.__x_ + (_Np - (__x.__i_ + __j))); 2446 } 2447 size_t __j = _Np - __x.__i_; 2448 if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), 2449 __x.__x_ + __x.__i_)) 2450 return false; 2451 if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Np, 2452 __x.__x_)) 2453 return false; 2454 return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, 2455 __x.__x_ + (_Np - (__y.__i_ + __j))); 2456 } 2457 2458 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2459 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2460 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2461 inline _LIBCPP_INLINE_VISIBILITY 2462 bool 2463 operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2464 _Bp, _Tp, _Cp, _Lp, _Fp>& __x, 2465 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2466 _Bp, _Tp, _Cp, _Lp, _Fp>& __y) 2467 { 2468 return !(__x == __y); 2469 } 2470 2471 template <class _CharT, class _Traits, 2472 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2473 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2474 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2475 basic_ostream<_CharT, _Traits>& 2476 operator<<(basic_ostream<_CharT, _Traits>& __os, 2477 const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2478 _Bp, _Tp, _Cp, _Lp, _Fp>& __x) 2479 { 2480 __save_flags<_CharT, _Traits> __lx(__os); 2481 __os.flags(ios_base::dec | ios_base::left); 2482 _CharT __sp = __os.widen(' '); 2483 __os.fill(__sp); 2484 __os << __x.__x_[__x.__i_]; 2485 for (size_t __j = __x.__i_ + 1; __j < _Np; ++__j) 2486 __os << __sp << __x.__x_[__j]; 2487 for (size_t __j = 0; __j < __x.__i_; ++__j) 2488 __os << __sp << __x.__x_[__j]; 2489 return __os; 2490 } 2491 2492 template <class _CharT, class _Traits, 2493 class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, 2494 _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, 2495 _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> 2496 basic_istream<_CharT, _Traits>& 2497 operator>>(basic_istream<_CharT, _Traits>& __is, 2498 mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, 2499 _Bp, _Tp, _Cp, _Lp, _Fp>& __x) 2500 { 2501 __save_flags<_CharT, _Traits> __lx(__is); 2502 __is.flags(ios_base::dec | ios_base::skipws); 2503 _UI __t[_Np]; 2504 for (size_t __i = 0; __i < _Np; ++__i) 2505 __is >> __t[__i]; 2506 if (!__is.fail()) 2507 { 2508 for (size_t __i = 0; __i < _Np; ++__i) 2509 __x.__x_[__i] = __t[__i]; 2510 __x.__i_ = 0; 2511 } 2512 return __is; 2513 } 2514 2515 typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31, 2516 0x9908b0df, 11, 0xffffffff, 2517 7, 0x9d2c5680, 2518 15, 0xefc60000, 2519 18, 1812433253> mt19937; 2520 typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31, 2521 0xb5026f5aa96619e9ULL, 29, 0x5555555555555555ULL, 2522 17, 0x71d67fffeda60000ULL, 2523 37, 0xfff7eee000000000ULL, 2524 43, 6364136223846793005ULL> mt19937_64; 2525 2526 // subtract_with_carry_engine 2527 2528 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2529 class _LIBCPP_VISIBLE subtract_with_carry_engine; 2530 2531 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2532 bool 2533 operator==( 2534 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2535 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); 2536 2537 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2538 _LIBCPP_INLINE_VISIBILITY 2539 bool 2540 operator!=( 2541 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2542 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); 2543 2544 template <class _CharT, class _Traits, 2545 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2546 basic_ostream<_CharT, _Traits>& 2547 operator<<(basic_ostream<_CharT, _Traits>& __os, 2548 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); 2549 2550 template <class _CharT, class _Traits, 2551 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2552 basic_istream<_CharT, _Traits>& 2553 operator>>(basic_istream<_CharT, _Traits>& __is, 2554 subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); 2555 2556 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2557 class _LIBCPP_VISIBLE subtract_with_carry_engine 2558 { 2559 public: 2560 // types 2561 typedef _UIntType result_type; 2562 2563 private: 2564 result_type __x_[__r]; 2565 result_type __c_; 2566 size_t __i_; 2567 2568 static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; 2569 static_assert( 0 < __w, "subtract_with_carry_engine invalid parameters"); 2570 static_assert(__w <= _Dt, "subtract_with_carry_engine invalid parameters"); 2571 static_assert( 0 < __s, "subtract_with_carry_engine invalid parameters"); 2572 static_assert(__s < __r, "subtract_with_carry_engine invalid parameters"); 2573 public: 2574 static _LIBCPP_CONSTEXPR const result_type _Min = 0; 2575 static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : 2576 (result_type(1) << __w) - result_type(1); 2577 static_assert(_Min < _Max, "subtract_with_carry_engine invalid parameters"); 2578 2579 // engine characteristics 2580 static _LIBCPP_CONSTEXPR const size_t word_size = __w; 2581 static _LIBCPP_CONSTEXPR const size_t short_lag = __s; 2582 static _LIBCPP_CONSTEXPR const size_t long_lag = __r; 2583 _LIBCPP_INLINE_VISIBILITY 2584 static _LIBCPP_CONSTEXPR result_type min() { return _Min; } 2585 _LIBCPP_INLINE_VISIBILITY 2586 static _LIBCPP_CONSTEXPR result_type max() { return _Max; } 2587 static _LIBCPP_CONSTEXPR const result_type default_seed = 19780503u; 2588 2589 // constructors and seeding functions 2590 _LIBCPP_INLINE_VISIBILITY 2591 explicit subtract_with_carry_engine(result_type __sd = default_seed) 2592 {seed(__sd);} 2593 template<class _Sseq> 2594 _LIBCPP_INLINE_VISIBILITY 2595 explicit subtract_with_carry_engine(_Sseq& __q, 2596 typename enable_if<__is_seed_sequence<_Sseq, subtract_with_carry_engine>::value>::type* = 0) 2597 {seed(__q);} 2598 _LIBCPP_INLINE_VISIBILITY 2599 void seed(result_type __sd = default_seed) 2600 {seed(__sd, integral_constant<unsigned, 1 + (__w - 1) / 32>());} 2601 template<class _Sseq> 2602 _LIBCPP_INLINE_VISIBILITY 2603 typename enable_if 2604 < 2605 __is_seed_sequence<_Sseq, subtract_with_carry_engine>::value, 2606 void 2607 >::type 2608 seed(_Sseq& __q) 2609 {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} 2610 2611 // generating functions 2612 result_type operator()(); 2613 _LIBCPP_INLINE_VISIBILITY 2614 void discard(unsigned long long __z) {for (; __z; --__z) operator()();} 2615 2616 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2617 friend 2618 bool 2619 operator==( 2620 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2621 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); 2622 2623 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2624 friend 2625 bool 2626 operator!=( 2627 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2628 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); 2629 2630 template <class _CharT, class _Traits, 2631 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2632 friend 2633 basic_ostream<_CharT, _Traits>& 2634 operator<<(basic_ostream<_CharT, _Traits>& __os, 2635 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); 2636 2637 template <class _CharT, class _Traits, 2638 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2639 friend 2640 basic_istream<_CharT, _Traits>& 2641 operator>>(basic_istream<_CharT, _Traits>& __is, 2642 subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); 2643 2644 private: 2645 2646 void seed(result_type __sd, integral_constant<unsigned, 1>); 2647 void seed(result_type __sd, integral_constant<unsigned, 2>); 2648 template<class _Sseq> 2649 void __seed(_Sseq& __q, integral_constant<unsigned, 1>); 2650 template<class _Sseq> 2651 void __seed(_Sseq& __q, integral_constant<unsigned, 2>); 2652 }; 2653 2654 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2655 _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::word_size; 2656 2657 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2658 _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::short_lag; 2659 2660 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2661 _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::long_lag; 2662 2663 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2664 _LIBCPP_CONSTEXPR const typename subtract_with_carry_engine<_UIntType, __w, __s, __r>::result_type 2665 subtract_with_carry_engine<_UIntType, __w, __s, __r>::default_seed; 2666 2667 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2668 void 2669 subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, 2670 integral_constant<unsigned, 1>) 2671 { 2672 linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> 2673 __e(__sd == 0u ? default_seed : __sd); 2674 for (size_t __i = 0; __i < __r; ++__i) 2675 __x_[__i] = static_cast<result_type>(__e() & _Max); 2676 __c_ = __x_[__r-1] == 0; 2677 __i_ = 0; 2678 } 2679 2680 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2681 void 2682 subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, 2683 integral_constant<unsigned, 2>) 2684 { 2685 linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> 2686 __e(__sd == 0u ? default_seed : __sd); 2687 for (size_t __i = 0; __i < __r; ++__i) 2688 { 2689 result_type __e0 = __e(); 2690 __x_[__i] = static_cast<result_type>( 2691 (__e0 + ((uint64_t)__e() << 32)) & _Max); 2692 } 2693 __c_ = __x_[__r-1] == 0; 2694 __i_ = 0; 2695 } 2696 2697 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2698 template<class _Sseq> 2699 void 2700 subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, 2701 integral_constant<unsigned, 1>) 2702 { 2703 const unsigned __k = 1; 2704 uint32_t __ar[__r * __k]; 2705 __q.generate(__ar, __ar + __r * __k); 2706 for (size_t __i = 0; __i < __r; ++__i) 2707 __x_[__i] = static_cast<result_type>(__ar[__i] & _Max); 2708 __c_ = __x_[__r-1] == 0; 2709 __i_ = 0; 2710 } 2711 2712 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2713 template<class _Sseq> 2714 void 2715 subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, 2716 integral_constant<unsigned, 2>) 2717 { 2718 const unsigned __k = 2; 2719 uint32_t __ar[__r * __k]; 2720 __q.generate(__ar, __ar + __r * __k); 2721 for (size_t __i = 0; __i < __r; ++__i) 2722 __x_[__i] = static_cast<result_type>( 2723 (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); 2724 __c_ = __x_[__r-1] == 0; 2725 __i_ = 0; 2726 } 2727 2728 template<class _UIntType, size_t __w, size_t __s, size_t __r> 2729 _UIntType 2730 subtract_with_carry_engine<_UIntType, __w, __s, __r>::operator()() 2731 { 2732 const result_type& __xs = __x_[(__i_ + (__r - __s)) % __r]; 2733 result_type& __xr = __x_[__i_]; 2734 result_type __new_c = __c_ == 0 ? __xs < __xr : __xs != 0 ? __xs <= __xr : 1; 2735 __xr = (__xs - __xr - __c_) & _Max; 2736 __c_ = __new_c; 2737 __i_ = (__i_ + 1) % __r; 2738 return __xr; 2739 } 2740 2741 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2742 bool 2743 operator==( 2744 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2745 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y) 2746 { 2747 if (__x.__c_ != __y.__c_) 2748 return false; 2749 if (__x.__i_ == __y.__i_) 2750 return _VSTD::equal(__x.__x_, __x.__x_ + _Rp, __y.__x_); 2751 if (__x.__i_ == 0 || __y.__i_ == 0) 2752 { 2753 size_t __j = _VSTD::min(_Rp - __x.__i_, _Rp - __y.__i_); 2754 if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, 2755 __y.__x_ + __y.__i_)) 2756 return false; 2757 if (__x.__i_ == 0) 2758 return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Rp, __y.__x_); 2759 return _VSTD::equal(__x.__x_, __x.__x_ + (_Rp - __j), __y.__x_ + __j); 2760 } 2761 if (__x.__i_ < __y.__i_) 2762 { 2763 size_t __j = _Rp - __y.__i_; 2764 if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), 2765 __y.__x_ + __y.__i_)) 2766 return false; 2767 if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Rp, 2768 __y.__x_)) 2769 return false; 2770 return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, 2771 __y.__x_ + (_Rp - (__x.__i_ + __j))); 2772 } 2773 size_t __j = _Rp - __x.__i_; 2774 if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), 2775 __x.__x_ + __x.__i_)) 2776 return false; 2777 if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Rp, 2778 __x.__x_)) 2779 return false; 2780 return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, 2781 __x.__x_ + (_Rp - (__y.__i_ + __j))); 2782 } 2783 2784 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2785 inline _LIBCPP_INLINE_VISIBILITY 2786 bool 2787 operator!=( 2788 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, 2789 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y) 2790 { 2791 return !(__x == __y); 2792 } 2793 2794 template <class _CharT, class _Traits, 2795 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2796 basic_ostream<_CharT, _Traits>& 2797 operator<<(basic_ostream<_CharT, _Traits>& __os, 2798 const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x) 2799 { 2800 __save_flags<_CharT, _Traits> __lx(__os); 2801 __os.flags(ios_base::dec | ios_base::left); 2802 _CharT __sp = __os.widen(' '); 2803 __os.fill(__sp); 2804 __os << __x.__x_[__x.__i_]; 2805 for (size_t __j = __x.__i_ + 1; __j < _Rp; ++__j) 2806 __os << __sp << __x.__x_[__j]; 2807 for (size_t __j = 0; __j < __x.__i_; ++__j) 2808 __os << __sp << __x.__x_[__j]; 2809 __os << __sp << __x.__c_; 2810 return __os; 2811 } 2812 2813 template <class _CharT, class _Traits, 2814 class _UI, size_t _Wp, size_t _Sp, size_t _Rp> 2815 basic_istream<_CharT, _Traits>& 2816 operator>>(basic_istream<_CharT, _Traits>& __is, 2817 subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x) 2818 { 2819 __save_flags<_CharT, _Traits> __lx(__is); 2820 __is.flags(ios_base::dec | ios_base::skipws); 2821 _UI __t[_Rp+1]; 2822 for (size_t __i = 0; __i < _Rp+1; ++__i) 2823 __is >> __t[__i]; 2824 if (!__is.fail()) 2825 { 2826 for (size_t __i = 0; __i < _Rp; ++__i) 2827 __x.__x_[__i] = __t[__i]; 2828 __x.__c_ = __t[_Rp]; 2829 __x.__i_ = 0; 2830 } 2831 return __is; 2832 } 2833 2834 typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base; 2835 typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base; 2836 2837 // discard_block_engine 2838 2839 template<class _Engine, size_t __p, size_t __r> 2840 class _LIBCPP_VISIBLE discard_block_engine 2841 { 2842 _Engine __e_; 2843 int __n_; 2844 2845 static_assert( 0 < __r, "discard_block_engine invalid parameters"); 2846 static_assert(__r <= __p, "discard_block_engine invalid parameters"); 2847 public: 2848 // types 2849 typedef typename _Engine::result_type result_type; 2850 2851 // engine characteristics 2852 static _LIBCPP_CONSTEXPR const size_t block_size = __p; 2853 static _LIBCPP_CONSTEXPR const size_t used_block = __r; 2854 2855 #ifdef _LIBCPP_HAS_NO_CONSTEXPR 2856 static const result_type _Min = _Engine::_Min; 2857 static const result_type _Max = _Engine::_Max; 2858 #else 2859 static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min(); 2860 static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max(); 2861 #endif 2862 2863 _LIBCPP_INLINE_VISIBILITY 2864 static _LIBCPP_CONSTEXPR result_type min() { return _Engine::min(); } 2865 _LIBCPP_INLINE_VISIBILITY 2866 static _LIBCPP_CONSTEXPR result_type max() { return _Engine::max(); } 2867 2868 // constructors and seeding functions 2869 _LIBCPP_INLINE_VISIBILITY 2870 discard_block_engine() : __n_(0) {} 2871 _LIBCPP_INLINE_VISIBILITY 2872 explicit discard_block_engine(const _Engine& __e) 2873 : __e_(__e), __n_(0) {} 2874 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2875 _LIBCPP_INLINE_VISIBILITY 2876 explicit discard_block_engine(_Engine&& __e) 2877 : __e_(_VSTD::move(__e)), __n_(0) {} 2878 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 2879 _LIBCPP_INLINE_VISIBILITY 2880 explicit discard_block_engine(result_type __sd) : __e_(__sd), __n_(0) {} 2881 template<class _Sseq> 2882 _LIBCPP_INLINE_VISIBILITY 2883 explicit discard_block_engine(_Sseq& __q, 2884 typename enable_if<__is_seed_sequence<_Sseq, discard_block_engine>::value && 2885 !is_convertible<_Sseq, _Engine>::value>::type* = 0) 2886 : __e_(__q), __n_(0) {} 2887 _LIBCPP_INLINE_VISIBILITY 2888 void seed() {__e_.seed(); __n_ = 0;} 2889 _LIBCPP_INLINE_VISIBILITY 2890 void seed(result_type __sd) {__e_.seed(__sd); __n_ = 0;} 2891 template<class _Sseq> 2892 _LIBCPP_INLINE_VISIBILITY 2893 typename enable_if 2894 < 2895 __is_seed_sequence<_Sseq, discard_block_engine>::value, 2896 void 2897 >::type 2898 seed(_Sseq& __q) {__e_.seed(__q); __n_ = 0;} 2899 2900 // generating functions 2901 result_type operator()(); 2902 _LIBCPP_INLINE_VISIBILITY 2903 void discard(unsigned long long __z) {for (; __z; --__z) operator()();} 2904 2905 // property functions 2906 _LIBCPP_INLINE_VISIBILITY 2907 const _Engine& base() const _NOEXCEPT {return __e_;} 2908 2909 template<class _Eng, size_t _Pp, size_t _Rp> 2910 friend 2911 bool 2912 operator==( 2913 const discard_block_engine<_Eng, _Pp, _Rp>& __x, 2914 const discard_block_engine<_Eng, _Pp, _Rp>& __y); 2915 2916 template<class _Eng, size_t _Pp, size_t _Rp> 2917 friend 2918 bool 2919 operator!=( 2920 const discard_block_engine<_Eng, _Pp, _Rp>& __x, 2921 const discard_block_engine<_Eng, _Pp, _Rp>& __y); 2922 2923 template <class _CharT, class _Traits, 2924 class _Eng, size_t _Pp, size_t _Rp> 2925 friend 2926 basic_ostream<_CharT, _Traits>& 2927 operator<<(basic_ostream<_CharT, _Traits>& __os, 2928 const discard_block_engine<_Eng, _Pp, _Rp>& __x); 2929 2930 template <class _CharT, class _Traits, 2931 class _Eng, size_t _Pp, size_t _Rp> 2932 friend 2933 basic_istream<_CharT, _Traits>& 2934 operator>>(basic_istream<_CharT, _Traits>& __is, 2935 discard_block_engine<_Eng, _Pp, _Rp>& __x); 2936 }; 2937 2938 template<class _Engine, size_t __p, size_t __r> 2939 _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::block_size; 2940 2941 template<class _Engine, size_t __p, size_t __r> 2942 _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::used_block; 2943 2944 template<class _Engine, size_t __p, size_t __r> 2945 typename discard_block_engine<_Engine, __p, __r>::result_type 2946 discard_block_engine<_Engine, __p, __r>::operator()() 2947 { 2948 if (__n_ >= __r) 2949 { 2950 __e_.discard(__p - __r); 2951 __n_ = 0; 2952 } 2953 ++__n_; 2954 return __e_(); 2955 } 2956 2957 template<class _Eng, size_t _Pp, size_t _Rp> 2958 inline _LIBCPP_INLINE_VISIBILITY 2959 bool 2960 operator==(const discard_block_engine<_Eng, _Pp, _Rp>& __x, 2961 const discard_block_engine<_Eng, _Pp, _Rp>& __y) 2962 { 2963 return __x.__n_ == __y.__n_ && __x.__e_ == __y.__e_; 2964 } 2965 2966 template<class _Eng, size_t _Pp, size_t _Rp> 2967 inline _LIBCPP_INLINE_VISIBILITY 2968 bool 2969 operator!=(const discard_block_engine<_Eng, _Pp, _Rp>& __x, 2970 const discard_block_engine<_Eng, _Pp, _Rp>& __y) 2971 { 2972 return !(__x == __y); 2973 } 2974 2975 template <class _CharT, class _Traits, 2976 class _Eng, size_t _Pp, size_t _Rp> 2977 basic_ostream<_CharT, _Traits>& 2978 operator<<(basic_ostream<_CharT, _Traits>& __os, 2979 const discard_block_engine<_Eng, _Pp, _Rp>& __x) 2980 { 2981 __save_flags<_CharT, _Traits> __lx(__os); 2982 __os.flags(ios_base::dec | ios_base::left); 2983 _CharT __sp = __os.widen(' '); 2984 __os.fill(__sp); 2985 return __os << __x.__e_ << __sp << __x.__n_; 2986 } 2987 2988 template <class _CharT, class _Traits, 2989 class _Eng, size_t _Pp, size_t _Rp> 2990 basic_istream<_CharT, _Traits>& 2991 operator>>(basic_istream<_CharT, _Traits>& __is, 2992 discard_block_engine<_Eng, _Pp, _Rp>& __x) 2993 { 2994 __save_flags<_CharT, _Traits> __lx(__is); 2995 __is.flags(ios_base::dec | ios_base::skipws); 2996 _Eng __e; 2997 int __n; 2998 __is >> __e >> __n; 2999 if (!__is.fail()) 3000 { 3001 __x.__e_ = __e; 3002 __x.__n_ = __n; 3003 } 3004 return __is; 3005 } 3006 3007 typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; 3008 typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; 3009 3010 // independent_bits_engine 3011 3012 template<class _Engine, size_t __w, class _UIntType> 3013 class _LIBCPP_VISIBLE independent_bits_engine 3014 { 3015 template <class _UI, _UI _R0, size_t _Wp, size_t _Mp> 3016 class __get_n 3017 { 3018 static _LIBCPP_CONSTEXPR const size_t _Dt = numeric_limits<_UI>::digits; 3019 static _LIBCPP_CONSTEXPR const size_t _Np = _Wp / _Mp + (_Wp % _Mp != 0); 3020 static _LIBCPP_CONSTEXPR const size_t _W0 = _Wp / _Np; 3021 static _LIBCPP_CONSTEXPR const _UI _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0; 3022 public: 3023 static _LIBCPP_CONSTEXPR const size_t value = _R0 - _Y0 > _Y0 / _Np ? _Np + 1 : _Np; 3024 }; 3025 public: 3026 // types 3027 typedef _UIntType result_type; 3028 3029 private: 3030 _Engine __e_; 3031 3032 static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; 3033 static_assert( 0 < __w, "independent_bits_engine invalid parameters"); 3034 static_assert(__w <= _Dt, "independent_bits_engine invalid parameters"); 3035 3036 typedef typename _Engine::result_type _Engine_result_type; 3037 typedef typename conditional 3038 < 3039 sizeof(_Engine_result_type) <= sizeof(result_type), 3040 result_type, 3041 _Engine_result_type 3042 >::type _Working_result_type; 3043 #ifdef _LIBCPP_HAS_NO_CONSTEXPR 3044 static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min 3045 + _Working_result_type(1); 3046 #else 3047 static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min() 3048 + _Working_result_type(1); 3049 #endif 3050 static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value; 3051 static _LIBCPP_CONSTEXPR const size_t __n = __get_n<_Working_result_type, _Rp, __w, __m>::value; 3052 static _LIBCPP_CONSTEXPR const size_t __w0 = __w / __n; 3053 static _LIBCPP_CONSTEXPR const size_t __n0 = __n - __w % __n; 3054 static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits; 3055 static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits; 3056 static _LIBCPP_CONSTEXPR const _Working_result_type __y0 = __w0 >= _WDt ? 0 : 3057 (_Rp >> __w0) << __w0; 3058 static _LIBCPP_CONSTEXPR const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 : 3059 (_Rp >> (__w0+1)) << (__w0+1); 3060 static _LIBCPP_CONSTEXPR const _Engine_result_type __mask0 = __w0 > 0 ? 3061 _Engine_result_type(~0) >> (_EDt - __w0) : 3062 _Engine_result_type(0); 3063 static _LIBCPP_CONSTEXPR const _Engine_result_type __mask1 = __w0 < _EDt - 1 ? 3064 _Engine_result_type(~0) >> (_EDt - (__w0 + 1)) : 3065 _Engine_result_type(~0); 3066 public: 3067 static _LIBCPP_CONSTEXPR const result_type _Min = 0; 3068 static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : 3069 (result_type(1) << __w) - result_type(1); 3070 static_assert(_Min < _Max, "independent_bits_engine invalid parameters"); 3071 3072 // engine characteristics 3073 _LIBCPP_INLINE_VISIBILITY 3074 static _LIBCPP_CONSTEXPR result_type min() { return _Min; } 3075 _LIBCPP_INLINE_VISIBILITY 3076 static _LIBCPP_CONSTEXPR result_type max() { return _Max; } 3077 3078 // constructors and seeding functions 3079 _LIBCPP_INLINE_VISIBILITY 3080 independent_bits_engine() {} 3081 _LIBCPP_INLINE_VISIBILITY 3082 explicit independent_bits_engine(const _Engine& __e) 3083 : __e_(__e) {} 3084 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3085 _LIBCPP_INLINE_VISIBILITY 3086 explicit independent_bits_engine(_Engine&& __e) 3087 : __e_(_VSTD::move(__e)) {} 3088 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3089 _LIBCPP_INLINE_VISIBILITY 3090 explicit independent_bits_engine(result_type __sd) : __e_(__sd) {} 3091 template<class _Sseq> 3092 _LIBCPP_INLINE_VISIBILITY 3093 explicit independent_bits_engine(_Sseq& __q, 3094 typename enable_if<__is_seed_sequence<_Sseq, independent_bits_engine>::value && 3095 !is_convertible<_Sseq, _Engine>::value>::type* = 0) 3096 : __e_(__q) {} 3097 _LIBCPP_INLINE_VISIBILITY 3098 void seed() {__e_.seed();} 3099 _LIBCPP_INLINE_VISIBILITY 3100 void seed(result_type __sd) {__e_.seed(__sd);} 3101 template<class _Sseq> 3102 _LIBCPP_INLINE_VISIBILITY 3103 typename enable_if 3104 < 3105 __is_seed_sequence<_Sseq, independent_bits_engine>::value, 3106 void 3107 >::type 3108 seed(_Sseq& __q) {__e_.seed(__q);} 3109 3110 // generating functions 3111 _LIBCPP_INLINE_VISIBILITY 3112 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} 3113 _LIBCPP_INLINE_VISIBILITY 3114 void discard(unsigned long long __z) {for (; __z; --__z) operator()();} 3115 3116 // property functions 3117 _LIBCPP_INLINE_VISIBILITY 3118 const _Engine& base() const _NOEXCEPT {return __e_;} 3119 3120 template<class _Eng, size_t _Wp, class _UI> 3121 friend 3122 bool 3123 operator==( 3124 const independent_bits_engine<_Eng, _Wp, _UI>& __x, 3125 const independent_bits_engine<_Eng, _Wp, _UI>& __y); 3126 3127 template<class _Eng, size_t _Wp, class _UI> 3128 friend 3129 bool 3130 operator!=( 3131 const independent_bits_engine<_Eng, _Wp, _UI>& __x, 3132 const independent_bits_engine<_Eng, _Wp, _UI>& __y); 3133 3134 template <class _CharT, class _Traits, 3135 class _Eng, size_t _Wp, class _UI> 3136 friend 3137 basic_ostream<_CharT, _Traits>& 3138 operator<<(basic_ostream<_CharT, _Traits>& __os, 3139 const independent_bits_engine<_Eng, _Wp, _UI>& __x); 3140 3141 template <class _CharT, class _Traits, 3142 class _Eng, size_t _Wp, class _UI> 3143 friend 3144 basic_istream<_CharT, _Traits>& 3145 operator>>(basic_istream<_CharT, _Traits>& __is, 3146 independent_bits_engine<_Eng, _Wp, _UI>& __x); 3147 3148 private: 3149 result_type __eval(false_type); 3150 result_type __eval(true_type); 3151 3152 template <size_t __count> 3153 _LIBCPP_INLINE_VISIBILITY 3154 static 3155 typename enable_if 3156 < 3157 __count < _Dt, 3158 result_type 3159 >::type 3160 __lshift(result_type __x) {return __x << __count;} 3161 3162 template <size_t __count> 3163 _LIBCPP_INLINE_VISIBILITY 3164 static 3165 typename enable_if 3166 < 3167 (__count >= _Dt), 3168 result_type 3169 >::type 3170 __lshift(result_type) {return result_type(0);} 3171 }; 3172 3173 template<class _Engine, size_t __w, class _UIntType> 3174 inline _LIBCPP_INLINE_VISIBILITY 3175 _UIntType 3176 independent_bits_engine<_Engine, __w, _UIntType>::__eval(false_type) 3177 { 3178 return static_cast<result_type>(__e_() & __mask0); 3179 } 3180 3181 template<class _Engine, size_t __w, class _UIntType> 3182 _UIntType 3183 independent_bits_engine<_Engine, __w, _UIntType>::__eval(true_type) 3184 { 3185 result_type _Sp = 0; 3186 for (size_t __k = 0; __k < __n0; ++__k) 3187 { 3188 _Engine_result_type __u; 3189 do 3190 { 3191 __u = __e_() - _Engine::min(); 3192 } while (__u >= __y0); 3193 _Sp = static_cast<result_type>(__lshift<__w0>(_Sp) + (__u & __mask0)); 3194 } 3195 for (size_t __k = __n0; __k < __n; ++__k) 3196 { 3197 _Engine_result_type __u; 3198 do 3199 { 3200 __u = __e_() - _Engine::min(); 3201 } while (__u >= __y1); 3202 _Sp = static_cast<result_type>(__lshift<__w0+1>(_Sp) + (__u & __mask1)); 3203 } 3204 return _Sp; 3205 } 3206 3207 template<class _Eng, size_t _Wp, class _UI> 3208 inline _LIBCPP_INLINE_VISIBILITY 3209 bool 3210 operator==( 3211 const independent_bits_engine<_Eng, _Wp, _UI>& __x, 3212 const independent_bits_engine<_Eng, _Wp, _UI>& __y) 3213 { 3214 return __x.base() == __y.base(); 3215 } 3216 3217 template<class _Eng, size_t _Wp, class _UI> 3218 inline _LIBCPP_INLINE_VISIBILITY 3219 bool 3220 operator!=( 3221 const independent_bits_engine<_Eng, _Wp, _UI>& __x, 3222 const independent_bits_engine<_Eng, _Wp, _UI>& __y) 3223 { 3224 return !(__x == __y); 3225 } 3226 3227 template <class _CharT, class _Traits, 3228 class _Eng, size_t _Wp, class _UI> 3229 basic_ostream<_CharT, _Traits>& 3230 operator<<(basic_ostream<_CharT, _Traits>& __os, 3231 const independent_bits_engine<_Eng, _Wp, _UI>& __x) 3232 { 3233 return __os << __x.base(); 3234 } 3235 3236 template <class _CharT, class _Traits, 3237 class _Eng, size_t _Wp, class _UI> 3238 basic_istream<_CharT, _Traits>& 3239 operator>>(basic_istream<_CharT, _Traits>& __is, 3240 independent_bits_engine<_Eng, _Wp, _UI>& __x) 3241 { 3242 _Eng __e; 3243 __is >> __e; 3244 if (!__is.fail()) 3245 __x.__e_ = __e; 3246 return __is; 3247 } 3248 3249 // shuffle_order_engine 3250 3251 template <uint64_t _Xp, uint64_t _Yp> 3252 struct __ugcd 3253 { 3254 static _LIBCPP_CONSTEXPR const uint64_t value = __ugcd<_Yp, _Xp % _Yp>::value; 3255 }; 3256 3257 template <uint64_t _Xp> 3258 struct __ugcd<_Xp, 0> 3259 { 3260 static _LIBCPP_CONSTEXPR const uint64_t value = _Xp; 3261 }; 3262 3263 template <uint64_t _Np, uint64_t _Dp> 3264 class __uratio 3265 { 3266 static_assert(_Dp != 0, "__uratio divide by 0"); 3267 static _LIBCPP_CONSTEXPR const uint64_t __gcd = __ugcd<_Np, _Dp>::value; 3268 public: 3269 static _LIBCPP_CONSTEXPR const uint64_t num = _Np / __gcd; 3270 static _LIBCPP_CONSTEXPR const uint64_t den = _Dp / __gcd; 3271 3272 typedef __uratio<num, den> type; 3273 }; 3274 3275 template<class _Engine, size_t __k> 3276 class _LIBCPP_VISIBLE shuffle_order_engine 3277 { 3278 static_assert(0 < __k, "shuffle_order_engine invalid parameters"); 3279 public: 3280 // types 3281 typedef typename _Engine::result_type result_type; 3282 3283 private: 3284 _Engine __e_; 3285 result_type _V_[__k]; 3286 result_type _Y_; 3287 3288 public: 3289 // engine characteristics 3290 static _LIBCPP_CONSTEXPR const size_t table_size = __k; 3291 3292 #ifdef _LIBCPP_HAS_NO_CONSTEXPR 3293 static const result_type _Min = _Engine::_Min; 3294 static const result_type _Max = _Engine::_Max; 3295 #else 3296 static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min(); 3297 static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max(); 3298 #endif 3299 static_assert(_Min < _Max, "shuffle_order_engine invalid parameters"); 3300 _LIBCPP_INLINE_VISIBILITY 3301 static _LIBCPP_CONSTEXPR result_type min() { return _Min; } 3302 _LIBCPP_INLINE_VISIBILITY 3303 static _LIBCPP_CONSTEXPR result_type max() { return _Max; } 3304 3305 static _LIBCPP_CONSTEXPR const unsigned long long _Rp = _Max - _Min + 1ull; 3306 3307 // constructors and seeding functions 3308 _LIBCPP_INLINE_VISIBILITY 3309 shuffle_order_engine() {__init();} 3310 _LIBCPP_INLINE_VISIBILITY 3311 explicit shuffle_order_engine(const _Engine& __e) 3312 : __e_(__e) {__init();} 3313 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3314 _LIBCPP_INLINE_VISIBILITY 3315 explicit shuffle_order_engine(_Engine&& __e) 3316 : __e_(_VSTD::move(__e)) {__init();} 3317 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3318 _LIBCPP_INLINE_VISIBILITY 3319 explicit shuffle_order_engine(result_type __sd) : __e_(__sd) {__init();} 3320 template<class _Sseq> 3321 _LIBCPP_INLINE_VISIBILITY 3322 explicit shuffle_order_engine(_Sseq& __q, 3323 typename enable_if<__is_seed_sequence<_Sseq, shuffle_order_engine>::value && 3324 !is_convertible<_Sseq, _Engine>::value>::type* = 0) 3325 : __e_(__q) {__init();} 3326 _LIBCPP_INLINE_VISIBILITY 3327 void seed() {__e_.seed(); __init();} 3328 _LIBCPP_INLINE_VISIBILITY 3329 void seed(result_type __sd) {__e_.seed(__sd); __init();} 3330 template<class _Sseq> 3331 _LIBCPP_INLINE_VISIBILITY 3332 typename enable_if 3333 < 3334 __is_seed_sequence<_Sseq, shuffle_order_engine>::value, 3335 void 3336 >::type 3337 seed(_Sseq& __q) {__e_.seed(__q); __init();} 3338 3339 // generating functions 3340 _LIBCPP_INLINE_VISIBILITY 3341 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} 3342 _LIBCPP_INLINE_VISIBILITY 3343 void discard(unsigned long long __z) {for (; __z; --__z) operator()();} 3344 3345 // property functions 3346 _LIBCPP_INLINE_VISIBILITY 3347 const _Engine& base() const _NOEXCEPT {return __e_;} 3348 3349 private: 3350 template<class _Eng, size_t _Kp> 3351 friend 3352 bool 3353 operator==( 3354 const shuffle_order_engine<_Eng, _Kp>& __x, 3355 const shuffle_order_engine<_Eng, _Kp>& __y); 3356 3357 template<class _Eng, size_t _Kp> 3358 friend 3359 bool 3360 operator!=( 3361 const shuffle_order_engine<_Eng, _Kp>& __x, 3362 const shuffle_order_engine<_Eng, _Kp>& __y); 3363 3364 template <class _CharT, class _Traits, 3365 class _Eng, size_t _Kp> 3366 friend 3367 basic_ostream<_CharT, _Traits>& 3368 operator<<(basic_ostream<_CharT, _Traits>& __os, 3369 const shuffle_order_engine<_Eng, _Kp>& __x); 3370 3371 template <class _CharT, class _Traits, 3372 class _Eng, size_t _Kp> 3373 friend 3374 basic_istream<_CharT, _Traits>& 3375 operator>>(basic_istream<_CharT, _Traits>& __is, 3376 shuffle_order_engine<_Eng, _Kp>& __x); 3377 3378 _LIBCPP_INLINE_VISIBILITY 3379 void __init() 3380 { 3381 for (size_t __i = 0; __i < __k; ++__i) 3382 _V_[__i] = __e_(); 3383 _Y_ = __e_(); 3384 } 3385 3386 _LIBCPP_INLINE_VISIBILITY 3387 result_type __eval(false_type) {return __eval2(integral_constant<bool, __k & 1>());} 3388 _LIBCPP_INLINE_VISIBILITY 3389 result_type __eval(true_type) {return __eval(__uratio<__k, _Rp>());} 3390 3391 _LIBCPP_INLINE_VISIBILITY 3392 result_type __eval2(false_type) {return __eval(__uratio<__k/2, 0x8000000000000000ull>());} 3393 _LIBCPP_INLINE_VISIBILITY 3394 result_type __eval2(true_type) {return __evalf<__k, 0>();} 3395 3396 template <uint64_t _Np, uint64_t _Dp> 3397 _LIBCPP_INLINE_VISIBILITY 3398 typename enable_if 3399 < 3400 (__uratio<_Np, _Dp>::num > 0xFFFFFFFFFFFFFFFFull / (_Max - _Min)), 3401 result_type 3402 >::type 3403 __eval(__uratio<_Np, _Dp>) 3404 {return __evalf<__uratio<_Np, _Dp>::num, __uratio<_Np, _Dp>::den>();} 3405 3406 template <uint64_t _Np, uint64_t _Dp> 3407 _LIBCPP_INLINE_VISIBILITY 3408 typename enable_if 3409 < 3410 __uratio<_Np, _Dp>::num <= 0xFFFFFFFFFFFFFFFFull / (_Max - _Min), 3411 result_type 3412 >::type 3413 __eval(__uratio<_Np, _Dp>) 3414 { 3415 const size_t __j = static_cast<size_t>(__uratio<_Np, _Dp>::num * (_Y_ - _Min) 3416 / __uratio<_Np, _Dp>::den); 3417 _Y_ = _V_[__j]; 3418 _V_[__j] = __e_(); 3419 return _Y_; 3420 } 3421 3422 template <uint64_t __n, uint64_t __d> 3423 _LIBCPP_INLINE_VISIBILITY 3424 result_type __evalf() 3425 { 3426 const double _Fp = __d == 0 ? 3427 __n / (2. * 0x8000000000000000ull) : 3428 __n / (double)__d; 3429 const size_t __j = static_cast<size_t>(_Fp * (_Y_ - _Min)); 3430 _Y_ = _V_[__j]; 3431 _V_[__j] = __e_(); 3432 return _Y_; 3433 } 3434 }; 3435 3436 template<class _Engine, size_t __k> 3437 _LIBCPP_CONSTEXPR const size_t shuffle_order_engine<_Engine, __k>::table_size; 3438 3439 template<class _Eng, size_t _Kp> 3440 bool 3441 operator==( 3442 const shuffle_order_engine<_Eng, _Kp>& __x, 3443 const shuffle_order_engine<_Eng, _Kp>& __y) 3444 { 3445 return __x._Y_ == __y._Y_ && _VSTD::equal(__x._V_, __x._V_ + _Kp, __y._V_) && 3446 __x.__e_ == __y.__e_; 3447 } 3448 3449 template<class _Eng, size_t _Kp> 3450 inline _LIBCPP_INLINE_VISIBILITY 3451 bool 3452 operator!=( 3453 const shuffle_order_engine<_Eng, _Kp>& __x, 3454 const shuffle_order_engine<_Eng, _Kp>& __y) 3455 { 3456 return !(__x == __y); 3457 } 3458 3459 template <class _CharT, class _Traits, 3460 class _Eng, size_t _Kp> 3461 basic_ostream<_CharT, _Traits>& 3462 operator<<(basic_ostream<_CharT, _Traits>& __os, 3463 const shuffle_order_engine<_Eng, _Kp>& __x) 3464 { 3465 __save_flags<_CharT, _Traits> __lx(__os); 3466 __os.flags(ios_base::dec | ios_base::left); 3467 _CharT __sp = __os.widen(' '); 3468 __os.fill(__sp); 3469 __os << __x.__e_ << __sp << __x._V_[0]; 3470 for (size_t __i = 1; __i < _Kp; ++__i) 3471 __os << __sp << __x._V_[__i]; 3472 return __os << __sp << __x._Y_; 3473 } 3474 3475 template <class _CharT, class _Traits, 3476 class _Eng, size_t _Kp> 3477 basic_istream<_CharT, _Traits>& 3478 operator>>(basic_istream<_CharT, _Traits>& __is, 3479 shuffle_order_engine<_Eng, _Kp>& __x) 3480 { 3481 typedef typename shuffle_order_engine<_Eng, _Kp>::result_type result_type; 3482 __save_flags<_CharT, _Traits> __lx(__is); 3483 __is.flags(ios_base::dec | ios_base::skipws); 3484 _Eng __e; 3485 result_type _Vp[_Kp+1]; 3486 __is >> __e; 3487 for (size_t __i = 0; __i < _Kp+1; ++__i) 3488 __is >> _Vp[__i]; 3489 if (!__is.fail()) 3490 { 3491 __x.__e_ = __e; 3492 for (size_t __i = 0; __i < _Kp; ++__i) 3493 __x._V_[__i] = _Vp[__i]; 3494 __x._Y_ = _Vp[_Kp]; 3495 } 3496 return __is; 3497 } 3498 3499 typedef shuffle_order_engine<minstd_rand0, 256> knuth_b; 3500 3501 // random_device 3502 3503 class _LIBCPP_VISIBLE random_device 3504 { 3505 int __f_; 3506 public: 3507 // types 3508 typedef unsigned result_type; 3509 3510 // generator characteristics 3511 static _LIBCPP_CONSTEXPR const result_type _Min = 0; 3512 static _LIBCPP_CONSTEXPR const result_type _Max = 0xFFFFFFFFu; 3513 3514 _LIBCPP_INLINE_VISIBILITY 3515 static _LIBCPP_CONSTEXPR result_type min() { return _Min;} 3516 _LIBCPP_INLINE_VISIBILITY 3517 static _LIBCPP_CONSTEXPR result_type max() { return _Max;} 3518 3519 // constructors 3520 explicit random_device(const string& __token = "/dev/urandom"); 3521 ~random_device(); 3522 3523 // generating functions 3524 result_type operator()(); 3525 3526 // property functions 3527 double entropy() const _NOEXCEPT; 3528 3529 private: 3530 // no copy functions 3531 random_device(const random_device&); // = delete; 3532 random_device& operator=(const random_device&); // = delete; 3533 }; 3534 3535 // seed_seq 3536 3537 class _LIBCPP_VISIBLE seed_seq 3538 { 3539 public: 3540 // types 3541 typedef uint32_t result_type; 3542 3543 private: 3544 vector<result_type> __v_; 3545 3546 template<class _InputIterator> 3547 void init(_InputIterator __first, _InputIterator __last); 3548 public: 3549 // constructors 3550 _LIBCPP_INLINE_VISIBILITY 3551 seed_seq() {} 3552 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 3553 template<class _Tp> 3554 _LIBCPP_INLINE_VISIBILITY 3555 seed_seq(initializer_list<_Tp> __il) {init(__il.begin(), __il.end());} 3556 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 3557 3558 template<class _InputIterator> 3559 _LIBCPP_INLINE_VISIBILITY 3560 seed_seq(_InputIterator __first, _InputIterator __last) 3561 {init(__first, __last);} 3562 3563 // generating functions 3564 template<class _RandomAccessIterator> 3565 void generate(_RandomAccessIterator __first, _RandomAccessIterator __last); 3566 3567 // property functions 3568 _LIBCPP_INLINE_VISIBILITY 3569 size_t size() const {return __v_.size();} 3570 template<class _OutputIterator> 3571 _LIBCPP_INLINE_VISIBILITY 3572 void param(_OutputIterator __dest) const 3573 {_VSTD::copy(__v_.begin(), __v_.end(), __dest);} 3574 3575 private: 3576 // no copy functions 3577 seed_seq(const seed_seq&); // = delete; 3578 void operator=(const seed_seq&); // = delete; 3579 3580 _LIBCPP_INLINE_VISIBILITY 3581 static result_type _Tp(result_type __x) {return __x ^ (__x >> 27);} 3582 }; 3583 3584 template<class _InputIterator> 3585 void 3586 seed_seq::init(_InputIterator __first, _InputIterator __last) 3587 { 3588 for (_InputIterator __s = __first; __s != __last; ++__s) 3589 __v_.push_back(*__s & 0xFFFFFFFF); 3590 } 3591 3592 template<class _RandomAccessIterator> 3593 void 3594 seed_seq::generate(_RandomAccessIterator __first, _RandomAccessIterator __last) 3595 { 3596 if (__first != __last) 3597 { 3598 _VSTD::fill(__first, __last, 0x8b8b8b8b); 3599 const size_t __n = static_cast<size_t>(__last - __first); 3600 const size_t __s = __v_.size(); 3601 const size_t __t = (__n >= 623) ? 11 3602 : (__n >= 68) ? 7 3603 : (__n >= 39) ? 5 3604 : (__n >= 7) ? 3 3605 : (__n - 1) / 2; 3606 const size_t __p = (__n - __t) / 2; 3607 const size_t __q = __p + __t; 3608 const size_t __m = _VSTD::max(__s + 1, __n); 3609 // __k = 0; 3610 { 3611 result_type __r = 1664525 * _Tp(__first[0] ^ __first[__p] 3612 ^ __first[__n - 1]); 3613 __first[__p] += __r; 3614 __r += __s; 3615 __first[__q] += __r; 3616 __first[0] = __r; 3617 } 3618 for (size_t __k = 1; __k <= __s; ++__k) 3619 { 3620 const size_t __kmodn = __k % __n; 3621 const size_t __kpmodn = (__k + __p) % __n; 3622 result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] 3623 ^ __first[(__k - 1) % __n]); 3624 __first[__kpmodn] += __r; 3625 __r += __kmodn + __v_[__k-1]; 3626 __first[(__k + __q) % __n] += __r; 3627 __first[__kmodn] = __r; 3628 } 3629 for (size_t __k = __s + 1; __k < __m; ++__k) 3630 { 3631 const size_t __kmodn = __k % __n; 3632 const size_t __kpmodn = (__k + __p) % __n; 3633 result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] 3634 ^ __first[(__k - 1) % __n]); 3635 __first[__kpmodn] += __r; 3636 __r += __kmodn; 3637 __first[(__k + __q) % __n] += __r; 3638 __first[__kmodn] = __r; 3639 } 3640 for (size_t __k = __m; __k < __m + __n; ++__k) 3641 { 3642 const size_t __kmodn = __k % __n; 3643 const size_t __kpmodn = (__k + __p) % __n; 3644 result_type __r = 1566083941 * _Tp(__first[__kmodn] + 3645 __first[__kpmodn] + 3646 __first[(__k - 1) % __n]); 3647 __first[__kpmodn] ^= __r; 3648 __r -= __kmodn; 3649 __first[(__k + __q) % __n] ^= __r; 3650 __first[__kmodn] = __r; 3651 } 3652 } 3653 } 3654 3655 // generate_canonical 3656 3657 template<class _RealType, size_t __bits, class _URNG> 3658 _RealType 3659 generate_canonical(_URNG& __g) 3660 { 3661 const size_t _Dt = numeric_limits<_RealType>::digits; 3662 const size_t __b = _Dt < __bits ? _Dt : __bits; 3663 #ifdef _LIBCPP_HAS_NO_CONSTEXPR 3664 const size_t __logR = __log2<uint64_t, _URNG::_Max - _URNG::_Min + uint64_t(1)>::value; 3665 #else 3666 const size_t __logR = __log2<uint64_t, _URNG::max() - _URNG::min() + uint64_t(1)>::value; 3667 #endif 3668 const size_t __k = __b / __logR + (__b % __logR != 0) + (__b == 0); 3669 const _RealType _Rp = _URNG::max() - _URNG::min() + _RealType(1); 3670 _RealType __base = _Rp; 3671 _RealType _Sp = __g() - _URNG::min(); 3672 for (size_t __i = 1; __i < __k; ++__i, __base *= _Rp) 3673 _Sp += (__g() - _URNG::min()) * __base; 3674 return _Sp / __base; 3675 } 3676 3677 // uniform_int_distribution 3678 3679 // in <algorithm> 3680 3681 template <class _CharT, class _Traits, class _IT> 3682 basic_ostream<_CharT, _Traits>& 3683 operator<<(basic_ostream<_CharT, _Traits>& __os, 3684 const uniform_int_distribution<_IT>& __x) 3685 { 3686 __save_flags<_CharT, _Traits> __lx(__os); 3687 __os.flags(ios_base::dec | ios_base::left); 3688 _CharT __sp = __os.widen(' '); 3689 __os.fill(__sp); 3690 return __os << __x.a() << __sp << __x.b(); 3691 } 3692 3693 template <class _CharT, class _Traits, class _IT> 3694 basic_istream<_CharT, _Traits>& 3695 operator>>(basic_istream<_CharT, _Traits>& __is, 3696 uniform_int_distribution<_IT>& __x) 3697 { 3698 typedef uniform_int_distribution<_IT> _Eng; 3699 typedef typename _Eng::result_type result_type; 3700 typedef typename _Eng::param_type param_type; 3701 __save_flags<_CharT, _Traits> __lx(__is); 3702 __is.flags(ios_base::dec | ios_base::skipws); 3703 result_type __a; 3704 result_type __b; 3705 __is >> __a >> __b; 3706 if (!__is.fail()) 3707 __x.param(param_type(__a, __b)); 3708 return __is; 3709 } 3710 3711 // uniform_real_distribution 3712 3713 template<class _RealType = double> 3714 class _LIBCPP_VISIBLE uniform_real_distribution 3715 { 3716 public: 3717 // types 3718 typedef _RealType result_type; 3719 3720 class _LIBCPP_VISIBLE param_type 3721 { 3722 result_type __a_; 3723 result_type __b_; 3724 public: 3725 typedef uniform_real_distribution distribution_type; 3726 3727 _LIBCPP_INLINE_VISIBILITY 3728 explicit param_type(result_type __a = 0, 3729 result_type __b = 1) 3730 : __a_(__a), __b_(__b) {} 3731 3732 _LIBCPP_INLINE_VISIBILITY 3733 result_type a() const {return __a_;} 3734 _LIBCPP_INLINE_VISIBILITY 3735 result_type b() const {return __b_;} 3736 3737 friend _LIBCPP_INLINE_VISIBILITY 3738 bool operator==(const param_type& __x, const param_type& __y) 3739 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} 3740 friend _LIBCPP_INLINE_VISIBILITY 3741 bool operator!=(const param_type& __x, const param_type& __y) 3742 {return !(__x == __y);} 3743 }; 3744 3745 private: 3746 param_type __p_; 3747 3748 public: 3749 // constructors and reset functions 3750 _LIBCPP_INLINE_VISIBILITY 3751 explicit uniform_real_distribution(result_type __a = 0, result_type __b = 1) 3752 : __p_(param_type(__a, __b)) {} 3753 _LIBCPP_INLINE_VISIBILITY 3754 explicit uniform_real_distribution(const param_type& __p) : __p_(__p) {} 3755 _LIBCPP_INLINE_VISIBILITY 3756 void reset() {} 3757 3758 // generating functions 3759 template<class _URNG> 3760 _LIBCPP_INLINE_VISIBILITY 3761 result_type operator()(_URNG& __g) 3762 {return (*this)(__g, __p_);} 3763 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 3764 3765 // property functions 3766 _LIBCPP_INLINE_VISIBILITY 3767 result_type a() const {return __p_.a();} 3768 _LIBCPP_INLINE_VISIBILITY 3769 result_type b() const {return __p_.b();} 3770 3771 _LIBCPP_INLINE_VISIBILITY 3772 param_type param() const {return __p_;} 3773 _LIBCPP_INLINE_VISIBILITY 3774 void param(const param_type& __p) {__p_ = __p;} 3775 3776 _LIBCPP_INLINE_VISIBILITY 3777 result_type min() const {return a();} 3778 _LIBCPP_INLINE_VISIBILITY 3779 result_type max() const {return b();} 3780 3781 friend _LIBCPP_INLINE_VISIBILITY 3782 bool operator==(const uniform_real_distribution& __x, 3783 const uniform_real_distribution& __y) 3784 {return __x.__p_ == __y.__p_;} 3785 friend _LIBCPP_INLINE_VISIBILITY 3786 bool operator!=(const uniform_real_distribution& __x, 3787 const uniform_real_distribution& __y) 3788 {return !(__x == __y);} 3789 }; 3790 3791 template<class _RealType> 3792 template<class _URNG> 3793 inline _LIBCPP_INLINE_VISIBILITY 3794 typename uniform_real_distribution<_RealType>::result_type 3795 uniform_real_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 3796 { 3797 return (__p.b() - __p.a()) 3798 * _VSTD::generate_canonical<_RealType, numeric_limits<_RealType>::digits>(__g) 3799 + __p.a(); 3800 } 3801 3802 template <class _CharT, class _Traits, class _RT> 3803 basic_ostream<_CharT, _Traits>& 3804 operator<<(basic_ostream<_CharT, _Traits>& __os, 3805 const uniform_real_distribution<_RT>& __x) 3806 { 3807 __save_flags<_CharT, _Traits> __lx(__os); 3808 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 3809 ios_base::scientific); 3810 _CharT __sp = __os.widen(' '); 3811 __os.fill(__sp); 3812 return __os << __x.a() << __sp << __x.b(); 3813 } 3814 3815 template <class _CharT, class _Traits, class _RT> 3816 basic_istream<_CharT, _Traits>& 3817 operator>>(basic_istream<_CharT, _Traits>& __is, 3818 uniform_real_distribution<_RT>& __x) 3819 { 3820 typedef uniform_real_distribution<_RT> _Eng; 3821 typedef typename _Eng::result_type result_type; 3822 typedef typename _Eng::param_type param_type; 3823 __save_flags<_CharT, _Traits> __lx(__is); 3824 __is.flags(ios_base::dec | ios_base::skipws); 3825 result_type __a; 3826 result_type __b; 3827 __is >> __a >> __b; 3828 if (!__is.fail()) 3829 __x.param(param_type(__a, __b)); 3830 return __is; 3831 } 3832 3833 // bernoulli_distribution 3834 3835 class _LIBCPP_VISIBLE bernoulli_distribution 3836 { 3837 public: 3838 // types 3839 typedef bool result_type; 3840 3841 class _LIBCPP_VISIBLE param_type 3842 { 3843 double __p_; 3844 public: 3845 typedef bernoulli_distribution distribution_type; 3846 3847 _LIBCPP_INLINE_VISIBILITY 3848 explicit param_type(double __p = 0.5) : __p_(__p) {} 3849 3850 _LIBCPP_INLINE_VISIBILITY 3851 double p() const {return __p_;} 3852 3853 friend _LIBCPP_INLINE_VISIBILITY 3854 bool operator==(const param_type& __x, const param_type& __y) 3855 {return __x.__p_ == __y.__p_;} 3856 friend _LIBCPP_INLINE_VISIBILITY 3857 bool operator!=(const param_type& __x, const param_type& __y) 3858 {return !(__x == __y);} 3859 }; 3860 3861 private: 3862 param_type __p_; 3863 3864 public: 3865 // constructors and reset functions 3866 _LIBCPP_INLINE_VISIBILITY 3867 explicit bernoulli_distribution(double __p = 0.5) 3868 : __p_(param_type(__p)) {} 3869 _LIBCPP_INLINE_VISIBILITY 3870 explicit bernoulli_distribution(const param_type& __p) : __p_(__p) {} 3871 _LIBCPP_INLINE_VISIBILITY 3872 void reset() {} 3873 3874 // generating functions 3875 template<class _URNG> 3876 _LIBCPP_INLINE_VISIBILITY 3877 result_type operator()(_URNG& __g) 3878 {return (*this)(__g, __p_);} 3879 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 3880 3881 // property functions 3882 _LIBCPP_INLINE_VISIBILITY 3883 double p() const {return __p_.p();} 3884 3885 _LIBCPP_INLINE_VISIBILITY 3886 param_type param() const {return __p_;} 3887 _LIBCPP_INLINE_VISIBILITY 3888 void param(const param_type& __p) {__p_ = __p;} 3889 3890 _LIBCPP_INLINE_VISIBILITY 3891 result_type min() const {return false;} 3892 _LIBCPP_INLINE_VISIBILITY 3893 result_type max() const {return true;} 3894 3895 friend _LIBCPP_INLINE_VISIBILITY 3896 bool operator==(const bernoulli_distribution& __x, 3897 const bernoulli_distribution& __y) 3898 {return __x.__p_ == __y.__p_;} 3899 friend _LIBCPP_INLINE_VISIBILITY 3900 bool operator!=(const bernoulli_distribution& __x, 3901 const bernoulli_distribution& __y) 3902 {return !(__x == __y);} 3903 }; 3904 3905 template<class _URNG> 3906 inline _LIBCPP_INLINE_VISIBILITY 3907 bernoulli_distribution::result_type 3908 bernoulli_distribution::operator()(_URNG& __g, const param_type& __p) 3909 { 3910 uniform_real_distribution<double> __gen; 3911 return __gen(__g) < __p.p(); 3912 } 3913 3914 template <class _CharT, class _Traits> 3915 basic_ostream<_CharT, _Traits>& 3916 operator<<(basic_ostream<_CharT, _Traits>& __os, const bernoulli_distribution& __x) 3917 { 3918 __save_flags<_CharT, _Traits> __lx(__os); 3919 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 3920 ios_base::scientific); 3921 _CharT __sp = __os.widen(' '); 3922 __os.fill(__sp); 3923 return __os << __x.p(); 3924 } 3925 3926 template <class _CharT, class _Traits> 3927 basic_istream<_CharT, _Traits>& 3928 operator>>(basic_istream<_CharT, _Traits>& __is, bernoulli_distribution& __x) 3929 { 3930 typedef bernoulli_distribution _Eng; 3931 typedef typename _Eng::param_type param_type; 3932 __save_flags<_CharT, _Traits> __lx(__is); 3933 __is.flags(ios_base::dec | ios_base::skipws); 3934 double __p; 3935 __is >> __p; 3936 if (!__is.fail()) 3937 __x.param(param_type(__p)); 3938 return __is; 3939 } 3940 3941 // binomial_distribution 3942 3943 template<class _IntType = int> 3944 class _LIBCPP_VISIBLE binomial_distribution 3945 { 3946 public: 3947 // types 3948 typedef _IntType result_type; 3949 3950 class _LIBCPP_VISIBLE param_type 3951 { 3952 result_type __t_; 3953 double __p_; 3954 double __pr_; 3955 double __odds_ratio_; 3956 result_type __r0_; 3957 public: 3958 typedef binomial_distribution distribution_type; 3959 3960 explicit param_type(result_type __t = 1, double __p = 0.5); 3961 3962 _LIBCPP_INLINE_VISIBILITY 3963 result_type t() const {return __t_;} 3964 _LIBCPP_INLINE_VISIBILITY 3965 double p() const {return __p_;} 3966 3967 friend _LIBCPP_INLINE_VISIBILITY 3968 bool operator==(const param_type& __x, const param_type& __y) 3969 {return __x.__t_ == __y.__t_ && __x.__p_ == __y.__p_;} 3970 friend _LIBCPP_INLINE_VISIBILITY 3971 bool operator!=(const param_type& __x, const param_type& __y) 3972 {return !(__x == __y);} 3973 3974 friend class binomial_distribution; 3975 }; 3976 3977 private: 3978 param_type __p_; 3979 3980 public: 3981 // constructors and reset functions 3982 _LIBCPP_INLINE_VISIBILITY 3983 explicit binomial_distribution(result_type __t = 1, double __p = 0.5) 3984 : __p_(param_type(__t, __p)) {} 3985 _LIBCPP_INLINE_VISIBILITY 3986 explicit binomial_distribution(const param_type& __p) : __p_(__p) {} 3987 _LIBCPP_INLINE_VISIBILITY 3988 void reset() {} 3989 3990 // generating functions 3991 template<class _URNG> 3992 _LIBCPP_INLINE_VISIBILITY 3993 result_type operator()(_URNG& __g) 3994 {return (*this)(__g, __p_);} 3995 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 3996 3997 // property functions 3998 _LIBCPP_INLINE_VISIBILITY 3999 result_type t() const {return __p_.t();} 4000 _LIBCPP_INLINE_VISIBILITY 4001 double p() const {return __p_.p();} 4002 4003 _LIBCPP_INLINE_VISIBILITY 4004 param_type param() const {return __p_;} 4005 _LIBCPP_INLINE_VISIBILITY 4006 void param(const param_type& __p) {__p_ = __p;} 4007 4008 _LIBCPP_INLINE_VISIBILITY 4009 result_type min() const {return 0;} 4010 _LIBCPP_INLINE_VISIBILITY 4011 result_type max() const {return t();} 4012 4013 friend _LIBCPP_INLINE_VISIBILITY 4014 bool operator==(const binomial_distribution& __x, 4015 const binomial_distribution& __y) 4016 {return __x.__p_ == __y.__p_;} 4017 friend _LIBCPP_INLINE_VISIBILITY 4018 bool operator!=(const binomial_distribution& __x, 4019 const binomial_distribution& __y) 4020 {return !(__x == __y);} 4021 }; 4022 4023 template<class _IntType> 4024 binomial_distribution<_IntType>::param_type::param_type(result_type __t, double __p) 4025 : __t_(__t), __p_(__p) 4026 { 4027 if (0 < __p_ && __p_ < 1) 4028 { 4029 __r0_ = static_cast<result_type>((__t_ + 1) * __p_); 4030 __pr_ = _VSTD::exp(_VSTD::lgamma(__t_ + 1.) - _VSTD::lgamma(__r0_ + 1.) - 4031 _VSTD::lgamma(__t_ - __r0_ + 1.) + __r0_ * _VSTD::log(__p_) + 4032 (__t_ - __r0_) * _VSTD::log(1 - __p_)); 4033 __odds_ratio_ = __p_ / (1 - __p_); 4034 } 4035 } 4036 4037 template<class _IntType> 4038 template<class _URNG> 4039 _IntType 4040 binomial_distribution<_IntType>::operator()(_URNG& __g, const param_type& __pr) 4041 { 4042 if (__pr.__t_ == 0 || __pr.__p_ == 0) 4043 return 0; 4044 if (__pr.__p_ == 1) 4045 return __pr.__t_; 4046 uniform_real_distribution<double> __gen; 4047 double __u = __gen(__g) - __pr.__pr_; 4048 if (__u < 0) 4049 return __pr.__r0_; 4050 double __pu = __pr.__pr_; 4051 double __pd = __pu; 4052 result_type __ru = __pr.__r0_; 4053 result_type __rd = __ru; 4054 while (true) 4055 { 4056 if (__rd >= 1) 4057 { 4058 __pd *= __rd / (__pr.__odds_ratio_ * (__pr.__t_ - __rd + 1)); 4059 __u -= __pd; 4060 if (__u < 0) 4061 return __rd - 1; 4062 } 4063 --__rd; 4064 ++__ru; 4065 if (__ru <= __pr.__t_) 4066 { 4067 __pu *= (__pr.__t_ - __ru + 1) * __pr.__odds_ratio_ / __ru; 4068 __u -= __pu; 4069 if (__u < 0) 4070 return __ru; 4071 } 4072 } 4073 } 4074 4075 template <class _CharT, class _Traits, class _IntType> 4076 basic_ostream<_CharT, _Traits>& 4077 operator<<(basic_ostream<_CharT, _Traits>& __os, 4078 const binomial_distribution<_IntType>& __x) 4079 { 4080 __save_flags<_CharT, _Traits> __lx(__os); 4081 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4082 ios_base::scientific); 4083 _CharT __sp = __os.widen(' '); 4084 __os.fill(__sp); 4085 return __os << __x.t() << __sp << __x.p(); 4086 } 4087 4088 template <class _CharT, class _Traits, class _IntType> 4089 basic_istream<_CharT, _Traits>& 4090 operator>>(basic_istream<_CharT, _Traits>& __is, 4091 binomial_distribution<_IntType>& __x) 4092 { 4093 typedef binomial_distribution<_IntType> _Eng; 4094 typedef typename _Eng::result_type result_type; 4095 typedef typename _Eng::param_type param_type; 4096 __save_flags<_CharT, _Traits> __lx(__is); 4097 __is.flags(ios_base::dec | ios_base::skipws); 4098 result_type __t; 4099 double __p; 4100 __is >> __t >> __p; 4101 if (!__is.fail()) 4102 __x.param(param_type(__t, __p)); 4103 return __is; 4104 } 4105 4106 // exponential_distribution 4107 4108 template<class _RealType = double> 4109 class _LIBCPP_VISIBLE exponential_distribution 4110 { 4111 public: 4112 // types 4113 typedef _RealType result_type; 4114 4115 class _LIBCPP_VISIBLE param_type 4116 { 4117 result_type __lambda_; 4118 public: 4119 typedef exponential_distribution distribution_type; 4120 4121 _LIBCPP_INLINE_VISIBILITY 4122 explicit param_type(result_type __lambda = 1) : __lambda_(__lambda) {} 4123 4124 _LIBCPP_INLINE_VISIBILITY 4125 result_type lambda() const {return __lambda_;} 4126 4127 friend _LIBCPP_INLINE_VISIBILITY 4128 bool operator==(const param_type& __x, const param_type& __y) 4129 {return __x.__lambda_ == __y.__lambda_;} 4130 friend _LIBCPP_INLINE_VISIBILITY 4131 bool operator!=(const param_type& __x, const param_type& __y) 4132 {return !(__x == __y);} 4133 }; 4134 4135 private: 4136 param_type __p_; 4137 4138 public: 4139 // constructors and reset functions 4140 _LIBCPP_INLINE_VISIBILITY 4141 explicit exponential_distribution(result_type __lambda = 1) 4142 : __p_(param_type(__lambda)) {} 4143 _LIBCPP_INLINE_VISIBILITY 4144 explicit exponential_distribution(const param_type& __p) : __p_(__p) {} 4145 _LIBCPP_INLINE_VISIBILITY 4146 void reset() {} 4147 4148 // generating functions 4149 template<class _URNG> 4150 _LIBCPP_INLINE_VISIBILITY 4151 result_type operator()(_URNG& __g) 4152 {return (*this)(__g, __p_);} 4153 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 4154 4155 // property functions 4156 _LIBCPP_INLINE_VISIBILITY 4157 result_type lambda() const {return __p_.lambda();} 4158 4159 _LIBCPP_INLINE_VISIBILITY 4160 param_type param() const {return __p_;} 4161 _LIBCPP_INLINE_VISIBILITY 4162 void param(const param_type& __p) {__p_ = __p;} 4163 4164 _LIBCPP_INLINE_VISIBILITY 4165 result_type min() const {return 0;} 4166 _LIBCPP_INLINE_VISIBILITY 4167 result_type max() const {return numeric_limits<result_type>::infinity();} 4168 4169 friend _LIBCPP_INLINE_VISIBILITY 4170 bool operator==(const exponential_distribution& __x, 4171 const exponential_distribution& __y) 4172 {return __x.__p_ == __y.__p_;} 4173 friend _LIBCPP_INLINE_VISIBILITY 4174 bool operator!=(const exponential_distribution& __x, 4175 const exponential_distribution& __y) 4176 {return !(__x == __y);} 4177 }; 4178 4179 template <class _RealType> 4180 template<class _URNG> 4181 _RealType 4182 exponential_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 4183 { 4184 return -_VSTD::log 4185 ( 4186 result_type(1) - 4187 _VSTD::generate_canonical<result_type, 4188 numeric_limits<result_type>::digits>(__g) 4189 ) 4190 / __p.lambda(); 4191 } 4192 4193 template <class _CharT, class _Traits, class _RealType> 4194 basic_ostream<_CharT, _Traits>& 4195 operator<<(basic_ostream<_CharT, _Traits>& __os, 4196 const exponential_distribution<_RealType>& __x) 4197 { 4198 __save_flags<_CharT, _Traits> __lx(__os); 4199 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4200 ios_base::scientific); 4201 return __os << __x.lambda(); 4202 } 4203 4204 template <class _CharT, class _Traits, class _RealType> 4205 basic_istream<_CharT, _Traits>& 4206 operator>>(basic_istream<_CharT, _Traits>& __is, 4207 exponential_distribution<_RealType>& __x) 4208 { 4209 typedef exponential_distribution<_RealType> _Eng; 4210 typedef typename _Eng::result_type result_type; 4211 typedef typename _Eng::param_type param_type; 4212 __save_flags<_CharT, _Traits> __lx(__is); 4213 __is.flags(ios_base::dec | ios_base::skipws); 4214 result_type __lambda; 4215 __is >> __lambda; 4216 if (!__is.fail()) 4217 __x.param(param_type(__lambda)); 4218 return __is; 4219 } 4220 4221 // normal_distribution 4222 4223 template<class _RealType = double> 4224 class _LIBCPP_VISIBLE normal_distribution 4225 { 4226 public: 4227 // types 4228 typedef _RealType result_type; 4229 4230 class _LIBCPP_VISIBLE param_type 4231 { 4232 result_type __mean_; 4233 result_type __stddev_; 4234 public: 4235 typedef normal_distribution distribution_type; 4236 4237 _LIBCPP_INLINE_VISIBILITY 4238 explicit param_type(result_type __mean = 0, result_type __stddev = 1) 4239 : __mean_(__mean), __stddev_(__stddev) {} 4240 4241 _LIBCPP_INLINE_VISIBILITY 4242 result_type mean() const {return __mean_;} 4243 _LIBCPP_INLINE_VISIBILITY 4244 result_type stddev() const {return __stddev_;} 4245 4246 friend _LIBCPP_INLINE_VISIBILITY 4247 bool operator==(const param_type& __x, const param_type& __y) 4248 {return __x.__mean_ == __y.__mean_ && __x.__stddev_ == __y.__stddev_;} 4249 friend _LIBCPP_INLINE_VISIBILITY 4250 bool operator!=(const param_type& __x, const param_type& __y) 4251 {return !(__x == __y);} 4252 }; 4253 4254 private: 4255 param_type __p_; 4256 result_type _V_; 4257 bool _V_hot_; 4258 4259 public: 4260 // constructors and reset functions 4261 _LIBCPP_INLINE_VISIBILITY 4262 explicit normal_distribution(result_type __mean = 0, result_type __stddev = 1) 4263 : __p_(param_type(__mean, __stddev)), _V_hot_(false) {} 4264 _LIBCPP_INLINE_VISIBILITY 4265 explicit normal_distribution(const param_type& __p) 4266 : __p_(__p), _V_hot_(false) {} 4267 _LIBCPP_INLINE_VISIBILITY 4268 void reset() {_V_hot_ = false;} 4269 4270 // generating functions 4271 template<class _URNG> 4272 _LIBCPP_INLINE_VISIBILITY 4273 result_type operator()(_URNG& __g) 4274 {return (*this)(__g, __p_);} 4275 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 4276 4277 // property functions 4278 _LIBCPP_INLINE_VISIBILITY 4279 result_type mean() const {return __p_.mean();} 4280 _LIBCPP_INLINE_VISIBILITY 4281 result_type stddev() const {return __p_.stddev();} 4282 4283 _LIBCPP_INLINE_VISIBILITY 4284 param_type param() const {return __p_;} 4285 _LIBCPP_INLINE_VISIBILITY 4286 void param(const param_type& __p) {__p_ = __p;} 4287 4288 _LIBCPP_INLINE_VISIBILITY 4289 result_type min() const {return -numeric_limits<result_type>::infinity();} 4290 _LIBCPP_INLINE_VISIBILITY 4291 result_type max() const {return numeric_limits<result_type>::infinity();} 4292 4293 friend _LIBCPP_INLINE_VISIBILITY 4294 bool operator==(const normal_distribution& __x, 4295 const normal_distribution& __y) 4296 {return __x.__p_ == __y.__p_ && __x._V_hot_ == __y._V_hot_ && 4297 (!__x._V_hot_ || __x._V_ == __y._V_);} 4298 friend _LIBCPP_INLINE_VISIBILITY 4299 bool operator!=(const normal_distribution& __x, 4300 const normal_distribution& __y) 4301 {return !(__x == __y);} 4302 4303 template <class _CharT, class _Traits, class _RT> 4304 friend 4305 basic_ostream<_CharT, _Traits>& 4306 operator<<(basic_ostream<_CharT, _Traits>& __os, 4307 const normal_distribution<_RT>& __x); 4308 4309 template <class _CharT, class _Traits, class _RT> 4310 friend 4311 basic_istream<_CharT, _Traits>& 4312 operator>>(basic_istream<_CharT, _Traits>& __is, 4313 normal_distribution<_RT>& __x); 4314 }; 4315 4316 template <class _RealType> 4317 template<class _URNG> 4318 _RealType 4319 normal_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 4320 { 4321 result_type _Up; 4322 if (_V_hot_) 4323 { 4324 _V_hot_ = false; 4325 _Up = _V_; 4326 } 4327 else 4328 { 4329 uniform_real_distribution<result_type> _Uni(-1, 1); 4330 result_type __u; 4331 result_type __v; 4332 result_type __s; 4333 do 4334 { 4335 __u = _Uni(__g); 4336 __v = _Uni(__g); 4337 __s = __u * __u + __v * __v; 4338 } while (__s > 1 || __s == 0); 4339 result_type _Fp = _VSTD::sqrt(-2 * _VSTD::log(__s) / __s); 4340 _V_ = __v * _Fp; 4341 _V_hot_ = true; 4342 _Up = __u * _Fp; 4343 } 4344 return _Up * __p.stddev() + __p.mean(); 4345 } 4346 4347 template <class _CharT, class _Traits, class _RT> 4348 basic_ostream<_CharT, _Traits>& 4349 operator<<(basic_ostream<_CharT, _Traits>& __os, 4350 const normal_distribution<_RT>& __x) 4351 { 4352 __save_flags<_CharT, _Traits> __lx(__os); 4353 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4354 ios_base::scientific); 4355 _CharT __sp = __os.widen(' '); 4356 __os.fill(__sp); 4357 __os << __x.mean() << __sp << __x.stddev() << __sp << __x._V_hot_; 4358 if (__x._V_hot_) 4359 __os << __sp << __x._V_; 4360 return __os; 4361 } 4362 4363 template <class _CharT, class _Traits, class _RT> 4364 basic_istream<_CharT, _Traits>& 4365 operator>>(basic_istream<_CharT, _Traits>& __is, 4366 normal_distribution<_RT>& __x) 4367 { 4368 typedef normal_distribution<_RT> _Eng; 4369 typedef typename _Eng::result_type result_type; 4370 typedef typename _Eng::param_type param_type; 4371 __save_flags<_CharT, _Traits> __lx(__is); 4372 __is.flags(ios_base::dec | ios_base::skipws); 4373 result_type __mean; 4374 result_type __stddev; 4375 result_type _Vp = 0; 4376 bool _V_hot = false; 4377 __is >> __mean >> __stddev >> _V_hot; 4378 if (_V_hot) 4379 __is >> _Vp; 4380 if (!__is.fail()) 4381 { 4382 __x.param(param_type(__mean, __stddev)); 4383 __x._V_hot_ = _V_hot; 4384 __x._V_ = _Vp; 4385 } 4386 return __is; 4387 } 4388 4389 // lognormal_distribution 4390 4391 template<class _RealType = double> 4392 class _LIBCPP_VISIBLE lognormal_distribution 4393 { 4394 public: 4395 // types 4396 typedef _RealType result_type; 4397 4398 class _LIBCPP_VISIBLE param_type 4399 { 4400 normal_distribution<result_type> __nd_; 4401 public: 4402 typedef lognormal_distribution distribution_type; 4403 4404 _LIBCPP_INLINE_VISIBILITY 4405 explicit param_type(result_type __m = 0, result_type __s = 1) 4406 : __nd_(__m, __s) {} 4407 4408 _LIBCPP_INLINE_VISIBILITY 4409 result_type m() const {return __nd_.mean();} 4410 _LIBCPP_INLINE_VISIBILITY 4411 result_type s() const {return __nd_.stddev();} 4412 4413 friend _LIBCPP_INLINE_VISIBILITY 4414 bool operator==(const param_type& __x, const param_type& __y) 4415 {return __x.__nd_ == __y.__nd_;} 4416 friend _LIBCPP_INLINE_VISIBILITY 4417 bool operator!=(const param_type& __x, const param_type& __y) 4418 {return !(__x == __y);} 4419 friend class lognormal_distribution; 4420 4421 template <class _CharT, class _Traits, class _RT> 4422 friend 4423 basic_ostream<_CharT, _Traits>& 4424 operator<<(basic_ostream<_CharT, _Traits>& __os, 4425 const lognormal_distribution<_RT>& __x); 4426 4427 template <class _CharT, class _Traits, class _RT> 4428 friend 4429 basic_istream<_CharT, _Traits>& 4430 operator>>(basic_istream<_CharT, _Traits>& __is, 4431 lognormal_distribution<_RT>& __x); 4432 }; 4433 4434 private: 4435 param_type __p_; 4436 4437 public: 4438 // constructor and reset functions 4439 _LIBCPP_INLINE_VISIBILITY 4440 explicit lognormal_distribution(result_type __m = 0, result_type __s = 1) 4441 : __p_(param_type(__m, __s)) {} 4442 _LIBCPP_INLINE_VISIBILITY 4443 explicit lognormal_distribution(const param_type& __p) 4444 : __p_(__p) {} 4445 _LIBCPP_INLINE_VISIBILITY 4446 void reset() {__p_.__nd_.reset();} 4447 4448 // generating functions 4449 template<class _URNG> 4450 _LIBCPP_INLINE_VISIBILITY 4451 result_type operator()(_URNG& __g) 4452 {return (*this)(__g, __p_);} 4453 template<class _URNG> 4454 _LIBCPP_INLINE_VISIBILITY 4455 result_type operator()(_URNG& __g, const param_type& __p) 4456 {return _VSTD::exp(const_cast<normal_distribution<result_type>&>(__p.__nd_)(__g));} 4457 4458 // property functions 4459 _LIBCPP_INLINE_VISIBILITY 4460 result_type m() const {return __p_.m();} 4461 _LIBCPP_INLINE_VISIBILITY 4462 result_type s() const {return __p_.s();} 4463 4464 _LIBCPP_INLINE_VISIBILITY 4465 param_type param() const {return __p_;} 4466 _LIBCPP_INLINE_VISIBILITY 4467 void param(const param_type& __p) {__p_ = __p;} 4468 4469 _LIBCPP_INLINE_VISIBILITY 4470 result_type min() const {return 0;} 4471 _LIBCPP_INLINE_VISIBILITY 4472 result_type max() const {return numeric_limits<result_type>::infinity();} 4473 4474 friend _LIBCPP_INLINE_VISIBILITY 4475 bool operator==(const lognormal_distribution& __x, 4476 const lognormal_distribution& __y) 4477 {return __x.__p_ == __y.__p_;} 4478 friend _LIBCPP_INLINE_VISIBILITY 4479 bool operator!=(const lognormal_distribution& __x, 4480 const lognormal_distribution& __y) 4481 {return !(__x == __y);} 4482 4483 template <class _CharT, class _Traits, class _RT> 4484 friend 4485 basic_ostream<_CharT, _Traits>& 4486 operator<<(basic_ostream<_CharT, _Traits>& __os, 4487 const lognormal_distribution<_RT>& __x); 4488 4489 template <class _CharT, class _Traits, class _RT> 4490 friend 4491 basic_istream<_CharT, _Traits>& 4492 operator>>(basic_istream<_CharT, _Traits>& __is, 4493 lognormal_distribution<_RT>& __x); 4494 }; 4495 4496 template <class _CharT, class _Traits, class _RT> 4497 inline _LIBCPP_INLINE_VISIBILITY 4498 basic_ostream<_CharT, _Traits>& 4499 operator<<(basic_ostream<_CharT, _Traits>& __os, 4500 const lognormal_distribution<_RT>& __x) 4501 { 4502 return __os << __x.__p_.__nd_; 4503 } 4504 4505 template <class _CharT, class _Traits, class _RT> 4506 inline _LIBCPP_INLINE_VISIBILITY 4507 basic_istream<_CharT, _Traits>& 4508 operator>>(basic_istream<_CharT, _Traits>& __is, 4509 lognormal_distribution<_RT>& __x) 4510 { 4511 return __is >> __x.__p_.__nd_; 4512 } 4513 4514 // poisson_distribution 4515 4516 template<class _IntType = int> 4517 class _LIBCPP_VISIBLE poisson_distribution 4518 { 4519 public: 4520 // types 4521 typedef _IntType result_type; 4522 4523 class _LIBCPP_VISIBLE param_type 4524 { 4525 double __mean_; 4526 double __s_; 4527 double __d_; 4528 double __l_; 4529 double __omega_; 4530 double __c0_; 4531 double __c1_; 4532 double __c2_; 4533 double __c3_; 4534 double __c_; 4535 4536 public: 4537 typedef poisson_distribution distribution_type; 4538 4539 explicit param_type(double __mean = 1.0); 4540 4541 _LIBCPP_INLINE_VISIBILITY 4542 double mean() const {return __mean_;} 4543 4544 friend _LIBCPP_INLINE_VISIBILITY 4545 bool operator==(const param_type& __x, const param_type& __y) 4546 {return __x.__mean_ == __y.__mean_;} 4547 friend _LIBCPP_INLINE_VISIBILITY 4548 bool operator!=(const param_type& __x, const param_type& __y) 4549 {return !(__x == __y);} 4550 4551 friend class poisson_distribution; 4552 }; 4553 4554 private: 4555 param_type __p_; 4556 4557 public: 4558 // constructors and reset functions 4559 _LIBCPP_INLINE_VISIBILITY 4560 explicit poisson_distribution(double __mean = 1.0) : __p_(__mean) {} 4561 _LIBCPP_INLINE_VISIBILITY 4562 explicit poisson_distribution(const param_type& __p) : __p_(__p) {} 4563 _LIBCPP_INLINE_VISIBILITY 4564 void reset() {} 4565 4566 // generating functions 4567 template<class _URNG> 4568 _LIBCPP_INLINE_VISIBILITY 4569 result_type operator()(_URNG& __g) 4570 {return (*this)(__g, __p_);} 4571 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 4572 4573 // property functions 4574 _LIBCPP_INLINE_VISIBILITY 4575 double mean() const {return __p_.mean();} 4576 4577 _LIBCPP_INLINE_VISIBILITY 4578 param_type param() const {return __p_;} 4579 _LIBCPP_INLINE_VISIBILITY 4580 void param(const param_type& __p) {__p_ = __p;} 4581 4582 _LIBCPP_INLINE_VISIBILITY 4583 result_type min() const {return 0;} 4584 _LIBCPP_INLINE_VISIBILITY 4585 result_type max() const {return numeric_limits<result_type>::max();} 4586 4587 friend _LIBCPP_INLINE_VISIBILITY 4588 bool operator==(const poisson_distribution& __x, 4589 const poisson_distribution& __y) 4590 {return __x.__p_ == __y.__p_;} 4591 friend _LIBCPP_INLINE_VISIBILITY 4592 bool operator!=(const poisson_distribution& __x, 4593 const poisson_distribution& __y) 4594 {return !(__x == __y);} 4595 }; 4596 4597 template<class _IntType> 4598 poisson_distribution<_IntType>::param_type::param_type(double __mean) 4599 : __mean_(__mean) 4600 { 4601 if (__mean_ < 10) 4602 { 4603 __s_ = 0; 4604 __d_ = 0; 4605 __l_ = _VSTD::exp(-__mean_); 4606 __omega_ = 0; 4607 __c3_ = 0; 4608 __c2_ = 0; 4609 __c1_ = 0; 4610 __c0_ = 0; 4611 __c_ = 0; 4612 } 4613 else 4614 { 4615 __s_ = _VSTD::sqrt(__mean_); 4616 __d_ = 6 * __mean_ * __mean_; 4617 __l_ = static_cast<result_type>(__mean_ - 1.1484); 4618 __omega_ = .3989423 / __s_; 4619 double __b1_ = .4166667E-1 / __mean_; 4620 double __b2_ = .3 * __b1_ * __b1_; 4621 __c3_ = .1428571 * __b1_ * __b2_; 4622 __c2_ = __b2_ - 15. * __c3_; 4623 __c1_ = __b1_ - 6. * __b2_ + 45. * __c3_; 4624 __c0_ = 1. - __b1_ + 3. * __b2_ - 15. * __c3_; 4625 __c_ = .1069 / __mean_; 4626 } 4627 } 4628 4629 template <class _IntType> 4630 template<class _URNG> 4631 _IntType 4632 poisson_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr) 4633 { 4634 result_type __x; 4635 uniform_real_distribution<double> __urd; 4636 if (__pr.__mean_ < 10) 4637 { 4638 __x = 0; 4639 for (double __p = __urd(__urng); __p > __pr.__l_; ++__x) 4640 __p *= __urd(__urng); 4641 } 4642 else 4643 { 4644 double __difmuk; 4645 double __g = __pr.__mean_ + __pr.__s_ * normal_distribution<double>()(__urng); 4646 double __u; 4647 if (__g > 0) 4648 { 4649 __x = static_cast<result_type>(__g); 4650 if (__x >= __pr.__l_) 4651 return __x; 4652 __difmuk = __pr.__mean_ - __x; 4653 __u = __urd(__urng); 4654 if (__pr.__d_ * __u >= __difmuk * __difmuk * __difmuk) 4655 return __x; 4656 } 4657 exponential_distribution<double> __edist; 4658 for (bool __using_exp_dist = false; true; __using_exp_dist = true) 4659 { 4660 double __e; 4661 if (__using_exp_dist || __g < 0) 4662 { 4663 double __t; 4664 do 4665 { 4666 __e = __edist(__urng); 4667 __u = __urd(__urng); 4668 __u += __u - 1; 4669 __t = 1.8 + (__u < 0 ? -__e : __e); 4670 } while (__t <= -.6744); 4671 __x = __pr.__mean_ + __pr.__s_ * __t; 4672 __difmuk = __pr.__mean_ - __x; 4673 __using_exp_dist = true; 4674 } 4675 double __px; 4676 double __py; 4677 if (__x < 10) 4678 { 4679 const result_type __fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, 4680 40320, 362880}; 4681 __px = -__pr.__mean_; 4682 __py = _VSTD::pow(__pr.__mean_, (double)__x) / __fac[__x]; 4683 } 4684 else 4685 { 4686 double __del = .8333333E-1 / __x; 4687 __del -= 4.8 * __del * __del * __del; 4688 double __v = __difmuk / __x; 4689 if (_VSTD::abs(__v) > 0.25) 4690 __px = __x * _VSTD::log(1 + __v) - __difmuk - __del; 4691 else 4692 __px = __x * __v * __v * (((((((.1250060 * __v + -.1384794) * 4693 __v + .1421878) * __v + -.1661269) * __v + .2000118) * 4694 __v + -.2500068) * __v + .3333333) * __v + -.5) - __del; 4695 __py = .3989423 / _VSTD::sqrt(__x); 4696 } 4697 double __r = (0.5 - __difmuk) / __pr.__s_; 4698 double __r2 = __r * __r; 4699 double __fx = -0.5 * __r2; 4700 double __fy = __pr.__omega_ * (((__pr.__c3_ * __r2 + __pr.__c2_) * 4701 __r2 + __pr.__c1_) * __r2 + __pr.__c0_); 4702 if (__using_exp_dist) 4703 { 4704 if (__pr.__c_ * _VSTD::abs(__u) <= __py * _VSTD::exp(__px + __e) - 4705 __fy * _VSTD::exp(__fx + __e)) 4706 break; 4707 } 4708 else 4709 { 4710 if (__fy - __u * __fy <= __py * _VSTD::exp(__px - __fx)) 4711 break; 4712 } 4713 } 4714 } 4715 return __x; 4716 } 4717 4718 template <class _CharT, class _Traits, class _IntType> 4719 basic_ostream<_CharT, _Traits>& 4720 operator<<(basic_ostream<_CharT, _Traits>& __os, 4721 const poisson_distribution<_IntType>& __x) 4722 { 4723 __save_flags<_CharT, _Traits> __lx(__os); 4724 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4725 ios_base::scientific); 4726 return __os << __x.mean(); 4727 } 4728 4729 template <class _CharT, class _Traits, class _IntType> 4730 basic_istream<_CharT, _Traits>& 4731 operator>>(basic_istream<_CharT, _Traits>& __is, 4732 poisson_distribution<_IntType>& __x) 4733 { 4734 typedef poisson_distribution<_IntType> _Eng; 4735 typedef typename _Eng::param_type param_type; 4736 __save_flags<_CharT, _Traits> __lx(__is); 4737 __is.flags(ios_base::dec | ios_base::skipws); 4738 double __mean; 4739 __is >> __mean; 4740 if (!__is.fail()) 4741 __x.param(param_type(__mean)); 4742 return __is; 4743 } 4744 4745 // weibull_distribution 4746 4747 template<class _RealType = double> 4748 class _LIBCPP_VISIBLE weibull_distribution 4749 { 4750 public: 4751 // types 4752 typedef _RealType result_type; 4753 4754 class _LIBCPP_VISIBLE param_type 4755 { 4756 result_type __a_; 4757 result_type __b_; 4758 public: 4759 typedef weibull_distribution distribution_type; 4760 4761 _LIBCPP_INLINE_VISIBILITY 4762 explicit param_type(result_type __a = 1, result_type __b = 1) 4763 : __a_(__a), __b_(__b) {} 4764 4765 _LIBCPP_INLINE_VISIBILITY 4766 result_type a() const {return __a_;} 4767 _LIBCPP_INLINE_VISIBILITY 4768 result_type b() const {return __b_;} 4769 4770 friend _LIBCPP_INLINE_VISIBILITY 4771 bool operator==(const param_type& __x, const param_type& __y) 4772 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} 4773 friend _LIBCPP_INLINE_VISIBILITY 4774 bool operator!=(const param_type& __x, const param_type& __y) 4775 {return !(__x == __y);} 4776 }; 4777 4778 private: 4779 param_type __p_; 4780 4781 public: 4782 // constructor and reset functions 4783 _LIBCPP_INLINE_VISIBILITY 4784 explicit weibull_distribution(result_type __a = 1, result_type __b = 1) 4785 : __p_(param_type(__a, __b)) {} 4786 _LIBCPP_INLINE_VISIBILITY 4787 explicit weibull_distribution(const param_type& __p) 4788 : __p_(__p) {} 4789 _LIBCPP_INLINE_VISIBILITY 4790 void reset() {} 4791 4792 // generating functions 4793 template<class _URNG> 4794 _LIBCPP_INLINE_VISIBILITY 4795 result_type operator()(_URNG& __g) 4796 {return (*this)(__g, __p_);} 4797 template<class _URNG> 4798 _LIBCPP_INLINE_VISIBILITY 4799 result_type operator()(_URNG& __g, const param_type& __p) 4800 {return __p.b() * 4801 _VSTD::pow(exponential_distribution<result_type>()(__g), 1/__p.a());} 4802 4803 // property functions 4804 _LIBCPP_INLINE_VISIBILITY 4805 result_type a() const {return __p_.a();} 4806 _LIBCPP_INLINE_VISIBILITY 4807 result_type b() const {return __p_.b();} 4808 4809 _LIBCPP_INLINE_VISIBILITY 4810 param_type param() const {return __p_;} 4811 _LIBCPP_INLINE_VISIBILITY 4812 void param(const param_type& __p) {__p_ = __p;} 4813 4814 _LIBCPP_INLINE_VISIBILITY 4815 result_type min() const {return 0;} 4816 _LIBCPP_INLINE_VISIBILITY 4817 result_type max() const {return numeric_limits<result_type>::infinity();} 4818 4819 friend _LIBCPP_INLINE_VISIBILITY 4820 bool operator==(const weibull_distribution& __x, 4821 const weibull_distribution& __y) 4822 {return __x.__p_ == __y.__p_;} 4823 friend _LIBCPP_INLINE_VISIBILITY 4824 bool operator!=(const weibull_distribution& __x, 4825 const weibull_distribution& __y) 4826 {return !(__x == __y);} 4827 }; 4828 4829 template <class _CharT, class _Traits, class _RT> 4830 basic_ostream<_CharT, _Traits>& 4831 operator<<(basic_ostream<_CharT, _Traits>& __os, 4832 const weibull_distribution<_RT>& __x) 4833 { 4834 __save_flags<_CharT, _Traits> __lx(__os); 4835 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4836 ios_base::scientific); 4837 _CharT __sp = __os.widen(' '); 4838 __os.fill(__sp); 4839 __os << __x.a() << __sp << __x.b(); 4840 return __os; 4841 } 4842 4843 template <class _CharT, class _Traits, class _RT> 4844 basic_istream<_CharT, _Traits>& 4845 operator>>(basic_istream<_CharT, _Traits>& __is, 4846 weibull_distribution<_RT>& __x) 4847 { 4848 typedef weibull_distribution<_RT> _Eng; 4849 typedef typename _Eng::result_type result_type; 4850 typedef typename _Eng::param_type param_type; 4851 __save_flags<_CharT, _Traits> __lx(__is); 4852 __is.flags(ios_base::dec | ios_base::skipws); 4853 result_type __a; 4854 result_type __b; 4855 __is >> __a >> __b; 4856 if (!__is.fail()) 4857 __x.param(param_type(__a, __b)); 4858 return __is; 4859 } 4860 4861 template<class _RealType = double> 4862 class _LIBCPP_VISIBLE extreme_value_distribution 4863 { 4864 public: 4865 // types 4866 typedef _RealType result_type; 4867 4868 class _LIBCPP_VISIBLE param_type 4869 { 4870 result_type __a_; 4871 result_type __b_; 4872 public: 4873 typedef extreme_value_distribution distribution_type; 4874 4875 _LIBCPP_INLINE_VISIBILITY 4876 explicit param_type(result_type __a = 0, result_type __b = 1) 4877 : __a_(__a), __b_(__b) {} 4878 4879 _LIBCPP_INLINE_VISIBILITY 4880 result_type a() const {return __a_;} 4881 _LIBCPP_INLINE_VISIBILITY 4882 result_type b() const {return __b_;} 4883 4884 friend _LIBCPP_INLINE_VISIBILITY 4885 bool operator==(const param_type& __x, const param_type& __y) 4886 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} 4887 friend _LIBCPP_INLINE_VISIBILITY 4888 bool operator!=(const param_type& __x, const param_type& __y) 4889 {return !(__x == __y);} 4890 }; 4891 4892 private: 4893 param_type __p_; 4894 4895 public: 4896 // constructor and reset functions 4897 _LIBCPP_INLINE_VISIBILITY 4898 explicit extreme_value_distribution(result_type __a = 0, result_type __b = 1) 4899 : __p_(param_type(__a, __b)) {} 4900 _LIBCPP_INLINE_VISIBILITY 4901 explicit extreme_value_distribution(const param_type& __p) 4902 : __p_(__p) {} 4903 _LIBCPP_INLINE_VISIBILITY 4904 void reset() {} 4905 4906 // generating functions 4907 template<class _URNG> 4908 _LIBCPP_INLINE_VISIBILITY 4909 result_type operator()(_URNG& __g) 4910 {return (*this)(__g, __p_);} 4911 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 4912 4913 // property functions 4914 _LIBCPP_INLINE_VISIBILITY 4915 result_type a() const {return __p_.a();} 4916 _LIBCPP_INLINE_VISIBILITY 4917 result_type b() const {return __p_.b();} 4918 4919 _LIBCPP_INLINE_VISIBILITY 4920 param_type param() const {return __p_;} 4921 _LIBCPP_INLINE_VISIBILITY 4922 void param(const param_type& __p) {__p_ = __p;} 4923 4924 _LIBCPP_INLINE_VISIBILITY 4925 result_type min() const {return -numeric_limits<result_type>::infinity();} 4926 _LIBCPP_INLINE_VISIBILITY 4927 result_type max() const {return numeric_limits<result_type>::infinity();} 4928 4929 friend _LIBCPP_INLINE_VISIBILITY 4930 bool operator==(const extreme_value_distribution& __x, 4931 const extreme_value_distribution& __y) 4932 {return __x.__p_ == __y.__p_;} 4933 friend _LIBCPP_INLINE_VISIBILITY 4934 bool operator!=(const extreme_value_distribution& __x, 4935 const extreme_value_distribution& __y) 4936 {return !(__x == __y);} 4937 }; 4938 4939 template<class _RealType> 4940 template<class _URNG> 4941 _RealType 4942 extreme_value_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 4943 { 4944 return __p.a() - __p.b() * 4945 _VSTD::log(-_VSTD::log(1-uniform_real_distribution<result_type>()(__g))); 4946 } 4947 4948 template <class _CharT, class _Traits, class _RT> 4949 basic_ostream<_CharT, _Traits>& 4950 operator<<(basic_ostream<_CharT, _Traits>& __os, 4951 const extreme_value_distribution<_RT>& __x) 4952 { 4953 __save_flags<_CharT, _Traits> __lx(__os); 4954 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 4955 ios_base::scientific); 4956 _CharT __sp = __os.widen(' '); 4957 __os.fill(__sp); 4958 __os << __x.a() << __sp << __x.b(); 4959 return __os; 4960 } 4961 4962 template <class _CharT, class _Traits, class _RT> 4963 basic_istream<_CharT, _Traits>& 4964 operator>>(basic_istream<_CharT, _Traits>& __is, 4965 extreme_value_distribution<_RT>& __x) 4966 { 4967 typedef extreme_value_distribution<_RT> _Eng; 4968 typedef typename _Eng::result_type result_type; 4969 typedef typename _Eng::param_type param_type; 4970 __save_flags<_CharT, _Traits> __lx(__is); 4971 __is.flags(ios_base::dec | ios_base::skipws); 4972 result_type __a; 4973 result_type __b; 4974 __is >> __a >> __b; 4975 if (!__is.fail()) 4976 __x.param(param_type(__a, __b)); 4977 return __is; 4978 } 4979 4980 // gamma_distribution 4981 4982 template<class _RealType = double> 4983 class _LIBCPP_VISIBLE gamma_distribution 4984 { 4985 public: 4986 // types 4987 typedef _RealType result_type; 4988 4989 class _LIBCPP_VISIBLE param_type 4990 { 4991 result_type __alpha_; 4992 result_type __beta_; 4993 public: 4994 typedef gamma_distribution distribution_type; 4995 4996 _LIBCPP_INLINE_VISIBILITY 4997 explicit param_type(result_type __alpha = 1, result_type __beta = 1) 4998 : __alpha_(__alpha), __beta_(__beta) {} 4999 5000 _LIBCPP_INLINE_VISIBILITY 5001 result_type alpha() const {return __alpha_;} 5002 _LIBCPP_INLINE_VISIBILITY 5003 result_type beta() const {return __beta_;} 5004 5005 friend _LIBCPP_INLINE_VISIBILITY 5006 bool operator==(const param_type& __x, const param_type& __y) 5007 {return __x.__alpha_ == __y.__alpha_ && __x.__beta_ == __y.__beta_;} 5008 friend _LIBCPP_INLINE_VISIBILITY 5009 bool operator!=(const param_type& __x, const param_type& __y) 5010 {return !(__x == __y);} 5011 }; 5012 5013 private: 5014 param_type __p_; 5015 5016 public: 5017 // constructors and reset functions 5018 _LIBCPP_INLINE_VISIBILITY 5019 explicit gamma_distribution(result_type __alpha = 1, result_type __beta = 1) 5020 : __p_(param_type(__alpha, __beta)) {} 5021 _LIBCPP_INLINE_VISIBILITY 5022 explicit gamma_distribution(const param_type& __p) 5023 : __p_(__p) {} 5024 _LIBCPP_INLINE_VISIBILITY 5025 void reset() {} 5026 5027 // generating functions 5028 template<class _URNG> 5029 _LIBCPP_INLINE_VISIBILITY 5030 result_type operator()(_URNG& __g) 5031 {return (*this)(__g, __p_);} 5032 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 5033 5034 // property functions 5035 _LIBCPP_INLINE_VISIBILITY 5036 result_type alpha() const {return __p_.alpha();} 5037 _LIBCPP_INLINE_VISIBILITY 5038 result_type beta() const {return __p_.beta();} 5039 5040 _LIBCPP_INLINE_VISIBILITY 5041 param_type param() const {return __p_;} 5042 _LIBCPP_INLINE_VISIBILITY 5043 void param(const param_type& __p) {__p_ = __p;} 5044 5045 _LIBCPP_INLINE_VISIBILITY 5046 result_type min() const {return 0;} 5047 _LIBCPP_INLINE_VISIBILITY 5048 result_type max() const {return numeric_limits<result_type>::infinity();} 5049 5050 friend _LIBCPP_INLINE_VISIBILITY 5051 bool operator==(const gamma_distribution& __x, 5052 const gamma_distribution& __y) 5053 {return __x.__p_ == __y.__p_;} 5054 friend _LIBCPP_INLINE_VISIBILITY 5055 bool operator!=(const gamma_distribution& __x, 5056 const gamma_distribution& __y) 5057 {return !(__x == __y);} 5058 }; 5059 5060 template <class _RealType> 5061 template<class _URNG> 5062 _RealType 5063 gamma_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 5064 { 5065 result_type __a = __p.alpha(); 5066 uniform_real_distribution<result_type> __gen(0, 1); 5067 exponential_distribution<result_type> __egen; 5068 result_type __x; 5069 if (__a == 1) 5070 __x = __egen(__g); 5071 else if (__a > 1) 5072 { 5073 const result_type __b = __a - 1; 5074 const result_type __c = 3 * __a - result_type(0.75); 5075 while (true) 5076 { 5077 const result_type __u = __gen(__g); 5078 const result_type __v = __gen(__g); 5079 const result_type __w = __u * (1 - __u); 5080 if (__w != 0) 5081 { 5082 const result_type __y = _VSTD::sqrt(__c / __w) * 5083 (__u - result_type(0.5)); 5084 __x = __b + __y; 5085 if (__x >= 0) 5086 { 5087 const result_type __z = 64 * __w * __w * __w * __v * __v; 5088 if (__z <= 1 - 2 * __y * __y / __x) 5089 break; 5090 if (_VSTD::log(__z) <= 2 * (__b * _VSTD::log(__x / __b) - __y)) 5091 break; 5092 } 5093 } 5094 } 5095 } 5096 else // __a < 1 5097 { 5098 while (true) 5099 { 5100 const result_type __u = __gen(__g); 5101 const result_type __es = __egen(__g); 5102 if (__u <= 1 - __a) 5103 { 5104 __x = _VSTD::pow(__u, 1 / __a); 5105 if (__x <= __es) 5106 break; 5107 } 5108 else 5109 { 5110 const result_type __e = -_VSTD::log((1-__u)/__a); 5111 __x = _VSTD::pow(1 - __a + __a * __e, 1 / __a); 5112 if (__x <= __e + __es) 5113 break; 5114 } 5115 } 5116 } 5117 return __x * __p.beta(); 5118 } 5119 5120 template <class _CharT, class _Traits, class _RT> 5121 basic_ostream<_CharT, _Traits>& 5122 operator<<(basic_ostream<_CharT, _Traits>& __os, 5123 const gamma_distribution<_RT>& __x) 5124 { 5125 __save_flags<_CharT, _Traits> __lx(__os); 5126 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5127 ios_base::scientific); 5128 _CharT __sp = __os.widen(' '); 5129 __os.fill(__sp); 5130 __os << __x.alpha() << __sp << __x.beta(); 5131 return __os; 5132 } 5133 5134 template <class _CharT, class _Traits, class _RT> 5135 basic_istream<_CharT, _Traits>& 5136 operator>>(basic_istream<_CharT, _Traits>& __is, 5137 gamma_distribution<_RT>& __x) 5138 { 5139 typedef gamma_distribution<_RT> _Eng; 5140 typedef typename _Eng::result_type result_type; 5141 typedef typename _Eng::param_type param_type; 5142 __save_flags<_CharT, _Traits> __lx(__is); 5143 __is.flags(ios_base::dec | ios_base::skipws); 5144 result_type __alpha; 5145 result_type __beta; 5146 __is >> __alpha >> __beta; 5147 if (!__is.fail()) 5148 __x.param(param_type(__alpha, __beta)); 5149 return __is; 5150 } 5151 5152 // negative_binomial_distribution 5153 5154 template<class _IntType = int> 5155 class _LIBCPP_VISIBLE negative_binomial_distribution 5156 { 5157 public: 5158 // types 5159 typedef _IntType result_type; 5160 5161 class _LIBCPP_VISIBLE param_type 5162 { 5163 result_type __k_; 5164 double __p_; 5165 public: 5166 typedef negative_binomial_distribution distribution_type; 5167 5168 _LIBCPP_INLINE_VISIBILITY 5169 explicit param_type(result_type __k = 1, double __p = 0.5) 5170 : __k_(__k), __p_(__p) {} 5171 5172 _LIBCPP_INLINE_VISIBILITY 5173 result_type k() const {return __k_;} 5174 _LIBCPP_INLINE_VISIBILITY 5175 double p() const {return __p_;} 5176 5177 friend _LIBCPP_INLINE_VISIBILITY 5178 bool operator==(const param_type& __x, const param_type& __y) 5179 {return __x.__k_ == __y.__k_ && __x.__p_ == __y.__p_;} 5180 friend _LIBCPP_INLINE_VISIBILITY 5181 bool operator!=(const param_type& __x, const param_type& __y) 5182 {return !(__x == __y);} 5183 }; 5184 5185 private: 5186 param_type __p_; 5187 5188 public: 5189 // constructor and reset functions 5190 _LIBCPP_INLINE_VISIBILITY 5191 explicit negative_binomial_distribution(result_type __k = 1, double __p = 0.5) 5192 : __p_(__k, __p) {} 5193 _LIBCPP_INLINE_VISIBILITY 5194 explicit negative_binomial_distribution(const param_type& __p) : __p_(__p) {} 5195 _LIBCPP_INLINE_VISIBILITY 5196 void reset() {} 5197 5198 // generating functions 5199 template<class _URNG> 5200 _LIBCPP_INLINE_VISIBILITY 5201 result_type operator()(_URNG& __g) 5202 {return (*this)(__g, __p_);} 5203 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 5204 5205 // property functions 5206 _LIBCPP_INLINE_VISIBILITY 5207 result_type k() const {return __p_.k();} 5208 _LIBCPP_INLINE_VISIBILITY 5209 double p() const {return __p_.p();} 5210 5211 _LIBCPP_INLINE_VISIBILITY 5212 param_type param() const {return __p_;} 5213 _LIBCPP_INLINE_VISIBILITY 5214 void param(const param_type& __p) {__p_ = __p;} 5215 5216 _LIBCPP_INLINE_VISIBILITY 5217 result_type min() const {return 0;} 5218 _LIBCPP_INLINE_VISIBILITY 5219 result_type max() const {return numeric_limits<result_type>::max();} 5220 5221 friend _LIBCPP_INLINE_VISIBILITY 5222 bool operator==(const negative_binomial_distribution& __x, 5223 const negative_binomial_distribution& __y) 5224 {return __x.__p_ == __y.__p_;} 5225 friend _LIBCPP_INLINE_VISIBILITY 5226 bool operator!=(const negative_binomial_distribution& __x, 5227 const negative_binomial_distribution& __y) 5228 {return !(__x == __y);} 5229 }; 5230 5231 template <class _IntType> 5232 template<class _URNG> 5233 _IntType 5234 negative_binomial_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr) 5235 { 5236 result_type __k = __pr.k(); 5237 double __p = __pr.p(); 5238 if (__k <= 21 * __p) 5239 { 5240 bernoulli_distribution __gen(__p); 5241 result_type __f = 0; 5242 result_type __s = 0; 5243 while (__s < __k) 5244 { 5245 if (__gen(__urng)) 5246 ++__s; 5247 else 5248 ++__f; 5249 } 5250 return __f; 5251 } 5252 return poisson_distribution<result_type>(gamma_distribution<double> 5253 (__k, (1-__p)/__p)(__urng))(__urng); 5254 } 5255 5256 template <class _CharT, class _Traits, class _IntType> 5257 basic_ostream<_CharT, _Traits>& 5258 operator<<(basic_ostream<_CharT, _Traits>& __os, 5259 const negative_binomial_distribution<_IntType>& __x) 5260 { 5261 __save_flags<_CharT, _Traits> __lx(__os); 5262 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5263 ios_base::scientific); 5264 _CharT __sp = __os.widen(' '); 5265 __os.fill(__sp); 5266 return __os << __x.k() << __sp << __x.p(); 5267 } 5268 5269 template <class _CharT, class _Traits, class _IntType> 5270 basic_istream<_CharT, _Traits>& 5271 operator>>(basic_istream<_CharT, _Traits>& __is, 5272 negative_binomial_distribution<_IntType>& __x) 5273 { 5274 typedef negative_binomial_distribution<_IntType> _Eng; 5275 typedef typename _Eng::result_type result_type; 5276 typedef typename _Eng::param_type param_type; 5277 __save_flags<_CharT, _Traits> __lx(__is); 5278 __is.flags(ios_base::dec | ios_base::skipws); 5279 result_type __k; 5280 double __p; 5281 __is >> __k >> __p; 5282 if (!__is.fail()) 5283 __x.param(param_type(__k, __p)); 5284 return __is; 5285 } 5286 5287 // geometric_distribution 5288 5289 template<class _IntType = int> 5290 class _LIBCPP_VISIBLE geometric_distribution 5291 { 5292 public: 5293 // types 5294 typedef _IntType result_type; 5295 5296 class _LIBCPP_VISIBLE param_type 5297 { 5298 double __p_; 5299 public: 5300 typedef geometric_distribution distribution_type; 5301 5302 _LIBCPP_INLINE_VISIBILITY 5303 explicit param_type(double __p = 0.5) : __p_(__p) {} 5304 5305 _LIBCPP_INLINE_VISIBILITY 5306 double p() const {return __p_;} 5307 5308 friend _LIBCPP_INLINE_VISIBILITY 5309 bool operator==(const param_type& __x, const param_type& __y) 5310 {return __x.__p_ == __y.__p_;} 5311 friend _LIBCPP_INLINE_VISIBILITY 5312 bool operator!=(const param_type& __x, const param_type& __y) 5313 {return !(__x == __y);} 5314 }; 5315 5316 private: 5317 param_type __p_; 5318 5319 public: 5320 // constructors and reset functions 5321 _LIBCPP_INLINE_VISIBILITY 5322 explicit geometric_distribution(double __p = 0.5) : __p_(__p) {} 5323 _LIBCPP_INLINE_VISIBILITY 5324 explicit geometric_distribution(const param_type& __p) : __p_(__p) {} 5325 _LIBCPP_INLINE_VISIBILITY 5326 void reset() {} 5327 5328 // generating functions 5329 template<class _URNG> 5330 _LIBCPP_INLINE_VISIBILITY 5331 result_type operator()(_URNG& __g) 5332 {return (*this)(__g, __p_);} 5333 template<class _URNG> 5334 _LIBCPP_INLINE_VISIBILITY 5335 result_type operator()(_URNG& __g, const param_type& __p) 5336 {return negative_binomial_distribution<result_type>(1, __p.p())(__g);} 5337 5338 // property functions 5339 _LIBCPP_INLINE_VISIBILITY 5340 double p() const {return __p_.p();} 5341 5342 _LIBCPP_INLINE_VISIBILITY 5343 param_type param() const {return __p_;} 5344 _LIBCPP_INLINE_VISIBILITY 5345 void param(const param_type& __p) {__p_ = __p;} 5346 5347 _LIBCPP_INLINE_VISIBILITY 5348 result_type min() const {return 0;} 5349 _LIBCPP_INLINE_VISIBILITY 5350 result_type max() const {return numeric_limits<result_type>::max();} 5351 5352 friend _LIBCPP_INLINE_VISIBILITY 5353 bool operator==(const geometric_distribution& __x, 5354 const geometric_distribution& __y) 5355 {return __x.__p_ == __y.__p_;} 5356 friend _LIBCPP_INLINE_VISIBILITY 5357 bool operator!=(const geometric_distribution& __x, 5358 const geometric_distribution& __y) 5359 {return !(__x == __y);} 5360 }; 5361 5362 template <class _CharT, class _Traits, class _IntType> 5363 basic_ostream<_CharT, _Traits>& 5364 operator<<(basic_ostream<_CharT, _Traits>& __os, 5365 const geometric_distribution<_IntType>& __x) 5366 { 5367 __save_flags<_CharT, _Traits> __lx(__os); 5368 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5369 ios_base::scientific); 5370 return __os << __x.p(); 5371 } 5372 5373 template <class _CharT, class _Traits, class _IntType> 5374 basic_istream<_CharT, _Traits>& 5375 operator>>(basic_istream<_CharT, _Traits>& __is, 5376 geometric_distribution<_IntType>& __x) 5377 { 5378 typedef geometric_distribution<_IntType> _Eng; 5379 typedef typename _Eng::param_type param_type; 5380 __save_flags<_CharT, _Traits> __lx(__is); 5381 __is.flags(ios_base::dec | ios_base::skipws); 5382 double __p; 5383 __is >> __p; 5384 if (!__is.fail()) 5385 __x.param(param_type(__p)); 5386 return __is; 5387 } 5388 5389 // chi_squared_distribution 5390 5391 template<class _RealType = double> 5392 class _LIBCPP_VISIBLE chi_squared_distribution 5393 { 5394 public: 5395 // types 5396 typedef _RealType result_type; 5397 5398 class _LIBCPP_VISIBLE param_type 5399 { 5400 result_type __n_; 5401 public: 5402 typedef chi_squared_distribution distribution_type; 5403 5404 _LIBCPP_INLINE_VISIBILITY 5405 explicit param_type(result_type __n = 1) : __n_(__n) {} 5406 5407 _LIBCPP_INLINE_VISIBILITY 5408 result_type n() const {return __n_;} 5409 5410 friend _LIBCPP_INLINE_VISIBILITY 5411 bool operator==(const param_type& __x, const param_type& __y) 5412 {return __x.__n_ == __y.__n_;} 5413 friend _LIBCPP_INLINE_VISIBILITY 5414 bool operator!=(const param_type& __x, const param_type& __y) 5415 {return !(__x == __y);} 5416 }; 5417 5418 private: 5419 param_type __p_; 5420 5421 public: 5422 // constructor and reset functions 5423 _LIBCPP_INLINE_VISIBILITY 5424 explicit chi_squared_distribution(result_type __n = 1) 5425 : __p_(param_type(__n)) {} 5426 _LIBCPP_INLINE_VISIBILITY 5427 explicit chi_squared_distribution(const param_type& __p) 5428 : __p_(__p) {} 5429 _LIBCPP_INLINE_VISIBILITY 5430 void reset() {} 5431 5432 // generating functions 5433 template<class _URNG> 5434 _LIBCPP_INLINE_VISIBILITY 5435 result_type operator()(_URNG& __g) 5436 {return (*this)(__g, __p_);} 5437 template<class _URNG> 5438 _LIBCPP_INLINE_VISIBILITY 5439 result_type operator()(_URNG& __g, const param_type& __p) 5440 {return gamma_distribution<result_type>(__p.n() / 2, 2)(__g);} 5441 5442 // property functions 5443 _LIBCPP_INLINE_VISIBILITY 5444 result_type n() const {return __p_.n();} 5445 5446 _LIBCPP_INLINE_VISIBILITY 5447 param_type param() const {return __p_;} 5448 _LIBCPP_INLINE_VISIBILITY 5449 void param(const param_type& __p) {__p_ = __p;} 5450 5451 _LIBCPP_INLINE_VISIBILITY 5452 result_type min() const {return 0;} 5453 _LIBCPP_INLINE_VISIBILITY 5454 result_type max() const {return numeric_limits<result_type>::infinity();} 5455 5456 friend _LIBCPP_INLINE_VISIBILITY 5457 bool operator==(const chi_squared_distribution& __x, 5458 const chi_squared_distribution& __y) 5459 {return __x.__p_ == __y.__p_;} 5460 friend _LIBCPP_INLINE_VISIBILITY 5461 bool operator!=(const chi_squared_distribution& __x, 5462 const chi_squared_distribution& __y) 5463 {return !(__x == __y);} 5464 }; 5465 5466 template <class _CharT, class _Traits, class _RT> 5467 basic_ostream<_CharT, _Traits>& 5468 operator<<(basic_ostream<_CharT, _Traits>& __os, 5469 const chi_squared_distribution<_RT>& __x) 5470 { 5471 __save_flags<_CharT, _Traits> __lx(__os); 5472 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5473 ios_base::scientific); 5474 __os << __x.n(); 5475 return __os; 5476 } 5477 5478 template <class _CharT, class _Traits, class _RT> 5479 basic_istream<_CharT, _Traits>& 5480 operator>>(basic_istream<_CharT, _Traits>& __is, 5481 chi_squared_distribution<_RT>& __x) 5482 { 5483 typedef chi_squared_distribution<_RT> _Eng; 5484 typedef typename _Eng::result_type result_type; 5485 typedef typename _Eng::param_type param_type; 5486 __save_flags<_CharT, _Traits> __lx(__is); 5487 __is.flags(ios_base::dec | ios_base::skipws); 5488 result_type __n; 5489 __is >> __n; 5490 if (!__is.fail()) 5491 __x.param(param_type(__n)); 5492 return __is; 5493 } 5494 5495 // cauchy_distribution 5496 5497 template<class _RealType = double> 5498 class _LIBCPP_VISIBLE cauchy_distribution 5499 { 5500 public: 5501 // types 5502 typedef _RealType result_type; 5503 5504 class _LIBCPP_VISIBLE param_type 5505 { 5506 result_type __a_; 5507 result_type __b_; 5508 public: 5509 typedef cauchy_distribution distribution_type; 5510 5511 _LIBCPP_INLINE_VISIBILITY 5512 explicit param_type(result_type __a = 0, result_type __b = 1) 5513 : __a_(__a), __b_(__b) {} 5514 5515 _LIBCPP_INLINE_VISIBILITY 5516 result_type a() const {return __a_;} 5517 _LIBCPP_INLINE_VISIBILITY 5518 result_type b() const {return __b_;} 5519 5520 friend _LIBCPP_INLINE_VISIBILITY 5521 bool operator==(const param_type& __x, const param_type& __y) 5522 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} 5523 friend _LIBCPP_INLINE_VISIBILITY 5524 bool operator!=(const param_type& __x, const param_type& __y) 5525 {return !(__x == __y);} 5526 }; 5527 5528 private: 5529 param_type __p_; 5530 5531 public: 5532 // constructor and reset functions 5533 _LIBCPP_INLINE_VISIBILITY 5534 explicit cauchy_distribution(result_type __a = 0, result_type __b = 1) 5535 : __p_(param_type(__a, __b)) {} 5536 _LIBCPP_INLINE_VISIBILITY 5537 explicit cauchy_distribution(const param_type& __p) 5538 : __p_(__p) {} 5539 _LIBCPP_INLINE_VISIBILITY 5540 void reset() {} 5541 5542 // generating functions 5543 template<class _URNG> 5544 _LIBCPP_INLINE_VISIBILITY 5545 result_type operator()(_URNG& __g) 5546 {return (*this)(__g, __p_);} 5547 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 5548 5549 // property functions 5550 _LIBCPP_INLINE_VISIBILITY 5551 result_type a() const {return __p_.a();} 5552 _LIBCPP_INLINE_VISIBILITY 5553 result_type b() const {return __p_.b();} 5554 5555 _LIBCPP_INLINE_VISIBILITY 5556 param_type param() const {return __p_;} 5557 _LIBCPP_INLINE_VISIBILITY 5558 void param(const param_type& __p) {__p_ = __p;} 5559 5560 _LIBCPP_INLINE_VISIBILITY 5561 result_type min() const {return -numeric_limits<result_type>::infinity();} 5562 _LIBCPP_INLINE_VISIBILITY 5563 result_type max() const {return numeric_limits<result_type>::infinity();} 5564 5565 friend _LIBCPP_INLINE_VISIBILITY 5566 bool operator==(const cauchy_distribution& __x, 5567 const cauchy_distribution& __y) 5568 {return __x.__p_ == __y.__p_;} 5569 friend _LIBCPP_INLINE_VISIBILITY 5570 bool operator!=(const cauchy_distribution& __x, 5571 const cauchy_distribution& __y) 5572 {return !(__x == __y);} 5573 }; 5574 5575 template <class _RealType> 5576 template<class _URNG> 5577 inline _LIBCPP_INLINE_VISIBILITY 5578 _RealType 5579 cauchy_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 5580 { 5581 uniform_real_distribution<result_type> __gen; 5582 // purposefully let tan arg get as close to pi/2 as it wants, tan will return a finite 5583 return __p.a() + __p.b() * _VSTD::tan(3.1415926535897932384626433832795 * __gen(__g)); 5584 } 5585 5586 template <class _CharT, class _Traits, class _RT> 5587 basic_ostream<_CharT, _Traits>& 5588 operator<<(basic_ostream<_CharT, _Traits>& __os, 5589 const cauchy_distribution<_RT>& __x) 5590 { 5591 __save_flags<_CharT, _Traits> __lx(__os); 5592 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5593 ios_base::scientific); 5594 _CharT __sp = __os.widen(' '); 5595 __os.fill(__sp); 5596 __os << __x.a() << __sp << __x.b(); 5597 return __os; 5598 } 5599 5600 template <class _CharT, class _Traits, class _RT> 5601 basic_istream<_CharT, _Traits>& 5602 operator>>(basic_istream<_CharT, _Traits>& __is, 5603 cauchy_distribution<_RT>& __x) 5604 { 5605 typedef cauchy_distribution<_RT> _Eng; 5606 typedef typename _Eng::result_type result_type; 5607 typedef typename _Eng::param_type param_type; 5608 __save_flags<_CharT, _Traits> __lx(__is); 5609 __is.flags(ios_base::dec | ios_base::skipws); 5610 result_type __a; 5611 result_type __b; 5612 __is >> __a >> __b; 5613 if (!__is.fail()) 5614 __x.param(param_type(__a, __b)); 5615 return __is; 5616 } 5617 5618 // fisher_f_distribution 5619 5620 template<class _RealType = double> 5621 class _LIBCPP_VISIBLE fisher_f_distribution 5622 { 5623 public: 5624 // types 5625 typedef _RealType result_type; 5626 5627 class _LIBCPP_VISIBLE param_type 5628 { 5629 result_type __m_; 5630 result_type __n_; 5631 public: 5632 typedef fisher_f_distribution distribution_type; 5633 5634 _LIBCPP_INLINE_VISIBILITY 5635 explicit param_type(result_type __m = 1, result_type __n = 1) 5636 : __m_(__m), __n_(__n) {} 5637 5638 _LIBCPP_INLINE_VISIBILITY 5639 result_type m() const {return __m_;} 5640 _LIBCPP_INLINE_VISIBILITY 5641 result_type n() const {return __n_;} 5642 5643 friend _LIBCPP_INLINE_VISIBILITY 5644 bool operator==(const param_type& __x, const param_type& __y) 5645 {return __x.__m_ == __y.__m_ && __x.__n_ == __y.__n_;} 5646 friend _LIBCPP_INLINE_VISIBILITY 5647 bool operator!=(const param_type& __x, const param_type& __y) 5648 {return !(__x == __y);} 5649 }; 5650 5651 private: 5652 param_type __p_; 5653 5654 public: 5655 // constructor and reset functions 5656 _LIBCPP_INLINE_VISIBILITY 5657 explicit fisher_f_distribution(result_type __m = 1, result_type __n = 1) 5658 : __p_(param_type(__m, __n)) {} 5659 _LIBCPP_INLINE_VISIBILITY 5660 explicit fisher_f_distribution(const param_type& __p) 5661 : __p_(__p) {} 5662 _LIBCPP_INLINE_VISIBILITY 5663 void reset() {} 5664 5665 // generating functions 5666 template<class _URNG> 5667 _LIBCPP_INLINE_VISIBILITY 5668 result_type operator()(_URNG& __g) 5669 {return (*this)(__g, __p_);} 5670 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 5671 5672 // property functions 5673 _LIBCPP_INLINE_VISIBILITY 5674 result_type m() const {return __p_.m();} 5675 _LIBCPP_INLINE_VISIBILITY 5676 result_type n() const {return __p_.n();} 5677 5678 _LIBCPP_INLINE_VISIBILITY 5679 param_type param() const {return __p_;} 5680 _LIBCPP_INLINE_VISIBILITY 5681 void param(const param_type& __p) {__p_ = __p;} 5682 5683 _LIBCPP_INLINE_VISIBILITY 5684 result_type min() const {return 0;} 5685 _LIBCPP_INLINE_VISIBILITY 5686 result_type max() const {return numeric_limits<result_type>::infinity();} 5687 5688 friend _LIBCPP_INLINE_VISIBILITY 5689 bool operator==(const fisher_f_distribution& __x, 5690 const fisher_f_distribution& __y) 5691 {return __x.__p_ == __y.__p_;} 5692 friend _LIBCPP_INLINE_VISIBILITY 5693 bool operator!=(const fisher_f_distribution& __x, 5694 const fisher_f_distribution& __y) 5695 {return !(__x == __y);} 5696 }; 5697 5698 template <class _RealType> 5699 template<class _URNG> 5700 _RealType 5701 fisher_f_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 5702 { 5703 gamma_distribution<result_type> __gdm(__p.m() * result_type(.5)); 5704 gamma_distribution<result_type> __gdn(__p.n() * result_type(.5)); 5705 return __p.n() * __gdm(__g) / (__p.m() * __gdn(__g)); 5706 } 5707 5708 template <class _CharT, class _Traits, class _RT> 5709 basic_ostream<_CharT, _Traits>& 5710 operator<<(basic_ostream<_CharT, _Traits>& __os, 5711 const fisher_f_distribution<_RT>& __x) 5712 { 5713 __save_flags<_CharT, _Traits> __lx(__os); 5714 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5715 ios_base::scientific); 5716 _CharT __sp = __os.widen(' '); 5717 __os.fill(__sp); 5718 __os << __x.m() << __sp << __x.n(); 5719 return __os; 5720 } 5721 5722 template <class _CharT, class _Traits, class _RT> 5723 basic_istream<_CharT, _Traits>& 5724 operator>>(basic_istream<_CharT, _Traits>& __is, 5725 fisher_f_distribution<_RT>& __x) 5726 { 5727 typedef fisher_f_distribution<_RT> _Eng; 5728 typedef typename _Eng::result_type result_type; 5729 typedef typename _Eng::param_type param_type; 5730 __save_flags<_CharT, _Traits> __lx(__is); 5731 __is.flags(ios_base::dec | ios_base::skipws); 5732 result_type __m; 5733 result_type __n; 5734 __is >> __m >> __n; 5735 if (!__is.fail()) 5736 __x.param(param_type(__m, __n)); 5737 return __is; 5738 } 5739 5740 // student_t_distribution 5741 5742 template<class _RealType = double> 5743 class _LIBCPP_VISIBLE student_t_distribution 5744 { 5745 public: 5746 // types 5747 typedef _RealType result_type; 5748 5749 class _LIBCPP_VISIBLE param_type 5750 { 5751 result_type __n_; 5752 public: 5753 typedef student_t_distribution distribution_type; 5754 5755 _LIBCPP_INLINE_VISIBILITY 5756 explicit param_type(result_type __n = 1) : __n_(__n) {} 5757 5758 _LIBCPP_INLINE_VISIBILITY 5759 result_type n() const {return __n_;} 5760 5761 friend _LIBCPP_INLINE_VISIBILITY 5762 bool operator==(const param_type& __x, const param_type& __y) 5763 {return __x.__n_ == __y.__n_;} 5764 friend _LIBCPP_INLINE_VISIBILITY 5765 bool operator!=(const param_type& __x, const param_type& __y) 5766 {return !(__x == __y);} 5767 }; 5768 5769 private: 5770 param_type __p_; 5771 normal_distribution<result_type> __nd_; 5772 5773 public: 5774 // constructor and reset functions 5775 _LIBCPP_INLINE_VISIBILITY 5776 explicit student_t_distribution(result_type __n = 1) 5777 : __p_(param_type(__n)) {} 5778 _LIBCPP_INLINE_VISIBILITY 5779 explicit student_t_distribution(const param_type& __p) 5780 : __p_(__p) {} 5781 _LIBCPP_INLINE_VISIBILITY 5782 void reset() {__nd_.reset();} 5783 5784 // generating functions 5785 template<class _URNG> 5786 _LIBCPP_INLINE_VISIBILITY 5787 result_type operator()(_URNG& __g) 5788 {return (*this)(__g, __p_);} 5789 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 5790 5791 // property functions 5792 _LIBCPP_INLINE_VISIBILITY 5793 result_type n() const {return __p_.n();} 5794 5795 _LIBCPP_INLINE_VISIBILITY 5796 param_type param() const {return __p_;} 5797 _LIBCPP_INLINE_VISIBILITY 5798 void param(const param_type& __p) {__p_ = __p;} 5799 5800 _LIBCPP_INLINE_VISIBILITY 5801 result_type min() const {return -numeric_limits<result_type>::infinity();} 5802 _LIBCPP_INLINE_VISIBILITY 5803 result_type max() const {return numeric_limits<result_type>::infinity();} 5804 5805 friend _LIBCPP_INLINE_VISIBILITY 5806 bool operator==(const student_t_distribution& __x, 5807 const student_t_distribution& __y) 5808 {return __x.__p_ == __y.__p_;} 5809 friend _LIBCPP_INLINE_VISIBILITY 5810 bool operator!=(const student_t_distribution& __x, 5811 const student_t_distribution& __y) 5812 {return !(__x == __y);} 5813 }; 5814 5815 template <class _RealType> 5816 template<class _URNG> 5817 _RealType 5818 student_t_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 5819 { 5820 gamma_distribution<result_type> __gd(__p.n() * .5, 2); 5821 return __nd_(__g) * _VSTD::sqrt(__p.n()/__gd(__g)); 5822 } 5823 5824 template <class _CharT, class _Traits, class _RT> 5825 basic_ostream<_CharT, _Traits>& 5826 operator<<(basic_ostream<_CharT, _Traits>& __os, 5827 const student_t_distribution<_RT>& __x) 5828 { 5829 __save_flags<_CharT, _Traits> __lx(__os); 5830 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 5831 ios_base::scientific); 5832 __os << __x.n(); 5833 return __os; 5834 } 5835 5836 template <class _CharT, class _Traits, class _RT> 5837 basic_istream<_CharT, _Traits>& 5838 operator>>(basic_istream<_CharT, _Traits>& __is, 5839 student_t_distribution<_RT>& __x) 5840 { 5841 typedef student_t_distribution<_RT> _Eng; 5842 typedef typename _Eng::result_type result_type; 5843 typedef typename _Eng::param_type param_type; 5844 __save_flags<_CharT, _Traits> __lx(__is); 5845 __is.flags(ios_base::dec | ios_base::skipws); 5846 result_type __n; 5847 __is >> __n; 5848 if (!__is.fail()) 5849 __x.param(param_type(__n)); 5850 return __is; 5851 } 5852 5853 // discrete_distribution 5854 5855 template<class _IntType = int> 5856 class _LIBCPP_VISIBLE discrete_distribution 5857 { 5858 public: 5859 // types 5860 typedef _IntType result_type; 5861 5862 class _LIBCPP_VISIBLE param_type 5863 { 5864 vector<double> __p_; 5865 public: 5866 typedef discrete_distribution distribution_type; 5867 5868 _LIBCPP_INLINE_VISIBILITY 5869 param_type() {} 5870 template<class _InputIterator> 5871 _LIBCPP_INLINE_VISIBILITY 5872 param_type(_InputIterator __f, _InputIterator __l) 5873 : __p_(__f, __l) {__init();} 5874 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 5875 _LIBCPP_INLINE_VISIBILITY 5876 param_type(initializer_list<double> __wl) 5877 : __p_(__wl.begin(), __wl.end()) {__init();} 5878 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 5879 template<class _UnaryOperation> 5880 param_type(size_t __nw, double __xmin, double __xmax, 5881 _UnaryOperation __fw); 5882 5883 vector<double> probabilities() const; 5884 5885 friend _LIBCPP_INLINE_VISIBILITY 5886 bool operator==(const param_type& __x, const param_type& __y) 5887 {return __x.__p_ == __y.__p_;} 5888 friend _LIBCPP_INLINE_VISIBILITY 5889 bool operator!=(const param_type& __x, const param_type& __y) 5890 {return !(__x == __y);} 5891 5892 private: 5893 void __init(); 5894 5895 friend class discrete_distribution; 5896 5897 template <class _CharT, class _Traits, class _IT> 5898 friend 5899 basic_ostream<_CharT, _Traits>& 5900 operator<<(basic_ostream<_CharT, _Traits>& __os, 5901 const discrete_distribution<_IT>& __x); 5902 5903 template <class _CharT, class _Traits, class _IT> 5904 friend 5905 basic_istream<_CharT, _Traits>& 5906 operator>>(basic_istream<_CharT, _Traits>& __is, 5907 discrete_distribution<_IT>& __x); 5908 }; 5909 5910 private: 5911 param_type __p_; 5912 5913 public: 5914 // constructor and reset functions 5915 _LIBCPP_INLINE_VISIBILITY 5916 discrete_distribution() {} 5917 template<class _InputIterator> 5918 _LIBCPP_INLINE_VISIBILITY 5919 discrete_distribution(_InputIterator __f, _InputIterator __l) 5920 : __p_(__f, __l) {} 5921 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 5922 _LIBCPP_INLINE_VISIBILITY 5923 discrete_distribution(initializer_list<double> __wl) 5924 : __p_(__wl) {} 5925 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 5926 template<class _UnaryOperation> 5927 _LIBCPP_INLINE_VISIBILITY 5928 discrete_distribution(size_t __nw, double __xmin, double __xmax, 5929 _UnaryOperation __fw) 5930 : __p_(__nw, __xmin, __xmax, __fw) {} 5931 explicit discrete_distribution(const param_type& __p) 5932 _LIBCPP_INLINE_VISIBILITY 5933 : __p_(__p) {} 5934 _LIBCPP_INLINE_VISIBILITY 5935 void reset() {} 5936 5937 // generating functions 5938 template<class _URNG> 5939 _LIBCPP_INLINE_VISIBILITY 5940 result_type operator()(_URNG& __g) 5941 {return (*this)(__g, __p_);} 5942 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 5943 5944 // property functions 5945 _LIBCPP_INLINE_VISIBILITY 5946 vector<double> probabilities() const {return __p_.probabilities();} 5947 5948 _LIBCPP_INLINE_VISIBILITY 5949 param_type param() const {return __p_;} 5950 _LIBCPP_INLINE_VISIBILITY 5951 void param(const param_type& __p) {__p_ = __p;} 5952 5953 _LIBCPP_INLINE_VISIBILITY 5954 result_type min() const {return 0;} 5955 _LIBCPP_INLINE_VISIBILITY 5956 result_type max() const {return __p_.__p_.size();} 5957 5958 friend _LIBCPP_INLINE_VISIBILITY 5959 bool operator==(const discrete_distribution& __x, 5960 const discrete_distribution& __y) 5961 {return __x.__p_ == __y.__p_;} 5962 friend _LIBCPP_INLINE_VISIBILITY 5963 bool operator!=(const discrete_distribution& __x, 5964 const discrete_distribution& __y) 5965 {return !(__x == __y);} 5966 5967 template <class _CharT, class _Traits, class _IT> 5968 friend 5969 basic_ostream<_CharT, _Traits>& 5970 operator<<(basic_ostream<_CharT, _Traits>& __os, 5971 const discrete_distribution<_IT>& __x); 5972 5973 template <class _CharT, class _Traits, class _IT> 5974 friend 5975 basic_istream<_CharT, _Traits>& 5976 operator>>(basic_istream<_CharT, _Traits>& __is, 5977 discrete_distribution<_IT>& __x); 5978 }; 5979 5980 template<class _IntType> 5981 template<class _UnaryOperation> 5982 discrete_distribution<_IntType>::param_type::param_type(size_t __nw, 5983 double __xmin, 5984 double __xmax, 5985 _UnaryOperation __fw) 5986 { 5987 if (__nw > 1) 5988 { 5989 __p_.reserve(__nw - 1); 5990 double __d = (__xmax - __xmin) / __nw; 5991 double __d2 = __d / 2; 5992 for (size_t __k = 0; __k < __nw; ++__k) 5993 __p_.push_back(__fw(__xmin + __k * __d + __d2)); 5994 __init(); 5995 } 5996 } 5997 5998 template<class _IntType> 5999 void 6000 discrete_distribution<_IntType>::param_type::__init() 6001 { 6002 if (!__p_.empty()) 6003 { 6004 if (__p_.size() > 1) 6005 { 6006 double __s = _VSTD::accumulate(__p_.begin(), __p_.end(), 0.0); 6007 for (_VSTD::vector<double>::iterator __i = __p_.begin(), __e = __p_.end(); 6008 __i < __e; ++__i) 6009 *__i /= __s; 6010 vector<double> __t(__p_.size() - 1); 6011 _VSTD::partial_sum(__p_.begin(), __p_.end() - 1, __t.begin()); 6012 swap(__p_, __t); 6013 } 6014 else 6015 { 6016 __p_.clear(); 6017 __p_.shrink_to_fit(); 6018 } 6019 } 6020 } 6021 6022 template<class _IntType> 6023 vector<double> 6024 discrete_distribution<_IntType>::param_type::probabilities() const 6025 { 6026 size_t __n = __p_.size(); 6027 _VSTD::vector<double> __p(__n+1); 6028 _VSTD::adjacent_difference(__p_.begin(), __p_.end(), __p.begin()); 6029 if (__n > 0) 6030 __p[__n] = 1 - __p_[__n-1]; 6031 else 6032 __p[0] = 1; 6033 return __p; 6034 } 6035 6036 template<class _IntType> 6037 template<class _URNG> 6038 _IntType 6039 discrete_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p) 6040 { 6041 uniform_real_distribution<double> __gen; 6042 return static_cast<_IntType>( 6043 _VSTD::upper_bound(__p.__p_.begin(), __p.__p_.end(), __gen(__g)) - 6044 __p.__p_.begin()); 6045 } 6046 6047 template <class _CharT, class _Traits, class _IT> 6048 basic_ostream<_CharT, _Traits>& 6049 operator<<(basic_ostream<_CharT, _Traits>& __os, 6050 const discrete_distribution<_IT>& __x) 6051 { 6052 __save_flags<_CharT, _Traits> __lx(__os); 6053 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 6054 ios_base::scientific); 6055 _CharT __sp = __os.widen(' '); 6056 __os.fill(__sp); 6057 size_t __n = __x.__p_.__p_.size(); 6058 __os << __n; 6059 for (size_t __i = 0; __i < __n; ++__i) 6060 __os << __sp << __x.__p_.__p_[__i]; 6061 return __os; 6062 } 6063 6064 template <class _CharT, class _Traits, class _IT> 6065 basic_istream<_CharT, _Traits>& 6066 operator>>(basic_istream<_CharT, _Traits>& __is, 6067 discrete_distribution<_IT>& __x) 6068 { 6069 typedef discrete_distribution<_IT> _Eng; 6070 typedef typename _Eng::result_type result_type; 6071 typedef typename _Eng::param_type param_type; 6072 __save_flags<_CharT, _Traits> __lx(__is); 6073 __is.flags(ios_base::dec | ios_base::skipws); 6074 size_t __n; 6075 __is >> __n; 6076 vector<double> __p(__n); 6077 for (size_t __i = 0; __i < __n; ++__i) 6078 __is >> __p[__i]; 6079 if (!__is.fail()) 6080 swap(__x.__p_.__p_, __p); 6081 return __is; 6082 } 6083 6084 // piecewise_constant_distribution 6085 6086 template<class _RealType = double> 6087 class _LIBCPP_VISIBLE piecewise_constant_distribution 6088 { 6089 public: 6090 // types 6091 typedef _RealType result_type; 6092 6093 class _LIBCPP_VISIBLE param_type 6094 { 6095 vector<result_type> __b_; 6096 vector<result_type> __densities_; 6097 vector<result_type> __areas_; 6098 public: 6099 typedef piecewise_constant_distribution distribution_type; 6100 6101 param_type(); 6102 template<class _InputIteratorB, class _InputIteratorW> 6103 param_type(_InputIteratorB __fB, _InputIteratorB __lB, 6104 _InputIteratorW __fW); 6105 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6106 template<class _UnaryOperation> 6107 param_type(initializer_list<result_type> __bl, _UnaryOperation __fw); 6108 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6109 template<class _UnaryOperation> 6110 param_type(size_t __nw, result_type __xmin, result_type __xmax, 6111 _UnaryOperation __fw); 6112 param_type & operator=(const param_type& __rhs); 6113 6114 _LIBCPP_INLINE_VISIBILITY 6115 vector<result_type> intervals() const {return __b_;} 6116 _LIBCPP_INLINE_VISIBILITY 6117 vector<result_type> densities() const {return __densities_;} 6118 6119 friend _LIBCPP_INLINE_VISIBILITY 6120 bool operator==(const param_type& __x, const param_type& __y) 6121 {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;} 6122 friend _LIBCPP_INLINE_VISIBILITY 6123 bool operator!=(const param_type& __x, const param_type& __y) 6124 {return !(__x == __y);} 6125 6126 private: 6127 void __init(); 6128 6129 friend class piecewise_constant_distribution; 6130 6131 template <class _CharT, class _Traits, class _RT> 6132 friend 6133 basic_ostream<_CharT, _Traits>& 6134 operator<<(basic_ostream<_CharT, _Traits>& __os, 6135 const piecewise_constant_distribution<_RT>& __x); 6136 6137 template <class _CharT, class _Traits, class _RT> 6138 friend 6139 basic_istream<_CharT, _Traits>& 6140 operator>>(basic_istream<_CharT, _Traits>& __is, 6141 piecewise_constant_distribution<_RT>& __x); 6142 }; 6143 6144 private: 6145 param_type __p_; 6146 6147 public: 6148 // constructor and reset functions 6149 _LIBCPP_INLINE_VISIBILITY 6150 piecewise_constant_distribution() {} 6151 template<class _InputIteratorB, class _InputIteratorW> 6152 _LIBCPP_INLINE_VISIBILITY 6153 piecewise_constant_distribution(_InputIteratorB __fB, 6154 _InputIteratorB __lB, 6155 _InputIteratorW __fW) 6156 : __p_(__fB, __lB, __fW) {} 6157 6158 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6159 template<class _UnaryOperation> 6160 _LIBCPP_INLINE_VISIBILITY 6161 piecewise_constant_distribution(initializer_list<result_type> __bl, 6162 _UnaryOperation __fw) 6163 : __p_(__bl, __fw) {} 6164 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6165 6166 template<class _UnaryOperation> 6167 _LIBCPP_INLINE_VISIBILITY 6168 piecewise_constant_distribution(size_t __nw, result_type __xmin, 6169 result_type __xmax, _UnaryOperation __fw) 6170 : __p_(__nw, __xmin, __xmax, __fw) {} 6171 6172 _LIBCPP_INLINE_VISIBILITY 6173 explicit piecewise_constant_distribution(const param_type& __p) 6174 : __p_(__p) {} 6175 6176 _LIBCPP_INLINE_VISIBILITY 6177 void reset() {} 6178 6179 // generating functions 6180 template<class _URNG> 6181 _LIBCPP_INLINE_VISIBILITY 6182 result_type operator()(_URNG& __g) 6183 {return (*this)(__g, __p_);} 6184 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 6185 6186 // property functions 6187 _LIBCPP_INLINE_VISIBILITY 6188 vector<result_type> intervals() const {return __p_.intervals();} 6189 _LIBCPP_INLINE_VISIBILITY 6190 vector<result_type> densities() const {return __p_.densities();} 6191 6192 _LIBCPP_INLINE_VISIBILITY 6193 param_type param() const {return __p_;} 6194 _LIBCPP_INLINE_VISIBILITY 6195 void param(const param_type& __p) {__p_ = __p;} 6196 6197 _LIBCPP_INLINE_VISIBILITY 6198 result_type min() const {return __p_.__b_.front();} 6199 _LIBCPP_INLINE_VISIBILITY 6200 result_type max() const {return __p_.__b_.back();} 6201 6202 friend _LIBCPP_INLINE_VISIBILITY 6203 bool operator==(const piecewise_constant_distribution& __x, 6204 const piecewise_constant_distribution& __y) 6205 {return __x.__p_ == __y.__p_;} 6206 friend _LIBCPP_INLINE_VISIBILITY 6207 bool operator!=(const piecewise_constant_distribution& __x, 6208 const piecewise_constant_distribution& __y) 6209 {return !(__x == __y);} 6210 6211 template <class _CharT, class _Traits, class _RT> 6212 friend 6213 basic_ostream<_CharT, _Traits>& 6214 operator<<(basic_ostream<_CharT, _Traits>& __os, 6215 const piecewise_constant_distribution<_RT>& __x); 6216 6217 template <class _CharT, class _Traits, class _RT> 6218 friend 6219 basic_istream<_CharT, _Traits>& 6220 operator>>(basic_istream<_CharT, _Traits>& __is, 6221 piecewise_constant_distribution<_RT>& __x); 6222 }; 6223 6224 template<class _RealType> 6225 typename piecewise_constant_distribution<_RealType>::param_type & 6226 piecewise_constant_distribution<_RealType>::param_type::operator= 6227 (const param_type& __rhs) 6228 { 6229 // These can throw 6230 __b_.reserve (__rhs.__b_.size ()); 6231 __densities_.reserve(__rhs.__densities_.size()); 6232 __areas_.reserve (__rhs.__areas_.size()); 6233 6234 // These can not throw 6235 __b_ = __rhs.__b_; 6236 __densities_ = __rhs.__densities_; 6237 __areas_ = __rhs.__areas_; 6238 return *this; 6239 } 6240 6241 template<class _RealType> 6242 void 6243 piecewise_constant_distribution<_RealType>::param_type::__init() 6244 { 6245 // __densities_ contains non-normalized areas 6246 result_type __total_area = _VSTD::accumulate(__densities_.begin(), 6247 __densities_.end(), 6248 result_type()); 6249 for (size_t __i = 0; __i < __densities_.size(); ++__i) 6250 __densities_[__i] /= __total_area; 6251 // __densities_ contains normalized areas 6252 __areas_.assign(__densities_.size(), result_type()); 6253 _VSTD::partial_sum(__densities_.begin(), __densities_.end() - 1, 6254 __areas_.begin() + 1); 6255 // __areas_ contains partial sums of normalized areas: [0, __densities_ - 1] 6256 __densities_.back() = 1 - __areas_.back(); // correct round off error 6257 for (size_t __i = 0; __i < __densities_.size(); ++__i) 6258 __densities_[__i] /= (__b_[__i+1] - __b_[__i]); 6259 // __densities_ now contains __densities_ 6260 } 6261 6262 template<class _RealType> 6263 piecewise_constant_distribution<_RealType>::param_type::param_type() 6264 : __b_(2), 6265 __densities_(1, 1.0), 6266 __areas_(1, 0.0) 6267 { 6268 __b_[1] = 1; 6269 } 6270 6271 template<class _RealType> 6272 template<class _InputIteratorB, class _InputIteratorW> 6273 piecewise_constant_distribution<_RealType>::param_type::param_type( 6274 _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW) 6275 : __b_(__fB, __lB) 6276 { 6277 if (__b_.size() < 2) 6278 { 6279 __b_.resize(2); 6280 __b_[0] = 0; 6281 __b_[1] = 1; 6282 __densities_.assign(1, 1.0); 6283 __areas_.assign(1, 0.0); 6284 } 6285 else 6286 { 6287 __densities_.reserve(__b_.size() - 1); 6288 for (size_t __i = 0; __i < __b_.size() - 1; ++__i, ++__fW) 6289 __densities_.push_back(*__fW); 6290 __init(); 6291 } 6292 } 6293 6294 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6295 6296 template<class _RealType> 6297 template<class _UnaryOperation> 6298 piecewise_constant_distribution<_RealType>::param_type::param_type( 6299 initializer_list<result_type> __bl, _UnaryOperation __fw) 6300 : __b_(__bl.begin(), __bl.end()) 6301 { 6302 if (__b_.size() < 2) 6303 { 6304 __b_.resize(2); 6305 __b_[0] = 0; 6306 __b_[1] = 1; 6307 __densities_.assign(1, 1.0); 6308 __areas_.assign(1, 0.0); 6309 } 6310 else 6311 { 6312 __densities_.reserve(__b_.size() - 1); 6313 for (size_t __i = 0; __i < __b_.size() - 1; ++__i) 6314 __densities_.push_back(__fw((__b_[__i+1] + __b_[__i])*.5)); 6315 __init(); 6316 } 6317 } 6318 6319 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6320 6321 template<class _RealType> 6322 template<class _UnaryOperation> 6323 piecewise_constant_distribution<_RealType>::param_type::param_type( 6324 size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw) 6325 : __b_(__nw == 0 ? 2 : __nw + 1) 6326 { 6327 size_t __n = __b_.size() - 1; 6328 result_type __d = (__xmax - __xmin) / __n; 6329 __densities_.reserve(__n); 6330 for (size_t __i = 0; __i < __n; ++__i) 6331 { 6332 __b_[__i] = __xmin + __i * __d; 6333 __densities_.push_back(__fw(__b_[__i] + __d*.5)); 6334 } 6335 __b_[__n] = __xmax; 6336 __init(); 6337 } 6338 6339 template<class _RealType> 6340 template<class _URNG> 6341 _RealType 6342 piecewise_constant_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 6343 { 6344 typedef uniform_real_distribution<result_type> _Gen; 6345 result_type __u = _Gen()(__g); 6346 ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(), 6347 __u) - __p.__areas_.begin() - 1; 6348 return (__u - __p.__areas_[__k]) / __p.__densities_[__k] + __p.__b_[__k]; 6349 } 6350 6351 template <class _CharT, class _Traits, class _RT> 6352 basic_ostream<_CharT, _Traits>& 6353 operator<<(basic_ostream<_CharT, _Traits>& __os, 6354 const piecewise_constant_distribution<_RT>& __x) 6355 { 6356 __save_flags<_CharT, _Traits> __lx(__os); 6357 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 6358 ios_base::scientific); 6359 _CharT __sp = __os.widen(' '); 6360 __os.fill(__sp); 6361 size_t __n = __x.__p_.__b_.size(); 6362 __os << __n; 6363 for (size_t __i = 0; __i < __n; ++__i) 6364 __os << __sp << __x.__p_.__b_[__i]; 6365 __n = __x.__p_.__densities_.size(); 6366 __os << __sp << __n; 6367 for (size_t __i = 0; __i < __n; ++__i) 6368 __os << __sp << __x.__p_.__densities_[__i]; 6369 __n = __x.__p_.__areas_.size(); 6370 __os << __sp << __n; 6371 for (size_t __i = 0; __i < __n; ++__i) 6372 __os << __sp << __x.__p_.__areas_[__i]; 6373 return __os; 6374 } 6375 6376 template <class _CharT, class _Traits, class _RT> 6377 basic_istream<_CharT, _Traits>& 6378 operator>>(basic_istream<_CharT, _Traits>& __is, 6379 piecewise_constant_distribution<_RT>& __x) 6380 { 6381 typedef piecewise_constant_distribution<_RT> _Eng; 6382 typedef typename _Eng::result_type result_type; 6383 typedef typename _Eng::param_type param_type; 6384 __save_flags<_CharT, _Traits> __lx(__is); 6385 __is.flags(ios_base::dec | ios_base::skipws); 6386 size_t __n; 6387 __is >> __n; 6388 vector<result_type> __b(__n); 6389 for (size_t __i = 0; __i < __n; ++__i) 6390 __is >> __b[__i]; 6391 __is >> __n; 6392 vector<result_type> __densities(__n); 6393 for (size_t __i = 0; __i < __n; ++__i) 6394 __is >> __densities[__i]; 6395 __is >> __n; 6396 vector<result_type> __areas(__n); 6397 for (size_t __i = 0; __i < __n; ++__i) 6398 __is >> __areas[__i]; 6399 if (!__is.fail()) 6400 { 6401 swap(__x.__p_.__b_, __b); 6402 swap(__x.__p_.__densities_, __densities); 6403 swap(__x.__p_.__areas_, __areas); 6404 } 6405 return __is; 6406 } 6407 6408 // piecewise_linear_distribution 6409 6410 template<class _RealType = double> 6411 class _LIBCPP_VISIBLE piecewise_linear_distribution 6412 { 6413 public: 6414 // types 6415 typedef _RealType result_type; 6416 6417 class _LIBCPP_VISIBLE param_type 6418 { 6419 vector<result_type> __b_; 6420 vector<result_type> __densities_; 6421 vector<result_type> __areas_; 6422 public: 6423 typedef piecewise_linear_distribution distribution_type; 6424 6425 param_type(); 6426 template<class _InputIteratorB, class _InputIteratorW> 6427 param_type(_InputIteratorB __fB, _InputIteratorB __lB, 6428 _InputIteratorW __fW); 6429 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6430 template<class _UnaryOperation> 6431 param_type(initializer_list<result_type> __bl, _UnaryOperation __fw); 6432 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6433 template<class _UnaryOperation> 6434 param_type(size_t __nw, result_type __xmin, result_type __xmax, 6435 _UnaryOperation __fw); 6436 param_type & operator=(const param_type& __rhs); 6437 6438 _LIBCPP_INLINE_VISIBILITY 6439 vector<result_type> intervals() const {return __b_;} 6440 _LIBCPP_INLINE_VISIBILITY 6441 vector<result_type> densities() const {return __densities_;} 6442 6443 friend _LIBCPP_INLINE_VISIBILITY 6444 bool operator==(const param_type& __x, const param_type& __y) 6445 {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;} 6446 friend _LIBCPP_INLINE_VISIBILITY 6447 bool operator!=(const param_type& __x, const param_type& __y) 6448 {return !(__x == __y);} 6449 6450 private: 6451 void __init(); 6452 6453 friend class piecewise_linear_distribution; 6454 6455 template <class _CharT, class _Traits, class _RT> 6456 friend 6457 basic_ostream<_CharT, _Traits>& 6458 operator<<(basic_ostream<_CharT, _Traits>& __os, 6459 const piecewise_linear_distribution<_RT>& __x); 6460 6461 template <class _CharT, class _Traits, class _RT> 6462 friend 6463 basic_istream<_CharT, _Traits>& 6464 operator>>(basic_istream<_CharT, _Traits>& __is, 6465 piecewise_linear_distribution<_RT>& __x); 6466 }; 6467 6468 private: 6469 param_type __p_; 6470 6471 public: 6472 // constructor and reset functions 6473 _LIBCPP_INLINE_VISIBILITY 6474 piecewise_linear_distribution() {} 6475 template<class _InputIteratorB, class _InputIteratorW> 6476 _LIBCPP_INLINE_VISIBILITY 6477 piecewise_linear_distribution(_InputIteratorB __fB, 6478 _InputIteratorB __lB, 6479 _InputIteratorW __fW) 6480 : __p_(__fB, __lB, __fW) {} 6481 6482 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6483 template<class _UnaryOperation> 6484 _LIBCPP_INLINE_VISIBILITY 6485 piecewise_linear_distribution(initializer_list<result_type> __bl, 6486 _UnaryOperation __fw) 6487 : __p_(__bl, __fw) {} 6488 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6489 6490 template<class _UnaryOperation> 6491 _LIBCPP_INLINE_VISIBILITY 6492 piecewise_linear_distribution(size_t __nw, result_type __xmin, 6493 result_type __xmax, _UnaryOperation __fw) 6494 : __p_(__nw, __xmin, __xmax, __fw) {} 6495 6496 _LIBCPP_INLINE_VISIBILITY 6497 explicit piecewise_linear_distribution(const param_type& __p) 6498 : __p_(__p) {} 6499 6500 _LIBCPP_INLINE_VISIBILITY 6501 void reset() {} 6502 6503 // generating functions 6504 template<class _URNG> 6505 _LIBCPP_INLINE_VISIBILITY 6506 result_type operator()(_URNG& __g) 6507 {return (*this)(__g, __p_);} 6508 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); 6509 6510 // property functions 6511 _LIBCPP_INLINE_VISIBILITY 6512 vector<result_type> intervals() const {return __p_.intervals();} 6513 _LIBCPP_INLINE_VISIBILITY 6514 vector<result_type> densities() const {return __p_.densities();} 6515 6516 _LIBCPP_INLINE_VISIBILITY 6517 param_type param() const {return __p_;} 6518 _LIBCPP_INLINE_VISIBILITY 6519 void param(const param_type& __p) {__p_ = __p;} 6520 6521 _LIBCPP_INLINE_VISIBILITY 6522 result_type min() const {return __p_.__b_.front();} 6523 _LIBCPP_INLINE_VISIBILITY 6524 result_type max() const {return __p_.__b_.back();} 6525 6526 friend _LIBCPP_INLINE_VISIBILITY 6527 bool operator==(const piecewise_linear_distribution& __x, 6528 const piecewise_linear_distribution& __y) 6529 {return __x.__p_ == __y.__p_;} 6530 friend _LIBCPP_INLINE_VISIBILITY 6531 bool operator!=(const piecewise_linear_distribution& __x, 6532 const piecewise_linear_distribution& __y) 6533 {return !(__x == __y);} 6534 6535 template <class _CharT, class _Traits, class _RT> 6536 friend 6537 basic_ostream<_CharT, _Traits>& 6538 operator<<(basic_ostream<_CharT, _Traits>& __os, 6539 const piecewise_linear_distribution<_RT>& __x); 6540 6541 template <class _CharT, class _Traits, class _RT> 6542 friend 6543 basic_istream<_CharT, _Traits>& 6544 operator>>(basic_istream<_CharT, _Traits>& __is, 6545 piecewise_linear_distribution<_RT>& __x); 6546 }; 6547 6548 template<class _RealType> 6549 typename piecewise_linear_distribution<_RealType>::param_type & 6550 piecewise_linear_distribution<_RealType>::param_type::operator= 6551 (const param_type& __rhs) 6552 { 6553 // These can throw 6554 __b_.reserve (__rhs.__b_.size ()); 6555 __densities_.reserve(__rhs.__densities_.size()); 6556 __areas_.reserve (__rhs.__areas_.size()); 6557 6558 // These can not throw 6559 __b_ = __rhs.__b_; 6560 __densities_ = __rhs.__densities_; 6561 __areas_ = __rhs.__areas_; 6562 return *this; 6563 } 6564 6565 6566 template<class _RealType> 6567 void 6568 piecewise_linear_distribution<_RealType>::param_type::__init() 6569 { 6570 __areas_.assign(__densities_.size() - 1, result_type()); 6571 result_type _Sp = 0; 6572 for (size_t __i = 0; __i < __areas_.size(); ++__i) 6573 { 6574 __areas_[__i] = (__densities_[__i+1] + __densities_[__i]) * 6575 (__b_[__i+1] - __b_[__i]) * .5; 6576 _Sp += __areas_[__i]; 6577 } 6578 for (size_t __i = __areas_.size(); __i > 1;) 6579 { 6580 --__i; 6581 __areas_[__i] = __areas_[__i-1] / _Sp; 6582 } 6583 __areas_[0] = 0; 6584 for (size_t __i = 1; __i < __areas_.size(); ++__i) 6585 __areas_[__i] += __areas_[__i-1]; 6586 for (size_t __i = 0; __i < __densities_.size(); ++__i) 6587 __densities_[__i] /= _Sp; 6588 } 6589 6590 template<class _RealType> 6591 piecewise_linear_distribution<_RealType>::param_type::param_type() 6592 : __b_(2), 6593 __densities_(2, 1.0), 6594 __areas_(1, 0.0) 6595 { 6596 __b_[1] = 1; 6597 } 6598 6599 template<class _RealType> 6600 template<class _InputIteratorB, class _InputIteratorW> 6601 piecewise_linear_distribution<_RealType>::param_type::param_type( 6602 _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW) 6603 : __b_(__fB, __lB) 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, ++__fW) 6617 __densities_.push_back(*__fW); 6618 __init(); 6619 } 6620 } 6621 6622 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6623 6624 template<class _RealType> 6625 template<class _UnaryOperation> 6626 piecewise_linear_distribution<_RealType>::param_type::param_type( 6627 initializer_list<result_type> __bl, _UnaryOperation __fw) 6628 : __b_(__bl.begin(), __bl.end()) 6629 { 6630 if (__b_.size() < 2) 6631 { 6632 __b_.resize(2); 6633 __b_[0] = 0; 6634 __b_[1] = 1; 6635 __densities_.assign(2, 1.0); 6636 __areas_.assign(1, 0.0); 6637 } 6638 else 6639 { 6640 __densities_.reserve(__b_.size()); 6641 for (size_t __i = 0; __i < __b_.size(); ++__i) 6642 __densities_.push_back(__fw(__b_[__i])); 6643 __init(); 6644 } 6645 } 6646 6647 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6648 6649 template<class _RealType> 6650 template<class _UnaryOperation> 6651 piecewise_linear_distribution<_RealType>::param_type::param_type( 6652 size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw) 6653 : __b_(__nw == 0 ? 2 : __nw + 1) 6654 { 6655 size_t __n = __b_.size() - 1; 6656 result_type __d = (__xmax - __xmin) / __n; 6657 __densities_.reserve(__b_.size()); 6658 for (size_t __i = 0; __i < __n; ++__i) 6659 { 6660 __b_[__i] = __xmin + __i * __d; 6661 __densities_.push_back(__fw(__b_[__i])); 6662 } 6663 __b_[__n] = __xmax; 6664 __densities_.push_back(__fw(__b_[__n])); 6665 __init(); 6666 } 6667 6668 template<class _RealType> 6669 template<class _URNG> 6670 _RealType 6671 piecewise_linear_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) 6672 { 6673 typedef uniform_real_distribution<result_type> _Gen; 6674 result_type __u = _Gen()(__g); 6675 ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(), 6676 __u) - __p.__areas_.begin() - 1; 6677 __u -= __p.__areas_[__k]; 6678 const result_type __dk = __p.__densities_[__k]; 6679 const result_type __dk1 = __p.__densities_[__k+1]; 6680 const result_type __deltad = __dk1 - __dk; 6681 const result_type __bk = __p.__b_[__k]; 6682 if (__deltad == 0) 6683 return __u / __dk + __bk; 6684 const result_type __bk1 = __p.__b_[__k+1]; 6685 const result_type __deltab = __bk1 - __bk; 6686 return (__bk * __dk1 - __bk1 * __dk + 6687 _VSTD::sqrt(__deltab * (__deltab * __dk * __dk + 2 * __deltad * __u))) / 6688 __deltad; 6689 } 6690 6691 template <class _CharT, class _Traits, class _RT> 6692 basic_ostream<_CharT, _Traits>& 6693 operator<<(basic_ostream<_CharT, _Traits>& __os, 6694 const piecewise_linear_distribution<_RT>& __x) 6695 { 6696 __save_flags<_CharT, _Traits> __lx(__os); 6697 __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | 6698 ios_base::scientific); 6699 _CharT __sp = __os.widen(' '); 6700 __os.fill(__sp); 6701 size_t __n = __x.__p_.__b_.size(); 6702 __os << __n; 6703 for (size_t __i = 0; __i < __n; ++__i) 6704 __os << __sp << __x.__p_.__b_[__i]; 6705 __n = __x.__p_.__densities_.size(); 6706 __os << __sp << __n; 6707 for (size_t __i = 0; __i < __n; ++__i) 6708 __os << __sp << __x.__p_.__densities_[__i]; 6709 __n = __x.__p_.__areas_.size(); 6710 __os << __sp << __n; 6711 for (size_t __i = 0; __i < __n; ++__i) 6712 __os << __sp << __x.__p_.__areas_[__i]; 6713 return __os; 6714 } 6715 6716 template <class _CharT, class _Traits, class _RT> 6717 basic_istream<_CharT, _Traits>& 6718 operator>>(basic_istream<_CharT, _Traits>& __is, 6719 piecewise_linear_distribution<_RT>& __x) 6720 { 6721 typedef piecewise_linear_distribution<_RT> _Eng; 6722 typedef typename _Eng::result_type result_type; 6723 typedef typename _Eng::param_type param_type; 6724 __save_flags<_CharT, _Traits> __lx(__is); 6725 __is.flags(ios_base::dec | ios_base::skipws); 6726 size_t __n; 6727 __is >> __n; 6728 vector<result_type> __b(__n); 6729 for (size_t __i = 0; __i < __n; ++__i) 6730 __is >> __b[__i]; 6731 __is >> __n; 6732 vector<result_type> __densities(__n); 6733 for (size_t __i = 0; __i < __n; ++__i) 6734 __is >> __densities[__i]; 6735 __is >> __n; 6736 vector<result_type> __areas(__n); 6737 for (size_t __i = 0; __i < __n; ++__i) 6738 __is >> __areas[__i]; 6739 if (!__is.fail()) 6740 { 6741 swap(__x.__p_.__b_, __b); 6742 swap(__x.__p_.__densities_, __densities); 6743 swap(__x.__p_.__areas_, __areas); 6744 } 6745 return __is; 6746 } 6747 6748 _LIBCPP_END_NAMESPACE_STD 6749 6750 #endif // _LIBCPP_RANDOM 6751