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