xref: /dflybsd-src/contrib/gcc-8.0/libstdc++-v3/include/ext/random.tcc (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj // Random number extensions -*- C++ -*-
2*38fd1498Szrj 
3*38fd1498Szrj // Copyright (C) 2012-2018 Free Software Foundation, Inc.
4*38fd1498Szrj //
5*38fd1498Szrj // This file is part of the GNU ISO C++ Library.  This library is free
6*38fd1498Szrj // software; you can redistribute it and/or modify it under the
7*38fd1498Szrj // terms of the GNU General Public License as published by the
8*38fd1498Szrj // Free Software Foundation; either version 3, or (at your option)
9*38fd1498Szrj // any later version.
10*38fd1498Szrj 
11*38fd1498Szrj // This library is distributed in the hope that it will be useful,
12*38fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of
13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*38fd1498Szrj // GNU General Public License for more details.
15*38fd1498Szrj 
16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional
17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version
18*38fd1498Szrj // 3.1, as published by the Free Software Foundation.
19*38fd1498Szrj 
20*38fd1498Szrj // You should have received a copy of the GNU General Public License and
21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program;
22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23*38fd1498Szrj // <http://www.gnu.org/licenses/>.
24*38fd1498Szrj 
25*38fd1498Szrj /** @file ext/random.tcc
26*38fd1498Szrj  *  This is an internal header file, included by other library headers.
27*38fd1498Szrj  *  Do not attempt to use it directly. @headername{ext/random}
28*38fd1498Szrj  */
29*38fd1498Szrj 
30*38fd1498Szrj #ifndef _EXT_RANDOM_TCC
31*38fd1498Szrj #define _EXT_RANDOM_TCC 1
32*38fd1498Szrj 
33*38fd1498Szrj #pragma GCC system_header
34*38fd1498Szrj 
35*38fd1498Szrj namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
36*38fd1498Szrj {
37*38fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
38*38fd1498Szrj 
39*38fd1498Szrj #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
40*38fd1498Szrj 
41*38fd1498Szrj   template<typename _UIntType, size_t __m,
42*38fd1498Szrj 	   size_t __pos1, size_t __sl1, size_t __sl2,
43*38fd1498Szrj 	   size_t __sr1, size_t __sr2,
44*38fd1498Szrj 	   uint32_t __msk1, uint32_t __msk2,
45*38fd1498Szrj 	   uint32_t __msk3, uint32_t __msk4,
46*38fd1498Szrj 	   uint32_t __parity1, uint32_t __parity2,
47*38fd1498Szrj 	   uint32_t __parity3, uint32_t __parity4>
48*38fd1498Szrj     void simd_fast_mersenne_twister_engine<_UIntType, __m,
49*38fd1498Szrj 					   __pos1, __sl1, __sl2, __sr1, __sr2,
50*38fd1498Szrj 					   __msk1, __msk2, __msk3, __msk4,
51*38fd1498Szrj 					   __parity1, __parity2, __parity3,
52*38fd1498Szrj 					   __parity4>::
seed(_UIntType __seed)53*38fd1498Szrj     seed(_UIntType __seed)
54*38fd1498Szrj     {
55*38fd1498Szrj       _M_state32[0] = static_cast<uint32_t>(__seed);
56*38fd1498Szrj       for (size_t __i = 1; __i < _M_nstate32; ++__i)
57*38fd1498Szrj 	_M_state32[__i] = (1812433253UL
58*38fd1498Szrj 			   * (_M_state32[__i - 1] ^ (_M_state32[__i - 1] >> 30))
59*38fd1498Szrj 			   + __i);
60*38fd1498Szrj       _M_pos = state_size;
61*38fd1498Szrj       _M_period_certification();
62*38fd1498Szrj     }
63*38fd1498Szrj 
64*38fd1498Szrj 
65*38fd1498Szrj   namespace {
66*38fd1498Szrj 
_Func1(uint32_t __x)67*38fd1498Szrj     inline uint32_t _Func1(uint32_t __x)
68*38fd1498Szrj     {
69*38fd1498Szrj       return (__x ^ (__x >> 27)) * UINT32_C(1664525);
70*38fd1498Szrj     }
71*38fd1498Szrj 
_Func2(uint32_t __x)72*38fd1498Szrj     inline uint32_t _Func2(uint32_t __x)
73*38fd1498Szrj     {
74*38fd1498Szrj       return (__x ^ (__x >> 27)) * UINT32_C(1566083941);
75*38fd1498Szrj     }
76*38fd1498Szrj 
77*38fd1498Szrj   }
78*38fd1498Szrj 
79*38fd1498Szrj 
80*38fd1498Szrj   template<typename _UIntType, size_t __m,
81*38fd1498Szrj 	   size_t __pos1, size_t __sl1, size_t __sl2,
82*38fd1498Szrj 	   size_t __sr1, size_t __sr2,
83*38fd1498Szrj 	   uint32_t __msk1, uint32_t __msk2,
84*38fd1498Szrj 	   uint32_t __msk3, uint32_t __msk4,
85*38fd1498Szrj 	   uint32_t __parity1, uint32_t __parity2,
86*38fd1498Szrj 	   uint32_t __parity3, uint32_t __parity4>
87*38fd1498Szrj     template<typename _Sseq>
88*38fd1498Szrj       typename std::enable_if<std::is_class<_Sseq>::value>::type
89*38fd1498Szrj       simd_fast_mersenne_twister_engine<_UIntType, __m,
90*38fd1498Szrj 					__pos1, __sl1, __sl2, __sr1, __sr2,
91*38fd1498Szrj 					__msk1, __msk2, __msk3, __msk4,
92*38fd1498Szrj 					__parity1, __parity2, __parity3,
93*38fd1498Szrj 					__parity4>::
seed(_Sseq & __q)94*38fd1498Szrj       seed(_Sseq& __q)
95*38fd1498Szrj       {
96*38fd1498Szrj 	size_t __lag;
97*38fd1498Szrj 
98*38fd1498Szrj 	if (_M_nstate32 >= 623)
99*38fd1498Szrj 	  __lag = 11;
100*38fd1498Szrj 	else if (_M_nstate32 >= 68)
101*38fd1498Szrj 	  __lag = 7;
102*38fd1498Szrj 	else if (_M_nstate32 >= 39)
103*38fd1498Szrj 	  __lag = 5;
104*38fd1498Szrj 	else
105*38fd1498Szrj 	  __lag = 3;
106*38fd1498Szrj 	const size_t __mid = (_M_nstate32 - __lag) / 2;
107*38fd1498Szrj 
108*38fd1498Szrj 	std::fill(_M_state32, _M_state32 + _M_nstate32, UINT32_C(0x8b8b8b8b));
109*38fd1498Szrj 	uint32_t __arr[_M_nstate32];
110*38fd1498Szrj 	__q.generate(__arr + 0, __arr + _M_nstate32);
111*38fd1498Szrj 
112*38fd1498Szrj 	uint32_t __r = _Func1(_M_state32[0] ^ _M_state32[__mid]
113*38fd1498Szrj 			      ^ _M_state32[_M_nstate32  - 1]);
114*38fd1498Szrj 	_M_state32[__mid] += __r;
115*38fd1498Szrj 	__r += _M_nstate32;
116*38fd1498Szrj 	_M_state32[__mid + __lag] += __r;
117*38fd1498Szrj 	_M_state32[0] = __r;
118*38fd1498Szrj 
119*38fd1498Szrj 	for (size_t __i = 1, __j = 0; __j < _M_nstate32; ++__j)
120*38fd1498Szrj 	  {
121*38fd1498Szrj 	    __r = _Func1(_M_state32[__i]
122*38fd1498Szrj 			 ^ _M_state32[(__i + __mid) % _M_nstate32]
123*38fd1498Szrj 			 ^ _M_state32[(__i + _M_nstate32 - 1) % _M_nstate32]);
124*38fd1498Szrj 	    _M_state32[(__i + __mid) % _M_nstate32] += __r;
125*38fd1498Szrj 	    __r += __arr[__j] + __i;
126*38fd1498Szrj 	    _M_state32[(__i + __mid + __lag) % _M_nstate32] += __r;
127*38fd1498Szrj 	    _M_state32[__i] = __r;
128*38fd1498Szrj 	    __i = (__i + 1) % _M_nstate32;
129*38fd1498Szrj 	  }
130*38fd1498Szrj 	for (size_t __j = 0; __j < _M_nstate32; ++__j)
131*38fd1498Szrj 	  {
132*38fd1498Szrj 	    const size_t __i = (__j + 1) % _M_nstate32;
133*38fd1498Szrj 	    __r = _Func2(_M_state32[__i]
134*38fd1498Szrj 			 + _M_state32[(__i + __mid) % _M_nstate32]
135*38fd1498Szrj 			 + _M_state32[(__i + _M_nstate32 - 1) % _M_nstate32]);
136*38fd1498Szrj 	    _M_state32[(__i + __mid) % _M_nstate32] ^= __r;
137*38fd1498Szrj 	    __r -= __i;
138*38fd1498Szrj 	    _M_state32[(__i + __mid + __lag) % _M_nstate32] ^= __r;
139*38fd1498Szrj 	    _M_state32[__i] = __r;
140*38fd1498Szrj 	  }
141*38fd1498Szrj 
142*38fd1498Szrj 	_M_pos = state_size;
143*38fd1498Szrj 	_M_period_certification();
144*38fd1498Szrj       }
145*38fd1498Szrj 
146*38fd1498Szrj 
147*38fd1498Szrj   template<typename _UIntType, size_t __m,
148*38fd1498Szrj 	   size_t __pos1, size_t __sl1, size_t __sl2,
149*38fd1498Szrj 	   size_t __sr1, size_t __sr2,
150*38fd1498Szrj 	   uint32_t __msk1, uint32_t __msk2,
151*38fd1498Szrj 	   uint32_t __msk3, uint32_t __msk4,
152*38fd1498Szrj 	   uint32_t __parity1, uint32_t __parity2,
153*38fd1498Szrj 	   uint32_t __parity3, uint32_t __parity4>
154*38fd1498Szrj     void simd_fast_mersenne_twister_engine<_UIntType, __m,
155*38fd1498Szrj 					   __pos1, __sl1, __sl2, __sr1, __sr2,
156*38fd1498Szrj 					   __msk1, __msk2, __msk3, __msk4,
157*38fd1498Szrj 					   __parity1, __parity2, __parity3,
158*38fd1498Szrj 					   __parity4>::
_M_period_certification(void)159*38fd1498Szrj     _M_period_certification(void)
160*38fd1498Szrj     {
161*38fd1498Szrj       static const uint32_t __parity[4] = { __parity1, __parity2,
162*38fd1498Szrj 					    __parity3, __parity4 };
163*38fd1498Szrj       uint32_t __inner = 0;
164*38fd1498Szrj       for (size_t __i = 0; __i < 4; ++__i)
165*38fd1498Szrj 	if (__parity[__i] != 0)
166*38fd1498Szrj 	  __inner ^= _M_state32[__i] & __parity[__i];
167*38fd1498Szrj 
168*38fd1498Szrj       if (__builtin_parity(__inner) & 1)
169*38fd1498Szrj 	return;
170*38fd1498Szrj       for (size_t __i = 0; __i < 4; ++__i)
171*38fd1498Szrj 	if (__parity[__i] != 0)
172*38fd1498Szrj 	  {
173*38fd1498Szrj 	    _M_state32[__i] ^= 1 << (__builtin_ffs(__parity[__i]) - 1);
174*38fd1498Szrj 	    return;
175*38fd1498Szrj 	  }
176*38fd1498Szrj       __builtin_unreachable();
177*38fd1498Szrj     }
178*38fd1498Szrj 
179*38fd1498Szrj 
180*38fd1498Szrj   template<typename _UIntType, size_t __m,
181*38fd1498Szrj 	   size_t __pos1, size_t __sl1, size_t __sl2,
182*38fd1498Szrj 	   size_t __sr1, size_t __sr2,
183*38fd1498Szrj 	   uint32_t __msk1, uint32_t __msk2,
184*38fd1498Szrj 	   uint32_t __msk3, uint32_t __msk4,
185*38fd1498Szrj 	   uint32_t __parity1, uint32_t __parity2,
186*38fd1498Szrj 	   uint32_t __parity3, uint32_t __parity4>
187*38fd1498Szrj     void simd_fast_mersenne_twister_engine<_UIntType, __m,
188*38fd1498Szrj 					   __pos1, __sl1, __sl2, __sr1, __sr2,
189*38fd1498Szrj 					   __msk1, __msk2, __msk3, __msk4,
190*38fd1498Szrj 					   __parity1, __parity2, __parity3,
191*38fd1498Szrj 					   __parity4>::
discard(unsigned long long __z)192*38fd1498Szrj     discard(unsigned long long __z)
193*38fd1498Szrj     {
194*38fd1498Szrj       while (__z > state_size - _M_pos)
195*38fd1498Szrj 	{
196*38fd1498Szrj 	  __z -= state_size - _M_pos;
197*38fd1498Szrj 
198*38fd1498Szrj 	  _M_gen_rand();
199*38fd1498Szrj 	}
200*38fd1498Szrj 
201*38fd1498Szrj       _M_pos += __z;
202*38fd1498Szrj     }
203*38fd1498Szrj 
204*38fd1498Szrj 
205*38fd1498Szrj #ifndef  _GLIBCXX_OPT_HAVE_RANDOM_SFMT_GEN_READ
206*38fd1498Szrj 
207*38fd1498Szrj   namespace {
208*38fd1498Szrj 
209*38fd1498Szrj     template<size_t __shift>
__rshift(uint32_t * __out,const uint32_t * __in)210*38fd1498Szrj       inline void __rshift(uint32_t *__out, const uint32_t *__in)
211*38fd1498Szrj       {
212*38fd1498Szrj 	uint64_t __th = ((static_cast<uint64_t>(__in[3]) << 32)
213*38fd1498Szrj 			 | static_cast<uint64_t>(__in[2]));
214*38fd1498Szrj 	uint64_t __tl = ((static_cast<uint64_t>(__in[1]) << 32)
215*38fd1498Szrj 			 | static_cast<uint64_t>(__in[0]));
216*38fd1498Szrj 
217*38fd1498Szrj 	uint64_t __oh = __th >> (__shift * 8);
218*38fd1498Szrj 	uint64_t __ol = __tl >> (__shift * 8);
219*38fd1498Szrj 	__ol |= __th << (64 - __shift * 8);
220*38fd1498Szrj 	__out[1] = static_cast<uint32_t>(__ol >> 32);
221*38fd1498Szrj 	__out[0] = static_cast<uint32_t>(__ol);
222*38fd1498Szrj 	__out[3] = static_cast<uint32_t>(__oh >> 32);
223*38fd1498Szrj 	__out[2] = static_cast<uint32_t>(__oh);
224*38fd1498Szrj       }
225*38fd1498Szrj 
226*38fd1498Szrj 
227*38fd1498Szrj     template<size_t __shift>
__lshift(uint32_t * __out,const uint32_t * __in)228*38fd1498Szrj       inline void __lshift(uint32_t *__out, const uint32_t *__in)
229*38fd1498Szrj       {
230*38fd1498Szrj 	uint64_t __th = ((static_cast<uint64_t>(__in[3]) << 32)
231*38fd1498Szrj 			 | static_cast<uint64_t>(__in[2]));
232*38fd1498Szrj 	uint64_t __tl = ((static_cast<uint64_t>(__in[1]) << 32)
233*38fd1498Szrj 			 | static_cast<uint64_t>(__in[0]));
234*38fd1498Szrj 
235*38fd1498Szrj 	uint64_t __oh = __th << (__shift * 8);
236*38fd1498Szrj 	uint64_t __ol = __tl << (__shift * 8);
237*38fd1498Szrj 	__oh |= __tl >> (64 - __shift * 8);
238*38fd1498Szrj 	__out[1] = static_cast<uint32_t>(__ol >> 32);
239*38fd1498Szrj 	__out[0] = static_cast<uint32_t>(__ol);
240*38fd1498Szrj 	__out[3] = static_cast<uint32_t>(__oh >> 32);
241*38fd1498Szrj 	__out[2] = static_cast<uint32_t>(__oh);
242*38fd1498Szrj       }
243*38fd1498Szrj 
244*38fd1498Szrj 
245*38fd1498Szrj     template<size_t __sl1, size_t __sl2, size_t __sr1, size_t __sr2,
246*38fd1498Szrj 	     uint32_t __msk1, uint32_t __msk2, uint32_t __msk3, uint32_t __msk4>
__recursion(uint32_t * __r,const uint32_t * __a,const uint32_t * __b,const uint32_t * __c,const uint32_t * __d)247*38fd1498Szrj       inline void __recursion(uint32_t *__r,
248*38fd1498Szrj 			      const uint32_t *__a, const uint32_t *__b,
249*38fd1498Szrj 			      const uint32_t *__c, const uint32_t *__d)
250*38fd1498Szrj       {
251*38fd1498Szrj 	uint32_t __x[4];
252*38fd1498Szrj 	uint32_t __y[4];
253*38fd1498Szrj 
254*38fd1498Szrj 	__lshift<__sl2>(__x, __a);
255*38fd1498Szrj 	__rshift<__sr2>(__y, __c);
256*38fd1498Szrj 	__r[0] = (__a[0] ^ __x[0] ^ ((__b[0] >> __sr1) & __msk1)
257*38fd1498Szrj 		  ^ __y[0] ^ (__d[0] << __sl1));
258*38fd1498Szrj 	__r[1] = (__a[1] ^ __x[1] ^ ((__b[1] >> __sr1) & __msk2)
259*38fd1498Szrj 		  ^ __y[1] ^ (__d[1] << __sl1));
260*38fd1498Szrj 	__r[2] = (__a[2] ^ __x[2] ^ ((__b[2] >> __sr1) & __msk3)
261*38fd1498Szrj 		  ^ __y[2] ^ (__d[2] << __sl1));
262*38fd1498Szrj 	__r[3] = (__a[3] ^ __x[3] ^ ((__b[3] >> __sr1) & __msk4)
263*38fd1498Szrj 		  ^ __y[3] ^ (__d[3] << __sl1));
264*38fd1498Szrj       }
265*38fd1498Szrj 
266*38fd1498Szrj   }
267*38fd1498Szrj 
268*38fd1498Szrj 
269*38fd1498Szrj   template<typename _UIntType, size_t __m,
270*38fd1498Szrj 	   size_t __pos1, size_t __sl1, size_t __sl2,
271*38fd1498Szrj 	   size_t __sr1, size_t __sr2,
272*38fd1498Szrj 	   uint32_t __msk1, uint32_t __msk2,
273*38fd1498Szrj 	   uint32_t __msk3, uint32_t __msk4,
274*38fd1498Szrj 	   uint32_t __parity1, uint32_t __parity2,
275*38fd1498Szrj 	   uint32_t __parity3, uint32_t __parity4>
276*38fd1498Szrj     void simd_fast_mersenne_twister_engine<_UIntType, __m,
277*38fd1498Szrj 					   __pos1, __sl1, __sl2, __sr1, __sr2,
278*38fd1498Szrj 					   __msk1, __msk2, __msk3, __msk4,
279*38fd1498Szrj 					   __parity1, __parity2, __parity3,
280*38fd1498Szrj 					   __parity4>::
_M_gen_rand(void)281*38fd1498Szrj     _M_gen_rand(void)
282*38fd1498Szrj     {
283*38fd1498Szrj       const uint32_t *__r1 = &_M_state32[_M_nstate32 - 8];
284*38fd1498Szrj       const uint32_t *__r2 = &_M_state32[_M_nstate32 - 4];
285*38fd1498Szrj       static constexpr size_t __pos1_32 = __pos1 * 4;
286*38fd1498Szrj 
287*38fd1498Szrj       size_t __i;
288*38fd1498Szrj       for (__i = 0; __i < _M_nstate32 - __pos1_32; __i += 4)
289*38fd1498Szrj 	{
290*38fd1498Szrj 	  __recursion<__sl1, __sl2, __sr1, __sr2,
291*38fd1498Szrj 		      __msk1, __msk2, __msk3, __msk4>
292*38fd1498Szrj 	    (&_M_state32[__i], &_M_state32[__i],
293*38fd1498Szrj 	     &_M_state32[__i + __pos1_32], __r1, __r2);
294*38fd1498Szrj 	  __r1 = __r2;
295*38fd1498Szrj 	  __r2 = &_M_state32[__i];
296*38fd1498Szrj 	}
297*38fd1498Szrj 
298*38fd1498Szrj       for (; __i < _M_nstate32; __i += 4)
299*38fd1498Szrj 	{
300*38fd1498Szrj 	  __recursion<__sl1, __sl2, __sr1, __sr2,
301*38fd1498Szrj 		      __msk1, __msk2, __msk3, __msk4>
302*38fd1498Szrj 	    (&_M_state32[__i], &_M_state32[__i],
303*38fd1498Szrj 	     &_M_state32[__i + __pos1_32 - _M_nstate32], __r1, __r2);
304*38fd1498Szrj 	  __r1 = __r2;
305*38fd1498Szrj 	  __r2 = &_M_state32[__i];
306*38fd1498Szrj 	}
307*38fd1498Szrj 
308*38fd1498Szrj       _M_pos = 0;
309*38fd1498Szrj     }
310*38fd1498Szrj 
311*38fd1498Szrj #endif
312*38fd1498Szrj 
313*38fd1498Szrj #ifndef _GLIBCXX_OPT_HAVE_RANDOM_SFMT_OPERATOREQUAL
314*38fd1498Szrj   template<typename _UIntType, size_t __m,
315*38fd1498Szrj 	   size_t __pos1, size_t __sl1, size_t __sl2,
316*38fd1498Szrj 	   size_t __sr1, size_t __sr2,
317*38fd1498Szrj 	   uint32_t __msk1, uint32_t __msk2,
318*38fd1498Szrj 	   uint32_t __msk3, uint32_t __msk4,
319*38fd1498Szrj 	   uint32_t __parity1, uint32_t __parity2,
320*38fd1498Szrj 	   uint32_t __parity3, uint32_t __parity4>
321*38fd1498Szrj     bool
operator ==(const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,__m,__pos1,__sl1,__sl2,__sr1,__sr2,__msk1,__msk2,__msk3,__msk4,__parity1,__parity2,__parity3,__parity4> & __lhs,const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,__m,__pos1,__sl1,__sl2,__sr1,__sr2,__msk1,__msk2,__msk3,__msk4,__parity1,__parity2,__parity3,__parity4> & __rhs)322*38fd1498Szrj     operator==(const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
323*38fd1498Szrj 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
324*38fd1498Szrj 	       __msk1, __msk2, __msk3, __msk4,
325*38fd1498Szrj 	       __parity1, __parity2, __parity3, __parity4>& __lhs,
326*38fd1498Szrj 	       const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
327*38fd1498Szrj 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
328*38fd1498Szrj 	       __msk1, __msk2, __msk3, __msk4,
329*38fd1498Szrj 	       __parity1, __parity2, __parity3, __parity4>& __rhs)
330*38fd1498Szrj     {
331*38fd1498Szrj       typedef __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
332*38fd1498Szrj 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
333*38fd1498Szrj 	       __msk1, __msk2, __msk3, __msk4,
334*38fd1498Szrj 	       __parity1, __parity2, __parity3, __parity4> __engine;
335*38fd1498Szrj       return (std::equal(__lhs._M_stateT,
336*38fd1498Szrj 			 __lhs._M_stateT + __engine::state_size,
337*38fd1498Szrj 			 __rhs._M_stateT)
338*38fd1498Szrj 	      && __lhs._M_pos == __rhs._M_pos);
339*38fd1498Szrj     }
340*38fd1498Szrj #endif
341*38fd1498Szrj 
342*38fd1498Szrj   template<typename _UIntType, size_t __m,
343*38fd1498Szrj 	   size_t __pos1, size_t __sl1, size_t __sl2,
344*38fd1498Szrj 	   size_t __sr1, size_t __sr2,
345*38fd1498Szrj 	   uint32_t __msk1, uint32_t __msk2,
346*38fd1498Szrj 	   uint32_t __msk3, uint32_t __msk4,
347*38fd1498Szrj 	   uint32_t __parity1, uint32_t __parity2,
348*38fd1498Szrj 	   uint32_t __parity3, uint32_t __parity4,
349*38fd1498Szrj 	   typename _CharT, typename _Traits>
350*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,__m,__pos1,__sl1,__sl2,__sr1,__sr2,__msk1,__msk2,__msk3,__msk4,__parity1,__parity2,__parity3,__parity4> & __x)351*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
352*38fd1498Szrj 	       const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
353*38fd1498Szrj 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
354*38fd1498Szrj 	       __msk1, __msk2, __msk3, __msk4,
355*38fd1498Szrj 	       __parity1, __parity2, __parity3, __parity4>& __x)
356*38fd1498Szrj     {
357*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits> __ostream_type;
358*38fd1498Szrj       typedef typename __ostream_type::ios_base __ios_base;
359*38fd1498Szrj 
360*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
361*38fd1498Szrj       const _CharT __fill = __os.fill();
362*38fd1498Szrj       const _CharT __space = __os.widen(' ');
363*38fd1498Szrj       __os.flags(__ios_base::dec | __ios_base::fixed | __ios_base::left);
364*38fd1498Szrj       __os.fill(__space);
365*38fd1498Szrj 
366*38fd1498Szrj       for (size_t __i = 0; __i < __x._M_nstate32; ++__i)
367*38fd1498Szrj 	__os << __x._M_state32[__i] << __space;
368*38fd1498Szrj       __os << __x._M_pos;
369*38fd1498Szrj 
370*38fd1498Szrj       __os.flags(__flags);
371*38fd1498Szrj       __os.fill(__fill);
372*38fd1498Szrj       return __os;
373*38fd1498Szrj     }
374*38fd1498Szrj 
375*38fd1498Szrj 
376*38fd1498Szrj   template<typename _UIntType, size_t __m,
377*38fd1498Szrj 	   size_t __pos1, size_t __sl1, size_t __sl2,
378*38fd1498Szrj 	   size_t __sr1, size_t __sr2,
379*38fd1498Szrj 	   uint32_t __msk1, uint32_t __msk2,
380*38fd1498Szrj 	   uint32_t __msk3, uint32_t __msk4,
381*38fd1498Szrj 	   uint32_t __parity1, uint32_t __parity2,
382*38fd1498Szrj 	   uint32_t __parity3, uint32_t __parity4,
383*38fd1498Szrj 	   typename _CharT, typename _Traits>
384*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,__gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,__m,__pos1,__sl1,__sl2,__sr1,__sr2,__msk1,__msk2,__msk3,__msk4,__parity1,__parity2,__parity3,__parity4> & __x)385*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
386*38fd1498Szrj 	       __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
387*38fd1498Szrj 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
388*38fd1498Szrj 	       __msk1, __msk2, __msk3, __msk4,
389*38fd1498Szrj 	       __parity1, __parity2, __parity3, __parity4>& __x)
390*38fd1498Szrj     {
391*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits> __istream_type;
392*38fd1498Szrj       typedef typename __istream_type::ios_base __ios_base;
393*38fd1498Szrj 
394*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
395*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
396*38fd1498Szrj 
397*38fd1498Szrj       for (size_t __i = 0; __i < __x._M_nstate32; ++__i)
398*38fd1498Szrj 	__is >> __x._M_state32[__i];
399*38fd1498Szrj       __is >> __x._M_pos;
400*38fd1498Szrj 
401*38fd1498Szrj       __is.flags(__flags);
402*38fd1498Szrj       return __is;
403*38fd1498Szrj     }
404*38fd1498Szrj 
405*38fd1498Szrj #endif // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
406*38fd1498Szrj 
407*38fd1498Szrj   /**
408*38fd1498Szrj    * Iteration method due to M.D. J<o:>hnk.
409*38fd1498Szrj    *
410*38fd1498Szrj    * M.D. J<o:>hnk, Erzeugung von betaverteilten und gammaverteilten
411*38fd1498Szrj    * Zufallszahlen, Metrika, Volume 8, 1964
412*38fd1498Szrj    */
413*38fd1498Szrj   template<typename _RealType>
414*38fd1498Szrj     template<typename _UniformRandomNumberGenerator>
415*38fd1498Szrj       typename beta_distribution<_RealType>::result_type
416*38fd1498Szrj       beta_distribution<_RealType>::
operator ()(_UniformRandomNumberGenerator & __urng,const param_type & __param)417*38fd1498Szrj       operator()(_UniformRandomNumberGenerator& __urng,
418*38fd1498Szrj 		 const param_type& __param)
419*38fd1498Szrj       {
420*38fd1498Szrj 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
421*38fd1498Szrj 	  __aurng(__urng);
422*38fd1498Szrj 
423*38fd1498Szrj 	result_type __x, __y;
424*38fd1498Szrj 	do
425*38fd1498Szrj 	  {
426*38fd1498Szrj 	    __x = std::exp(std::log(__aurng()) / __param.alpha());
427*38fd1498Szrj 	    __y = std::exp(std::log(__aurng()) / __param.beta());
428*38fd1498Szrj 	  }
429*38fd1498Szrj 	while (__x + __y > result_type(1));
430*38fd1498Szrj 
431*38fd1498Szrj 	return __x / (__x + __y);
432*38fd1498Szrj       }
433*38fd1498Szrj 
434*38fd1498Szrj   template<typename _RealType>
435*38fd1498Szrj     template<typename _OutputIterator,
436*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
437*38fd1498Szrj       void
438*38fd1498Szrj       beta_distribution<_RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __param)439*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
440*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
441*38fd1498Szrj 		      const param_type& __param)
442*38fd1498Szrj       {
443*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
444*38fd1498Szrj 	    result_type>)
445*38fd1498Szrj 
446*38fd1498Szrj 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
447*38fd1498Szrj 	  __aurng(__urng);
448*38fd1498Szrj 
449*38fd1498Szrj 	while (__f != __t)
450*38fd1498Szrj 	  {
451*38fd1498Szrj 	    result_type __x, __y;
452*38fd1498Szrj 	    do
453*38fd1498Szrj 	      {
454*38fd1498Szrj 		__x = std::exp(std::log(__aurng()) / __param.alpha());
455*38fd1498Szrj 		__y = std::exp(std::log(__aurng()) / __param.beta());
456*38fd1498Szrj 	      }
457*38fd1498Szrj 	    while (__x + __y > result_type(1));
458*38fd1498Szrj 
459*38fd1498Szrj 	    *__f++ = __x / (__x + __y);
460*38fd1498Szrj 	  }
461*38fd1498Szrj       }
462*38fd1498Szrj 
463*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
464*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const __gnu_cxx::beta_distribution<_RealType> & __x)465*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
466*38fd1498Szrj 	       const __gnu_cxx::beta_distribution<_RealType>& __x)
467*38fd1498Szrj     {
468*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
469*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
470*38fd1498Szrj 
471*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
472*38fd1498Szrj       const _CharT __fill = __os.fill();
473*38fd1498Szrj       const std::streamsize __precision = __os.precision();
474*38fd1498Szrj       const _CharT __space = __os.widen(' ');
475*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
476*38fd1498Szrj       __os.fill(__space);
477*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
478*38fd1498Szrj 
479*38fd1498Szrj       __os << __x.alpha() << __space << __x.beta();
480*38fd1498Szrj 
481*38fd1498Szrj       __os.flags(__flags);
482*38fd1498Szrj       __os.fill(__fill);
483*38fd1498Szrj       __os.precision(__precision);
484*38fd1498Szrj       return __os;
485*38fd1498Szrj     }
486*38fd1498Szrj 
487*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
488*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,__gnu_cxx::beta_distribution<_RealType> & __x)489*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
490*38fd1498Szrj 	       __gnu_cxx::beta_distribution<_RealType>& __x)
491*38fd1498Szrj     {
492*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
493*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
494*38fd1498Szrj 
495*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
496*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
497*38fd1498Szrj 
498*38fd1498Szrj       _RealType __alpha_val, __beta_val;
499*38fd1498Szrj       __is >> __alpha_val >> __beta_val;
500*38fd1498Szrj       __x.param(typename __gnu_cxx::beta_distribution<_RealType>::
501*38fd1498Szrj 		param_type(__alpha_val, __beta_val));
502*38fd1498Szrj 
503*38fd1498Szrj       __is.flags(__flags);
504*38fd1498Szrj       return __is;
505*38fd1498Szrj     }
506*38fd1498Szrj 
507*38fd1498Szrj 
508*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType>
509*38fd1498Szrj     template<typename _InputIterator1, typename _InputIterator2>
510*38fd1498Szrj       void
511*38fd1498Szrj       normal_mv_distribution<_Dimen, _RealType>::param_type::
_M_init_full(_InputIterator1 __meanbegin,_InputIterator1 __meanend,_InputIterator2 __varcovbegin,_InputIterator2 __varcovend)512*38fd1498Szrj       _M_init_full(_InputIterator1 __meanbegin, _InputIterator1 __meanend,
513*38fd1498Szrj 		   _InputIterator2 __varcovbegin, _InputIterator2 __varcovend)
514*38fd1498Szrj       {
515*38fd1498Szrj 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
516*38fd1498Szrj 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
517*38fd1498Szrj 	std::fill(std::copy(__meanbegin, __meanend, _M_mean.begin()),
518*38fd1498Szrj 		  _M_mean.end(), _RealType(0));
519*38fd1498Szrj 
520*38fd1498Szrj 	// Perform the Cholesky decomposition
521*38fd1498Szrj 	auto __w = _M_t.begin();
522*38fd1498Szrj 	for (size_t __j = 0; __j < _Dimen; ++__j)
523*38fd1498Szrj 	  {
524*38fd1498Szrj 	    _RealType __sum = _RealType(0);
525*38fd1498Szrj 
526*38fd1498Szrj 	    auto __slitbegin = __w;
527*38fd1498Szrj 	    auto __cit = _M_t.begin();
528*38fd1498Szrj 	    for (size_t __i = 0; __i < __j; ++__i)
529*38fd1498Szrj 	      {
530*38fd1498Szrj 		auto __slit = __slitbegin;
531*38fd1498Szrj 		_RealType __s = *__varcovbegin++;
532*38fd1498Szrj 		for (size_t __k = 0; __k < __i; ++__k)
533*38fd1498Szrj 		  __s -= *__slit++ * *__cit++;
534*38fd1498Szrj 
535*38fd1498Szrj 		*__w++ = __s /= *__cit++;
536*38fd1498Szrj 		__sum += __s * __s;
537*38fd1498Szrj 	      }
538*38fd1498Szrj 
539*38fd1498Szrj 	    __sum = *__varcovbegin - __sum;
540*38fd1498Szrj 	    if (__builtin_expect(__sum <= _RealType(0), 0))
541*38fd1498Szrj 	      std::__throw_runtime_error(__N("normal_mv_distribution::"
542*38fd1498Szrj 					     "param_type::_M_init_full"));
543*38fd1498Szrj 	    *__w++ = std::sqrt(__sum);
544*38fd1498Szrj 
545*38fd1498Szrj 	    std::advance(__varcovbegin, _Dimen - __j);
546*38fd1498Szrj 	  }
547*38fd1498Szrj       }
548*38fd1498Szrj 
549*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType>
550*38fd1498Szrj     template<typename _InputIterator1, typename _InputIterator2>
551*38fd1498Szrj       void
552*38fd1498Szrj       normal_mv_distribution<_Dimen, _RealType>::param_type::
_M_init_lower(_InputIterator1 __meanbegin,_InputIterator1 __meanend,_InputIterator2 __varcovbegin,_InputIterator2 __varcovend)553*38fd1498Szrj       _M_init_lower(_InputIterator1 __meanbegin, _InputIterator1 __meanend,
554*38fd1498Szrj 		    _InputIterator2 __varcovbegin, _InputIterator2 __varcovend)
555*38fd1498Szrj       {
556*38fd1498Szrj 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
557*38fd1498Szrj 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
558*38fd1498Szrj 	std::fill(std::copy(__meanbegin, __meanend, _M_mean.begin()),
559*38fd1498Szrj 		  _M_mean.end(), _RealType(0));
560*38fd1498Szrj 
561*38fd1498Szrj 	// Perform the Cholesky decomposition
562*38fd1498Szrj 	auto __w = _M_t.begin();
563*38fd1498Szrj 	for (size_t __j = 0; __j < _Dimen; ++__j)
564*38fd1498Szrj 	  {
565*38fd1498Szrj 	    _RealType __sum = _RealType(0);
566*38fd1498Szrj 
567*38fd1498Szrj 	    auto __slitbegin = __w;
568*38fd1498Szrj 	    auto __cit = _M_t.begin();
569*38fd1498Szrj 	    for (size_t __i = 0; __i < __j; ++__i)
570*38fd1498Szrj 	      {
571*38fd1498Szrj 		auto __slit = __slitbegin;
572*38fd1498Szrj 		_RealType __s = *__varcovbegin++;
573*38fd1498Szrj 		for (size_t __k = 0; __k < __i; ++__k)
574*38fd1498Szrj 		  __s -= *__slit++ * *__cit++;
575*38fd1498Szrj 
576*38fd1498Szrj 		*__w++ = __s /= *__cit++;
577*38fd1498Szrj 		__sum += __s * __s;
578*38fd1498Szrj 	      }
579*38fd1498Szrj 
580*38fd1498Szrj 	    __sum = *__varcovbegin++ - __sum;
581*38fd1498Szrj 	    if (__builtin_expect(__sum <= _RealType(0), 0))
582*38fd1498Szrj 	      std::__throw_runtime_error(__N("normal_mv_distribution::"
583*38fd1498Szrj 					     "param_type::_M_init_full"));
584*38fd1498Szrj 	    *__w++ = std::sqrt(__sum);
585*38fd1498Szrj 	  }
586*38fd1498Szrj       }
587*38fd1498Szrj 
588*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType>
589*38fd1498Szrj     template<typename _InputIterator1, typename _InputIterator2>
590*38fd1498Szrj       void
591*38fd1498Szrj       normal_mv_distribution<_Dimen, _RealType>::param_type::
_M_init_diagonal(_InputIterator1 __meanbegin,_InputIterator1 __meanend,_InputIterator2 __varbegin,_InputIterator2 __varend)592*38fd1498Szrj       _M_init_diagonal(_InputIterator1 __meanbegin, _InputIterator1 __meanend,
593*38fd1498Szrj 		       _InputIterator2 __varbegin, _InputIterator2 __varend)
594*38fd1498Szrj       {
595*38fd1498Szrj 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
596*38fd1498Szrj 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
597*38fd1498Szrj 	std::fill(std::copy(__meanbegin, __meanend, _M_mean.begin()),
598*38fd1498Szrj 		  _M_mean.end(), _RealType(0));
599*38fd1498Szrj 
600*38fd1498Szrj 	auto __w = _M_t.begin();
601*38fd1498Szrj 	size_t __step = 0;
602*38fd1498Szrj 	while (__varbegin != __varend)
603*38fd1498Szrj 	  {
604*38fd1498Szrj 	    std::fill_n(__w, __step, _RealType(0));
605*38fd1498Szrj 	    __w += __step++;
606*38fd1498Szrj 	    if (__builtin_expect(*__varbegin < _RealType(0), 0))
607*38fd1498Szrj 	      std::__throw_runtime_error(__N("normal_mv_distribution::"
608*38fd1498Szrj 					     "param_type::_M_init_diagonal"));
609*38fd1498Szrj 	    *__w++ = std::sqrt(*__varbegin++);
610*38fd1498Szrj 	  }
611*38fd1498Szrj       }
612*38fd1498Szrj 
613*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType>
614*38fd1498Szrj     template<typename _UniformRandomNumberGenerator>
615*38fd1498Szrj       typename normal_mv_distribution<_Dimen, _RealType>::result_type
616*38fd1498Szrj       normal_mv_distribution<_Dimen, _RealType>::
operator ()(_UniformRandomNumberGenerator & __urng,const param_type & __param)617*38fd1498Szrj       operator()(_UniformRandomNumberGenerator& __urng,
618*38fd1498Szrj 		 const param_type& __param)
619*38fd1498Szrj       {
620*38fd1498Szrj 	result_type __ret;
621*38fd1498Szrj 
622*38fd1498Szrj 	_M_nd.__generate(__ret.begin(), __ret.end(), __urng);
623*38fd1498Szrj 
624*38fd1498Szrj 	auto __t_it = __param._M_t.crbegin();
625*38fd1498Szrj 	for (size_t __i = _Dimen; __i > 0; --__i)
626*38fd1498Szrj 	  {
627*38fd1498Szrj 	    _RealType __sum = _RealType(0);
628*38fd1498Szrj 	    for (size_t __j = __i; __j > 0; --__j)
629*38fd1498Szrj 	      __sum += __ret[__j - 1] * *__t_it++;
630*38fd1498Szrj 	    __ret[__i - 1] = __sum;
631*38fd1498Szrj 	  }
632*38fd1498Szrj 
633*38fd1498Szrj 	return __ret;
634*38fd1498Szrj       }
635*38fd1498Szrj 
636*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType>
637*38fd1498Szrj     template<typename _ForwardIterator, typename _UniformRandomNumberGenerator>
638*38fd1498Szrj       void
639*38fd1498Szrj       normal_mv_distribution<_Dimen, _RealType>::
__generate_impl(_ForwardIterator __f,_ForwardIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __param)640*38fd1498Szrj       __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
641*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
642*38fd1498Szrj 		      const param_type& __param)
643*38fd1498Szrj       {
644*38fd1498Szrj 	__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
645*38fd1498Szrj 				    _ForwardIterator>)
646*38fd1498Szrj 	while (__f != __t)
647*38fd1498Szrj 	  *__f++ = this->operator()(__urng, __param);
648*38fd1498Szrj       }
649*38fd1498Szrj 
650*38fd1498Szrj   template<size_t _Dimen, typename _RealType>
651*38fd1498Szrj     bool
operator ==(const __gnu_cxx::normal_mv_distribution<_Dimen,_RealType> & __d1,const __gnu_cxx::normal_mv_distribution<_Dimen,_RealType> & __d2)652*38fd1498Szrj     operator==(const __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>&
653*38fd1498Szrj 	       __d1,
654*38fd1498Szrj 	       const __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>&
655*38fd1498Szrj 	       __d2)
656*38fd1498Szrj     {
657*38fd1498Szrj       return __d1._M_param == __d2._M_param && __d1._M_nd == __d2._M_nd;
658*38fd1498Szrj     }
659*38fd1498Szrj 
660*38fd1498Szrj   template<size_t _Dimen, typename _RealType, typename _CharT, typename _Traits>
661*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const __gnu_cxx::normal_mv_distribution<_Dimen,_RealType> & __x)662*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
663*38fd1498Szrj 	       const __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>& __x)
664*38fd1498Szrj     {
665*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
666*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
667*38fd1498Szrj 
668*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
669*38fd1498Szrj       const _CharT __fill = __os.fill();
670*38fd1498Szrj       const std::streamsize __precision = __os.precision();
671*38fd1498Szrj       const _CharT __space = __os.widen(' ');
672*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
673*38fd1498Szrj       __os.fill(__space);
674*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
675*38fd1498Szrj 
676*38fd1498Szrj       auto __mean = __x._M_param.mean();
677*38fd1498Szrj       for (auto __it : __mean)
678*38fd1498Szrj 	__os << __it << __space;
679*38fd1498Szrj       auto __t = __x._M_param.varcov();
680*38fd1498Szrj       for (auto __it : __t)
681*38fd1498Szrj 	__os << __it << __space;
682*38fd1498Szrj 
683*38fd1498Szrj       __os << __x._M_nd;
684*38fd1498Szrj 
685*38fd1498Szrj       __os.flags(__flags);
686*38fd1498Szrj       __os.fill(__fill);
687*38fd1498Szrj       __os.precision(__precision);
688*38fd1498Szrj       return __os;
689*38fd1498Szrj     }
690*38fd1498Szrj 
691*38fd1498Szrj   template<size_t _Dimen, typename _RealType, typename _CharT, typename _Traits>
692*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,__gnu_cxx::normal_mv_distribution<_Dimen,_RealType> & __x)693*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
694*38fd1498Szrj 	       __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>& __x)
695*38fd1498Szrj     {
696*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
697*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
698*38fd1498Szrj 
699*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
700*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
701*38fd1498Szrj 
702*38fd1498Szrj       std::array<_RealType, _Dimen> __mean;
703*38fd1498Szrj       for (auto& __it : __mean)
704*38fd1498Szrj 	__is >> __it;
705*38fd1498Szrj       std::array<_RealType, _Dimen * (_Dimen + 1) / 2> __varcov;
706*38fd1498Szrj       for (auto& __it : __varcov)
707*38fd1498Szrj 	__is >> __it;
708*38fd1498Szrj 
709*38fd1498Szrj       __is >> __x._M_nd;
710*38fd1498Szrj 
711*38fd1498Szrj       __x.param(typename normal_mv_distribution<_Dimen, _RealType>::
712*38fd1498Szrj 		param_type(__mean.begin(), __mean.end(),
713*38fd1498Szrj 			   __varcov.begin(), __varcov.end()));
714*38fd1498Szrj 
715*38fd1498Szrj       __is.flags(__flags);
716*38fd1498Szrj       return __is;
717*38fd1498Szrj     }
718*38fd1498Szrj 
719*38fd1498Szrj 
720*38fd1498Szrj   template<typename _RealType>
721*38fd1498Szrj     template<typename _OutputIterator,
722*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
723*38fd1498Szrj       void
724*38fd1498Szrj       rice_distribution<_RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __p)725*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
726*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
727*38fd1498Szrj 		      const param_type& __p)
728*38fd1498Szrj       {
729*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
730*38fd1498Szrj 	    result_type>)
731*38fd1498Szrj 
732*38fd1498Szrj 	while (__f != __t)
733*38fd1498Szrj 	  {
734*38fd1498Szrj 	    typename std::normal_distribution<result_type>::param_type
735*38fd1498Szrj 	      __px(__p.nu(), __p.sigma()), __py(result_type(0), __p.sigma());
736*38fd1498Szrj 	    result_type __x = this->_M_ndx(__px, __urng);
737*38fd1498Szrj 	    result_type __y = this->_M_ndy(__py, __urng);
738*38fd1498Szrj #if _GLIBCXX_USE_C99_MATH_TR1
739*38fd1498Szrj 	    *__f++ = std::hypot(__x, __y);
740*38fd1498Szrj #else
741*38fd1498Szrj 	    *__f++ = std::sqrt(__x * __x + __y * __y);
742*38fd1498Szrj #endif
743*38fd1498Szrj 	  }
744*38fd1498Szrj       }
745*38fd1498Szrj 
746*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
747*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const rice_distribution<_RealType> & __x)748*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
749*38fd1498Szrj 	       const rice_distribution<_RealType>& __x)
750*38fd1498Szrj     {
751*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
752*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
753*38fd1498Szrj 
754*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
755*38fd1498Szrj       const _CharT __fill = __os.fill();
756*38fd1498Szrj       const std::streamsize __precision = __os.precision();
757*38fd1498Szrj       const _CharT __space = __os.widen(' ');
758*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
759*38fd1498Szrj       __os.fill(__space);
760*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
761*38fd1498Szrj 
762*38fd1498Szrj       __os << __x.nu() << __space << __x.sigma();
763*38fd1498Szrj       __os << __space << __x._M_ndx;
764*38fd1498Szrj       __os << __space << __x._M_ndy;
765*38fd1498Szrj 
766*38fd1498Szrj       __os.flags(__flags);
767*38fd1498Szrj       __os.fill(__fill);
768*38fd1498Szrj       __os.precision(__precision);
769*38fd1498Szrj       return __os;
770*38fd1498Szrj     }
771*38fd1498Szrj 
772*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
773*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,rice_distribution<_RealType> & __x)774*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
775*38fd1498Szrj 	       rice_distribution<_RealType>& __x)
776*38fd1498Szrj     {
777*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
778*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
779*38fd1498Szrj 
780*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
781*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
782*38fd1498Szrj 
783*38fd1498Szrj       _RealType __nu_val, __sigma_val;
784*38fd1498Szrj       __is >> __nu_val >> __sigma_val;
785*38fd1498Szrj       __is >> __x._M_ndx;
786*38fd1498Szrj       __is >> __x._M_ndy;
787*38fd1498Szrj       __x.param(typename rice_distribution<_RealType>::
788*38fd1498Szrj 		param_type(__nu_val, __sigma_val));
789*38fd1498Szrj 
790*38fd1498Szrj       __is.flags(__flags);
791*38fd1498Szrj       return __is;
792*38fd1498Szrj     }
793*38fd1498Szrj 
794*38fd1498Szrj 
795*38fd1498Szrj   template<typename _RealType>
796*38fd1498Szrj     template<typename _OutputIterator,
797*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
798*38fd1498Szrj       void
799*38fd1498Szrj       nakagami_distribution<_RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __p)800*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
801*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
802*38fd1498Szrj 		      const param_type& __p)
803*38fd1498Szrj       {
804*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
805*38fd1498Szrj 	    result_type>)
806*38fd1498Szrj 
807*38fd1498Szrj 	typename std::gamma_distribution<result_type>::param_type
808*38fd1498Szrj 	  __pg(__p.mu(), __p.omega() / __p.mu());
809*38fd1498Szrj 	while (__f != __t)
810*38fd1498Szrj 	  *__f++ = std::sqrt(this->_M_gd(__pg, __urng));
811*38fd1498Szrj       }
812*38fd1498Szrj 
813*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
814*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const nakagami_distribution<_RealType> & __x)815*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
816*38fd1498Szrj 	       const nakagami_distribution<_RealType>& __x)
817*38fd1498Szrj     {
818*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
819*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
820*38fd1498Szrj 
821*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
822*38fd1498Szrj       const _CharT __fill = __os.fill();
823*38fd1498Szrj       const std::streamsize __precision = __os.precision();
824*38fd1498Szrj       const _CharT __space = __os.widen(' ');
825*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
826*38fd1498Szrj       __os.fill(__space);
827*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
828*38fd1498Szrj 
829*38fd1498Szrj       __os << __x.mu() << __space << __x.omega();
830*38fd1498Szrj       __os << __space << __x._M_gd;
831*38fd1498Szrj 
832*38fd1498Szrj       __os.flags(__flags);
833*38fd1498Szrj       __os.fill(__fill);
834*38fd1498Szrj       __os.precision(__precision);
835*38fd1498Szrj       return __os;
836*38fd1498Szrj     }
837*38fd1498Szrj 
838*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
839*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,nakagami_distribution<_RealType> & __x)840*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
841*38fd1498Szrj 	       nakagami_distribution<_RealType>& __x)
842*38fd1498Szrj     {
843*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
844*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
845*38fd1498Szrj 
846*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
847*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
848*38fd1498Szrj 
849*38fd1498Szrj       _RealType __mu_val, __omega_val;
850*38fd1498Szrj       __is >> __mu_val >> __omega_val;
851*38fd1498Szrj       __is >> __x._M_gd;
852*38fd1498Szrj       __x.param(typename nakagami_distribution<_RealType>::
853*38fd1498Szrj 		param_type(__mu_val, __omega_val));
854*38fd1498Szrj 
855*38fd1498Szrj       __is.flags(__flags);
856*38fd1498Szrj       return __is;
857*38fd1498Szrj     }
858*38fd1498Szrj 
859*38fd1498Szrj 
860*38fd1498Szrj   template<typename _RealType>
861*38fd1498Szrj     template<typename _OutputIterator,
862*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
863*38fd1498Szrj       void
864*38fd1498Szrj       pareto_distribution<_RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __p)865*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
866*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
867*38fd1498Szrj 		      const param_type& __p)
868*38fd1498Szrj       {
869*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
870*38fd1498Szrj 	    result_type>)
871*38fd1498Szrj 
872*38fd1498Szrj 	result_type __mu_val = __p.mu();
873*38fd1498Szrj 	result_type __malphinv = -result_type(1) / __p.alpha();
874*38fd1498Szrj 	while (__f != __t)
875*38fd1498Szrj 	  *__f++ = __mu_val * std::pow(this->_M_ud(__urng), __malphinv);
876*38fd1498Szrj       }
877*38fd1498Szrj 
878*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
879*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const pareto_distribution<_RealType> & __x)880*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
881*38fd1498Szrj 	       const pareto_distribution<_RealType>& __x)
882*38fd1498Szrj     {
883*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
884*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
885*38fd1498Szrj 
886*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
887*38fd1498Szrj       const _CharT __fill = __os.fill();
888*38fd1498Szrj       const std::streamsize __precision = __os.precision();
889*38fd1498Szrj       const _CharT __space = __os.widen(' ');
890*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
891*38fd1498Szrj       __os.fill(__space);
892*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
893*38fd1498Szrj 
894*38fd1498Szrj       __os << __x.alpha() << __space << __x.mu();
895*38fd1498Szrj       __os << __space << __x._M_ud;
896*38fd1498Szrj 
897*38fd1498Szrj       __os.flags(__flags);
898*38fd1498Szrj       __os.fill(__fill);
899*38fd1498Szrj       __os.precision(__precision);
900*38fd1498Szrj       return __os;
901*38fd1498Szrj     }
902*38fd1498Szrj 
903*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
904*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,pareto_distribution<_RealType> & __x)905*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
906*38fd1498Szrj 	       pareto_distribution<_RealType>& __x)
907*38fd1498Szrj     {
908*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
909*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
910*38fd1498Szrj 
911*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
912*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
913*38fd1498Szrj 
914*38fd1498Szrj       _RealType __alpha_val, __mu_val;
915*38fd1498Szrj       __is >> __alpha_val >> __mu_val;
916*38fd1498Szrj       __is >> __x._M_ud;
917*38fd1498Szrj       __x.param(typename pareto_distribution<_RealType>::
918*38fd1498Szrj 		param_type(__alpha_val, __mu_val));
919*38fd1498Szrj 
920*38fd1498Szrj       __is.flags(__flags);
921*38fd1498Szrj       return __is;
922*38fd1498Szrj     }
923*38fd1498Szrj 
924*38fd1498Szrj 
925*38fd1498Szrj   template<typename _RealType>
926*38fd1498Szrj     template<typename _UniformRandomNumberGenerator>
927*38fd1498Szrj       typename k_distribution<_RealType>::result_type
928*38fd1498Szrj       k_distribution<_RealType>::
operator ()(_UniformRandomNumberGenerator & __urng)929*38fd1498Szrj       operator()(_UniformRandomNumberGenerator& __urng)
930*38fd1498Szrj       {
931*38fd1498Szrj 	result_type __x = this->_M_gd1(__urng);
932*38fd1498Szrj 	result_type __y = this->_M_gd2(__urng);
933*38fd1498Szrj 	return std::sqrt(__x * __y);
934*38fd1498Szrj       }
935*38fd1498Szrj 
936*38fd1498Szrj   template<typename _RealType>
937*38fd1498Szrj     template<typename _UniformRandomNumberGenerator>
938*38fd1498Szrj       typename k_distribution<_RealType>::result_type
939*38fd1498Szrj       k_distribution<_RealType>::
operator ()(_UniformRandomNumberGenerator & __urng,const param_type & __p)940*38fd1498Szrj       operator()(_UniformRandomNumberGenerator& __urng,
941*38fd1498Szrj 		 const param_type& __p)
942*38fd1498Szrj       {
943*38fd1498Szrj 	typename std::gamma_distribution<result_type>::param_type
944*38fd1498Szrj 	  __p1(__p.lambda(), result_type(1) / __p.lambda()),
945*38fd1498Szrj 	  __p2(__p.nu(), __p.mu() / __p.nu());
946*38fd1498Szrj 	result_type __x = this->_M_gd1(__p1, __urng);
947*38fd1498Szrj 	result_type __y = this->_M_gd2(__p2, __urng);
948*38fd1498Szrj 	return std::sqrt(__x * __y);
949*38fd1498Szrj       }
950*38fd1498Szrj 
951*38fd1498Szrj   template<typename _RealType>
952*38fd1498Szrj     template<typename _OutputIterator,
953*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
954*38fd1498Szrj       void
955*38fd1498Szrj       k_distribution<_RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __p)956*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
957*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
958*38fd1498Szrj 		      const param_type& __p)
959*38fd1498Szrj       {
960*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
961*38fd1498Szrj 	    result_type>)
962*38fd1498Szrj 
963*38fd1498Szrj 	typename std::gamma_distribution<result_type>::param_type
964*38fd1498Szrj 	  __p1(__p.lambda(), result_type(1) / __p.lambda()),
965*38fd1498Szrj 	  __p2(__p.nu(), __p.mu() / __p.nu());
966*38fd1498Szrj 	while (__f != __t)
967*38fd1498Szrj 	  {
968*38fd1498Szrj 	    result_type __x = this->_M_gd1(__p1, __urng);
969*38fd1498Szrj 	    result_type __y = this->_M_gd2(__p2, __urng);
970*38fd1498Szrj 	    *__f++ = std::sqrt(__x * __y);
971*38fd1498Szrj 	  }
972*38fd1498Szrj       }
973*38fd1498Szrj 
974*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
975*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const k_distribution<_RealType> & __x)976*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
977*38fd1498Szrj 	       const k_distribution<_RealType>& __x)
978*38fd1498Szrj     {
979*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
980*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
981*38fd1498Szrj 
982*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
983*38fd1498Szrj       const _CharT __fill = __os.fill();
984*38fd1498Szrj       const std::streamsize __precision = __os.precision();
985*38fd1498Szrj       const _CharT __space = __os.widen(' ');
986*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
987*38fd1498Szrj       __os.fill(__space);
988*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
989*38fd1498Szrj 
990*38fd1498Szrj       __os << __x.lambda() << __space << __x.mu() << __space << __x.nu();
991*38fd1498Szrj       __os << __space << __x._M_gd1;
992*38fd1498Szrj       __os << __space << __x._M_gd2;
993*38fd1498Szrj 
994*38fd1498Szrj       __os.flags(__flags);
995*38fd1498Szrj       __os.fill(__fill);
996*38fd1498Szrj       __os.precision(__precision);
997*38fd1498Szrj       return __os;
998*38fd1498Szrj     }
999*38fd1498Szrj 
1000*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
1001*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,k_distribution<_RealType> & __x)1002*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1003*38fd1498Szrj 	       k_distribution<_RealType>& __x)
1004*38fd1498Szrj     {
1005*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1006*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
1007*38fd1498Szrj 
1008*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
1009*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
1010*38fd1498Szrj 
1011*38fd1498Szrj       _RealType __lambda_val, __mu_val, __nu_val;
1012*38fd1498Szrj       __is >> __lambda_val >> __mu_val >> __nu_val;
1013*38fd1498Szrj       __is >> __x._M_gd1;
1014*38fd1498Szrj       __is >> __x._M_gd2;
1015*38fd1498Szrj       __x.param(typename k_distribution<_RealType>::
1016*38fd1498Szrj 		param_type(__lambda_val, __mu_val, __nu_val));
1017*38fd1498Szrj 
1018*38fd1498Szrj       __is.flags(__flags);
1019*38fd1498Szrj       return __is;
1020*38fd1498Szrj     }
1021*38fd1498Szrj 
1022*38fd1498Szrj 
1023*38fd1498Szrj   template<typename _RealType>
1024*38fd1498Szrj     template<typename _OutputIterator,
1025*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
1026*38fd1498Szrj       void
1027*38fd1498Szrj       arcsine_distribution<_RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __p)1028*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
1029*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
1030*38fd1498Szrj 		      const param_type& __p)
1031*38fd1498Szrj       {
1032*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1033*38fd1498Szrj 	    result_type>)
1034*38fd1498Szrj 
1035*38fd1498Szrj 	result_type __dif = __p.b() - __p.a();
1036*38fd1498Szrj 	result_type __sum = __p.a() + __p.b();
1037*38fd1498Szrj 	while (__f != __t)
1038*38fd1498Szrj 	  {
1039*38fd1498Szrj 	    result_type __x = std::sin(this->_M_ud(__urng));
1040*38fd1498Szrj 	    *__f++ = (__x * __dif + __sum) / result_type(2);
1041*38fd1498Szrj 	  }
1042*38fd1498Szrj       }
1043*38fd1498Szrj 
1044*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
1045*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const arcsine_distribution<_RealType> & __x)1046*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1047*38fd1498Szrj 	       const arcsine_distribution<_RealType>& __x)
1048*38fd1498Szrj     {
1049*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1050*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
1051*38fd1498Szrj 
1052*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
1053*38fd1498Szrj       const _CharT __fill = __os.fill();
1054*38fd1498Szrj       const std::streamsize __precision = __os.precision();
1055*38fd1498Szrj       const _CharT __space = __os.widen(' ');
1056*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
1057*38fd1498Szrj       __os.fill(__space);
1058*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1059*38fd1498Szrj 
1060*38fd1498Szrj       __os << __x.a() << __space << __x.b();
1061*38fd1498Szrj       __os << __space << __x._M_ud;
1062*38fd1498Szrj 
1063*38fd1498Szrj       __os.flags(__flags);
1064*38fd1498Szrj       __os.fill(__fill);
1065*38fd1498Szrj       __os.precision(__precision);
1066*38fd1498Szrj       return __os;
1067*38fd1498Szrj     }
1068*38fd1498Szrj 
1069*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
1070*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,arcsine_distribution<_RealType> & __x)1071*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1072*38fd1498Szrj 	       arcsine_distribution<_RealType>& __x)
1073*38fd1498Szrj     {
1074*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1075*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
1076*38fd1498Szrj 
1077*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
1078*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
1079*38fd1498Szrj 
1080*38fd1498Szrj       _RealType __a, __b;
1081*38fd1498Szrj       __is >> __a >> __b;
1082*38fd1498Szrj       __is >> __x._M_ud;
1083*38fd1498Szrj       __x.param(typename arcsine_distribution<_RealType>::
1084*38fd1498Szrj 		param_type(__a, __b));
1085*38fd1498Szrj 
1086*38fd1498Szrj       __is.flags(__flags);
1087*38fd1498Szrj       return __is;
1088*38fd1498Szrj     }
1089*38fd1498Szrj 
1090*38fd1498Szrj 
1091*38fd1498Szrj   template<typename _RealType>
1092*38fd1498Szrj     template<typename _UniformRandomNumberGenerator>
1093*38fd1498Szrj       typename hoyt_distribution<_RealType>::result_type
1094*38fd1498Szrj       hoyt_distribution<_RealType>::
operator ()(_UniformRandomNumberGenerator & __urng)1095*38fd1498Szrj       operator()(_UniformRandomNumberGenerator& __urng)
1096*38fd1498Szrj       {
1097*38fd1498Szrj 	result_type __x = this->_M_ad(__urng);
1098*38fd1498Szrj 	result_type __y = this->_M_ed(__urng);
1099*38fd1498Szrj 	return (result_type(2) * this->q()
1100*38fd1498Szrj 		  / (result_type(1) + this->q() * this->q()))
1101*38fd1498Szrj 	       * std::sqrt(this->omega() * __x * __y);
1102*38fd1498Szrj       }
1103*38fd1498Szrj 
1104*38fd1498Szrj   template<typename _RealType>
1105*38fd1498Szrj     template<typename _UniformRandomNumberGenerator>
1106*38fd1498Szrj       typename hoyt_distribution<_RealType>::result_type
1107*38fd1498Szrj       hoyt_distribution<_RealType>::
operator ()(_UniformRandomNumberGenerator & __urng,const param_type & __p)1108*38fd1498Szrj       operator()(_UniformRandomNumberGenerator& __urng,
1109*38fd1498Szrj 		 const param_type& __p)
1110*38fd1498Szrj       {
1111*38fd1498Szrj 	result_type __q2 = __p.q() * __p.q();
1112*38fd1498Szrj 	result_type __num = result_type(0.5L) * (result_type(1) + __q2);
1113*38fd1498Szrj 	typename __gnu_cxx::arcsine_distribution<result_type>::param_type
1114*38fd1498Szrj 	  __pa(__num, __num / __q2);
1115*38fd1498Szrj 	result_type __x = this->_M_ad(__pa, __urng);
1116*38fd1498Szrj 	result_type __y = this->_M_ed(__urng);
1117*38fd1498Szrj 	return (result_type(2) * __p.q() / (result_type(1) + __q2))
1118*38fd1498Szrj 	       * std::sqrt(__p.omega() * __x * __y);
1119*38fd1498Szrj       }
1120*38fd1498Szrj 
1121*38fd1498Szrj   template<typename _RealType>
1122*38fd1498Szrj     template<typename _OutputIterator,
1123*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
1124*38fd1498Szrj       void
1125*38fd1498Szrj       hoyt_distribution<_RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __p)1126*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
1127*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
1128*38fd1498Szrj 		      const param_type& __p)
1129*38fd1498Szrj       {
1130*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1131*38fd1498Szrj 	    result_type>)
1132*38fd1498Szrj 
1133*38fd1498Szrj 	result_type __2q = result_type(2) * __p.q();
1134*38fd1498Szrj 	result_type __q2 = __p.q() * __p.q();
1135*38fd1498Szrj 	result_type __q2p1 = result_type(1) + __q2;
1136*38fd1498Szrj 	result_type __num = result_type(0.5L) * __q2p1;
1137*38fd1498Szrj 	result_type __omega = __p.omega();
1138*38fd1498Szrj 	typename __gnu_cxx::arcsine_distribution<result_type>::param_type
1139*38fd1498Szrj 	  __pa(__num, __num / __q2);
1140*38fd1498Szrj 	while (__f != __t)
1141*38fd1498Szrj 	  {
1142*38fd1498Szrj 	    result_type __x = this->_M_ad(__pa, __urng);
1143*38fd1498Szrj 	    result_type __y = this->_M_ed(__urng);
1144*38fd1498Szrj 	    *__f++ = (__2q / __q2p1) * std::sqrt(__omega * __x * __y);
1145*38fd1498Szrj 	  }
1146*38fd1498Szrj       }
1147*38fd1498Szrj 
1148*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
1149*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const hoyt_distribution<_RealType> & __x)1150*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1151*38fd1498Szrj 	       const hoyt_distribution<_RealType>& __x)
1152*38fd1498Szrj     {
1153*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1154*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
1155*38fd1498Szrj 
1156*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
1157*38fd1498Szrj       const _CharT __fill = __os.fill();
1158*38fd1498Szrj       const std::streamsize __precision = __os.precision();
1159*38fd1498Szrj       const _CharT __space = __os.widen(' ');
1160*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
1161*38fd1498Szrj       __os.fill(__space);
1162*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1163*38fd1498Szrj 
1164*38fd1498Szrj       __os << __x.q() << __space << __x.omega();
1165*38fd1498Szrj       __os << __space << __x._M_ad;
1166*38fd1498Szrj       __os << __space << __x._M_ed;
1167*38fd1498Szrj 
1168*38fd1498Szrj       __os.flags(__flags);
1169*38fd1498Szrj       __os.fill(__fill);
1170*38fd1498Szrj       __os.precision(__precision);
1171*38fd1498Szrj       return __os;
1172*38fd1498Szrj     }
1173*38fd1498Szrj 
1174*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
1175*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,hoyt_distribution<_RealType> & __x)1176*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1177*38fd1498Szrj 	       hoyt_distribution<_RealType>& __x)
1178*38fd1498Szrj     {
1179*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1180*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
1181*38fd1498Szrj 
1182*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
1183*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
1184*38fd1498Szrj 
1185*38fd1498Szrj       _RealType __q, __omega;
1186*38fd1498Szrj       __is >> __q >> __omega;
1187*38fd1498Szrj       __is >> __x._M_ad;
1188*38fd1498Szrj       __is >> __x._M_ed;
1189*38fd1498Szrj       __x.param(typename hoyt_distribution<_RealType>::
1190*38fd1498Szrj 		param_type(__q, __omega));
1191*38fd1498Szrj 
1192*38fd1498Szrj       __is.flags(__flags);
1193*38fd1498Szrj       return __is;
1194*38fd1498Szrj     }
1195*38fd1498Szrj 
1196*38fd1498Szrj 
1197*38fd1498Szrj   template<typename _RealType>
1198*38fd1498Szrj     template<typename _OutputIterator,
1199*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
1200*38fd1498Szrj       void
1201*38fd1498Szrj       triangular_distribution<_RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __param)1202*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
1203*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
1204*38fd1498Szrj 		      const param_type& __param)
1205*38fd1498Szrj       {
1206*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1207*38fd1498Szrj 	    result_type>)
1208*38fd1498Szrj 
1209*38fd1498Szrj 	while (__f != __t)
1210*38fd1498Szrj 	  *__f++ = this->operator()(__urng, __param);
1211*38fd1498Szrj       }
1212*38fd1498Szrj 
1213*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
1214*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const __gnu_cxx::triangular_distribution<_RealType> & __x)1215*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1216*38fd1498Szrj 	       const __gnu_cxx::triangular_distribution<_RealType>& __x)
1217*38fd1498Szrj     {
1218*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1219*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
1220*38fd1498Szrj 
1221*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
1222*38fd1498Szrj       const _CharT __fill = __os.fill();
1223*38fd1498Szrj       const std::streamsize __precision = __os.precision();
1224*38fd1498Szrj       const _CharT __space = __os.widen(' ');
1225*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
1226*38fd1498Szrj       __os.fill(__space);
1227*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1228*38fd1498Szrj 
1229*38fd1498Szrj       __os << __x.a() << __space << __x.b() << __space << __x.c();
1230*38fd1498Szrj 
1231*38fd1498Szrj       __os.flags(__flags);
1232*38fd1498Szrj       __os.fill(__fill);
1233*38fd1498Szrj       __os.precision(__precision);
1234*38fd1498Szrj       return __os;
1235*38fd1498Szrj     }
1236*38fd1498Szrj 
1237*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
1238*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,__gnu_cxx::triangular_distribution<_RealType> & __x)1239*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1240*38fd1498Szrj 	       __gnu_cxx::triangular_distribution<_RealType>& __x)
1241*38fd1498Szrj     {
1242*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1243*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
1244*38fd1498Szrj 
1245*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
1246*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
1247*38fd1498Szrj 
1248*38fd1498Szrj       _RealType __a, __b, __c;
1249*38fd1498Szrj       __is >> __a >> __b >> __c;
1250*38fd1498Szrj       __x.param(typename __gnu_cxx::triangular_distribution<_RealType>::
1251*38fd1498Szrj 		param_type(__a, __b, __c));
1252*38fd1498Szrj 
1253*38fd1498Szrj       __is.flags(__flags);
1254*38fd1498Szrj       return __is;
1255*38fd1498Szrj     }
1256*38fd1498Szrj 
1257*38fd1498Szrj 
1258*38fd1498Szrj   template<typename _RealType>
1259*38fd1498Szrj     template<typename _UniformRandomNumberGenerator>
1260*38fd1498Szrj       typename von_mises_distribution<_RealType>::result_type
1261*38fd1498Szrj       von_mises_distribution<_RealType>::
operator ()(_UniformRandomNumberGenerator & __urng,const param_type & __p)1262*38fd1498Szrj       operator()(_UniformRandomNumberGenerator& __urng,
1263*38fd1498Szrj 		 const param_type& __p)
1264*38fd1498Szrj       {
1265*38fd1498Szrj 	const result_type __pi
1266*38fd1498Szrj 	  = __gnu_cxx::__math_constants<result_type>::__pi;
1267*38fd1498Szrj 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
1268*38fd1498Szrj 	  __aurng(__urng);
1269*38fd1498Szrj 
1270*38fd1498Szrj 	result_type __f;
1271*38fd1498Szrj 	while (1)
1272*38fd1498Szrj 	  {
1273*38fd1498Szrj 	    result_type __rnd = std::cos(__pi * __aurng());
1274*38fd1498Szrj 	    __f = (result_type(1) + __p._M_r * __rnd) / (__p._M_r + __rnd);
1275*38fd1498Szrj 	    result_type __c = __p._M_kappa * (__p._M_r - __f);
1276*38fd1498Szrj 
1277*38fd1498Szrj 	    result_type __rnd2 = __aurng();
1278*38fd1498Szrj 	    if (__c * (result_type(2) - __c) > __rnd2)
1279*38fd1498Szrj 	      break;
1280*38fd1498Szrj 	    if (std::log(__c / __rnd2) >= __c - result_type(1))
1281*38fd1498Szrj 	      break;
1282*38fd1498Szrj 	  }
1283*38fd1498Szrj 
1284*38fd1498Szrj 	result_type __res = std::acos(__f);
1285*38fd1498Szrj #if _GLIBCXX_USE_C99_MATH_TR1
1286*38fd1498Szrj 	__res = std::copysign(__res, __aurng() - result_type(0.5));
1287*38fd1498Szrj #else
1288*38fd1498Szrj 	if (__aurng() < result_type(0.5))
1289*38fd1498Szrj 	  __res = -__res;
1290*38fd1498Szrj #endif
1291*38fd1498Szrj 	__res += __p._M_mu;
1292*38fd1498Szrj 	if (__res > __pi)
1293*38fd1498Szrj 	  __res -= result_type(2) * __pi;
1294*38fd1498Szrj 	else if (__res < -__pi)
1295*38fd1498Szrj 	  __res += result_type(2) * __pi;
1296*38fd1498Szrj 	return __res;
1297*38fd1498Szrj       }
1298*38fd1498Szrj 
1299*38fd1498Szrj   template<typename _RealType>
1300*38fd1498Szrj     template<typename _OutputIterator,
1301*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
1302*38fd1498Szrj       void
1303*38fd1498Szrj       von_mises_distribution<_RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __param)1304*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
1305*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
1306*38fd1498Szrj 		      const param_type& __param)
1307*38fd1498Szrj       {
1308*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1309*38fd1498Szrj 	    result_type>)
1310*38fd1498Szrj 
1311*38fd1498Szrj 	while (__f != __t)
1312*38fd1498Szrj 	  *__f++ = this->operator()(__urng, __param);
1313*38fd1498Szrj       }
1314*38fd1498Szrj 
1315*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
1316*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const __gnu_cxx::von_mises_distribution<_RealType> & __x)1317*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1318*38fd1498Szrj 	       const __gnu_cxx::von_mises_distribution<_RealType>& __x)
1319*38fd1498Szrj     {
1320*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1321*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
1322*38fd1498Szrj 
1323*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
1324*38fd1498Szrj       const _CharT __fill = __os.fill();
1325*38fd1498Szrj       const std::streamsize __precision = __os.precision();
1326*38fd1498Szrj       const _CharT __space = __os.widen(' ');
1327*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
1328*38fd1498Szrj       __os.fill(__space);
1329*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1330*38fd1498Szrj 
1331*38fd1498Szrj       __os << __x.mu() << __space << __x.kappa();
1332*38fd1498Szrj 
1333*38fd1498Szrj       __os.flags(__flags);
1334*38fd1498Szrj       __os.fill(__fill);
1335*38fd1498Szrj       __os.precision(__precision);
1336*38fd1498Szrj       return __os;
1337*38fd1498Szrj     }
1338*38fd1498Szrj 
1339*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
1340*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,__gnu_cxx::von_mises_distribution<_RealType> & __x)1341*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1342*38fd1498Szrj 	       __gnu_cxx::von_mises_distribution<_RealType>& __x)
1343*38fd1498Szrj     {
1344*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1345*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
1346*38fd1498Szrj 
1347*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
1348*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
1349*38fd1498Szrj 
1350*38fd1498Szrj       _RealType __mu, __kappa;
1351*38fd1498Szrj       __is >> __mu >> __kappa;
1352*38fd1498Szrj       __x.param(typename __gnu_cxx::von_mises_distribution<_RealType>::
1353*38fd1498Szrj 		param_type(__mu, __kappa));
1354*38fd1498Szrj 
1355*38fd1498Szrj       __is.flags(__flags);
1356*38fd1498Szrj       return __is;
1357*38fd1498Szrj     }
1358*38fd1498Szrj 
1359*38fd1498Szrj 
1360*38fd1498Szrj   template<typename _UIntType>
1361*38fd1498Szrj     template<typename _UniformRandomNumberGenerator>
1362*38fd1498Szrj       typename hypergeometric_distribution<_UIntType>::result_type
1363*38fd1498Szrj       hypergeometric_distribution<_UIntType>::
operator ()(_UniformRandomNumberGenerator & __urng,const param_type & __param)1364*38fd1498Szrj       operator()(_UniformRandomNumberGenerator& __urng,
1365*38fd1498Szrj 		 const param_type& __param)
1366*38fd1498Szrj       {
1367*38fd1498Szrj 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, double>
1368*38fd1498Szrj 	  __aurng(__urng);
1369*38fd1498Szrj 
1370*38fd1498Szrj 	result_type __a = __param.successful_size();
1371*38fd1498Szrj 	result_type __b = __param.total_size();
1372*38fd1498Szrj 	result_type __k = 0;
1373*38fd1498Szrj 
1374*38fd1498Szrj 	if (__param.total_draws() < __param.total_size() / 2)
1375*38fd1498Szrj 	  {
1376*38fd1498Szrj 	    for (result_type __i = 0; __i < __param.total_draws(); ++__i)
1377*38fd1498Szrj 	      {
1378*38fd1498Szrj 		if (__b * __aurng() < __a)
1379*38fd1498Szrj 		  {
1380*38fd1498Szrj 		    ++__k;
1381*38fd1498Szrj 		    if (__k == __param.successful_size())
1382*38fd1498Szrj 		      return __k;
1383*38fd1498Szrj 		   --__a;
1384*38fd1498Szrj 		  }
1385*38fd1498Szrj 		--__b;
1386*38fd1498Szrj 	      }
1387*38fd1498Szrj 	    return __k;
1388*38fd1498Szrj 	  }
1389*38fd1498Szrj 	else
1390*38fd1498Szrj 	  {
1391*38fd1498Szrj 	    for (result_type __i = 0; __i < __param.unsuccessful_size(); ++__i)
1392*38fd1498Szrj 	      {
1393*38fd1498Szrj 		if (__b * __aurng() < __a)
1394*38fd1498Szrj 		  {
1395*38fd1498Szrj 		    ++__k;
1396*38fd1498Szrj 		    if (__k == __param.successful_size())
1397*38fd1498Szrj 		      return __param.successful_size() - __k;
1398*38fd1498Szrj 		    --__a;
1399*38fd1498Szrj 		  }
1400*38fd1498Szrj 		--__b;
1401*38fd1498Szrj 	      }
1402*38fd1498Szrj 	    return __param.successful_size() - __k;
1403*38fd1498Szrj 	  }
1404*38fd1498Szrj       }
1405*38fd1498Szrj 
1406*38fd1498Szrj   template<typename _UIntType>
1407*38fd1498Szrj     template<typename _OutputIterator,
1408*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
1409*38fd1498Szrj       void
1410*38fd1498Szrj       hypergeometric_distribution<_UIntType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __param)1411*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
1412*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
1413*38fd1498Szrj 		      const param_type& __param)
1414*38fd1498Szrj       {
1415*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1416*38fd1498Szrj 	    result_type>)
1417*38fd1498Szrj 
1418*38fd1498Szrj 	while (__f != __t)
1419*38fd1498Szrj 	  *__f++ = this->operator()(__urng);
1420*38fd1498Szrj       }
1421*38fd1498Szrj 
1422*38fd1498Szrj   template<typename _UIntType, typename _CharT, typename _Traits>
1423*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const __gnu_cxx::hypergeometric_distribution<_UIntType> & __x)1424*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1425*38fd1498Szrj 	       const __gnu_cxx::hypergeometric_distribution<_UIntType>& __x)
1426*38fd1498Szrj     {
1427*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1428*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
1429*38fd1498Szrj 
1430*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
1431*38fd1498Szrj       const _CharT __fill = __os.fill();
1432*38fd1498Szrj       const std::streamsize __precision = __os.precision();
1433*38fd1498Szrj       const _CharT __space = __os.widen(' ');
1434*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
1435*38fd1498Szrj       __os.fill(__space);
1436*38fd1498Szrj       __os.precision(std::numeric_limits<_UIntType>::max_digits10);
1437*38fd1498Szrj 
1438*38fd1498Szrj       __os << __x.total_size() << __space << __x.successful_size() << __space
1439*38fd1498Szrj 	   << __x.total_draws();
1440*38fd1498Szrj 
1441*38fd1498Szrj       __os.flags(__flags);
1442*38fd1498Szrj       __os.fill(__fill);
1443*38fd1498Szrj       __os.precision(__precision);
1444*38fd1498Szrj       return __os;
1445*38fd1498Szrj     }
1446*38fd1498Szrj 
1447*38fd1498Szrj   template<typename _UIntType, typename _CharT, typename _Traits>
1448*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,__gnu_cxx::hypergeometric_distribution<_UIntType> & __x)1449*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1450*38fd1498Szrj 	       __gnu_cxx::hypergeometric_distribution<_UIntType>& __x)
1451*38fd1498Szrj     {
1452*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1453*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
1454*38fd1498Szrj 
1455*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
1456*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
1457*38fd1498Szrj 
1458*38fd1498Szrj       _UIntType __total_size, __successful_size, __total_draws;
1459*38fd1498Szrj       __is >> __total_size >> __successful_size >> __total_draws;
1460*38fd1498Szrj       __x.param(typename __gnu_cxx::hypergeometric_distribution<_UIntType>::
1461*38fd1498Szrj 		param_type(__total_size, __successful_size, __total_draws));
1462*38fd1498Szrj 
1463*38fd1498Szrj       __is.flags(__flags);
1464*38fd1498Szrj       return __is;
1465*38fd1498Szrj     }
1466*38fd1498Szrj 
1467*38fd1498Szrj 
1468*38fd1498Szrj   template<typename _RealType>
1469*38fd1498Szrj     template<typename _UniformRandomNumberGenerator>
1470*38fd1498Szrj       typename logistic_distribution<_RealType>::result_type
1471*38fd1498Szrj       logistic_distribution<_RealType>::
operator ()(_UniformRandomNumberGenerator & __urng,const param_type & __p)1472*38fd1498Szrj       operator()(_UniformRandomNumberGenerator& __urng,
1473*38fd1498Szrj 		 const param_type& __p)
1474*38fd1498Szrj       {
1475*38fd1498Szrj 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
1476*38fd1498Szrj 	  __aurng(__urng);
1477*38fd1498Szrj 
1478*38fd1498Szrj 	result_type __arg = result_type(1);
1479*38fd1498Szrj 	while (__arg == result_type(1) || __arg == result_type(0))
1480*38fd1498Szrj 	  __arg = __aurng();
1481*38fd1498Szrj 	return __p.a()
1482*38fd1498Szrj 	     + __p.b() * std::log(__arg / (result_type(1) - __arg));
1483*38fd1498Szrj       }
1484*38fd1498Szrj 
1485*38fd1498Szrj   template<typename _RealType>
1486*38fd1498Szrj     template<typename _OutputIterator,
1487*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
1488*38fd1498Szrj       void
1489*38fd1498Szrj       logistic_distribution<_RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __p)1490*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
1491*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
1492*38fd1498Szrj 		      const param_type& __p)
1493*38fd1498Szrj       {
1494*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1495*38fd1498Szrj 	    result_type>)
1496*38fd1498Szrj 
1497*38fd1498Szrj 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
1498*38fd1498Szrj 	  __aurng(__urng);
1499*38fd1498Szrj 
1500*38fd1498Szrj 	while (__f != __t)
1501*38fd1498Szrj 	  {
1502*38fd1498Szrj 	    result_type __arg = result_type(1);
1503*38fd1498Szrj 	    while (__arg == result_type(1) || __arg == result_type(0))
1504*38fd1498Szrj 	      __arg = __aurng();
1505*38fd1498Szrj 	    *__f++ = __p.a()
1506*38fd1498Szrj 		   + __p.b() * std::log(__arg / (result_type(1) - __arg));
1507*38fd1498Szrj 	  }
1508*38fd1498Szrj       }
1509*38fd1498Szrj 
1510*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
1511*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const logistic_distribution<_RealType> & __x)1512*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1513*38fd1498Szrj 	       const logistic_distribution<_RealType>& __x)
1514*38fd1498Szrj     {
1515*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1516*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
1517*38fd1498Szrj 
1518*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
1519*38fd1498Szrj       const _CharT __fill = __os.fill();
1520*38fd1498Szrj       const std::streamsize __precision = __os.precision();
1521*38fd1498Szrj       const _CharT __space = __os.widen(' ');
1522*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
1523*38fd1498Szrj       __os.fill(__space);
1524*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1525*38fd1498Szrj 
1526*38fd1498Szrj       __os << __x.a() << __space << __x.b();
1527*38fd1498Szrj 
1528*38fd1498Szrj       __os.flags(__flags);
1529*38fd1498Szrj       __os.fill(__fill);
1530*38fd1498Szrj       __os.precision(__precision);
1531*38fd1498Szrj       return __os;
1532*38fd1498Szrj     }
1533*38fd1498Szrj 
1534*38fd1498Szrj   template<typename _RealType, typename _CharT, typename _Traits>
1535*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,logistic_distribution<_RealType> & __x)1536*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1537*38fd1498Szrj 	       logistic_distribution<_RealType>& __x)
1538*38fd1498Szrj     {
1539*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1540*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
1541*38fd1498Szrj 
1542*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
1543*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
1544*38fd1498Szrj 
1545*38fd1498Szrj       _RealType __a, __b;
1546*38fd1498Szrj       __is >> __a >> __b;
1547*38fd1498Szrj       __x.param(typename logistic_distribution<_RealType>::
1548*38fd1498Szrj 		param_type(__a, __b));
1549*38fd1498Szrj 
1550*38fd1498Szrj       __is.flags(__flags);
1551*38fd1498Szrj       return __is;
1552*38fd1498Szrj     }
1553*38fd1498Szrj 
1554*38fd1498Szrj 
1555*38fd1498Szrj   namespace {
1556*38fd1498Szrj 
1557*38fd1498Szrj     // Helper class for the uniform_on_sphere_distribution generation
1558*38fd1498Szrj     // function.
1559*38fd1498Szrj     template<std::size_t _Dimen, typename _RealType>
1560*38fd1498Szrj       class uniform_on_sphere_helper
1561*38fd1498Szrj       {
1562*38fd1498Szrj 	typedef typename uniform_on_sphere_distribution<_Dimen, _RealType>::
1563*38fd1498Szrj 	  result_type result_type;
1564*38fd1498Szrj 
1565*38fd1498Szrj       public:
1566*38fd1498Szrj 	template<typename _NormalDistribution,
1567*38fd1498Szrj 		 typename _UniformRandomNumberGenerator>
operator ()(_NormalDistribution & __nd,_UniformRandomNumberGenerator & __urng)1568*38fd1498Szrj 	result_type operator()(_NormalDistribution& __nd,
1569*38fd1498Szrj 			       _UniformRandomNumberGenerator& __urng)
1570*38fd1498Szrj         {
1571*38fd1498Szrj 	  result_type __ret;
1572*38fd1498Szrj 	  typename result_type::value_type __norm;
1573*38fd1498Szrj 
1574*38fd1498Szrj 	  do
1575*38fd1498Szrj 	    {
1576*38fd1498Szrj 	      auto __sum = _RealType(0);
1577*38fd1498Szrj 
1578*38fd1498Szrj 	      std::generate(__ret.begin(), __ret.end(),
1579*38fd1498Szrj 			    [&__nd, &__urng, &__sum](){
1580*38fd1498Szrj 			      _RealType __t = __nd(__urng);
1581*38fd1498Szrj 			      __sum += __t * __t;
1582*38fd1498Szrj 			      return __t; });
1583*38fd1498Szrj 	      __norm = std::sqrt(__sum);
1584*38fd1498Szrj 	    }
1585*38fd1498Szrj 	  while (__norm == _RealType(0) || ! __builtin_isfinite(__norm));
1586*38fd1498Szrj 
1587*38fd1498Szrj 	  std::transform(__ret.begin(), __ret.end(), __ret.begin(),
1588*38fd1498Szrj 			 [__norm](_RealType __val){ return __val / __norm; });
1589*38fd1498Szrj 
1590*38fd1498Szrj 	  return __ret;
1591*38fd1498Szrj         }
1592*38fd1498Szrj       };
1593*38fd1498Szrj 
1594*38fd1498Szrj 
1595*38fd1498Szrj     template<typename _RealType>
1596*38fd1498Szrj       class uniform_on_sphere_helper<2, _RealType>
1597*38fd1498Szrj       {
1598*38fd1498Szrj 	typedef typename uniform_on_sphere_distribution<2, _RealType>::
1599*38fd1498Szrj 	  result_type result_type;
1600*38fd1498Szrj 
1601*38fd1498Szrj       public:
1602*38fd1498Szrj 	template<typename _NormalDistribution,
1603*38fd1498Szrj 		 typename _UniformRandomNumberGenerator>
operator ()(_NormalDistribution &,_UniformRandomNumberGenerator & __urng)1604*38fd1498Szrj 	result_type operator()(_NormalDistribution&,
1605*38fd1498Szrj 			       _UniformRandomNumberGenerator& __urng)
1606*38fd1498Szrj         {
1607*38fd1498Szrj 	  result_type __ret;
1608*38fd1498Szrj 	  _RealType __sq;
1609*38fd1498Szrj 	  std::__detail::_Adaptor<_UniformRandomNumberGenerator,
1610*38fd1498Szrj 				  _RealType> __aurng(__urng);
1611*38fd1498Szrj 
1612*38fd1498Szrj 	  do
1613*38fd1498Szrj 	    {
1614*38fd1498Szrj 	      __ret[0] = _RealType(2) * __aurng() - _RealType(1);
1615*38fd1498Szrj 	      __ret[1] = _RealType(2) * __aurng() - _RealType(1);
1616*38fd1498Szrj 
1617*38fd1498Szrj 	      __sq = __ret[0] * __ret[0] + __ret[1] * __ret[1];
1618*38fd1498Szrj 	    }
1619*38fd1498Szrj 	  while (__sq == _RealType(0) || __sq > _RealType(1));
1620*38fd1498Szrj 
1621*38fd1498Szrj #if _GLIBCXX_USE_C99_MATH_TR1
1622*38fd1498Szrj 	  // Yes, we do not just use sqrt(__sq) because hypot() is more
1623*38fd1498Szrj 	  // accurate.
1624*38fd1498Szrj 	  auto __norm = std::hypot(__ret[0], __ret[1]);
1625*38fd1498Szrj #else
1626*38fd1498Szrj 	  auto __norm = std::sqrt(__sq);
1627*38fd1498Szrj #endif
1628*38fd1498Szrj 	  __ret[0] /= __norm;
1629*38fd1498Szrj 	  __ret[1] /= __norm;
1630*38fd1498Szrj 
1631*38fd1498Szrj 	  return __ret;
1632*38fd1498Szrj         }
1633*38fd1498Szrj       };
1634*38fd1498Szrj 
1635*38fd1498Szrj   }
1636*38fd1498Szrj 
1637*38fd1498Szrj 
1638*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType>
1639*38fd1498Szrj     template<typename _UniformRandomNumberGenerator>
1640*38fd1498Szrj       typename uniform_on_sphere_distribution<_Dimen, _RealType>::result_type
1641*38fd1498Szrj       uniform_on_sphere_distribution<_Dimen, _RealType>::
operator ()(_UniformRandomNumberGenerator & __urng,const param_type & __p)1642*38fd1498Szrj       operator()(_UniformRandomNumberGenerator& __urng,
1643*38fd1498Szrj 		 const param_type& __p)
1644*38fd1498Szrj       {
1645*38fd1498Szrj         uniform_on_sphere_helper<_Dimen, _RealType> __helper;
1646*38fd1498Szrj         return __helper(_M_nd, __urng);
1647*38fd1498Szrj       }
1648*38fd1498Szrj 
1649*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType>
1650*38fd1498Szrj     template<typename _OutputIterator,
1651*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
1652*38fd1498Szrj       void
1653*38fd1498Szrj       uniform_on_sphere_distribution<_Dimen, _RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __param)1654*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
1655*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
1656*38fd1498Szrj 		      const param_type& __param)
1657*38fd1498Szrj       {
1658*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1659*38fd1498Szrj 	    result_type>)
1660*38fd1498Szrj 
1661*38fd1498Szrj 	while (__f != __t)
1662*38fd1498Szrj 	  *__f++ = this->operator()(__urng, __param);
1663*38fd1498Szrj       }
1664*38fd1498Szrj 
1665*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType, typename _CharT,
1666*38fd1498Szrj 	   typename _Traits>
1667*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const __gnu_cxx::uniform_on_sphere_distribution<_Dimen,_RealType> & __x)1668*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1669*38fd1498Szrj 	       const __gnu_cxx::uniform_on_sphere_distribution<_Dimen,
1670*38fd1498Szrj 							       _RealType>& __x)
1671*38fd1498Szrj     {
1672*38fd1498Szrj       return __os << __x._M_nd;
1673*38fd1498Szrj     }
1674*38fd1498Szrj 
1675*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType, typename _CharT,
1676*38fd1498Szrj 	   typename _Traits>
1677*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,__gnu_cxx::uniform_on_sphere_distribution<_Dimen,_RealType> & __x)1678*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1679*38fd1498Szrj 	       __gnu_cxx::uniform_on_sphere_distribution<_Dimen,
1680*38fd1498Szrj 							 _RealType>& __x)
1681*38fd1498Szrj     {
1682*38fd1498Szrj       return __is >> __x._M_nd;
1683*38fd1498Szrj     }
1684*38fd1498Szrj 
1685*38fd1498Szrj 
1686*38fd1498Szrj   namespace {
1687*38fd1498Szrj 
1688*38fd1498Szrj     // Helper class for the uniform_inside_sphere_distribution generation
1689*38fd1498Szrj     // function.
1690*38fd1498Szrj     template<std::size_t _Dimen, bool _SmallDimen, typename _RealType>
1691*38fd1498Szrj       class uniform_inside_sphere_helper;
1692*38fd1498Szrj 
1693*38fd1498Szrj     template<std::size_t _Dimen, typename _RealType>
1694*38fd1498Szrj       class uniform_inside_sphere_helper<_Dimen, false, _RealType>
1695*38fd1498Szrj       {
1696*38fd1498Szrj 	using result_type
1697*38fd1498Szrj 	  = typename uniform_inside_sphere_distribution<_Dimen, _RealType>::
1698*38fd1498Szrj 	    result_type;
1699*38fd1498Szrj 
1700*38fd1498Szrj       public:
1701*38fd1498Szrj 	template<typename _UniformOnSphereDistribution,
1702*38fd1498Szrj 		 typename _UniformRandomNumberGenerator>
1703*38fd1498Szrj 	result_type
operator ()(_UniformOnSphereDistribution & __uosd,_UniformRandomNumberGenerator & __urng,_RealType __radius)1704*38fd1498Szrj 	operator()(_UniformOnSphereDistribution& __uosd,
1705*38fd1498Szrj 		   _UniformRandomNumberGenerator& __urng,
1706*38fd1498Szrj 		   _RealType __radius)
1707*38fd1498Szrj         {
1708*38fd1498Szrj 	  std::__detail::_Adaptor<_UniformRandomNumberGenerator,
1709*38fd1498Szrj 				  _RealType> __aurng(__urng);
1710*38fd1498Szrj 
1711*38fd1498Szrj 	  _RealType __pow = 1 / _RealType(_Dimen);
1712*38fd1498Szrj 	  _RealType __urt = __radius * std::pow(__aurng(), __pow);
1713*38fd1498Szrj 	  result_type __ret = __uosd(__aurng);
1714*38fd1498Szrj 
1715*38fd1498Szrj 	  std::transform(__ret.begin(), __ret.end(), __ret.begin(),
1716*38fd1498Szrj 			 [__urt](_RealType __val)
1717*38fd1498Szrj 			 { return __val * __urt; });
1718*38fd1498Szrj 
1719*38fd1498Szrj 	  return __ret;
1720*38fd1498Szrj         }
1721*38fd1498Szrj       };
1722*38fd1498Szrj 
1723*38fd1498Szrj     // Helper class for the uniform_inside_sphere_distribution generation
1724*38fd1498Szrj     // function specialized for small dimensions.
1725*38fd1498Szrj     template<std::size_t _Dimen, typename _RealType>
1726*38fd1498Szrj       class uniform_inside_sphere_helper<_Dimen, true, _RealType>
1727*38fd1498Szrj       {
1728*38fd1498Szrj 	using result_type
1729*38fd1498Szrj 	  = typename uniform_inside_sphere_distribution<_Dimen, _RealType>::
1730*38fd1498Szrj 	    result_type;
1731*38fd1498Szrj 
1732*38fd1498Szrj       public:
1733*38fd1498Szrj 	template<typename _UniformOnSphereDistribution,
1734*38fd1498Szrj 		 typename _UniformRandomNumberGenerator>
1735*38fd1498Szrj 	result_type
operator ()(_UniformOnSphereDistribution &,_UniformRandomNumberGenerator & __urng,_RealType __radius)1736*38fd1498Szrj 	operator()(_UniformOnSphereDistribution&,
1737*38fd1498Szrj 		   _UniformRandomNumberGenerator& __urng,
1738*38fd1498Szrj 		   _RealType __radius)
1739*38fd1498Szrj         {
1740*38fd1498Szrj 	  result_type __ret;
1741*38fd1498Szrj 	  _RealType __sq;
1742*38fd1498Szrj 	  _RealType __radsq = __radius * __radius;
1743*38fd1498Szrj 	  std::__detail::_Adaptor<_UniformRandomNumberGenerator,
1744*38fd1498Szrj 				  _RealType> __aurng(__urng);
1745*38fd1498Szrj 
1746*38fd1498Szrj 	  do
1747*38fd1498Szrj 	    {
1748*38fd1498Szrj 	      __sq = _RealType(0);
1749*38fd1498Szrj 	      for (int i = 0; i < _Dimen; ++i)
1750*38fd1498Szrj 		{
1751*38fd1498Szrj 		  __ret[i] = _RealType(2) * __aurng() - _RealType(1);
1752*38fd1498Szrj 		  __sq += __ret[i] * __ret[i];
1753*38fd1498Szrj 		}
1754*38fd1498Szrj 	    }
1755*38fd1498Szrj 	  while (__sq > _RealType(1));
1756*38fd1498Szrj 
1757*38fd1498Szrj 	  for (int i = 0; i < _Dimen; ++i)
1758*38fd1498Szrj             __ret[i] *= __radius;
1759*38fd1498Szrj 
1760*38fd1498Szrj 	  return __ret;
1761*38fd1498Szrj         }
1762*38fd1498Szrj       };
1763*38fd1498Szrj   } // namespace
1764*38fd1498Szrj 
1765*38fd1498Szrj   //
1766*38fd1498Szrj   //  Experiments have shown that rejection is more efficient than transform
1767*38fd1498Szrj   //  for dimensions less than 8.
1768*38fd1498Szrj   //
1769*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType>
1770*38fd1498Szrj     template<typename _UniformRandomNumberGenerator>
1771*38fd1498Szrj       typename uniform_inside_sphere_distribution<_Dimen, _RealType>::result_type
1772*38fd1498Szrj       uniform_inside_sphere_distribution<_Dimen, _RealType>::
operator ()(_UniformRandomNumberGenerator & __urng,const param_type & __p)1773*38fd1498Szrj       operator()(_UniformRandomNumberGenerator& __urng,
1774*38fd1498Szrj 		 const param_type& __p)
1775*38fd1498Szrj       {
1776*38fd1498Szrj         uniform_inside_sphere_helper<_Dimen, _Dimen < 8, _RealType> __helper;
1777*38fd1498Szrj         return __helper(_M_uosd, __urng, __p.radius());
1778*38fd1498Szrj       }
1779*38fd1498Szrj 
1780*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType>
1781*38fd1498Szrj     template<typename _OutputIterator,
1782*38fd1498Szrj 	     typename _UniformRandomNumberGenerator>
1783*38fd1498Szrj       void
1784*38fd1498Szrj       uniform_inside_sphere_distribution<_Dimen, _RealType>::
__generate_impl(_OutputIterator __f,_OutputIterator __t,_UniformRandomNumberGenerator & __urng,const param_type & __param)1785*38fd1498Szrj       __generate_impl(_OutputIterator __f, _OutputIterator __t,
1786*38fd1498Szrj 		      _UniformRandomNumberGenerator& __urng,
1787*38fd1498Szrj 		      const param_type& __param)
1788*38fd1498Szrj       {
1789*38fd1498Szrj 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1790*38fd1498Szrj 	    result_type>)
1791*38fd1498Szrj 
1792*38fd1498Szrj 	while (__f != __t)
1793*38fd1498Szrj 	  *__f++ = this->operator()(__urng, __param);
1794*38fd1498Szrj       }
1795*38fd1498Szrj 
1796*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType, typename _CharT,
1797*38fd1498Szrj 	   typename _Traits>
1798*38fd1498Szrj     std::basic_ostream<_CharT, _Traits>&
operator <<(std::basic_ostream<_CharT,_Traits> & __os,const __gnu_cxx::uniform_inside_sphere_distribution<_Dimen,_RealType> & __x)1799*38fd1498Szrj     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1800*38fd1498Szrj 	       const __gnu_cxx::uniform_inside_sphere_distribution<_Dimen,
1801*38fd1498Szrj 								_RealType>& __x)
1802*38fd1498Szrj     {
1803*38fd1498Szrj       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1804*38fd1498Szrj       typedef typename __ostream_type::ios_base    __ios_base;
1805*38fd1498Szrj 
1806*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __os.flags();
1807*38fd1498Szrj       const _CharT __fill = __os.fill();
1808*38fd1498Szrj       const std::streamsize __precision = __os.precision();
1809*38fd1498Szrj       const _CharT __space = __os.widen(' ');
1810*38fd1498Szrj       __os.flags(__ios_base::scientific | __ios_base::left);
1811*38fd1498Szrj       __os.fill(__space);
1812*38fd1498Szrj       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1813*38fd1498Szrj 
1814*38fd1498Szrj       __os << __x.radius() << __space << __x._M_uosd;
1815*38fd1498Szrj 
1816*38fd1498Szrj       __os.flags(__flags);
1817*38fd1498Szrj       __os.fill(__fill);
1818*38fd1498Szrj       __os.precision(__precision);
1819*38fd1498Szrj 
1820*38fd1498Szrj       return __os;
1821*38fd1498Szrj     }
1822*38fd1498Szrj 
1823*38fd1498Szrj   template<std::size_t _Dimen, typename _RealType, typename _CharT,
1824*38fd1498Szrj 	   typename _Traits>
1825*38fd1498Szrj     std::basic_istream<_CharT, _Traits>&
operator >>(std::basic_istream<_CharT,_Traits> & __is,__gnu_cxx::uniform_inside_sphere_distribution<_Dimen,_RealType> & __x)1826*38fd1498Szrj     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1827*38fd1498Szrj 	       __gnu_cxx::uniform_inside_sphere_distribution<_Dimen,
1828*38fd1498Szrj 							     _RealType>& __x)
1829*38fd1498Szrj     {
1830*38fd1498Szrj       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1831*38fd1498Szrj       typedef typename __istream_type::ios_base    __ios_base;
1832*38fd1498Szrj 
1833*38fd1498Szrj       const typename __ios_base::fmtflags __flags = __is.flags();
1834*38fd1498Szrj       __is.flags(__ios_base::dec | __ios_base::skipws);
1835*38fd1498Szrj 
1836*38fd1498Szrj       _RealType __radius_val;
1837*38fd1498Szrj       __is >> __radius_val >> __x._M_uosd;
1838*38fd1498Szrj       __x.param(typename uniform_inside_sphere_distribution<_Dimen, _RealType>::
1839*38fd1498Szrj 		param_type(__radius_val));
1840*38fd1498Szrj 
1841*38fd1498Szrj       __is.flags(__flags);
1842*38fd1498Szrj 
1843*38fd1498Szrj       return __is;
1844*38fd1498Szrj     }
1845*38fd1498Szrj 
1846*38fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
1847*38fd1498Szrj } // namespace __gnu_cxx
1848*38fd1498Szrj 
1849*38fd1498Szrj 
1850*38fd1498Szrj #endif // _EXT_RANDOM_TCC
1851