Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / c++ / random @ 13

History | View | Annotate | Download (220 KB)

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