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