root / lab4 / .minix-src / include / c++ / random @ 14
History | View | Annotate | Download (220 KB)
1 |
// -*- C++ -*- |
---|---|
2 |
//===--------------------------- random -----------------------------------===// |
3 |
// |
4 |
// The LLVM Compiler Infrastructure |
5 |
// |
6 |
// This file is dual licensed under the MIT and the University of Illinois Open |
7 |
// Source Licenses. See LICENSE.TXT for details. |
8 |
// |
9 |
//===----------------------------------------------------------------------===// |
10 |
|
11 |
#ifndef _LIBCPP_RANDOM |
12 |
#define _LIBCPP_RANDOM |
13 |
|
14 |
/* |
15 |
random synopsis |
16 |
|
17 |
#include <initializer_list> |
18 |
|
19 |
namespace std |
20 |
{ |
21 |
|
22 |
// Engines |
23 |
|
24 |
template <class UIntType, UIntType a, UIntType c, UIntType m> |
25 |
class linear_congruential_engine |
26 |
{ |
27 |
public: |
28 |
// types |
29 |
typedef UIntType result_type; |
30 |
|
31 |
// engine characteristics |
32 |
static constexpr result_type multiplier = a; |
33 |
static constexpr result_type increment = c; |
34 |
static constexpr result_type modulus = m; |
35 |
static constexpr result_type min() { return c == 0u ? 1u: 0u;} |
36 |
static constexpr result_type max() { return m - 1u;} |
37 |
static constexpr result_type default_seed = 1u; |
38 |
|
39 |
// constructors and seeding functions |
40 |
explicit linear_congruential_engine(result_type s = default_seed); |
41 |
template<class Sseq> explicit linear_congruential_engine(Sseq& q); |
42 |
void seed(result_type s = default_seed); |
43 |
template<class Sseq> void seed(Sseq& q); |
44 |
|
45 |
// generating functions |
46 |
result_type operator()(); |
47 |
void discard(unsigned long long z); |
48 |
}; |
49 |
|
50 |
template <class UIntType, UIntType a, UIntType c, UIntType m> |
51 |
bool |
52 |
operator==(const linear_congruential_engine<UIntType, a, c, m>& x, |
53 |
const linear_congruential_engine<UIntType, a, c, m>& y); |
54 |
|
55 |
template <class UIntType, UIntType a, UIntType c, UIntType m> |
56 |
bool |
57 |
operator!=(const linear_congruential_engine<UIntType, a, c, m>& x, |
58 |
const linear_congruential_engine<UIntType, a, c, m>& y); |
59 |
|
60 |
template <class charT, class traits, |
61 |
class UIntType, UIntType a, UIntType c, UIntType m> |
62 |
basic_ostream<charT, traits>& |
63 |
operator<<(basic_ostream<charT, traits>& os, |
64 |
const linear_congruential_engine<UIntType, a, c, m>& x); |
65 |
|
66 |
template <class charT, class traits, |
67 |
class UIntType, UIntType a, UIntType c, UIntType m> |
68 |
basic_istream<charT, traits>& |
69 |
operator>>(basic_istream<charT, traits>& is, |
70 |
linear_congruential_engine<UIntType, a, c, m>& x); |
71 |
|
72 |
template <class UIntType, size_t w, size_t n, size_t m, size_t r, |
73 |
UIntType a, size_t u, UIntType d, size_t s, |
74 |
UIntType b, size_t t, UIntType c, size_t l, UIntType f> |
75 |
class mersenne_twister_engine |
76 |
{ |
77 |
public: |
78 |
// types |
79 |
typedef UIntType result_type; |
80 |
|
81 |
// engine characteristics |
82 |
static constexpr size_t word_size = w; |
83 |
static constexpr size_t state_size = n; |
84 |
static constexpr size_t shift_size = m; |
85 |
static constexpr size_t mask_bits = r; |
86 |
static constexpr result_type xor_mask = a; |
87 |
static constexpr size_t tempering_u = u; |
88 |
static constexpr result_type tempering_d = d; |
89 |
static constexpr size_t tempering_s = s; |
90 |
static constexpr result_type tempering_b = b; |
91 |
static constexpr size_t tempering_t = t; |
92 |
static constexpr result_type tempering_c = c; |
93 |
static constexpr size_t tempering_l = l; |
94 |
static constexpr result_type initialization_multiplier = f; |
95 |
static constexpr result_type min () { return 0; } |
96 |
static constexpr result_type max() { return 2^w - 1; } |
97 |
static constexpr result_type default_seed = 5489u; |
98 |
|
99 |
// constructors and seeding functions |
100 |
explicit mersenne_twister_engine(result_type value = default_seed); |
101 |
template<class Sseq> explicit mersenne_twister_engine(Sseq& q); |
102 |
void seed(result_type value = default_seed); |
103 |
template<class Sseq> void seed(Sseq& q); |
104 |
|
105 |
// generating functions |
106 |
result_type operator()(); |
107 |
void discard(unsigned long long z); |
108 |
}; |
109 |
|
110 |
template <class UIntType, size_t w, size_t n, size_t m, size_t r, |
111 |
UIntType a, size_t u, UIntType d, size_t s, |
112 |
UIntType b, size_t t, UIntType c, size_t l, UIntType f> |
113 |
bool |
114 |
operator==( |
115 |
const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x, |
116 |
const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& y); |
117 |
|
118 |
template <class UIntType, size_t w, size_t n, size_t m, size_t r, |
119 |
UIntType a, size_t u, UIntType d, size_t s, |
120 |
UIntType b, size_t t, UIntType c, size_t l, UIntType f> |
121 |
bool |
122 |
operator!=( |
123 |
const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x, |
124 |
const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& y); |
125 |
|
126 |
template <class charT, class traits, |
127 |
class UIntType, size_t w, size_t n, size_t m, size_t r, |
128 |
UIntType a, size_t u, UIntType d, size_t s, |
129 |
UIntType b, size_t t, UIntType c, size_t l, UIntType f> |
130 |
basic_ostream<charT, traits>& |
131 |
operator<<(basic_ostream<charT, traits>& os, |
132 |
const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x); |
133 |
|
134 |
template <class charT, class traits, |
135 |
class UIntType, size_t w, size_t n, size_t m, size_t r, |
136 |
UIntType a, size_t u, UIntType d, size_t s, |
137 |
UIntType b, size_t t, UIntType c, size_t l, UIntType f> |
138 |
basic_istream<charT, traits>& |
139 |
operator>>(basic_istream<charT, traits>& is, |
140 |
mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x); |
141 |
|
142 |
template<class UIntType, size_t w, size_t s, size_t r> |
143 |
class subtract_with_carry_engine |
144 |
{ |
145 |
public: |
146 |
// types |
147 |
typedef UIntType result_type; |
148 |
|
149 |
// engine characteristics |
150 |
static constexpr size_t word_size = w; |
151 |
static constexpr size_t short_lag = s; |
152 |
static constexpr size_t long_lag = r; |
153 |
static constexpr result_type min() { return 0; } |
154 |
static constexpr result_type max() { return m-1; } |
155 |
static constexpr result_type default_seed = 19780503u; |
156 |
|
157 |
// constructors and seeding functions |
158 |
explicit subtract_with_carry_engine(result_type value = default_seed); |
159 |
template<class Sseq> explicit subtract_with_carry_engine(Sseq& q); |
160 |
void seed(result_type value = default_seed); |
161 |
template<class Sseq> void seed(Sseq& q); |
162 |
|
163 |
// generating functions |
164 |
result_type operator()(); |
165 |
void discard(unsigned long long z); |
166 |
}; |
167 |
|
168 |
template<class UIntType, size_t w, size_t s, size_t r> |
169 |
bool |
170 |
operator==( |
171 |
const subtract_with_carry_engine<UIntType, w, s, r>& x, |
172 |
const subtract_with_carry_engine<UIntType, w, s, r>& y); |
173 |
|
174 |
template<class UIntType, size_t w, size_t s, size_t r> |
175 |
bool |
176 |
operator!=( |
177 |
const subtract_with_carry_engine<UIntType, w, s, r>& x, |
178 |
const subtract_with_carry_engine<UIntType, w, s, r>& y); |
179 |
|
180 |
template <class charT, class traits, |
181 |
class UIntType, size_t w, size_t s, size_t r> |
182 |
basic_ostream<charT, traits>& |
183 |
operator<<(basic_ostream<charT, traits>& os, |
184 |
const subtract_with_carry_engine<UIntType, w, s, r>& x); |
185 |
|
186 |
template <class charT, class traits, |
187 |
class UIntType, size_t w, size_t s, size_t r> |
188 |
basic_istream<charT, traits>& |
189 |
operator>>(basic_istream<charT, traits>& is, |
190 |
subtract_with_carry_engine<UIntType, w, s, r>& x); |
191 |
|
192 |
template<class Engine, size_t p, size_t r> |
193 |
class discard_block_engine |
194 |
{ |
195 |
public: |
196 |
// types |
197 |
typedef typename Engine::result_type result_type; |
198 |
|
199 |
// engine characteristics |
200 |
static constexpr size_t block_size = p; |
201 |
static constexpr size_t used_block = r; |
202 |
static constexpr result_type min() { return Engine::min(); } |
203 |
static constexpr result_type max() { return Engine::max(); } |
204 |
|
205 |
// constructors and seeding functions |
206 |
discard_block_engine(); |
207 |
explicit discard_block_engine(const Engine& e); |
208 |
explicit discard_block_engine(Engine&& e); |
209 |
explicit discard_block_engine(result_type s); |
210 |
template<class Sseq> explicit discard_block_engine(Sseq& q); |
211 |
void seed(); |
212 |
void seed(result_type s); |
213 |
template<class Sseq> void seed(Sseq& q); |
214 |
|
215 |
// generating functions |
216 |
result_type operator()(); |
217 |
void discard(unsigned long long z); |
218 |
|
219 |
// property functions |
220 |
const Engine& base() const noexcept; |
221 |
}; |
222 |
|
223 |
template<class Engine, size_t p, size_t r> |
224 |
bool |
225 |
operator==( |
226 |
const discard_block_engine<Engine, p, r>& x, |
227 |
const discard_block_engine<Engine, p, r>& y); |
228 |
|
229 |
template<class Engine, size_t p, size_t r> |
230 |
bool |
231 |
operator!=( |
232 |
const discard_block_engine<Engine, p, r>& x, |
233 |
const discard_block_engine<Engine, p, r>& y); |
234 |
|
235 |
template <class charT, class traits, |
236 |
class Engine, size_t p, size_t r> |
237 |
basic_ostream<charT, traits>& |
238 |
operator<<(basic_ostream<charT, traits>& os, |
239 |
const discard_block_engine<Engine, p, r>& x); |
240 |
|
241 |
template <class charT, class traits, |
242 |
class Engine, size_t p, size_t r> |
243 |
basic_istream<charT, traits>& |
244 |
operator>>(basic_istream<charT, traits>& is, |
245 |
discard_block_engine<Engine, p, r>& x); |
246 |
|
247 |
template<class Engine, size_t w, class UIntType> |
248 |
class independent_bits_engine |
249 |
{ |
250 |
public: |
251 |
// types |
252 |
typedef UIntType result_type; |
253 |
|
254 |
// engine characteristics |
255 |
static constexpr result_type min() { return 0; } |
256 |
static constexpr result_type max() { return 2^w - 1; } |
257 |
|
258 |
// constructors and seeding functions |
259 |
independent_bits_engine(); |
260 |
explicit independent_bits_engine(const Engine& e); |
261 |
explicit independent_bits_engine(Engine&& e); |
262 |
explicit independent_bits_engine(result_type s); |
263 |
template<class Sseq> explicit independent_bits_engine(Sseq& q); |
264 |
void seed(); |
265 |
void seed(result_type s); |
266 |
template<class Sseq> void seed(Sseq& q); |
267 |
|
268 |
// generating functions |
269 |
result_type operator()(); void discard(unsigned long long z); |
270 |
|
271 |
// property functions |
272 |
const Engine& base() const noexcept; |
273 |
}; |
274 |
|
275 |
template<class Engine, size_t w, class UIntType> |
276 |
bool |
277 |
operator==( |
278 |
const independent_bits_engine<Engine, w, UIntType>& x, |
279 |
const independent_bits_engine<Engine, w, UIntType>& y); |
280 |
|
281 |
template<class Engine, size_t w, class UIntType> |
282 |
bool |
283 |
operator!=( |
284 |
const independent_bits_engine<Engine, w, UIntType>& x, |
285 |
const independent_bits_engine<Engine, w, UIntType>& y); |
286 |
|
287 |
template <class charT, class traits, |
288 |
class Engine, size_t w, class UIntType> |
289 |
basic_ostream<charT, traits>& |
290 |
operator<<(basic_ostream<charT, traits>& os, |
291 |
const independent_bits_engine<Engine, w, UIntType>& x); |
292 |
|
293 |
template <class charT, class traits, |
294 |
class Engine, size_t w, class UIntType> |
295 |
basic_istream<charT, traits>& |
296 |
operator>>(basic_istream<charT, traits>& is, |
297 |
independent_bits_engine<Engine, w, UIntType>& x); |
298 |
|
299 |
template<class Engine, size_t k> |
300 |
class shuffle_order_engine |
301 |
{ |
302 |
public: |
303 |
// types |
304 |
typedef typename Engine::result_type result_type; |
305 |
|
306 |
// engine characteristics |
307 |
static constexpr size_t table_size = k; |
308 |
static constexpr result_type min() { return Engine::min; } |
309 |
static constexpr result_type max() { return Engine::max; } |
310 |
|
311 |
// constructors and seeding functions |
312 |
shuffle_order_engine(); |
313 |
explicit shuffle_order_engine(const Engine& e); |
314 |
explicit shuffle_order_engine(Engine&& e); |
315 |
explicit shuffle_order_engine(result_type s); |
316 |
template<class Sseq> explicit shuffle_order_engine(Sseq& q); |
317 |
void seed(); |
318 |
void seed(result_type s); |
319 |
template<class Sseq> void seed(Sseq& q); |
320 |
|
321 |
// generating functions |
322 |
result_type operator()(); |
323 |
void discard(unsigned long long z); |
324 |
|
325 |
// property functions |
326 |
const Engine& base() const noexcept; |
327 |
}; |
328 |
|
329 |
template<class Engine, size_t k> |
330 |
bool |
331 |
operator==( |
332 |
const shuffle_order_engine<Engine, k>& x, |
333 |
const shuffle_order_engine<Engine, k>& y); |
334 |
|
335 |
template<class Engine, size_t k> |
336 |
bool |
337 |
operator!=( |
338 |
const shuffle_order_engine<Engine, k>& x, |
339 |
const shuffle_order_engine<Engine, k>& y); |
340 |
|
341 |
template <class charT, class traits, |
342 |
class Engine, size_t k> |
343 |
basic_ostream<charT, traits>& |
344 |
operator<<(basic_ostream<charT, traits>& os, |
345 |
const shuffle_order_engine<Engine, k>& x); |
346 |
|
347 |
template <class charT, class traits, |
348 |
class Engine, size_t k> |
349 |
basic_istream<charT, traits>& |
350 |
operator>>(basic_istream<charT, traits>& is, |
351 |
shuffle_order_engine<Engine, k>& x); |
352 |
|
353 |
typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> |
354 |
minstd_rand0; |
355 |
typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647> |
356 |
minstd_rand; |
357 |
typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31, |
358 |
0x9908b0df, |
359 |
11, 0xffffffff, |
360 |
7, 0x9d2c5680, |
361 |
15, 0xefc60000, |
362 |
18, 1812433253> mt19937; |
363 |
typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31, |
364 |
0xb5026f5aa96619e9, |
365 |
29, 0x5555555555555555, |
366 |
17, 0x71d67fffeda60000, |
367 |
37, 0xfff7eee000000000, |
368 |
43, 6364136223846793005> mt19937_64; |
369 |
typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base; |
370 |
typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base; |
371 |
typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; |
372 |
typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; |
373 |
typedef shuffle_order_engine<minstd_rand0, 256> knuth_b; |
374 |
typedef minstd_rand default_random_engine; |
375 |
|
376 |
// Generators |
377 |
|
378 |
class random_device |
379 |
{ |
380 |
public: |
381 |
// types |
382 |
typedef unsigned int result_type; |
383 |
|
384 |
// generator characteristics |
385 |
static constexpr result_type min() { return numeric_limits<result_type>::min(); } |
386 |
static constexpr result_type max() { return numeric_limits<result_type>::max(); } |
387 |
|
388 |
// constructors |
389 |
explicit random_device(const string& token = "/dev/urandom"); |
390 |
|
391 |
// generating functions |
392 |
result_type operator()(); |
393 |
|
394 |
// property functions |
395 |
double entropy() const noexcept; |
396 |
|
397 |
// no copy functions |
398 |
random_device(const random_device& ) = delete; |
399 |
void operator=(const random_device& ) = delete; |
400 |
}; |
401 |
|
402 |
// Utilities |
403 |
|
404 |
class seed_seq |
405 |
{ |
406 |
public: |
407 |
// types |
408 |
typedef uint_least32_t result_type; |
409 |
|
410 |
// constructors |
411 |
seed_seq(); |
412 |
template<class T> |
413 |
seed_seq(initializer_list<T> il); |
414 |
template<class InputIterator> |
415 |
seed_seq(InputIterator begin, InputIterator end); |
416 |
|
417 |
// generating functions |
418 |
template<class RandomAccessIterator> |
419 |
void generate(RandomAccessIterator begin, RandomAccessIterator end); |
420 |
|
421 |
// property functions |
422 |
size_t size() const; |
423 |
template<class OutputIterator> |
424 |
void param(OutputIterator dest) const; |
425 |
|
426 |
// no copy functions |
427 |
seed_seq(const seed_seq&) = delete; |
428 |
void operator=(const seed_seq& ) = delete; |
429 |
}; |
430 |
|
431 |
template<class RealType, size_t bits, class URNG> |
432 |
RealType generate_canonical(URNG& g); |
433 |
|
434 |
// Distributions |
435 |
|
436 |
template<class IntType = int> |
437 |
class uniform_int_distribution |
438 |
{ |
439 |
public: |
440 |
// types |
441 |
typedef IntType result_type; |
442 |
|
443 |
class param_type |
444 |
{ |
445 |
public: |
446 |
typedef uniform_int_distribution distribution_type; |
447 |
|
448 |
explicit param_type(IntType a = 0, |
449 |
IntType b = numeric_limits<IntType>::max()); |
450 |
|
451 |
result_type a() const; |
452 |
result_type b() const; |
453 |
|
454 |
friend bool operator==(const param_type& x, const param_type& y); |
455 |
friend bool operator!=(const param_type& x, const param_type& y); |
456 |
}; |
457 |
|
458 |
// constructors and reset functions |
459 |
explicit uniform_int_distribution(IntType a = 0, |
460 |
IntType b = numeric_limits<IntType>::max()); |
461 |
explicit uniform_int_distribution(const param_type& parm); |
462 |
void reset(); |
463 |
|
464 |
// generating functions |
465 |
template<class URNG> result_type operator()(URNG& g); |
466 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
467 |
|
468 |
// property functions |
469 |
result_type a() const; |
470 |
result_type b() const; |
471 |
|
472 |
param_type param() const; |
473 |
void param(const param_type& parm); |
474 |
|
475 |
result_type min() const; |
476 |
result_type max() const; |
477 |
|
478 |
friend bool operator==(const uniform_int_distribution& x, |
479 |
const uniform_int_distribution& y); |
480 |
friend bool operator!=(const uniform_int_distribution& x, |
481 |
const uniform_int_distribution& y); |
482 |
|
483 |
template <class charT, class traits> |
484 |
friend |
485 |
basic_ostream<charT, traits>& |
486 |
operator<<(basic_ostream<charT, traits>& os, |
487 |
const uniform_int_distribution& x); |
488 |
|
489 |
template <class charT, class traits> |
490 |
friend |
491 |
basic_istream<charT, traits>& |
492 |
operator>>(basic_istream<charT, traits>& is, |
493 |
uniform_int_distribution& x); |
494 |
}; |
495 |
|
496 |
template<class RealType = double> |
497 |
class uniform_real_distribution |
498 |
{ |
499 |
public: |
500 |
// types |
501 |
typedef RealType result_type; |
502 |
|
503 |
class param_type |
504 |
{ |
505 |
public: |
506 |
typedef uniform_real_distribution distribution_type; |
507 |
|
508 |
explicit param_type(RealType a = 0, |
509 |
RealType b = 1); |
510 |
|
511 |
result_type a() const; |
512 |
result_type b() const; |
513 |
|
514 |
friend bool operator==(const param_type& x, const param_type& y); |
515 |
friend bool operator!=(const param_type& x, const param_type& y); |
516 |
}; |
517 |
|
518 |
// constructors and reset functions |
519 |
explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0); |
520 |
explicit uniform_real_distribution(const param_type& parm); |
521 |
void reset(); |
522 |
|
523 |
// generating functions |
524 |
template<class URNG> result_type operator()(URNG& g); |
525 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
526 |
|
527 |
// property functions |
528 |
result_type a() const; |
529 |
result_type b() const; |
530 |
|
531 |
param_type param() const; |
532 |
void param(const param_type& parm); |
533 |
|
534 |
result_type min() const; |
535 |
result_type max() const; |
536 |
|
537 |
friend bool operator==(const uniform_real_distribution& x, |
538 |
const uniform_real_distribution& y); |
539 |
friend bool operator!=(const uniform_real_distribution& x, |
540 |
const uniform_real_distribution& y); |
541 |
|
542 |
template <class charT, class traits> |
543 |
friend |
544 |
basic_ostream<charT, traits>& |
545 |
operator<<(basic_ostream<charT, traits>& os, |
546 |
const uniform_real_distribution& x); |
547 |
|
548 |
template <class charT, class traits> |
549 |
friend |
550 |
basic_istream<charT, traits>& |
551 |
operator>>(basic_istream<charT, traits>& is, |
552 |
uniform_real_distribution& x); |
553 |
}; |
554 |
|
555 |
class bernoulli_distribution |
556 |
{ |
557 |
public: |
558 |
// types |
559 |
typedef bool result_type; |
560 |
|
561 |
class param_type |
562 |
{ |
563 |
public: |
564 |
typedef bernoulli_distribution distribution_type; |
565 |
|
566 |
explicit param_type(double p = 0.5); |
567 |
|
568 |
double p() const; |
569 |
|
570 |
friend bool operator==(const param_type& x, const param_type& y); |
571 |
friend bool operator!=(const param_type& x, const param_type& y); |
572 |
}; |
573 |
|
574 |
// constructors and reset functions |
575 |
explicit bernoulli_distribution(double p = 0.5); |
576 |
explicit bernoulli_distribution(const param_type& parm); |
577 |
void reset(); |
578 |
|
579 |
// generating functions |
580 |
template<class URNG> result_type operator()(URNG& g); |
581 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
582 |
|
583 |
// property functions |
584 |
double p() const; |
585 |
|
586 |
param_type param() const; |
587 |
void param(const param_type& parm); |
588 |
|
589 |
result_type min() const; |
590 |
result_type max() const; |
591 |
|
592 |
friend bool operator==(const bernoulli_distribution& x, |
593 |
const bernoulli_distribution& y); |
594 |
friend bool operator!=(const bernoulli_distribution& x, |
595 |
const bernoulli_distribution& y); |
596 |
|
597 |
template <class charT, class traits> |
598 |
friend |
599 |
basic_ostream<charT, traits>& |
600 |
operator<<(basic_ostream<charT, traits>& os, |
601 |
const bernoulli_distribution& x); |
602 |
|
603 |
template <class charT, class traits> |
604 |
friend |
605 |
basic_istream<charT, traits>& |
606 |
operator>>(basic_istream<charT, traits>& is, |
607 |
bernoulli_distribution& x); |
608 |
}; |
609 |
|
610 |
template<class IntType = int> |
611 |
class binomial_distribution |
612 |
{ |
613 |
public: |
614 |
// types |
615 |
typedef IntType result_type; |
616 |
|
617 |
class param_type |
618 |
{ |
619 |
public: |
620 |
typedef binomial_distribution distribution_type; |
621 |
|
622 |
explicit param_type(IntType t = 1, double p = 0.5); |
623 |
|
624 |
IntType t() const; |
625 |
double p() const; |
626 |
|
627 |
friend bool operator==(const param_type& x, const param_type& y); |
628 |
friend bool operator!=(const param_type& x, const param_type& y); |
629 |
}; |
630 |
|
631 |
// constructors and reset functions |
632 |
explicit binomial_distribution(IntType t = 1, double p = 0.5); |
633 |
explicit binomial_distribution(const param_type& parm); |
634 |
void reset(); |
635 |
|
636 |
// generating functions |
637 |
template<class URNG> result_type operator()(URNG& g); |
638 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
639 |
|
640 |
// property functions |
641 |
IntType t() const; |
642 |
double p() const; |
643 |
|
644 |
param_type param() const; |
645 |
void param(const param_type& parm); |
646 |
|
647 |
result_type min() const; |
648 |
result_type max() const; |
649 |
|
650 |
friend bool operator==(const binomial_distribution& x, |
651 |
const binomial_distribution& y); |
652 |
friend bool operator!=(const binomial_distribution& x, |
653 |
const binomial_distribution& y); |
654 |
|
655 |
template <class charT, class traits> |
656 |
friend |
657 |
basic_ostream<charT, traits>& |
658 |
operator<<(basic_ostream<charT, traits>& os, |
659 |
const binomial_distribution& x); |
660 |
|
661 |
template <class charT, class traits> |
662 |
friend |
663 |
basic_istream<charT, traits>& |
664 |
operator>>(basic_istream<charT, traits>& is, |
665 |
binomial_distribution& x); |
666 |
}; |
667 |
|
668 |
template<class IntType = int> |
669 |
class geometric_distribution |
670 |
{ |
671 |
public: |
672 |
// types |
673 |
typedef IntType result_type; |
674 |
|
675 |
class param_type |
676 |
{ |
677 |
public: |
678 |
typedef geometric_distribution distribution_type; |
679 |
|
680 |
explicit param_type(double p = 0.5); |
681 |
|
682 |
double p() const; |
683 |
|
684 |
friend bool operator==(const param_type& x, const param_type& y); |
685 |
friend bool operator!=(const param_type& x, const param_type& y); |
686 |
}; |
687 |
|
688 |
// constructors and reset functions |
689 |
explicit geometric_distribution(double p = 0.5); |
690 |
explicit geometric_distribution(const param_type& parm); |
691 |
void reset(); |
692 |
|
693 |
// generating functions |
694 |
template<class URNG> result_type operator()(URNG& g); |
695 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
696 |
|
697 |
// property functions |
698 |
double p() const; |
699 |
|
700 |
param_type param() const; |
701 |
void param(const param_type& parm); |
702 |
|
703 |
result_type min() const; |
704 |
result_type max() const; |
705 |
|
706 |
friend bool operator==(const geometric_distribution& x, |
707 |
const geometric_distribution& y); |
708 |
friend bool operator!=(const geometric_distribution& x, |
709 |
const geometric_distribution& y); |
710 |
|
711 |
template <class charT, class traits> |
712 |
friend |
713 |
basic_ostream<charT, traits>& |
714 |
operator<<(basic_ostream<charT, traits>& os, |
715 |
const geometric_distribution& x); |
716 |
|
717 |
template <class charT, class traits> |
718 |
friend |
719 |
basic_istream<charT, traits>& |
720 |
operator>>(basic_istream<charT, traits>& is, |
721 |
geometric_distribution& x); |
722 |
}; |
723 |
|
724 |
template<class IntType = int> |
725 |
class negative_binomial_distribution |
726 |
{ |
727 |
public: |
728 |
// types |
729 |
typedef IntType result_type; |
730 |
|
731 |
class param_type |
732 |
{ |
733 |
public: |
734 |
typedef negative_binomial_distribution distribution_type; |
735 |
|
736 |
explicit param_type(result_type k = 1, double p = 0.5); |
737 |
|
738 |
result_type k() const; |
739 |
double p() const; |
740 |
|
741 |
friend bool operator==(const param_type& x, const param_type& y); |
742 |
friend bool operator!=(const param_type& x, const param_type& y); |
743 |
}; |
744 |
|
745 |
// constructor and reset functions |
746 |
explicit negative_binomial_distribution(result_type k = 1, double p = 0.5); |
747 |
explicit negative_binomial_distribution(const param_type& parm); |
748 |
void reset(); |
749 |
|
750 |
// generating functions |
751 |
template<class URNG> result_type operator()(URNG& g); |
752 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
753 |
|
754 |
// property functions |
755 |
result_type k() const; |
756 |
double p() const; |
757 |
|
758 |
param_type param() const; |
759 |
void param(const param_type& parm); |
760 |
|
761 |
result_type min() const; |
762 |
result_type max() const; |
763 |
|
764 |
friend bool operator==(const negative_binomial_distribution& x, |
765 |
const negative_binomial_distribution& y); |
766 |
friend bool operator!=(const negative_binomial_distribution& x, |
767 |
const negative_binomial_distribution& y); |
768 |
|
769 |
template <class charT, class traits> |
770 |
friend |
771 |
basic_ostream<charT, traits>& |
772 |
operator<<(basic_ostream<charT, traits>& os, |
773 |
const negative_binomial_distribution& x); |
774 |
|
775 |
template <class charT, class traits> |
776 |
friend |
777 |
basic_istream<charT, traits>& |
778 |
operator>>(basic_istream<charT, traits>& is, |
779 |
negative_binomial_distribution& x); |
780 |
}; |
781 |
|
782 |
template<class IntType = int> |
783 |
class poisson_distribution |
784 |
{ |
785 |
public: |
786 |
// types |
787 |
typedef IntType result_type; |
788 |
|
789 |
class param_type |
790 |
{ |
791 |
public: |
792 |
typedef poisson_distribution distribution_type; |
793 |
|
794 |
explicit param_type(double mean = 1.0); |
795 |
|
796 |
double mean() const; |
797 |
|
798 |
friend bool operator==(const param_type& x, const param_type& y); |
799 |
friend bool operator!=(const param_type& x, const param_type& y); |
800 |
}; |
801 |
|
802 |
// constructors and reset functions |
803 |
explicit poisson_distribution(double mean = 1.0); |
804 |
explicit poisson_distribution(const param_type& parm); |
805 |
void reset(); |
806 |
|
807 |
// generating functions |
808 |
template<class URNG> result_type operator()(URNG& g); |
809 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
810 |
|
811 |
// property functions |
812 |
double mean() const; |
813 |
|
814 |
param_type param() const; |
815 |
void param(const param_type& parm); |
816 |
|
817 |
result_type min() const; |
818 |
result_type max() const; |
819 |
|
820 |
friend bool operator==(const poisson_distribution& x, |
821 |
const poisson_distribution& y); |
822 |
friend bool operator!=(const poisson_distribution& x, |
823 |
const poisson_distribution& y); |
824 |
|
825 |
template <class charT, class traits> |
826 |
friend |
827 |
basic_ostream<charT, traits>& |
828 |
operator<<(basic_ostream<charT, traits>& os, |
829 |
const poisson_distribution& x); |
830 |
|
831 |
template <class charT, class traits> |
832 |
friend |
833 |
basic_istream<charT, traits>& |
834 |
operator>>(basic_istream<charT, traits>& is, |
835 |
poisson_distribution& x); |
836 |
}; |
837 |
|
838 |
template<class RealType = double> |
839 |
class exponential_distribution |
840 |
{ |
841 |
public: |
842 |
// types |
843 |
typedef RealType result_type; |
844 |
|
845 |
class param_type |
846 |
{ |
847 |
public: |
848 |
typedef exponential_distribution distribution_type; |
849 |
|
850 |
explicit param_type(result_type lambda = 1.0); |
851 |
|
852 |
result_type lambda() const; |
853 |
|
854 |
friend bool operator==(const param_type& x, const param_type& y); |
855 |
friend bool operator!=(const param_type& x, const param_type& y); |
856 |
}; |
857 |
|
858 |
// constructors and reset functions |
859 |
explicit exponential_distribution(result_type lambda = 1.0); |
860 |
explicit exponential_distribution(const param_type& parm); |
861 |
void reset(); |
862 |
|
863 |
// generating functions |
864 |
template<class URNG> result_type operator()(URNG& g); |
865 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
866 |
|
867 |
// property functions |
868 |
result_type lambda() const; |
869 |
|
870 |
param_type param() const; |
871 |
void param(const param_type& parm); |
872 |
|
873 |
result_type min() const; |
874 |
result_type max() const; |
875 |
|
876 |
friend bool operator==(const exponential_distribution& x, |
877 |
const exponential_distribution& y); |
878 |
friend bool operator!=(const exponential_distribution& x, |
879 |
const exponential_distribution& y); |
880 |
|
881 |
template <class charT, class traits> |
882 |
friend |
883 |
basic_ostream<charT, traits>& |
884 |
operator<<(basic_ostream<charT, traits>& os, |
885 |
const exponential_distribution& x); |
886 |
|
887 |
template <class charT, class traits> |
888 |
friend |
889 |
basic_istream<charT, traits>& |
890 |
operator>>(basic_istream<charT, traits>& is, |
891 |
exponential_distribution& x); |
892 |
}; |
893 |
|
894 |
template<class RealType = double> |
895 |
class gamma_distribution |
896 |
{ |
897 |
public: |
898 |
// types |
899 |
typedef RealType result_type; |
900 |
|
901 |
class param_type |
902 |
{ |
903 |
public: |
904 |
typedef gamma_distribution distribution_type; |
905 |
|
906 |
explicit param_type(result_type alpha = 1, result_type beta = 1); |
907 |
|
908 |
result_type alpha() const; |
909 |
result_type beta() const; |
910 |
|
911 |
friend bool operator==(const param_type& x, const param_type& y); |
912 |
friend bool operator!=(const param_type& x, const param_type& y); |
913 |
}; |
914 |
|
915 |
// constructors and reset functions |
916 |
explicit gamma_distribution(result_type alpha = 1, result_type beta = 1); |
917 |
explicit gamma_distribution(const param_type& parm); |
918 |
void reset(); |
919 |
|
920 |
// generating functions |
921 |
template<class URNG> result_type operator()(URNG& g); |
922 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
923 |
|
924 |
// property functions |
925 |
result_type alpha() const; |
926 |
result_type beta() const; |
927 |
|
928 |
param_type param() const; |
929 |
void param(const param_type& parm); |
930 |
|
931 |
result_type min() const; |
932 |
result_type max() const; |
933 |
|
934 |
friend bool operator==(const gamma_distribution& x, |
935 |
const gamma_distribution& y); |
936 |
friend bool operator!=(const gamma_distribution& x, |
937 |
const gamma_distribution& y); |
938 |
|
939 |
template <class charT, class traits> |
940 |
friend |
941 |
basic_ostream<charT, traits>& |
942 |
operator<<(basic_ostream<charT, traits>& os, |
943 |
const gamma_distribution& x); |
944 |
|
945 |
template <class charT, class traits> |
946 |
friend |
947 |
basic_istream<charT, traits>& |
948 |
operator>>(basic_istream<charT, traits>& is, |
949 |
gamma_distribution& x); |
950 |
}; |
951 |
|
952 |
template<class RealType = double> |
953 |
class weibull_distribution |
954 |
{ |
955 |
public: |
956 |
// types |
957 |
typedef RealType result_type; |
958 |
|
959 |
class param_type |
960 |
{ |
961 |
public: |
962 |
typedef weibull_distribution distribution_type; |
963 |
|
964 |
explicit param_type(result_type alpha = 1, result_type beta = 1); |
965 |
|
966 |
result_type a() const; |
967 |
result_type b() const; |
968 |
|
969 |
friend bool operator==(const param_type& x, const param_type& y); |
970 |
friend bool operator!=(const param_type& x, const param_type& y); |
971 |
}; |
972 |
|
973 |
// constructor and reset functions |
974 |
explicit weibull_distribution(result_type a = 1, result_type b = 1); |
975 |
explicit weibull_distribution(const param_type& parm); |
976 |
void reset(); |
977 |
|
978 |
// generating functions |
979 |
template<class URNG> result_type operator()(URNG& g); |
980 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
981 |
|
982 |
// property functions |
983 |
result_type a() const; |
984 |
result_type b() const; |
985 |
|
986 |
param_type param() const; |
987 |
void param(const param_type& parm); |
988 |
|
989 |
result_type min() const; |
990 |
result_type max() const; |
991 |
|
992 |
friend bool operator==(const weibull_distribution& x, |
993 |
const weibull_distribution& y); |
994 |
friend bool operator!=(const weibull_distribution& x, |
995 |
const weibull_distribution& y); |
996 |
|
997 |
template <class charT, class traits> |
998 |
friend |
999 |
basic_ostream<charT, traits>& |
1000 |
operator<<(basic_ostream<charT, traits>& os, |
1001 |
const weibull_distribution& x); |
1002 |
|
1003 |
template <class charT, class traits> |
1004 |
friend |
1005 |
basic_istream<charT, traits>& |
1006 |
operator>>(basic_istream<charT, traits>& is, |
1007 |
weibull_distribution& x); |
1008 |
}; |
1009 |
|
1010 |
template<class RealType = double> |
1011 |
class extreme_value_distribution |
1012 |
{ |
1013 |
public: |
1014 |
// types |
1015 |
typedef RealType result_type; |
1016 |
|
1017 |
class param_type |
1018 |
{ |
1019 |
public: |
1020 |
typedef extreme_value_distribution distribution_type; |
1021 |
|
1022 |
explicit param_type(result_type a = 0, result_type b = 1); |
1023 |
|
1024 |
result_type a() const; |
1025 |
result_type b() const; |
1026 |
|
1027 |
friend bool operator==(const param_type& x, const param_type& y); |
1028 |
friend bool operator!=(const param_type& x, const param_type& y); |
1029 |
}; |
1030 |
|
1031 |
// constructor and reset functions |
1032 |
explicit extreme_value_distribution(result_type a = 0, result_type b = 1); |
1033 |
explicit extreme_value_distribution(const param_type& parm); |
1034 |
void reset(); |
1035 |
|
1036 |
// generating functions |
1037 |
template<class URNG> result_type operator()(URNG& g); |
1038 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
1039 |
|
1040 |
// property functions |
1041 |
result_type a() const; |
1042 |
result_type b() const; |
1043 |
|
1044 |
param_type param() const; |
1045 |
void param(const param_type& parm); |
1046 |
|
1047 |
result_type min() const; |
1048 |
result_type max() const; |
1049 |
|
1050 |
friend bool operator==(const extreme_value_distribution& x, |
1051 |
const extreme_value_distribution& y); |
1052 |
friend bool operator!=(const extreme_value_distribution& x, |
1053 |
const extreme_value_distribution& y); |
1054 |
|
1055 |
template <class charT, class traits> |
1056 |
friend |
1057 |
basic_ostream<charT, traits>& |
1058 |
operator<<(basic_ostream<charT, traits>& os, |
1059 |
const extreme_value_distribution& x); |
1060 |
|
1061 |
template <class charT, class traits> |
1062 |
friend |
1063 |
basic_istream<charT, traits>& |
1064 |
operator>>(basic_istream<charT, traits>& is, |
1065 |
extreme_value_distribution& x); |
1066 |
}; |
1067 |
|
1068 |
template<class RealType = double> |
1069 |
class normal_distribution |
1070 |
{ |
1071 |
public: |
1072 |
// types |
1073 |
typedef RealType result_type; |
1074 |
|
1075 |
class param_type |
1076 |
{ |
1077 |
public: |
1078 |
typedef normal_distribution distribution_type; |
1079 |
|
1080 |
explicit param_type(result_type mean = 0, result_type stddev = 1); |
1081 |
|
1082 |
result_type mean() const; |
1083 |
result_type stddev() const; |
1084 |
|
1085 |
friend bool operator==(const param_type& x, const param_type& y); |
1086 |
friend bool operator!=(const param_type& x, const param_type& y); |
1087 |
}; |
1088 |
|
1089 |
// constructors and reset functions |
1090 |
explicit normal_distribution(result_type mean = 0, result_type stddev = 1); |
1091 |
explicit normal_distribution(const param_type& parm); |
1092 |
void reset(); |
1093 |
|
1094 |
// generating functions |
1095 |
template<class URNG> result_type operator()(URNG& g); |
1096 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
1097 |
|
1098 |
// property functions |
1099 |
result_type mean() const; |
1100 |
result_type stddev() const; |
1101 |
|
1102 |
param_type param() const; |
1103 |
void param(const param_type& parm); |
1104 |
|
1105 |
result_type min() const; |
1106 |
result_type max() const; |
1107 |
|
1108 |
friend bool operator==(const normal_distribution& x, |
1109 |
const normal_distribution& y); |
1110 |
friend bool operator!=(const normal_distribution& x, |
1111 |
const normal_distribution& y); |
1112 |
|
1113 |
template <class charT, class traits> |
1114 |
friend |
1115 |
basic_ostream<charT, traits>& |
1116 |
operator<<(basic_ostream<charT, traits>& os, |
1117 |
const normal_distribution& x); |
1118 |
|
1119 |
template <class charT, class traits> |
1120 |
friend |
1121 |
basic_istream<charT, traits>& |
1122 |
operator>>(basic_istream<charT, traits>& is, |
1123 |
normal_distribution& x); |
1124 |
}; |
1125 |
|
1126 |
template<class RealType = double> |
1127 |
class lognormal_distribution |
1128 |
{ |
1129 |
public: |
1130 |
// types |
1131 |
typedef RealType result_type; |
1132 |
|
1133 |
class param_type |
1134 |
{ |
1135 |
public: |
1136 |
typedef lognormal_distribution distribution_type; |
1137 |
|
1138 |
explicit param_type(result_type m = 0, result_type s = 1); |
1139 |
|
1140 |
result_type m() const; |
1141 |
result_type s() const; |
1142 |
|
1143 |
friend bool operator==(const param_type& x, const param_type& y); |
1144 |
friend bool operator!=(const param_type& x, const param_type& y); |
1145 |
}; |
1146 |
|
1147 |
// constructor and reset functions |
1148 |
explicit lognormal_distribution(result_type m = 0, result_type s = 1); |
1149 |
explicit lognormal_distribution(const param_type& parm); |
1150 |
void reset(); |
1151 |
|
1152 |
// generating functions |
1153 |
template<class URNG> result_type operator()(URNG& g); |
1154 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
1155 |
|
1156 |
// property functions |
1157 |
result_type m() const; |
1158 |
result_type s() const; |
1159 |
|
1160 |
param_type param() const; |
1161 |
void param(const param_type& parm); |
1162 |
|
1163 |
result_type min() const; |
1164 |
result_type max() const; |
1165 |
|
1166 |
friend bool operator==(const lognormal_distribution& x, |
1167 |
const lognormal_distribution& y); |
1168 |
friend bool operator!=(const lognormal_distribution& x, |
1169 |
const lognormal_distribution& y); |
1170 |
|
1171 |
template <class charT, class traits> |
1172 |
friend |
1173 |
basic_ostream<charT, traits>& |
1174 |
operator<<(basic_ostream<charT, traits>& os, |
1175 |
const lognormal_distribution& x); |
1176 |
|
1177 |
template <class charT, class traits> |
1178 |
friend |
1179 |
basic_istream<charT, traits>& |
1180 |
operator>>(basic_istream<charT, traits>& is, |
1181 |
lognormal_distribution& x); |
1182 |
}; |
1183 |
|
1184 |
template<class RealType = double> |
1185 |
class chi_squared_distribution |
1186 |
{ |
1187 |
public: |
1188 |
// types |
1189 |
typedef RealType result_type; |
1190 |
|
1191 |
class param_type |
1192 |
{ |
1193 |
public: |
1194 |
typedef chi_squared_distribution distribution_type; |
1195 |
|
1196 |
explicit param_type(result_type n = 1); |
1197 |
|
1198 |
result_type n() const; |
1199 |
|
1200 |
friend bool operator==(const param_type& x, const param_type& y); |
1201 |
friend bool operator!=(const param_type& x, const param_type& y); |
1202 |
}; |
1203 |
|
1204 |
// constructor and reset functions |
1205 |
explicit chi_squared_distribution(result_type n = 1); |
1206 |
explicit chi_squared_distribution(const param_type& parm); |
1207 |
void reset(); |
1208 |
|
1209 |
// generating functions |
1210 |
template<class URNG> result_type operator()(URNG& g); |
1211 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
1212 |
|
1213 |
// property functions |
1214 |
result_type n() const; |
1215 |
|
1216 |
param_type param() const; |
1217 |
void param(const param_type& parm); |
1218 |
|
1219 |
result_type min() const; |
1220 |
result_type max() const; |
1221 |
|
1222 |
friend bool operator==(const chi_squared_distribution& x, |
1223 |
const chi_squared_distribution& y); |
1224 |
friend bool operator!=(const chi_squared_distribution& x, |
1225 |
const chi_squared_distribution& y); |
1226 |
|
1227 |
template <class charT, class traits> |
1228 |
friend |
1229 |
basic_ostream<charT, traits>& |
1230 |
operator<<(basic_ostream<charT, traits>& os, |
1231 |
const chi_squared_distribution& x); |
1232 |
|
1233 |
template <class charT, class traits> |
1234 |
friend |
1235 |
basic_istream<charT, traits>& |
1236 |
operator>>(basic_istream<charT, traits>& is, |
1237 |
chi_squared_distribution& x); |
1238 |
}; |
1239 |
|
1240 |
template<class RealType = double> |
1241 |
class cauchy_distribution |
1242 |
{ |
1243 |
public: |
1244 |
// types |
1245 |
typedef RealType result_type; |
1246 |
|
1247 |
class param_type |
1248 |
{ |
1249 |
public: |
1250 |
typedef cauchy_distribution distribution_type; |
1251 |
|
1252 |
explicit param_type(result_type a = 0, result_type b = 1); |
1253 |
|
1254 |
result_type a() const; |
1255 |
result_type b() const; |
1256 |
|
1257 |
friend bool operator==(const param_type& x, const param_type& y); |
1258 |
friend bool operator!=(const param_type& x, const param_type& y); |
1259 |
}; |
1260 |
|
1261 |
// constructor and reset functions |
1262 |
explicit cauchy_distribution(result_type a = 0, result_type b = 1); |
1263 |
explicit cauchy_distribution(const param_type& parm); |
1264 |
void reset(); |
1265 |
|
1266 |
// generating functions |
1267 |
template<class URNG> result_type operator()(URNG& g); |
1268 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
1269 |
|
1270 |
// property functions |
1271 |
result_type a() const; |
1272 |
result_type b() const; |
1273 |
|
1274 |
param_type param() const; |
1275 |
void param(const param_type& parm); |
1276 |
|
1277 |
result_type min() const; |
1278 |
result_type max() const; |
1279 |
|
1280 |
friend bool operator==(const cauchy_distribution& x, |
1281 |
const cauchy_distribution& y); |
1282 |
friend bool operator!=(const cauchy_distribution& x, |
1283 |
const cauchy_distribution& y); |
1284 |
|
1285 |
template <class charT, class traits> |
1286 |
friend |
1287 |
basic_ostream<charT, traits>& |
1288 |
operator<<(basic_ostream<charT, traits>& os, |
1289 |
const cauchy_distribution& x); |
1290 |
|
1291 |
template <class charT, class traits> |
1292 |
friend |
1293 |
basic_istream<charT, traits>& |
1294 |
operator>>(basic_istream<charT, traits>& is, |
1295 |
cauchy_distribution& x); |
1296 |
}; |
1297 |
|
1298 |
template<class RealType = double> |
1299 |
class fisher_f_distribution |
1300 |
{ |
1301 |
public: |
1302 |
// types |
1303 |
typedef RealType result_type; |
1304 |
|
1305 |
class param_type |
1306 |
{ |
1307 |
public: |
1308 |
typedef fisher_f_distribution distribution_type; |
1309 |
|
1310 |
explicit param_type(result_type m = 1, result_type n = 1); |
1311 |
|
1312 |
result_type m() const; |
1313 |
result_type n() const; |
1314 |
|
1315 |
friend bool operator==(const param_type& x, const param_type& y); |
1316 |
friend bool operator!=(const param_type& x, const param_type& y); |
1317 |
}; |
1318 |
|
1319 |
// constructor and reset functions |
1320 |
explicit fisher_f_distribution(result_type m = 1, result_type n = 1); |
1321 |
explicit fisher_f_distribution(const param_type& parm); |
1322 |
void reset(); |
1323 |
|
1324 |
// generating functions |
1325 |
template<class URNG> result_type operator()(URNG& g); |
1326 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
1327 |
|
1328 |
// property functions |
1329 |
result_type m() const; |
1330 |
result_type n() const; |
1331 |
|
1332 |
param_type param() const; |
1333 |
void param(const param_type& parm); |
1334 |
|
1335 |
result_type min() const; |
1336 |
result_type max() const; |
1337 |
|
1338 |
friend bool operator==(const fisher_f_distribution& x, |
1339 |
const fisher_f_distribution& y); |
1340 |
friend bool operator!=(const fisher_f_distribution& x, |
1341 |
const fisher_f_distribution& y); |
1342 |
|
1343 |
template <class charT, class traits> |
1344 |
friend |
1345 |
basic_ostream<charT, traits>& |
1346 |
operator<<(basic_ostream<charT, traits>& os, |
1347 |
const fisher_f_distribution& x); |
1348 |
|
1349 |
template <class charT, class traits> |
1350 |
friend |
1351 |
basic_istream<charT, traits>& |
1352 |
operator>>(basic_istream<charT, traits>& is, |
1353 |
fisher_f_distribution& x); |
1354 |
}; |
1355 |
|
1356 |
template<class RealType = double> |
1357 |
class student_t_distribution |
1358 |
{ |
1359 |
public: |
1360 |
// types |
1361 |
typedef RealType result_type; |
1362 |
|
1363 |
class param_type |
1364 |
{ |
1365 |
public: |
1366 |
typedef student_t_distribution distribution_type; |
1367 |
|
1368 |
explicit param_type(result_type n = 1); |
1369 |
|
1370 |
result_type n() const; |
1371 |
|
1372 |
friend bool operator==(const param_type& x, const param_type& y); |
1373 |
friend bool operator!=(const param_type& x, const param_type& y); |
1374 |
}; |
1375 |
|
1376 |
// constructor and reset functions |
1377 |
explicit student_t_distribution(result_type n = 1); |
1378 |
explicit student_t_distribution(const param_type& parm); |
1379 |
void reset(); |
1380 |
|
1381 |
// generating functions |
1382 |
template<class URNG> result_type operator()(URNG& g); |
1383 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
1384 |
|
1385 |
// property functions |
1386 |
result_type n() const; |
1387 |
|
1388 |
param_type param() const; |
1389 |
void param(const param_type& parm); |
1390 |
|
1391 |
result_type min() const; |
1392 |
result_type max() const; |
1393 |
|
1394 |
friend bool operator==(const student_t_distribution& x, |
1395 |
const student_t_distribution& y); |
1396 |
friend bool operator!=(const student_t_distribution& x, |
1397 |
const student_t_distribution& y); |
1398 |
|
1399 |
template <class charT, class traits> |
1400 |
friend |
1401 |
basic_ostream<charT, traits>& |
1402 |
operator<<(basic_ostream<charT, traits>& os, |
1403 |
const student_t_distribution& x); |
1404 |
|
1405 |
template <class charT, class traits> |
1406 |
friend |
1407 |
basic_istream<charT, traits>& |
1408 |
operator>>(basic_istream<charT, traits>& is, |
1409 |
student_t_distribution& x); |
1410 |
}; |
1411 |
|
1412 |
template<class IntType = int> |
1413 |
class discrete_distribution |
1414 |
{ |
1415 |
public: |
1416 |
// types |
1417 |
typedef IntType result_type; |
1418 |
|
1419 |
class param_type |
1420 |
{ |
1421 |
public: |
1422 |
typedef discrete_distribution distribution_type; |
1423 |
|
1424 |
param_type(); |
1425 |
template<class InputIterator> |
1426 |
param_type(InputIterator firstW, InputIterator lastW); |
1427 |
param_type(initializer_list<double> wl); |
1428 |
template<class UnaryOperation> |
1429 |
param_type(size_t nw, double xmin, double xmax, UnaryOperation fw); |
1430 |
|
1431 |
vector<double> probabilities() const; |
1432 |
|
1433 |
friend bool operator==(const param_type& x, const param_type& y); |
1434 |
friend bool operator!=(const param_type& x, const param_type& y); |
1435 |
}; |
1436 |
|
1437 |
// constructor and reset functions |
1438 |
discrete_distribution(); |
1439 |
template<class InputIterator> |
1440 |
discrete_distribution(InputIterator firstW, InputIterator lastW); |
1441 |
discrete_distribution(initializer_list<double> wl); |
1442 |
template<class UnaryOperation> |
1443 |
discrete_distribution(size_t nw, double xmin, double xmax, |
1444 |
UnaryOperation fw); |
1445 |
explicit discrete_distribution(const param_type& parm); |
1446 |
void reset(); |
1447 |
|
1448 |
// generating functions |
1449 |
template<class URNG> result_type operator()(URNG& g); |
1450 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
1451 |
|
1452 |
// property functions |
1453 |
vector<double> probabilities() const; |
1454 |
|
1455 |
param_type param() const; |
1456 |
void param(const param_type& parm); |
1457 |
|
1458 |
result_type min() const; |
1459 |
result_type max() const; |
1460 |
|
1461 |
friend bool operator==(const discrete_distribution& x, |
1462 |
const discrete_distribution& y); |
1463 |
friend bool operator!=(const discrete_distribution& x, |
1464 |
const discrete_distribution& y); |
1465 |
|
1466 |
template <class charT, class traits> |
1467 |
friend |
1468 |
basic_ostream<charT, traits>& |
1469 |
operator<<(basic_ostream<charT, traits>& os, |
1470 |
const discrete_distribution& x); |
1471 |
|
1472 |
template <class charT, class traits> |
1473 |
friend |
1474 |
basic_istream<charT, traits>& |
1475 |
operator>>(basic_istream<charT, traits>& is, |
1476 |
discrete_distribution& x); |
1477 |
}; |
1478 |
|
1479 |
template<class RealType = double> |
1480 |
class piecewise_constant_distribution |
1481 |
{ |
1482 |
// types |
1483 |
typedef RealType result_type; |
1484 |
|
1485 |
class param_type |
1486 |
{ |
1487 |
public: |
1488 |
typedef piecewise_constant_distribution distribution_type; |
1489 |
|
1490 |
param_type(); |
1491 |
template<class InputIteratorB, class InputIteratorW> |
1492 |
param_type(InputIteratorB firstB, InputIteratorB lastB, |
1493 |
InputIteratorW firstW); |
1494 |
template<class UnaryOperation> |
1495 |
param_type(initializer_list<result_type> bl, UnaryOperation fw); |
1496 |
template<class UnaryOperation> |
1497 |
param_type(size_t nw, result_type xmin, result_type xmax, |
1498 |
UnaryOperation fw); |
1499 |
|
1500 |
vector<result_type> intervals() const; |
1501 |
vector<result_type> densities() const; |
1502 |
|
1503 |
friend bool operator==(const param_type& x, const param_type& y); |
1504 |
friend bool operator!=(const param_type& x, const param_type& y); |
1505 |
}; |
1506 |
|
1507 |
// constructor and reset functions |
1508 |
piecewise_constant_distribution(); |
1509 |
template<class InputIteratorB, class InputIteratorW> |
1510 |
piecewise_constant_distribution(InputIteratorB firstB, |
1511 |
InputIteratorB lastB, |
1512 |
InputIteratorW firstW); |
1513 |
template<class UnaryOperation> |
1514 |
piecewise_constant_distribution(initializer_list<result_type> bl, |
1515 |
UnaryOperation fw); |
1516 |
template<class UnaryOperation> |
1517 |
piecewise_constant_distribution(size_t nw, result_type xmin, |
1518 |
result_type xmax, UnaryOperation fw); |
1519 |
explicit piecewise_constant_distribution(const param_type& parm); |
1520 |
void reset(); |
1521 |
|
1522 |
// generating functions |
1523 |
template<class URNG> result_type operator()(URNG& g); |
1524 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
1525 |
|
1526 |
// property functions |
1527 |
vector<result_type> intervals() const; |
1528 |
vector<result_type> densities() const; |
1529 |
|
1530 |
param_type param() const; |
1531 |
void param(const param_type& parm); |
1532 |
|
1533 |
result_type min() const; |
1534 |
result_type max() const; |
1535 |
|
1536 |
friend bool operator==(const piecewise_constant_distribution& x, |
1537 |
const piecewise_constant_distribution& y); |
1538 |
friend bool operator!=(const piecewise_constant_distribution& x, |
1539 |
const piecewise_constant_distribution& y); |
1540 |
|
1541 |
template <class charT, class traits> |
1542 |
friend |
1543 |
basic_ostream<charT, traits>& |
1544 |
operator<<(basic_ostream<charT, traits>& os, |
1545 |
const piecewise_constant_distribution& x); |
1546 |
|
1547 |
template <class charT, class traits> |
1548 |
friend |
1549 |
basic_istream<charT, traits>& |
1550 |
operator>>(basic_istream<charT, traits>& is, |
1551 |
piecewise_constant_distribution& x); |
1552 |
}; |
1553 |
|
1554 |
template<class RealType = double> |
1555 |
class piecewise_linear_distribution |
1556 |
{ |
1557 |
// types |
1558 |
typedef RealType result_type; |
1559 |
|
1560 |
class param_type |
1561 |
{ |
1562 |
public: |
1563 |
typedef piecewise_linear_distribution distribution_type; |
1564 |
|
1565 |
param_type(); |
1566 |
template<class InputIteratorB, class InputIteratorW> |
1567 |
param_type(InputIteratorB firstB, InputIteratorB lastB, |
1568 |
InputIteratorW firstW); |
1569 |
template<class UnaryOperation> |
1570 |
param_type(initializer_list<result_type> bl, UnaryOperation fw); |
1571 |
template<class UnaryOperation> |
1572 |
param_type(size_t nw, result_type xmin, result_type xmax, |
1573 |
UnaryOperation fw); |
1574 |
|
1575 |
vector<result_type> intervals() const; |
1576 |
vector<result_type> densities() const; |
1577 |
|
1578 |
friend bool operator==(const param_type& x, const param_type& y); |
1579 |
friend bool operator!=(const param_type& x, const param_type& y); |
1580 |
}; |
1581 |
|
1582 |
// constructor and reset functions |
1583 |
piecewise_linear_distribution(); |
1584 |
template<class InputIteratorB, class InputIteratorW> |
1585 |
piecewise_linear_distribution(InputIteratorB firstB, |
1586 |
InputIteratorB lastB, |
1587 |
InputIteratorW firstW); |
1588 |
|
1589 |
template<class UnaryOperation> |
1590 |
piecewise_linear_distribution(initializer_list<result_type> bl, |
1591 |
UnaryOperation fw); |
1592 |
|
1593 |
template<class UnaryOperation> |
1594 |
piecewise_linear_distribution(size_t nw, result_type xmin, |
1595 |
result_type xmax, UnaryOperation fw); |
1596 |
|
1597 |
explicit piecewise_linear_distribution(const param_type& parm); |
1598 |
void reset(); |
1599 |
|
1600 |
// generating functions |
1601 |
template<class URNG> result_type operator()(URNG& g); |
1602 |
template<class URNG> result_type operator()(URNG& g, const param_type& parm); |
1603 |
|
1604 |
// property functions |
1605 |
vector<result_type> intervals() const; |
1606 |
vector<result_type> densities() const; |
1607 |
|
1608 |
param_type param() const; |
1609 |
void param(const param_type& parm); |
1610 |
|
1611 |
result_type min() const; |
1612 |
result_type max() const; |
1613 |
|
1614 |
friend bool operator==(const piecewise_linear_distribution& x, |
1615 |
const piecewise_linear_distribution& y); |
1616 |
friend bool operator!=(const piecewise_linear_distribution& x, |
1617 |
const piecewise_linear_distribution& y); |
1618 |
|
1619 |
template <class charT, class traits> |
1620 |
friend |
1621 |
basic_ostream<charT, traits>& |
1622 |
operator<<(basic_ostream<charT, traits>& os, |
1623 |
const piecewise_linear_distribution& x); |
1624 |
|
1625 |
template <class charT, class traits> |
1626 |
friend |
1627 |
basic_istream<charT, traits>& |
1628 |
operator>>(basic_istream<charT, traits>& is, |
1629 |
piecewise_linear_distribution& x); |
1630 |
}; |
1631 |
|
1632 |
} // std |
1633 |
*/ |
1634 |
|
1635 |
#include <__config> |
1636 |
#include <cstddef> |
1637 |
#include <cstdint> |
1638 |
#include <cmath> |
1639 |
#include <type_traits> |
1640 |
#include <initializer_list> |
1641 |
#include <limits> |
1642 |
#include <algorithm> |
1643 |
#include <numeric> |
1644 |
#include <vector> |
1645 |
#include <string> |
1646 |
#include <istream> |
1647 |
#include <ostream> |
1648 |
|
1649 |
#include <__undef_min_max> |
1650 |
|
1651 |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
1652 |
#pragma GCC system_header |
1653 |
#endif |
1654 |
|
1655 |
_LIBCPP_BEGIN_NAMESPACE_STD |
1656 |
|
1657 |
// __is_seed_sequence |
1658 |
|
1659 |
template <class _Sseq, class _Engine> |
1660 |
struct __is_seed_sequence |
1661 |
{ |
1662 |
static _LIBCPP_CONSTEXPR const bool value = |
1663 |
!is_convertible<_Sseq, typename _Engine::result_type>::value && |
1664 |
!is_same<typename remove_cv<_Sseq>::type, _Engine>::value; |
1665 |
}; |
1666 |
|
1667 |
// linear_congruential_engine |
1668 |
|
1669 |
template <unsigned long long __a, unsigned long long __c, |
1670 |
unsigned long long __m, unsigned long long _Mp, |
1671 |
bool _MightOverflow = (__a != 0 && __m != 0 && __m-1 > (_Mp-__c)/__a)> |
1672 |
struct __lce_ta; |
1673 |
|
1674 |
// 64 |
1675 |
|
1676 |
template <unsigned long long __a, unsigned long long __c, unsigned long long __m> |
1677 |
struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), true> |
1678 |
{ |
1679 |
typedef unsigned long long result_type; |
1680 |
_LIBCPP_INLINE_VISIBILITY |
1681 |
static result_type next(result_type __x) |
1682 |
{ |
1683 |
// Schrage's algorithm |
1684 |
const result_type __q = __m / __a; |
1685 |
const result_type __r = __m % __a; |
1686 |
const result_type __t0 = __a * (__x % __q); |
1687 |
const result_type __t1 = __r * (__x / __q); |
1688 |
__x = __t0 + (__t0 < __t1) * __m - __t1; |
1689 |
__x += __c - (__x >= __m - __c) * __m; |
1690 |
return __x; |
1691 |
} |
1692 |
}; |
1693 |
|
1694 |
template <unsigned long long __a, unsigned long long __m> |
1695 |
struct __lce_ta<__a, 0, __m, (unsigned long long)(~0), true> |
1696 |
{ |
1697 |
typedef unsigned long long result_type; |
1698 |
_LIBCPP_INLINE_VISIBILITY |
1699 |
static result_type next(result_type __x) |
1700 |
{ |
1701 |
// Schrage's algorithm |
1702 |
const result_type __q = __m / __a; |
1703 |
const result_type __r = __m % __a; |
1704 |
const result_type __t0 = __a * (__x % __q); |
1705 |
const result_type __t1 = __r * (__x / __q); |
1706 |
__x = __t0 + (__t0 < __t1) * __m - __t1; |
1707 |
return __x; |
1708 |
} |
1709 |
}; |
1710 |
|
1711 |
template <unsigned long long __a, unsigned long long __c, unsigned long long __m> |
1712 |
struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), false> |
1713 |
{ |
1714 |
typedef unsigned long long result_type; |
1715 |
_LIBCPP_INLINE_VISIBILITY |
1716 |
static result_type next(result_type __x) |
1717 |
{ |
1718 |
return (__a * __x + __c) % __m; |
1719 |
} |
1720 |
}; |
1721 |
|
1722 |
template <unsigned long long __a, unsigned long long __c> |
1723 |
struct __lce_ta<__a, __c, 0, (unsigned long long)(~0), false> |
1724 |
{ |
1725 |
typedef unsigned long long result_type; |
1726 |
_LIBCPP_INLINE_VISIBILITY |
1727 |
static result_type next(result_type __x) |
1728 |
{ |
1729 |
return __a * __x + __c; |
1730 |
} |
1731 |
}; |
1732 |
|
1733 |
// 32 |
1734 |
|
1735 |
template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp> |
1736 |
struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), true> |
1737 |
{ |
1738 |
typedef unsigned result_type; |
1739 |
_LIBCPP_INLINE_VISIBILITY |
1740 |
static result_type next(result_type __x) |
1741 |
{ |
1742 |
const result_type __a = static_cast<result_type>(_Ap); |
1743 |
const result_type __c = static_cast<result_type>(_Cp); |
1744 |
const result_type __m = static_cast<result_type>(_Mp); |
1745 |
// Schrage's algorithm |
1746 |
const result_type __q = __m / __a; |
1747 |
const result_type __r = __m % __a; |
1748 |
const result_type __t0 = __a * (__x % __q); |
1749 |
const result_type __t1 = __r * (__x / __q); |
1750 |
__x = __t0 + (__t0 < __t1) * __m - __t1; |
1751 |
__x += __c - (__x >= __m - __c) * __m; |
1752 |
return __x; |
1753 |
} |
1754 |
}; |
1755 |
|
1756 |
template <unsigned long long _Ap, unsigned long long _Mp> |
1757 |
struct __lce_ta<_Ap, 0, _Mp, unsigned(~0), true> |
1758 |
{ |
1759 |
typedef unsigned result_type; |
1760 |
_LIBCPP_INLINE_VISIBILITY |
1761 |
static result_type next(result_type __x) |
1762 |
{ |
1763 |
const result_type __a = static_cast<result_type>(_Ap); |
1764 |
const result_type __m = static_cast<result_type>(_Mp); |
1765 |
// Schrage's algorithm |
1766 |
const result_type __q = __m / __a; |
1767 |
const result_type __r = __m % __a; |
1768 |
const result_type __t0 = __a * (__x % __q); |
1769 |
const result_type __t1 = __r * (__x / __q); |
1770 |
__x = __t0 + (__t0 < __t1) * __m - __t1; |
1771 |
return __x; |
1772 |
} |
1773 |
}; |
1774 |
|
1775 |
template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp> |
1776 |
struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), false> |
1777 |
{ |
1778 |
typedef unsigned result_type; |
1779 |
_LIBCPP_INLINE_VISIBILITY |
1780 |
static result_type next(result_type __x) |
1781 |
{ |
1782 |
const result_type __a = static_cast<result_type>(_Ap); |
1783 |
const result_type __c = static_cast<result_type>(_Cp); |
1784 |
const result_type __m = static_cast<result_type>(_Mp); |
1785 |
return (__a * __x + __c) % __m; |
1786 |
} |
1787 |
}; |
1788 |
|
1789 |
template <unsigned long long _Ap, unsigned long long _Cp> |
1790 |
struct __lce_ta<_Ap, _Cp, 0, unsigned(~0), false> |
1791 |
{ |
1792 |
typedef unsigned result_type; |
1793 |
_LIBCPP_INLINE_VISIBILITY |
1794 |
static result_type next(result_type __x) |
1795 |
{ |
1796 |
const result_type __a = static_cast<result_type>(_Ap); |
1797 |
const result_type __c = static_cast<result_type>(_Cp); |
1798 |
return __a * __x + __c; |
1799 |
} |
1800 |
}; |
1801 |
|
1802 |
// 16 |
1803 |
|
1804 |
template <unsigned long long __a, unsigned long long __c, unsigned long long __m, bool __b> |
1805 |
struct __lce_ta<__a, __c, __m, (unsigned short)(~0), __b> |
1806 |
{ |
1807 |
typedef unsigned short result_type; |
1808 |
_LIBCPP_INLINE_VISIBILITY |
1809 |
static result_type next(result_type __x) |
1810 |
{ |
1811 |
return static_cast<result_type>(__lce_ta<__a, __c, __m, unsigned(~0)>::next(__x)); |
1812 |
} |
1813 |
}; |
1814 |
|
1815 |
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> |
1816 |
class _LIBCPP_TYPE_VIS_ONLY linear_congruential_engine; |
1817 |
|
1818 |
template <class _CharT, class _Traits, |
1819 |
class _Up, _Up _Ap, _Up _Cp, _Up _Np> |
1820 |
_LIBCPP_INLINE_VISIBILITY |
1821 |
basic_ostream<_CharT, _Traits>& |
1822 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
1823 |
const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&); |
1824 |
|
1825 |
template <class _CharT, class _Traits, |
1826 |
class _Up, _Up _Ap, _Up _Cp, _Up _Np> |
1827 |
basic_istream<_CharT, _Traits>& |
1828 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
1829 |
linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x); |
1830 |
|
1831 |
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> |
1832 |
class _LIBCPP_TYPE_VIS_ONLY linear_congruential_engine |
1833 |
{ |
1834 |
public: |
1835 |
// types |
1836 |
typedef _UIntType result_type; |
1837 |
|
1838 |
private: |
1839 |
result_type __x_; |
1840 |
|
1841 |
static _LIBCPP_CONSTEXPR const result_type _Mp = result_type(~0); |
1842 |
|
1843 |
static_assert(__m == 0 || __a < __m, "linear_congruential_engine invalid parameters"); |
1844 |
static_assert(__m == 0 || __c < __m, "linear_congruential_engine invalid parameters"); |
1845 |
public: |
1846 |
static _LIBCPP_CONSTEXPR const result_type _Min = __c == 0u ? 1u: 0u; |
1847 |
static _LIBCPP_CONSTEXPR const result_type _Max = __m - 1u; |
1848 |
static_assert(_Min < _Max, "linear_congruential_engine invalid parameters"); |
1849 |
|
1850 |
// engine characteristics |
1851 |
static _LIBCPP_CONSTEXPR const result_type multiplier = __a; |
1852 |
static _LIBCPP_CONSTEXPR const result_type increment = __c; |
1853 |
static _LIBCPP_CONSTEXPR const result_type modulus = __m; |
1854 |
_LIBCPP_INLINE_VISIBILITY |
1855 |
static _LIBCPP_CONSTEXPR result_type min() {return _Min;} |
1856 |
_LIBCPP_INLINE_VISIBILITY |
1857 |
static _LIBCPP_CONSTEXPR result_type max() {return _Max;} |
1858 |
static _LIBCPP_CONSTEXPR const result_type default_seed = 1u; |
1859 |
|
1860 |
// constructors and seeding functions |
1861 |
_LIBCPP_INLINE_VISIBILITY |
1862 |
explicit linear_congruential_engine(result_type __s = default_seed) |
1863 |
{seed(__s);} |
1864 |
template<class _Sseq> |
1865 |
_LIBCPP_INLINE_VISIBILITY |
1866 |
explicit linear_congruential_engine(_Sseq& __q, |
1867 |
typename enable_if<__is_seed_sequence<_Sseq, linear_congruential_engine>::value>::type* = 0) |
1868 |
{seed(__q);} |
1869 |
_LIBCPP_INLINE_VISIBILITY |
1870 |
void seed(result_type __s = default_seed) |
1871 |
{seed(integral_constant<bool, __m == 0>(), |
1872 |
integral_constant<bool, __c == 0>(), __s);} |
1873 |
template<class _Sseq> |
1874 |
_LIBCPP_INLINE_VISIBILITY |
1875 |
typename enable_if |
1876 |
< |
1877 |
__is_seed_sequence<_Sseq, linear_congruential_engine>::value, |
1878 |
void |
1879 |
>::type |
1880 |
seed(_Sseq& __q) |
1881 |
{__seed(__q, integral_constant<unsigned, |
1882 |
1 + (__m == 0 ? (sizeof(result_type) * __CHAR_BIT__ - 1)/32 |
1883 |
: (__m > 0x100000000ull))>());} |
1884 |
|
1885 |
// generating functions |
1886 |
_LIBCPP_INLINE_VISIBILITY |
1887 |
result_type operator()() |
1888 |
{return __x_ = static_cast<result_type>(__lce_ta<__a, __c, __m, _Mp>::next(__x_));} |
1889 |
_LIBCPP_INLINE_VISIBILITY |
1890 |
void discard(unsigned long long __z) {for (; __z; --__z) operator()();} |
1891 |
|
1892 |
friend _LIBCPP_INLINE_VISIBILITY |
1893 |
bool operator==(const linear_congruential_engine& __x, |
1894 |
const linear_congruential_engine& __y) |
1895 |
{return __x.__x_ == __y.__x_;} |
1896 |
friend _LIBCPP_INLINE_VISIBILITY |
1897 |
bool operator!=(const linear_congruential_engine& __x, |
1898 |
const linear_congruential_engine& __y) |
1899 |
{return !(__x == __y);} |
1900 |
|
1901 |
private: |
1902 |
|
1903 |
_LIBCPP_INLINE_VISIBILITY |
1904 |
void seed(true_type, true_type, result_type __s) {__x_ = __s == 0 ? 1 : __s;} |
1905 |
_LIBCPP_INLINE_VISIBILITY |
1906 |
void seed(true_type, false_type, result_type __s) {__x_ = __s;} |
1907 |
_LIBCPP_INLINE_VISIBILITY |
1908 |
void seed(false_type, true_type, result_type __s) {__x_ = __s % __m == 0 ? |
1909 |
1 : __s % __m;} |
1910 |
_LIBCPP_INLINE_VISIBILITY |
1911 |
void seed(false_type, false_type, result_type __s) {__x_ = __s % __m;} |
1912 |
|
1913 |
template<class _Sseq> |
1914 |
void __seed(_Sseq& __q, integral_constant<unsigned, 1>); |
1915 |
template<class _Sseq> |
1916 |
void __seed(_Sseq& __q, integral_constant<unsigned, 2>); |
1917 |
|
1918 |
template <class _CharT, class _Traits, |
1919 |
class _Up, _Up _Ap, _Up _Cp, _Up _Np> |
1920 |
friend |
1921 |
basic_ostream<_CharT, _Traits>& |
1922 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
1923 |
const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&); |
1924 |
|
1925 |
template <class _CharT, class _Traits, |
1926 |
class _Up, _Up _Ap, _Up _Cp, _Up _Np> |
1927 |
friend |
1928 |
basic_istream<_CharT, _Traits>& |
1929 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
1930 |
linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x); |
1931 |
}; |
1932 |
|
1933 |
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> |
1934 |
_LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type |
1935 |
linear_congruential_engine<_UIntType, __a, __c, __m>::multiplier; |
1936 |
|
1937 |
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> |
1938 |
_LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type |
1939 |
linear_congruential_engine<_UIntType, __a, __c, __m>::increment; |
1940 |
|
1941 |
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> |
1942 |
_LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type |
1943 |
linear_congruential_engine<_UIntType, __a, __c, __m>::modulus; |
1944 |
|
1945 |
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> |
1946 |
_LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type |
1947 |
linear_congruential_engine<_UIntType, __a, __c, __m>::default_seed; |
1948 |
|
1949 |
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> |
1950 |
template<class _Sseq> |
1951 |
void |
1952 |
linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q, |
1953 |
integral_constant<unsigned, 1>) |
1954 |
{ |
1955 |
const unsigned __k = 1; |
1956 |
uint32_t __ar[__k+3]; |
1957 |
__q.generate(__ar, __ar + __k + 3); |
1958 |
result_type __s = static_cast<result_type>(__ar[3] % __m); |
1959 |
__x_ = __c == 0 && __s == 0 ? result_type(1) : __s; |
1960 |
} |
1961 |
|
1962 |
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> |
1963 |
template<class _Sseq> |
1964 |
void |
1965 |
linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q, |
1966 |
integral_constant<unsigned, 2>) |
1967 |
{ |
1968 |
const unsigned __k = 2; |
1969 |
uint32_t __ar[__k+3]; |
1970 |
__q.generate(__ar, __ar + __k + 3); |
1971 |
result_type __s = static_cast<result_type>((__ar[3] + |
1972 |
((uint64_t)__ar[4] << 32)) % __m); |
1973 |
__x_ = __c == 0 && __s == 0 ? result_type(1) : __s; |
1974 |
} |
1975 |
|
1976 |
template <class _CharT, class _Traits, |
1977 |
class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> |
1978 |
inline _LIBCPP_INLINE_VISIBILITY |
1979 |
basic_ostream<_CharT, _Traits>& |
1980 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
1981 |
const linear_congruential_engine<_UIntType, __a, __c, __m>& __x) |
1982 |
{ |
1983 |
__save_flags<_CharT, _Traits> __lx(__os); |
1984 |
__os.flags(ios_base::dec | ios_base::left); |
1985 |
__os.fill(__os.widen(' ')); |
1986 |
return __os << __x.__x_; |
1987 |
} |
1988 |
|
1989 |
template <class _CharT, class _Traits, |
1990 |
class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> |
1991 |
basic_istream<_CharT, _Traits>& |
1992 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
1993 |
linear_congruential_engine<_UIntType, __a, __c, __m>& __x) |
1994 |
{ |
1995 |
__save_flags<_CharT, _Traits> __lx(__is); |
1996 |
__is.flags(ios_base::dec | ios_base::skipws); |
1997 |
_UIntType __t; |
1998 |
__is >> __t; |
1999 |
if (!__is.fail()) |
2000 |
__x.__x_ = __t; |
2001 |
return __is; |
2002 |
} |
2003 |
|
2004 |
typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> |
2005 |
minstd_rand0; |
2006 |
typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647> |
2007 |
minstd_rand; |
2008 |
typedef minstd_rand default_random_engine; |
2009 |
// mersenne_twister_engine |
2010 |
|
2011 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2012 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2013 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2014 |
class _LIBCPP_TYPE_VIS_ONLY mersenne_twister_engine; |
2015 |
|
2016 |
template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2017 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2018 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2019 |
bool |
2020 |
operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2021 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x, |
2022 |
const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2023 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __y); |
2024 |
|
2025 |
template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2026 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2027 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2028 |
_LIBCPP_INLINE_VISIBILITY |
2029 |
bool |
2030 |
operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2031 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x, |
2032 |
const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2033 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __y); |
2034 |
|
2035 |
template <class _CharT, class _Traits, |
2036 |
class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2037 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2038 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2039 |
basic_ostream<_CharT, _Traits>& |
2040 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
2041 |
const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2042 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x); |
2043 |
|
2044 |
template <class _CharT, class _Traits, |
2045 |
class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2046 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2047 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2048 |
basic_istream<_CharT, _Traits>& |
2049 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
2050 |
mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2051 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x); |
2052 |
|
2053 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2054 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2055 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2056 |
class _LIBCPP_TYPE_VIS_ONLY mersenne_twister_engine |
2057 |
{ |
2058 |
public: |
2059 |
// types |
2060 |
typedef _UIntType result_type; |
2061 |
|
2062 |
private: |
2063 |
result_type __x_[__n]; |
2064 |
size_t __i_; |
2065 |
|
2066 |
static_assert( 0 < __m, "mersenne_twister_engine invalid parameters"); |
2067 |
static_assert(__m <= __n, "mersenne_twister_engine invalid parameters"); |
2068 |
static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; |
2069 |
static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters"); |
2070 |
static_assert( 2 <= __w, "mersenne_twister_engine invalid parameters"); |
2071 |
static_assert(__r <= __w, "mersenne_twister_engine invalid parameters"); |
2072 |
static_assert(__u <= __w, "mersenne_twister_engine invalid parameters"); |
2073 |
static_assert(__s <= __w, "mersenne_twister_engine invalid parameters"); |
2074 |
static_assert(__t <= __w, "mersenne_twister_engine invalid parameters"); |
2075 |
static_assert(__l <= __w, "mersenne_twister_engine invalid parameters"); |
2076 |
public: |
2077 |
static _LIBCPP_CONSTEXPR const result_type _Min = 0; |
2078 |
static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : |
2079 |
(result_type(1) << __w) - result_type(1); |
2080 |
static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters"); |
2081 |
static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters"); |
2082 |
static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters"); |
2083 |
static_assert(__c <= _Max, "mersenne_twister_engine invalid parameters"); |
2084 |
static_assert(__d <= _Max, "mersenne_twister_engine invalid parameters"); |
2085 |
static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters"); |
2086 |
|
2087 |
// engine characteristics |
2088 |
static _LIBCPP_CONSTEXPR const size_t word_size = __w; |
2089 |
static _LIBCPP_CONSTEXPR const size_t state_size = __n; |
2090 |
static _LIBCPP_CONSTEXPR const size_t shift_size = __m; |
2091 |
static _LIBCPP_CONSTEXPR const size_t mask_bits = __r; |
2092 |
static _LIBCPP_CONSTEXPR const result_type xor_mask = __a; |
2093 |
static _LIBCPP_CONSTEXPR const size_t tempering_u = __u; |
2094 |
static _LIBCPP_CONSTEXPR const result_type tempering_d = __d; |
2095 |
static _LIBCPP_CONSTEXPR const size_t tempering_s = __s; |
2096 |
static _LIBCPP_CONSTEXPR const result_type tempering_b = __b; |
2097 |
static _LIBCPP_CONSTEXPR const size_t tempering_t = __t; |
2098 |
static _LIBCPP_CONSTEXPR const result_type tempering_c = __c; |
2099 |
static _LIBCPP_CONSTEXPR const size_t tempering_l = __l; |
2100 |
static _LIBCPP_CONSTEXPR const result_type initialization_multiplier = __f; |
2101 |
_LIBCPP_INLINE_VISIBILITY |
2102 |
static _LIBCPP_CONSTEXPR result_type min() { return _Min; } |
2103 |
_LIBCPP_INLINE_VISIBILITY |
2104 |
static _LIBCPP_CONSTEXPR result_type max() { return _Max; } |
2105 |
static _LIBCPP_CONSTEXPR const result_type default_seed = 5489u; |
2106 |
|
2107 |
// constructors and seeding functions |
2108 |
_LIBCPP_INLINE_VISIBILITY |
2109 |
explicit mersenne_twister_engine(result_type __sd = default_seed) |
2110 |
{seed(__sd);} |
2111 |
template<class _Sseq> |
2112 |
_LIBCPP_INLINE_VISIBILITY |
2113 |
explicit mersenne_twister_engine(_Sseq& __q, |
2114 |
typename enable_if<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value>::type* = 0) |
2115 |
{seed(__q);} |
2116 |
void seed(result_type __sd = default_seed); |
2117 |
template<class _Sseq> |
2118 |
_LIBCPP_INLINE_VISIBILITY |
2119 |
typename enable_if |
2120 |
< |
2121 |
__is_seed_sequence<_Sseq, mersenne_twister_engine>::value, |
2122 |
void |
2123 |
>::type |
2124 |
seed(_Sseq& __q) |
2125 |
{__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} |
2126 |
|
2127 |
// generating functions |
2128 |
result_type operator()(); |
2129 |
_LIBCPP_INLINE_VISIBILITY |
2130 |
void discard(unsigned long long __z) {for (; __z; --__z) operator()();} |
2131 |
|
2132 |
template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2133 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2134 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2135 |
friend |
2136 |
bool |
2137 |
operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2138 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x, |
2139 |
const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2140 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __y); |
2141 |
|
2142 |
template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2143 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2144 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2145 |
friend |
2146 |
bool |
2147 |
operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2148 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x, |
2149 |
const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2150 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __y); |
2151 |
|
2152 |
template <class _CharT, class _Traits, |
2153 |
class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2154 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2155 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2156 |
friend |
2157 |
basic_ostream<_CharT, _Traits>& |
2158 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
2159 |
const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2160 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x); |
2161 |
|
2162 |
template <class _CharT, class _Traits, |
2163 |
class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2164 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2165 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2166 |
friend |
2167 |
basic_istream<_CharT, _Traits>& |
2168 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
2169 |
mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2170 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x); |
2171 |
private: |
2172 |
|
2173 |
template<class _Sseq> |
2174 |
void __seed(_Sseq& __q, integral_constant<unsigned, 1>); |
2175 |
template<class _Sseq> |
2176 |
void __seed(_Sseq& __q, integral_constant<unsigned, 2>); |
2177 |
|
2178 |
template <size_t __count> |
2179 |
_LIBCPP_INLINE_VISIBILITY |
2180 |
static |
2181 |
typename enable_if |
2182 |
< |
2183 |
__count < __w, |
2184 |
result_type |
2185 |
>::type |
2186 |
__lshift(result_type __x) {return (__x << __count) & _Max;} |
2187 |
|
2188 |
template <size_t __count> |
2189 |
_LIBCPP_INLINE_VISIBILITY |
2190 |
static |
2191 |
typename enable_if |
2192 |
< |
2193 |
(__count >= __w), |
2194 |
result_type |
2195 |
>::type |
2196 |
__lshift(result_type) {return result_type(0);} |
2197 |
|
2198 |
template <size_t __count> |
2199 |
_LIBCPP_INLINE_VISIBILITY |
2200 |
static |
2201 |
typename enable_if |
2202 |
< |
2203 |
__count < _Dt, |
2204 |
result_type |
2205 |
>::type |
2206 |
__rshift(result_type __x) {return __x >> __count;} |
2207 |
|
2208 |
template <size_t __count> |
2209 |
_LIBCPP_INLINE_VISIBILITY |
2210 |
static |
2211 |
typename enable_if |
2212 |
< |
2213 |
(__count >= _Dt), |
2214 |
result_type |
2215 |
>::type |
2216 |
__rshift(result_type) {return result_type(0);} |
2217 |
}; |
2218 |
|
2219 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2220 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2221 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2222 |
_LIBCPP_CONSTEXPR const size_t |
2223 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::word_size; |
2224 |
|
2225 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2226 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2227 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2228 |
_LIBCPP_CONSTEXPR const size_t |
2229 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::state_size; |
2230 |
|
2231 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2232 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2233 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2234 |
_LIBCPP_CONSTEXPR const size_t |
2235 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::shift_size; |
2236 |
|
2237 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2238 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2239 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2240 |
_LIBCPP_CONSTEXPR const size_t |
2241 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::mask_bits; |
2242 |
|
2243 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2244 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2245 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2246 |
_LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type |
2247 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::xor_mask; |
2248 |
|
2249 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2250 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2251 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2252 |
_LIBCPP_CONSTEXPR const size_t |
2253 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_u; |
2254 |
|
2255 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2256 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2257 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2258 |
_LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type |
2259 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_d; |
2260 |
|
2261 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2262 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2263 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2264 |
_LIBCPP_CONSTEXPR const size_t |
2265 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_s; |
2266 |
|
2267 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2268 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2269 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2270 |
_LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type |
2271 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_b; |
2272 |
|
2273 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2274 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2275 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2276 |
_LIBCPP_CONSTEXPR const size_t |
2277 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_t; |
2278 |
|
2279 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2280 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2281 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2282 |
_LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type |
2283 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_c; |
2284 |
|
2285 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2286 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2287 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2288 |
_LIBCPP_CONSTEXPR const size_t |
2289 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_l; |
2290 |
|
2291 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2292 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2293 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2294 |
_LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type |
2295 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::initialization_multiplier; |
2296 |
|
2297 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2298 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2299 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2300 |
_LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type |
2301 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::default_seed; |
2302 |
|
2303 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2304 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2305 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2306 |
void |
2307 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, |
2308 |
__t, __c, __l, __f>::seed(result_type __sd) |
2309 |
{ // __w >= 2 |
2310 |
__x_[0] = __sd & _Max; |
2311 |
for (size_t __i = 1; __i < __n; ++__i) |
2312 |
__x_[__i] = (__f * (__x_[__i-1] ^ __rshift<__w - 2>(__x_[__i-1])) + __i) & _Max; |
2313 |
__i_ = 0; |
2314 |
} |
2315 |
|
2316 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2317 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2318 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2319 |
template<class _Sseq> |
2320 |
void |
2321 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, |
2322 |
__t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 1>) |
2323 |
{ |
2324 |
const unsigned __k = 1; |
2325 |
uint32_t __ar[__n * __k]; |
2326 |
__q.generate(__ar, __ar + __n * __k); |
2327 |
for (size_t __i = 0; __i < __n; ++__i) |
2328 |
__x_[__i] = static_cast<result_type>(__ar[__i] & _Max); |
2329 |
const result_type __mask = __r == _Dt ? result_type(~0) : |
2330 |
(result_type(1) << __r) - result_type(1); |
2331 |
__i_ = 0; |
2332 |
if ((__x_[0] & ~__mask) == 0) |
2333 |
{ |
2334 |
for (size_t __i = 1; __i < __n; ++__i) |
2335 |
if (__x_[__i] != 0) |
2336 |
return; |
2337 |
__x_[0] = _Max; |
2338 |
} |
2339 |
} |
2340 |
|
2341 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2342 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2343 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2344 |
template<class _Sseq> |
2345 |
void |
2346 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, |
2347 |
__t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 2>) |
2348 |
{ |
2349 |
const unsigned __k = 2; |
2350 |
uint32_t __ar[__n * __k]; |
2351 |
__q.generate(__ar, __ar + __n * __k); |
2352 |
for (size_t __i = 0; __i < __n; ++__i) |
2353 |
__x_[__i] = static_cast<result_type>( |
2354 |
(__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); |
2355 |
const result_type __mask = __r == _Dt ? result_type(~0) : |
2356 |
(result_type(1) << __r) - result_type(1); |
2357 |
__i_ = 0; |
2358 |
if ((__x_[0] & ~__mask) == 0) |
2359 |
{ |
2360 |
for (size_t __i = 1; __i < __n; ++__i) |
2361 |
if (__x_[__i] != 0) |
2362 |
return; |
2363 |
__x_[0] = _Max; |
2364 |
} |
2365 |
} |
2366 |
|
2367 |
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, |
2368 |
_UIntType __a, size_t __u, _UIntType __d, size_t __s, |
2369 |
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> |
2370 |
_UIntType |
2371 |
mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, |
2372 |
__t, __c, __l, __f>::operator()() |
2373 |
{ |
2374 |
const size_t __j = (__i_ + 1) % __n; |
2375 |
const result_type __mask = __r == _Dt ? result_type(~0) : |
2376 |
(result_type(1) << __r) - result_type(1); |
2377 |
const result_type _Yp = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask); |
2378 |
const size_t __k = (__i_ + __m) % __n; |
2379 |
__x_[__i_] = __x_[__k] ^ __rshift<1>(_Yp) ^ (__a * (_Yp & 1)); |
2380 |
result_type __z = __x_[__i_] ^ (__rshift<__u>(__x_[__i_]) & __d); |
2381 |
__i_ = __j; |
2382 |
__z ^= __lshift<__s>(__z) & __b; |
2383 |
__z ^= __lshift<__t>(__z) & __c; |
2384 |
return __z ^ __rshift<__l>(__z); |
2385 |
} |
2386 |
|
2387 |
template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2388 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2389 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2390 |
bool |
2391 |
operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2392 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x, |
2393 |
const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2394 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __y) |
2395 |
{ |
2396 |
if (__x.__i_ == __y.__i_) |
2397 |
return _VSTD::equal(__x.__x_, __x.__x_ + _Np, __y.__x_); |
2398 |
if (__x.__i_ == 0 || __y.__i_ == 0) |
2399 |
{ |
2400 |
size_t __j = _VSTD::min(_Np - __x.__i_, _Np - __y.__i_); |
2401 |
if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, |
2402 |
__y.__x_ + __y.__i_)) |
2403 |
return false; |
2404 |
if (__x.__i_ == 0) |
2405 |
return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Np, __y.__x_); |
2406 |
return _VSTD::equal(__x.__x_, __x.__x_ + (_Np - __j), __y.__x_ + __j); |
2407 |
} |
2408 |
if (__x.__i_ < __y.__i_) |
2409 |
{ |
2410 |
size_t __j = _Np - __y.__i_; |
2411 |
if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), |
2412 |
__y.__x_ + __y.__i_)) |
2413 |
return false; |
2414 |
if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Np, |
2415 |
__y.__x_)) |
2416 |
return false; |
2417 |
return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, |
2418 |
__y.__x_ + (_Np - (__x.__i_ + __j))); |
2419 |
} |
2420 |
size_t __j = _Np - __x.__i_; |
2421 |
if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), |
2422 |
__x.__x_ + __x.__i_)) |
2423 |
return false; |
2424 |
if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Np, |
2425 |
__x.__x_)) |
2426 |
return false; |
2427 |
return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, |
2428 |
__x.__x_ + (_Np - (__y.__i_ + __j))); |
2429 |
} |
2430 |
|
2431 |
template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2432 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2433 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2434 |
inline _LIBCPP_INLINE_VISIBILITY |
2435 |
bool |
2436 |
operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2437 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x, |
2438 |
const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2439 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __y) |
2440 |
{ |
2441 |
return !(__x == __y); |
2442 |
} |
2443 |
|
2444 |
template <class _CharT, class _Traits, |
2445 |
class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2446 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2447 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2448 |
basic_ostream<_CharT, _Traits>& |
2449 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
2450 |
const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2451 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x) |
2452 |
{ |
2453 |
__save_flags<_CharT, _Traits> __lx(__os); |
2454 |
__os.flags(ios_base::dec | ios_base::left); |
2455 |
_CharT __sp = __os.widen(' '); |
2456 |
__os.fill(__sp); |
2457 |
__os << __x.__x_[__x.__i_]; |
2458 |
for (size_t __j = __x.__i_ + 1; __j < _Np; ++__j) |
2459 |
__os << __sp << __x.__x_[__j]; |
2460 |
for (size_t __j = 0; __j < __x.__i_; ++__j) |
2461 |
__os << __sp << __x.__x_[__j]; |
2462 |
return __os; |
2463 |
} |
2464 |
|
2465 |
template <class _CharT, class _Traits, |
2466 |
class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, |
2467 |
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, |
2468 |
_UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> |
2469 |
basic_istream<_CharT, _Traits>& |
2470 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
2471 |
mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, |
2472 |
_Bp, _Tp, _Cp, _Lp, _Fp>& __x) |
2473 |
{ |
2474 |
__save_flags<_CharT, _Traits> __lx(__is); |
2475 |
__is.flags(ios_base::dec | ios_base::skipws); |
2476 |
_UI __t[_Np]; |
2477 |
for (size_t __i = 0; __i < _Np; ++__i) |
2478 |
__is >> __t[__i]; |
2479 |
if (!__is.fail()) |
2480 |
{ |
2481 |
for (size_t __i = 0; __i < _Np; ++__i) |
2482 |
__x.__x_[__i] = __t[__i]; |
2483 |
__x.__i_ = 0; |
2484 |
} |
2485 |
return __is; |
2486 |
} |
2487 |
|
2488 |
typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31, |
2489 |
0x9908b0df, 11, 0xffffffff, |
2490 |
7, 0x9d2c5680, |
2491 |
15, 0xefc60000, |
2492 |
18, 1812433253> mt19937; |
2493 |
typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31, |
2494 |
0xb5026f5aa96619e9ULL, 29, 0x5555555555555555ULL, |
2495 |
17, 0x71d67fffeda60000ULL, |
2496 |
37, 0xfff7eee000000000ULL, |
2497 |
43, 6364136223846793005ULL> mt19937_64; |
2498 |
|
2499 |
// subtract_with_carry_engine |
2500 |
|
2501 |
template<class _UIntType, size_t __w, size_t __s, size_t __r> |
2502 |
class _LIBCPP_TYPE_VIS_ONLY subtract_with_carry_engine; |
2503 |
|
2504 |
template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2505 |
bool |
2506 |
operator==( |
2507 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, |
2508 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); |
2509 |
|
2510 |
template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2511 |
_LIBCPP_INLINE_VISIBILITY |
2512 |
bool |
2513 |
operator!=( |
2514 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, |
2515 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); |
2516 |
|
2517 |
template <class _CharT, class _Traits, |
2518 |
class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2519 |
basic_ostream<_CharT, _Traits>& |
2520 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
2521 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); |
2522 |
|
2523 |
template <class _CharT, class _Traits, |
2524 |
class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2525 |
basic_istream<_CharT, _Traits>& |
2526 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
2527 |
subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); |
2528 |
|
2529 |
template<class _UIntType, size_t __w, size_t __s, size_t __r> |
2530 |
class _LIBCPP_TYPE_VIS_ONLY subtract_with_carry_engine |
2531 |
{ |
2532 |
public: |
2533 |
// types |
2534 |
typedef _UIntType result_type; |
2535 |
|
2536 |
private: |
2537 |
result_type __x_[__r]; |
2538 |
result_type __c_; |
2539 |
size_t __i_; |
2540 |
|
2541 |
static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; |
2542 |
static_assert( 0 < __w, "subtract_with_carry_engine invalid parameters"); |
2543 |
static_assert(__w <= _Dt, "subtract_with_carry_engine invalid parameters"); |
2544 |
static_assert( 0 < __s, "subtract_with_carry_engine invalid parameters"); |
2545 |
static_assert(__s < __r, "subtract_with_carry_engine invalid parameters"); |
2546 |
public: |
2547 |
static _LIBCPP_CONSTEXPR const result_type _Min = 0; |
2548 |
static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : |
2549 |
(result_type(1) << __w) - result_type(1); |
2550 |
static_assert(_Min < _Max, "subtract_with_carry_engine invalid parameters"); |
2551 |
|
2552 |
// engine characteristics |
2553 |
static _LIBCPP_CONSTEXPR const size_t word_size = __w; |
2554 |
static _LIBCPP_CONSTEXPR const size_t short_lag = __s; |
2555 |
static _LIBCPP_CONSTEXPR const size_t long_lag = __r; |
2556 |
_LIBCPP_INLINE_VISIBILITY |
2557 |
static _LIBCPP_CONSTEXPR result_type min() { return _Min; } |
2558 |
_LIBCPP_INLINE_VISIBILITY |
2559 |
static _LIBCPP_CONSTEXPR result_type max() { return _Max; } |
2560 |
static _LIBCPP_CONSTEXPR const result_type default_seed = 19780503u; |
2561 |
|
2562 |
// constructors and seeding functions |
2563 |
_LIBCPP_INLINE_VISIBILITY |
2564 |
explicit subtract_with_carry_engine(result_type __sd = default_seed) |
2565 |
{seed(__sd);} |
2566 |
template<class _Sseq> |
2567 |
_LIBCPP_INLINE_VISIBILITY |
2568 |
explicit subtract_with_carry_engine(_Sseq& __q, |
2569 |
typename enable_if<__is_seed_sequence<_Sseq, subtract_with_carry_engine>::value>::type* = 0) |
2570 |
{seed(__q);} |
2571 |
_LIBCPP_INLINE_VISIBILITY |
2572 |
void seed(result_type __sd = default_seed) |
2573 |
{seed(__sd, integral_constant<unsigned, 1 + (__w - 1) / 32>());} |
2574 |
template<class _Sseq> |
2575 |
_LIBCPP_INLINE_VISIBILITY |
2576 |
typename enable_if |
2577 |
< |
2578 |
__is_seed_sequence<_Sseq, subtract_with_carry_engine>::value, |
2579 |
void |
2580 |
>::type |
2581 |
seed(_Sseq& __q) |
2582 |
{__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} |
2583 |
|
2584 |
// generating functions |
2585 |
result_type operator()(); |
2586 |
_LIBCPP_INLINE_VISIBILITY |
2587 |
void discard(unsigned long long __z) {for (; __z; --__z) operator()();} |
2588 |
|
2589 |
template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2590 |
friend |
2591 |
bool |
2592 |
operator==( |
2593 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, |
2594 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); |
2595 |
|
2596 |
template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2597 |
friend |
2598 |
bool |
2599 |
operator!=( |
2600 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, |
2601 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); |
2602 |
|
2603 |
template <class _CharT, class _Traits, |
2604 |
class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2605 |
friend |
2606 |
basic_ostream<_CharT, _Traits>& |
2607 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
2608 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); |
2609 |
|
2610 |
template <class _CharT, class _Traits, |
2611 |
class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2612 |
friend |
2613 |
basic_istream<_CharT, _Traits>& |
2614 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
2615 |
subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); |
2616 |
|
2617 |
private: |
2618 |
|
2619 |
void seed(result_type __sd, integral_constant<unsigned, 1>); |
2620 |
void seed(result_type __sd, integral_constant<unsigned, 2>); |
2621 |
template<class _Sseq> |
2622 |
void __seed(_Sseq& __q, integral_constant<unsigned, 1>); |
2623 |
template<class _Sseq> |
2624 |
void __seed(_Sseq& __q, integral_constant<unsigned, 2>); |
2625 |
}; |
2626 |
|
2627 |
template<class _UIntType, size_t __w, size_t __s, size_t __r> |
2628 |
_LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::word_size; |
2629 |
|
2630 |
template<class _UIntType, size_t __w, size_t __s, size_t __r> |
2631 |
_LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::short_lag; |
2632 |
|
2633 |
template<class _UIntType, size_t __w, size_t __s, size_t __r> |
2634 |
_LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::long_lag; |
2635 |
|
2636 |
template<class _UIntType, size_t __w, size_t __s, size_t __r> |
2637 |
_LIBCPP_CONSTEXPR const typename subtract_with_carry_engine<_UIntType, __w, __s, __r>::result_type |
2638 |
subtract_with_carry_engine<_UIntType, __w, __s, __r>::default_seed; |
2639 |
|
2640 |
template<class _UIntType, size_t __w, size_t __s, size_t __r> |
2641 |
void |
2642 |
subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, |
2643 |
integral_constant<unsigned, 1>) |
2644 |
{ |
2645 |
linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> |
2646 |
__e(__sd == 0u ? default_seed : __sd); |
2647 |
for (size_t __i = 0; __i < __r; ++__i) |
2648 |
__x_[__i] = static_cast<result_type>(__e() & _Max); |
2649 |
__c_ = __x_[__r-1] == 0; |
2650 |
__i_ = 0; |
2651 |
} |
2652 |
|
2653 |
template<class _UIntType, size_t __w, size_t __s, size_t __r> |
2654 |
void |
2655 |
subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, |
2656 |
integral_constant<unsigned, 2>) |
2657 |
{ |
2658 |
linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> |
2659 |
__e(__sd == 0u ? default_seed : __sd); |
2660 |
for (size_t __i = 0; __i < __r; ++__i) |
2661 |
{ |
2662 |
result_type __e0 = __e(); |
2663 |
__x_[__i] = static_cast<result_type>( |
2664 |
(__e0 + ((uint64_t)__e() << 32)) & _Max); |
2665 |
} |
2666 |
__c_ = __x_[__r-1] == 0; |
2667 |
__i_ = 0; |
2668 |
} |
2669 |
|
2670 |
template<class _UIntType, size_t __w, size_t __s, size_t __r> |
2671 |
template<class _Sseq> |
2672 |
void |
2673 |
subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, |
2674 |
integral_constant<unsigned, 1>) |
2675 |
{ |
2676 |
const unsigned __k = 1; |
2677 |
uint32_t __ar[__r * __k]; |
2678 |
__q.generate(__ar, __ar + __r * __k); |
2679 |
for (size_t __i = 0; __i < __r; ++__i) |
2680 |
__x_[__i] = static_cast<result_type>(__ar[__i] & _Max); |
2681 |
__c_ = __x_[__r-1] == 0; |
2682 |
__i_ = 0; |
2683 |
} |
2684 |
|
2685 |
template<class _UIntType, size_t __w, size_t __s, size_t __r> |
2686 |
template<class _Sseq> |
2687 |
void |
2688 |
subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, |
2689 |
integral_constant<unsigned, 2>) |
2690 |
{ |
2691 |
const unsigned __k = 2; |
2692 |
uint32_t __ar[__r * __k]; |
2693 |
__q.generate(__ar, __ar + __r * __k); |
2694 |
for (size_t __i = 0; __i < __r; ++__i) |
2695 |
__x_[__i] = static_cast<result_type>( |
2696 |
(__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); |
2697 |
__c_ = __x_[__r-1] == 0; |
2698 |
__i_ = 0; |
2699 |
} |
2700 |
|
2701 |
template<class _UIntType, size_t __w, size_t __s, size_t __r> |
2702 |
_UIntType |
2703 |
subtract_with_carry_engine<_UIntType, __w, __s, __r>::operator()() |
2704 |
{ |
2705 |
const result_type& __xs = __x_[(__i_ + (__r - __s)) % __r]; |
2706 |
result_type& __xr = __x_[__i_]; |
2707 |
result_type __new_c = __c_ == 0 ? __xs < __xr : __xs != 0 ? __xs <= __xr : 1; |
2708 |
__xr = (__xs - __xr - __c_) & _Max; |
2709 |
__c_ = __new_c; |
2710 |
__i_ = (__i_ + 1) % __r; |
2711 |
return __xr; |
2712 |
} |
2713 |
|
2714 |
template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2715 |
bool |
2716 |
operator==( |
2717 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, |
2718 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y) |
2719 |
{ |
2720 |
if (__x.__c_ != __y.__c_) |
2721 |
return false; |
2722 |
if (__x.__i_ == __y.__i_) |
2723 |
return _VSTD::equal(__x.__x_, __x.__x_ + _Rp, __y.__x_); |
2724 |
if (__x.__i_ == 0 || __y.__i_ == 0) |
2725 |
{ |
2726 |
size_t __j = _VSTD::min(_Rp - __x.__i_, _Rp - __y.__i_); |
2727 |
if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, |
2728 |
__y.__x_ + __y.__i_)) |
2729 |
return false; |
2730 |
if (__x.__i_ == 0) |
2731 |
return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Rp, __y.__x_); |
2732 |
return _VSTD::equal(__x.__x_, __x.__x_ + (_Rp - __j), __y.__x_ + __j); |
2733 |
} |
2734 |
if (__x.__i_ < __y.__i_) |
2735 |
{ |
2736 |
size_t __j = _Rp - __y.__i_; |
2737 |
if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), |
2738 |
__y.__x_ + __y.__i_)) |
2739 |
return false; |
2740 |
if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Rp, |
2741 |
__y.__x_)) |
2742 |
return false; |
2743 |
return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, |
2744 |
__y.__x_ + (_Rp - (__x.__i_ + __j))); |
2745 |
} |
2746 |
size_t __j = _Rp - __x.__i_; |
2747 |
if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), |
2748 |
__x.__x_ + __x.__i_)) |
2749 |
return false; |
2750 |
if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Rp, |
2751 |
__x.__x_)) |
2752 |
return false; |
2753 |
return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, |
2754 |
__x.__x_ + (_Rp - (__y.__i_ + __j))); |
2755 |
} |
2756 |
|
2757 |
template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2758 |
inline _LIBCPP_INLINE_VISIBILITY |
2759 |
bool |
2760 |
operator!=( |
2761 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, |
2762 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y) |
2763 |
{ |
2764 |
return !(__x == __y); |
2765 |
} |
2766 |
|
2767 |
template <class _CharT, class _Traits, |
2768 |
class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2769 |
basic_ostream<_CharT, _Traits>& |
2770 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
2771 |
const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x) |
2772 |
{ |
2773 |
__save_flags<_CharT, _Traits> __lx(__os); |
2774 |
__os.flags(ios_base::dec | ios_base::left); |
2775 |
_CharT __sp = __os.widen(' '); |
2776 |
__os.fill(__sp); |
2777 |
__os << __x.__x_[__x.__i_]; |
2778 |
for (size_t __j = __x.__i_ + 1; __j < _Rp; ++__j) |
2779 |
__os << __sp << __x.__x_[__j]; |
2780 |
for (size_t __j = 0; __j < __x.__i_; ++__j) |
2781 |
__os << __sp << __x.__x_[__j]; |
2782 |
__os << __sp << __x.__c_; |
2783 |
return __os; |
2784 |
} |
2785 |
|
2786 |
template <class _CharT, class _Traits, |
2787 |
class _UI, size_t _Wp, size_t _Sp, size_t _Rp> |
2788 |
basic_istream<_CharT, _Traits>& |
2789 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
2790 |
subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x) |
2791 |
{ |
2792 |
__save_flags<_CharT, _Traits> __lx(__is); |
2793 |
__is.flags(ios_base::dec | ios_base::skipws); |
2794 |
_UI __t[_Rp+1]; |
2795 |
for (size_t __i = 0; __i < _Rp+1; ++__i) |
2796 |
__is >> __t[__i]; |
2797 |
if (!__is.fail()) |
2798 |
{ |
2799 |
for (size_t __i = 0; __i < _Rp; ++__i) |
2800 |
__x.__x_[__i] = __t[__i]; |
2801 |
__x.__c_ = __t[_Rp]; |
2802 |
__x.__i_ = 0; |
2803 |
} |
2804 |
return __is; |
2805 |
} |
2806 |
|
2807 |
typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base; |
2808 |
typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base; |
2809 |
|
2810 |
// discard_block_engine |
2811 |
|
2812 |
template<class _Engine, size_t __p, size_t __r> |
2813 |
class _LIBCPP_TYPE_VIS_ONLY discard_block_engine |
2814 |
{ |
2815 |
_Engine __e_; |
2816 |
int __n_; |
2817 |
|
2818 |
static_assert( 0 < __r, "discard_block_engine invalid parameters"); |
2819 |
static_assert(__r <= __p, "discard_block_engine invalid parameters"); |
2820 |
public: |
2821 |
// types |
2822 |
typedef typename _Engine::result_type result_type; |
2823 |
|
2824 |
// engine characteristics |
2825 |
static _LIBCPP_CONSTEXPR const size_t block_size = __p; |
2826 |
static _LIBCPP_CONSTEXPR const size_t used_block = __r; |
2827 |
|
2828 |
#ifdef _LIBCPP_HAS_NO_CONSTEXPR |
2829 |
static const result_type _Min = _Engine::_Min; |
2830 |
static const result_type _Max = _Engine::_Max; |
2831 |
#else |
2832 |
static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min(); |
2833 |
static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max(); |
2834 |
#endif |
2835 |
|
2836 |
_LIBCPP_INLINE_VISIBILITY |
2837 |
static _LIBCPP_CONSTEXPR result_type min() { return _Engine::min(); } |
2838 |
_LIBCPP_INLINE_VISIBILITY |
2839 |
static _LIBCPP_CONSTEXPR result_type max() { return _Engine::max(); } |
2840 |
|
2841 |
// constructors and seeding functions |
2842 |
_LIBCPP_INLINE_VISIBILITY |
2843 |
discard_block_engine() : __n_(0) {} |
2844 |
_LIBCPP_INLINE_VISIBILITY |
2845 |
explicit discard_block_engine(const _Engine& __e) |
2846 |
: __e_(__e), __n_(0) {} |
2847 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
2848 |
_LIBCPP_INLINE_VISIBILITY |
2849 |
explicit discard_block_engine(_Engine&& __e) |
2850 |
: __e_(_VSTD::move(__e)), __n_(0) {} |
2851 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
2852 |
_LIBCPP_INLINE_VISIBILITY |
2853 |
explicit discard_block_engine(result_type __sd) : __e_(__sd), __n_(0) {} |
2854 |
template<class _Sseq> |
2855 |
_LIBCPP_INLINE_VISIBILITY |
2856 |
explicit discard_block_engine(_Sseq& __q, |
2857 |
typename enable_if<__is_seed_sequence<_Sseq, discard_block_engine>::value && |
2858 |
!is_convertible<_Sseq, _Engine>::value>::type* = 0) |
2859 |
: __e_(__q), __n_(0) {} |
2860 |
_LIBCPP_INLINE_VISIBILITY |
2861 |
void seed() {__e_.seed(); __n_ = 0;} |
2862 |
_LIBCPP_INLINE_VISIBILITY |
2863 |
void seed(result_type __sd) {__e_.seed(__sd); __n_ = 0;} |
2864 |
template<class _Sseq> |
2865 |
_LIBCPP_INLINE_VISIBILITY |
2866 |
typename enable_if |
2867 |
< |
2868 |
__is_seed_sequence<_Sseq, discard_block_engine>::value, |
2869 |
void |
2870 |
>::type |
2871 |
seed(_Sseq& __q) {__e_.seed(__q); __n_ = 0;} |
2872 |
|
2873 |
// generating functions |
2874 |
result_type operator()(); |
2875 |
_LIBCPP_INLINE_VISIBILITY |
2876 |
void discard(unsigned long long __z) {for (; __z; --__z) operator()();} |
2877 |
|
2878 |
// property functions |
2879 |
_LIBCPP_INLINE_VISIBILITY |
2880 |
const _Engine& base() const _NOEXCEPT {return __e_;} |
2881 |
|
2882 |
template<class _Eng, size_t _Pp, size_t _Rp> |
2883 |
friend |
2884 |
bool |
2885 |
operator==( |
2886 |
const discard_block_engine<_Eng, _Pp, _Rp>& __x, |
2887 |
const discard_block_engine<_Eng, _Pp, _Rp>& __y); |
2888 |
|
2889 |
template<class _Eng, size_t _Pp, size_t _Rp> |
2890 |
friend |
2891 |
bool |
2892 |
operator!=( |
2893 |
const discard_block_engine<_Eng, _Pp, _Rp>& __x, |
2894 |
const discard_block_engine<_Eng, _Pp, _Rp>& __y); |
2895 |
|
2896 |
template <class _CharT, class _Traits, |
2897 |
class _Eng, size_t _Pp, size_t _Rp> |
2898 |
friend |
2899 |
basic_ostream<_CharT, _Traits>& |
2900 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
2901 |
const discard_block_engine<_Eng, _Pp, _Rp>& __x); |
2902 |
|
2903 |
template <class _CharT, class _Traits, |
2904 |
class _Eng, size_t _Pp, size_t _Rp> |
2905 |
friend |
2906 |
basic_istream<_CharT, _Traits>& |
2907 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
2908 |
discard_block_engine<_Eng, _Pp, _Rp>& __x); |
2909 |
}; |
2910 |
|
2911 |
template<class _Engine, size_t __p, size_t __r> |
2912 |
_LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::block_size; |
2913 |
|
2914 |
template<class _Engine, size_t __p, size_t __r> |
2915 |
_LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::used_block; |
2916 |
|
2917 |
template<class _Engine, size_t __p, size_t __r> |
2918 |
typename discard_block_engine<_Engine, __p, __r>::result_type |
2919 |
discard_block_engine<_Engine, __p, __r>::operator()() |
2920 |
{ |
2921 |
if (__n_ >= __r) |
2922 |
{ |
2923 |
__e_.discard(__p - __r); |
2924 |
__n_ = 0; |
2925 |
} |
2926 |
++__n_; |
2927 |
return __e_(); |
2928 |
} |
2929 |
|
2930 |
template<class _Eng, size_t _Pp, size_t _Rp> |
2931 |
inline _LIBCPP_INLINE_VISIBILITY |
2932 |
bool |
2933 |
operator==(const discard_block_engine<_Eng, _Pp, _Rp>& __x, |
2934 |
const discard_block_engine<_Eng, _Pp, _Rp>& __y) |
2935 |
{ |
2936 |
return __x.__n_ == __y.__n_ && __x.__e_ == __y.__e_; |
2937 |
} |
2938 |
|
2939 |
template<class _Eng, size_t _Pp, size_t _Rp> |
2940 |
inline _LIBCPP_INLINE_VISIBILITY |
2941 |
bool |
2942 |
operator!=(const discard_block_engine<_Eng, _Pp, _Rp>& __x, |
2943 |
const discard_block_engine<_Eng, _Pp, _Rp>& __y) |
2944 |
{ |
2945 |
return !(__x == __y); |
2946 |
} |
2947 |
|
2948 |
template <class _CharT, class _Traits, |
2949 |
class _Eng, size_t _Pp, size_t _Rp> |
2950 |
basic_ostream<_CharT, _Traits>& |
2951 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
2952 |
const discard_block_engine<_Eng, _Pp, _Rp>& __x) |
2953 |
{ |
2954 |
__save_flags<_CharT, _Traits> __lx(__os); |
2955 |
__os.flags(ios_base::dec | ios_base::left); |
2956 |
_CharT __sp = __os.widen(' '); |
2957 |
__os.fill(__sp); |
2958 |
return __os << __x.__e_ << __sp << __x.__n_; |
2959 |
} |
2960 |
|
2961 |
template <class _CharT, class _Traits, |
2962 |
class _Eng, size_t _Pp, size_t _Rp> |
2963 |
basic_istream<_CharT, _Traits>& |
2964 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
2965 |
discard_block_engine<_Eng, _Pp, _Rp>& __x) |
2966 |
{ |
2967 |
__save_flags<_CharT, _Traits> __lx(__is); |
2968 |
__is.flags(ios_base::dec | ios_base::skipws); |
2969 |
_Eng __e; |
2970 |
int __n; |
2971 |
__is >> __e >> __n; |
2972 |
if (!__is.fail()) |
2973 |
{ |
2974 |
__x.__e_ = __e; |
2975 |
__x.__n_ = __n; |
2976 |
} |
2977 |
return __is; |
2978 |
} |
2979 |
|
2980 |
typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; |
2981 |
typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; |
2982 |
|
2983 |
// independent_bits_engine |
2984 |
|
2985 |
template<class _Engine, size_t __w, class _UIntType> |
2986 |
class _LIBCPP_TYPE_VIS_ONLY independent_bits_engine |
2987 |
{ |
2988 |
template <class _UI, _UI _R0, size_t _Wp, size_t _Mp> |
2989 |
class __get_n |
2990 |
{ |
2991 |
static _LIBCPP_CONSTEXPR const size_t _Dt = numeric_limits<_UI>::digits; |
2992 |
static _LIBCPP_CONSTEXPR const size_t _Np = _Wp / _Mp + (_Wp % _Mp != 0); |
2993 |
static _LIBCPP_CONSTEXPR const size_t _W0 = _Wp / _Np; |
2994 |
static _LIBCPP_CONSTEXPR const _UI _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0; |
2995 |
public: |
2996 |
static _LIBCPP_CONSTEXPR const size_t value = _R0 - _Y0 > _Y0 / _Np ? _Np + 1 : _Np; |
2997 |
}; |
2998 |
public: |
2999 |
// types |
3000 |
typedef _UIntType result_type; |
3001 |
|
3002 |
private: |
3003 |
_Engine __e_; |
3004 |
|
3005 |
static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; |
3006 |
static_assert( 0 < __w, "independent_bits_engine invalid parameters"); |
3007 |
static_assert(__w <= _Dt, "independent_bits_engine invalid parameters"); |
3008 |
|
3009 |
typedef typename _Engine::result_type _Engine_result_type; |
3010 |
typedef typename conditional |
3011 |
< |
3012 |
sizeof(_Engine_result_type) <= sizeof(result_type), |
3013 |
result_type, |
3014 |
_Engine_result_type |
3015 |
>::type _Working_result_type; |
3016 |
#ifdef _LIBCPP_HAS_NO_CONSTEXPR |
3017 |
static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min |
3018 |
+ _Working_result_type(1); |
3019 |
#else |
3020 |
static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min() |
3021 |
+ _Working_result_type(1); |
3022 |
#endif |
3023 |
static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value; |
3024 |
static _LIBCPP_CONSTEXPR const size_t __n = __get_n<_Working_result_type, _Rp, __w, __m>::value; |
3025 |
static _LIBCPP_CONSTEXPR const size_t __w0 = __w / __n; |
3026 |
static _LIBCPP_CONSTEXPR const size_t __n0 = __n - __w % __n; |
3027 |
static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits; |
3028 |
static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits; |
3029 |
static _LIBCPP_CONSTEXPR const _Working_result_type __y0 = __w0 >= _WDt ? 0 : |
3030 |
(_Rp >> __w0) << __w0; |
3031 |
static _LIBCPP_CONSTEXPR const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 : |
3032 |
(_Rp >> (__w0+1)) << (__w0+1); |
3033 |
static _LIBCPP_CONSTEXPR const _Engine_result_type __mask0 = __w0 > 0 ? |
3034 |
_Engine_result_type(~0) >> (_EDt - __w0) : |
3035 |
_Engine_result_type(0); |
3036 |
static _LIBCPP_CONSTEXPR const _Engine_result_type __mask1 = __w0 < _EDt - 1 ? |
3037 |
_Engine_result_type(~0) >> (_EDt - (__w0 + 1)) : |
3038 |
_Engine_result_type(~0); |
3039 |
public: |
3040 |
static _LIBCPP_CONSTEXPR const result_type _Min = 0; |
3041 |
static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : |
3042 |
(result_type(1) << __w) - result_type(1); |
3043 |
static_assert(_Min < _Max, "independent_bits_engine invalid parameters"); |
3044 |
|
3045 |
// engine characteristics |
3046 |
_LIBCPP_INLINE_VISIBILITY |
3047 |
static _LIBCPP_CONSTEXPR result_type min() { return _Min; } |
3048 |
_LIBCPP_INLINE_VISIBILITY |
3049 |
static _LIBCPP_CONSTEXPR result_type max() { return _Max; } |
3050 |
|
3051 |
// constructors and seeding functions |
3052 |
_LIBCPP_INLINE_VISIBILITY |
3053 |
independent_bits_engine() {} |
3054 |
_LIBCPP_INLINE_VISIBILITY |
3055 |
explicit independent_bits_engine(const _Engine& __e) |
3056 |
: __e_(__e) {} |
3057 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
3058 |
_LIBCPP_INLINE_VISIBILITY |
3059 |
explicit independent_bits_engine(_Engine&& __e) |
3060 |
: __e_(_VSTD::move(__e)) {} |
3061 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
3062 |
_LIBCPP_INLINE_VISIBILITY |
3063 |
explicit independent_bits_engine(result_type __sd) : __e_(__sd) {} |
3064 |
template<class _Sseq> |
3065 |
_LIBCPP_INLINE_VISIBILITY |
3066 |
explicit independent_bits_engine(_Sseq& __q, |
3067 |
typename enable_if<__is_seed_sequence<_Sseq, independent_bits_engine>::value && |
3068 |
!is_convertible<_Sseq, _Engine>::value>::type* = 0) |
3069 |
: __e_(__q) {} |
3070 |
_LIBCPP_INLINE_VISIBILITY |
3071 |
void seed() {__e_.seed();} |
3072 |
_LIBCPP_INLINE_VISIBILITY |
3073 |
void seed(result_type __sd) {__e_.seed(__sd);} |
3074 |
template<class _Sseq> |
3075 |
_LIBCPP_INLINE_VISIBILITY |
3076 |
typename enable_if |
3077 |
< |
3078 |
__is_seed_sequence<_Sseq, independent_bits_engine>::value, |
3079 |
void |
3080 |
>::type |
3081 |
seed(_Sseq& __q) {__e_.seed(__q);} |
3082 |
|
3083 |
// generating functions |
3084 |
_LIBCPP_INLINE_VISIBILITY |
3085 |
result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} |
3086 |
_LIBCPP_INLINE_VISIBILITY |
3087 |
void discard(unsigned long long __z) {for (; __z; --__z) operator()();} |
3088 |
|
3089 |
// property functions |
3090 |
_LIBCPP_INLINE_VISIBILITY |
3091 |
const _Engine& base() const _NOEXCEPT {return __e_;} |
3092 |
|
3093 |
template<class _Eng, size_t _Wp, class _UI> |
3094 |
friend |
3095 |
bool |
3096 |
operator==( |
3097 |
const independent_bits_engine<_Eng, _Wp, _UI>& __x, |
3098 |
const independent_bits_engine<_Eng, _Wp, _UI>& __y); |
3099 |
|
3100 |
template<class _Eng, size_t _Wp, class _UI> |
3101 |
friend |
3102 |
bool |
3103 |
operator!=( |
3104 |
const independent_bits_engine<_Eng, _Wp, _UI>& __x, |
3105 |
const independent_bits_engine<_Eng, _Wp, _UI>& __y); |
3106 |
|
3107 |
template <class _CharT, class _Traits, |
3108 |
class _Eng, size_t _Wp, class _UI> |
3109 |
friend |
3110 |
basic_ostream<_CharT, _Traits>& |
3111 |
operator<<(basic_ostream<_CharT, _Traits>& __os, |
3112 |
const independent_bits_engine<_Eng, _Wp, _UI>& __x); |
3113 |
|
3114 |
template <class _CharT, class _Traits, |
3115 |
class _Eng, size_t _Wp, class _UI> |
3116 |
friend |
3117 |
basic_istream<_CharT, _Traits>& |
3118 |
operator>>(basic_istream<_CharT, _Traits>& __is, |
3119 |
independent_bits_engine<_Eng, _Wp, _UI>& __x); |
3120 |
|
3121 |
private: |
3122 |
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 |