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