random.h (__mod(_Tp)): Use defaults.
2009-06-29 Paolo Carlini <paolo.carlini@oracle.com> * include/bits/random.h (__mod(_Tp)): Use defaults. (struct _Mod): Adjust template parameters. (linear_congruential_engine<>::operator()()): Adjust. (typedef _UInt32Type): Remove. (mersenne_twister_engine<>::initialization_multiplier): Fix type. * include/bits/random.tcc (struct _Mod): Adjust template parameters. (linear_congruential_engine<>::seed(result_type)): Adjust __mod calls. (mersenne_twister_engine<>::seed(result_type)): Likewise. (mersenne_twister_engine<>::seed(seed_seq&)): Likewise. (subtract_with_carry_engine<>::seed(result_type)): Likewise. (subtract_with_carry_engine<>::seed(seed_seq&)): Likewise. (seed_seq::seed_seq(std::initializer_list<>)): Likewise. (seed_seq::seed_seq(_InputIterator, _InputIterator)): Likewise. (seed_seq::generate(_RandomAccessIterator, _RandomAccessIterator)): Likewise. * include/bits/random.tcc (mersenne_twister_engine<>::seed(result_type)): Fix i usage in the formula (i mod n). (mersenne_twister_engine<>::seed(seed_seq&)): Use uint_least32_t as array type. (subtract_with_carry_engine<>::seed(seed_seq&)): Likewise; fix array size. (subtract_with_carry_engine<>::seed(result_type)): Fix; also use uint_least32_t. From-SVN: r149074
This commit is contained in:
parent
15ab11cb46
commit
b94f4bef8b
3 changed files with 91 additions and 67 deletions
|
@ -1,3 +1,32 @@
|
|||
2009-06-29 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
* include/bits/random.h (__mod(_Tp)): Use defaults.
|
||||
(struct _Mod): Adjust template parameters.
|
||||
(linear_congruential_engine<>::operator()()): Adjust.
|
||||
(typedef _UInt32Type): Remove.
|
||||
(mersenne_twister_engine<>::initialization_multiplier): Fix type.
|
||||
* include/bits/random.tcc (struct _Mod): Adjust template parameters.
|
||||
(linear_congruential_engine<>::seed(result_type)): Adjust __mod
|
||||
calls.
|
||||
(mersenne_twister_engine<>::seed(result_type)): Likewise.
|
||||
(mersenne_twister_engine<>::seed(seed_seq&)): Likewise.
|
||||
(subtract_with_carry_engine<>::seed(result_type)): Likewise.
|
||||
(subtract_with_carry_engine<>::seed(seed_seq&)): Likewise.
|
||||
(seed_seq::seed_seq(std::initializer_list<>)): Likewise.
|
||||
(seed_seq::seed_seq(_InputIterator, _InputIterator)): Likewise.
|
||||
(seed_seq::generate(_RandomAccessIterator, _RandomAccessIterator)):
|
||||
Likewise.
|
||||
|
||||
* include/bits/random.tcc
|
||||
(mersenne_twister_engine<>::seed(result_type)): Fix i usage in the
|
||||
formula (i mod n).
|
||||
(mersenne_twister_engine<>::seed(seed_seq&)): Use uint_least32_t
|
||||
as array type.
|
||||
(subtract_with_carry_engine<>::seed(seed_seq&)): Likewise; fix array
|
||||
size.
|
||||
(subtract_with_carry_engine<>::seed(result_type)): Fix; also use
|
||||
uint_least32_t.
|
||||
|
||||
2009-06-24 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||
|
||||
* include/std/future (shared_future): Adjust doxygen comment.
|
||||
|
|
|
@ -68,18 +68,15 @@ namespace std
|
|||
struct _Shift<_UIntType, __w, true>
|
||||
{ static const _UIntType __value = _UIntType(1) << __w; };
|
||||
|
||||
template<typename _Tp, _Tp __a, _Tp __c, _Tp __m, bool>
|
||||
template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, bool>
|
||||
struct _Mod;
|
||||
|
||||
// Dispatch based on modulus value to prevent divide-by-zero compile-time
|
||||
// errors when m == 0.
|
||||
template<typename _Tp, _Tp __a, _Tp __c, _Tp __m>
|
||||
template<typename _Tp, _Tp __m, _Tp __a = 1, _Tp __c = 0>
|
||||
inline _Tp
|
||||
__mod(_Tp __x)
|
||||
{ return _Mod<_Tp, __a, __c, __m, __m == 0>::__calc(__x); }
|
||||
|
||||
typedef __gnu_cxx::__conditional_type<(sizeof(unsigned) == 4),
|
||||
unsigned, unsigned long>::__type _UInt32Type;
|
||||
{ return _Mod<_Tp, __m, __a, __c, __m == 0>::__calc(__x); }
|
||||
|
||||
/*
|
||||
* An adaptor class for converting the output of any Generator into
|
||||
|
@ -253,7 +250,7 @@ namespace std
|
|||
result_type
|
||||
operator()()
|
||||
{
|
||||
_M_x = __detail::__mod<_UIntType, __a, __c, __m>(_M_x);
|
||||
_M_x = __detail::__mod<_UIntType, __m, __a, __c>(_M_x);
|
||||
return _M_x;
|
||||
}
|
||||
|
||||
|
@ -281,8 +278,7 @@ namespace std
|
|||
* @returns __os.
|
||||
*/
|
||||
template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
|
||||
_UIntType1 __m1,
|
||||
typename _CharT, typename _Traits>
|
||||
_UIntType1 __m1, typename _CharT, typename _Traits>
|
||||
friend std::basic_ostream<_CharT, _Traits>&
|
||||
operator<<(std::basic_ostream<_CharT, _Traits>&,
|
||||
const std::linear_congruential_engine<_UIntType1,
|
||||
|
@ -302,8 +298,7 @@ namespace std
|
|||
* @returns __is.
|
||||
*/
|
||||
template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
|
||||
_UIntType1 __m1,
|
||||
typename _CharT, typename _Traits>
|
||||
_UIntType1 __m1, typename _CharT, typename _Traits>
|
||||
friend std::basic_istream<_CharT, _Traits>&
|
||||
operator>>(std::basic_istream<_CharT, _Traits>&,
|
||||
std::linear_congruential_engine<_UIntType1, __a1,
|
||||
|
@ -371,6 +366,10 @@ namespace std
|
|||
"mersenne_twister_engine template arguments out of bounds");
|
||||
static_assert(__c <= (__detail::_Shift<_UIntType, __w>::__value - 1),
|
||||
"mersenne_twister_engine template arguments out of bounds");
|
||||
static_assert(__d <= (__detail::_Shift<_UIntType, __w>::__value - 1),
|
||||
"mersenne_twister_engine template arguments out of bounds");
|
||||
static_assert(__f <= (__detail::_Shift<_UIntType, __w>::__value - 1),
|
||||
"mersenne_twister_engine template arguments out of bounds");
|
||||
|
||||
public:
|
||||
/** The type of the generated random value. */
|
||||
|
@ -389,7 +388,7 @@ namespace std
|
|||
static const size_t tempering_t = __t;
|
||||
static const result_type tempering_c = __c;
|
||||
static const size_t tempering_l = __l;
|
||||
static const size_t initialization_multiplier = __f;
|
||||
static const result_type initialization_multiplier = __f;
|
||||
static const result_type default_seed = 5489u;
|
||||
|
||||
// constructors and member function
|
||||
|
@ -1351,11 +1350,11 @@ namespace std
|
|||
typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24>
|
||||
ranlux24_base;
|
||||
|
||||
typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
|
||||
|
||||
typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12>
|
||||
ranlux48_base;
|
||||
|
||||
typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
|
||||
|
||||
typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
|
||||
|
||||
/**
|
||||
|
|
|
@ -45,7 +45,7 @@ namespace std
|
|||
//
|
||||
// Preconditions: a > 0, m > 0.
|
||||
//
|
||||
template<typename _Tp, _Tp __a, _Tp __c, _Tp __m, bool>
|
||||
template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, bool>
|
||||
struct _Mod
|
||||
{
|
||||
static _Tp
|
||||
|
@ -80,8 +80,8 @@ namespace std
|
|||
|
||||
// Special case for m == 0 -- use unsigned integer overflow as modulo
|
||||
// operator.
|
||||
template<typename _Tp, _Tp __a, _Tp __c, _Tp __m>
|
||||
struct _Mod<_Tp, __a, __c, __m, true>
|
||||
template<typename _Tp, _Tp __m, _Tp __a, _Tp __c>
|
||||
struct _Mod<_Tp, __m, __a, __c, true>
|
||||
{
|
||||
static _Tp
|
||||
__calc(_Tp __x)
|
||||
|
@ -98,11 +98,11 @@ namespace std
|
|||
linear_congruential_engine<_UIntType, __a, __c, __m>::
|
||||
seed(result_type __s)
|
||||
{
|
||||
if ((__detail::__mod<_UIntType, 1U, 0U, __m>(__c) == 0U)
|
||||
&& (__detail::__mod<_UIntType, 1U, 0U, __m>(__s) == 0U))
|
||||
_M_x = __detail::__mod<_UIntType, 1U, 0U, __m>(1U);
|
||||
if ((__detail::__mod<_UIntType, __m>(__c) == 0)
|
||||
&& (__detail::__mod<_UIntType, __m>(__s) == 0))
|
||||
_M_x = 1;
|
||||
else
|
||||
_M_x = __detail::__mod<_UIntType, 1U, 0U, __m>(__s);
|
||||
_M_x = __detail::__mod<_UIntType, __m>(__s);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -118,8 +118,8 @@ namespace std
|
|||
const _UIntType __k = (__k0 + 31) / 32;
|
||||
_UIntType __arr[__k + 3];
|
||||
__q.generate(__arr + 0, __arr + __k + 3);
|
||||
_UIntType __factor = 1U;
|
||||
_UIntType __sum = 0U;
|
||||
_UIntType __factor = 1u;
|
||||
_UIntType __sum = 0u;
|
||||
for (size_t __j = 0; __j < __k; ++__j)
|
||||
{
|
||||
__sum += __arr[__j + 3] * __factor;
|
||||
|
@ -179,7 +179,7 @@ namespace std
|
|||
__s, __b, __t, __c, __l, __f>::
|
||||
seed(result_type __sd)
|
||||
{
|
||||
_M_x[0] = __detail::__mod<_UIntType, 1, 0,
|
||||
_M_x[0] = __detail::__mod<_UIntType,
|
||||
__detail::_Shift<_UIntType, __w>::__value>(__sd);
|
||||
|
||||
for (size_t __i = 1; __i < state_size; ++__i)
|
||||
|
@ -187,8 +187,8 @@ namespace std
|
|||
_UIntType __x = _M_x[__i - 1];
|
||||
__x ^= __x >> (__w - 2);
|
||||
__x *= __f;
|
||||
__x += __i;
|
||||
_M_x[__i] = __detail::__mod<_UIntType, 1, 0,
|
||||
__x += __detail::__mod<_UIntType, __n>(__i);
|
||||
_M_x[__i] = __detail::__mod<_UIntType,
|
||||
__detail::_Shift<_UIntType, __w>::__value>(__x);
|
||||
}
|
||||
_M_p = state_size;
|
||||
|
@ -206,35 +206,35 @@ namespace std
|
|||
{
|
||||
const _UIntType __upper_mask = (~_UIntType()) << __r;
|
||||
const size_t __k = (__w + 31) / 32;
|
||||
_UIntType __arr[__k * __n];
|
||||
__q.generate(__arr + 0, __arr + __k * __n);
|
||||
uint_least32_t __arr[__n * __k];
|
||||
__q.generate(__arr + 0, __arr + __n * __k);
|
||||
|
||||
bool __zero = true;
|
||||
for (size_t __i = 0; __i < state_size; ++__i)
|
||||
{
|
||||
_UIntType __factor = 1U;
|
||||
_UIntType __sum = 0U;
|
||||
_UIntType __factor = 1u;
|
||||
_UIntType __sum = 0u;
|
||||
for (size_t __j = 0; __j < __k; ++__j)
|
||||
{
|
||||
__sum += __arr[__i * __k + __j] * __factor;
|
||||
__sum += __arr[__k * __i + __j] * __factor;
|
||||
__factor *= __detail::_Shift<_UIntType, 32>::__value;
|
||||
}
|
||||
_M_x[__i] = __detail::__mod<_UIntType, 1U, 0U,
|
||||
__detail::_Shift<_UIntType, __w>::__value>(__sum);
|
||||
_M_x[__i] = __detail::__mod<_UIntType,
|
||||
__detail::_Shift<_UIntType, __w>::__value>(__sum);
|
||||
|
||||
if (__zero)
|
||||
{
|
||||
if (__i == 0)
|
||||
{
|
||||
if ((_M_x[0] & __upper_mask) != 0U)
|
||||
if ((_M_x[0] & __upper_mask) != 0u)
|
||||
__zero = false;
|
||||
}
|
||||
else if (_M_x[__i] != 0U)
|
||||
else if (_M_x[__i] != 0u)
|
||||
__zero = false;
|
||||
}
|
||||
}
|
||||
if (__zero)
|
||||
_M_x[0] = __detail::_Shift<_UIntType, __w - 1U>::__value;
|
||||
_M_x[0] = __detail::_Shift<_UIntType, __w - 1>::__value;
|
||||
}
|
||||
|
||||
template<typename _UIntType, size_t __w,
|
||||
|
@ -345,26 +345,23 @@ namespace std
|
|||
subtract_with_carry_engine<_UIntType, __w, __s, __r>::
|
||||
seed(result_type __value)
|
||||
{
|
||||
if (__value == 0)
|
||||
__value = default_seed;
|
||||
std::linear_congruential_engine<result_type, 40014u, 0u, 2147483563u>
|
||||
__lcg(__value == 0u ? default_seed : __value);
|
||||
|
||||
std::linear_congruential_engine<result_type, 40014U, 0U, 2147483563U>
|
||||
__lcg(__value);
|
||||
|
||||
// I hope this is right. The "10000" tests work for the ranluxen.
|
||||
const size_t __n = (word_size + 31) / 32;
|
||||
const size_t __n = (__w + 31) / 32;
|
||||
|
||||
for (size_t __i = 0; __i < long_lag; ++__i)
|
||||
{
|
||||
_UIntType __sum = 0U;
|
||||
_UIntType __factor = 1U;
|
||||
_UIntType __sum = 0u;
|
||||
_UIntType __factor = 1u;
|
||||
for (size_t __j = 0; __j < __n; ++__j)
|
||||
{
|
||||
__sum += __detail::__mod<__detail::_UInt32Type, 1, 0, 0>
|
||||
__sum += __detail::__mod<uint_least32_t,
|
||||
__detail::_Shift<uint_least32_t, 32>::__value>
|
||||
(__lcg()) * __factor;
|
||||
__factor *= __detail::_Shift<_UIntType, 32>::__value;
|
||||
}
|
||||
_M_x[__i] = __detail::__mod<_UIntType, 1, 0,
|
||||
_M_x[__i] = __detail::__mod<_UIntType,
|
||||
__detail::_Shift<_UIntType, __w>::__value>(__sum);
|
||||
}
|
||||
_M_carry = (_M_x[long_lag - 1] == 0) ? 1 : 0;
|
||||
|
@ -376,21 +373,20 @@ namespace std
|
|||
subtract_with_carry_engine<_UIntType, __w, __s, __r>::
|
||||
seed(seed_seq& __q)
|
||||
{
|
||||
const size_t __n = (word_size + 31) / 32;
|
||||
_UIntType __arr[long_lag + __n];
|
||||
__q.generate(__arr + 0, __arr + long_lag + __n);
|
||||
const size_t __k = (__w + 31) / 32;
|
||||
uint_least32_t __arr[__r * __k];
|
||||
__q.generate(__arr + 0, __arr + __r * __k);
|
||||
|
||||
for (size_t __i = 0; __i < long_lag; ++__i)
|
||||
{
|
||||
_UIntType __sum = 0U;
|
||||
_UIntType __factor = 1U;
|
||||
for (size_t __j = 0; __j < __n; ++__j)
|
||||
_UIntType __sum = 0u;
|
||||
_UIntType __factor = 1u;
|
||||
for (size_t __j = 0; __j < __k; ++__j)
|
||||
{
|
||||
__sum += __detail::__mod<__detail::_UInt32Type, 1, 0, 0>
|
||||
(__arr[__i * __n + __j]) * __factor;
|
||||
__sum += __arr[__k * __i + __j] * __factor;
|
||||
__factor *= __detail::_Shift<_UIntType, 32>::__value;
|
||||
}
|
||||
_M_x[__i] = __detail::__mod<_UIntType, 1, 0,
|
||||
_M_x[__i] = __detail::__mod<_UIntType,
|
||||
__detail::_Shift<_UIntType, __w>::__value>(__sum);
|
||||
}
|
||||
_M_carry = (_M_x[long_lag - 1] == 0) ? 1 : 0;
|
||||
|
@ -2485,7 +2481,7 @@ namespace std
|
|||
seed_seq::seed_seq(std::initializer_list<_IntType> __il)
|
||||
{
|
||||
for (auto __iter = __il.begin(); __iter != __il.end(); ++__iter)
|
||||
_M_v.push_back(__detail::__mod<result_type, 1, 0,
|
||||
_M_v.push_back(__detail::__mod<result_type,
|
||||
__detail::_Shift<result_type, 32>::__value>(*__iter));
|
||||
}
|
||||
|
||||
|
@ -2493,7 +2489,7 @@ namespace std
|
|||
seed_seq::seed_seq(_InputIterator __begin, _InputIterator __end)
|
||||
{
|
||||
for (_InputIterator __iter = __begin; __iter != __end; ++__iter)
|
||||
_M_v.push_back(__detail::__mod<result_type, 1, 0,
|
||||
_M_v.push_back(__detail::__mod<result_type,
|
||||
__detail::_Shift<result_type, 32>::__value>(*__iter));
|
||||
}
|
||||
|
||||
|
@ -2508,7 +2504,7 @@ namespace std
|
|||
if (__begin == __end)
|
||||
return;
|
||||
|
||||
std::fill(__begin, __end, _Type(0x8b8b8b8bU));
|
||||
std::fill(__begin, __end, _Type(0x8b8b8b8bu));
|
||||
|
||||
const size_t __n = __end - __begin;
|
||||
const size_t __s = _M_v.size();
|
||||
|
@ -2527,8 +2523,8 @@ namespace std
|
|||
^ __begin[(__k + __p) % __n]
|
||||
^ __begin[(__k - 1) % __n]);
|
||||
_Type __r1 = __arg ^ (__arg << 27);
|
||||
__r1 = __detail::__mod<_Type, 1664525U, 0U,
|
||||
__detail::_Shift<_Type, 32>::__value>(__r1);
|
||||
__r1 = __detail::__mod<_Type, __detail::_Shift<_Type, 32>::__value,
|
||||
1664525u, 0u>(__r1);
|
||||
_Type __r2 = __r1;
|
||||
if (__k == 0)
|
||||
__r2 += __s;
|
||||
|
@ -2536,8 +2532,8 @@ namespace std
|
|||
__r2 += __k % __n + _M_v[__k - 1];
|
||||
else
|
||||
__r2 += __k % __n;
|
||||
__r2 = __detail::__mod<_Type, 1U, 0U,
|
||||
__detail::_Shift<_Type, 32>::__value>(__r2);
|
||||
__r2 = __detail::__mod<_Type,
|
||||
__detail::_Shift<_Type, 32>::__value>(__r2);
|
||||
__begin[(__k + __p) % __n] += __r1;
|
||||
__begin[(__k + __q) % __n] += __r2;
|
||||
__begin[__k % __n] = __r2;
|
||||
|
@ -2549,11 +2545,11 @@ namespace std
|
|||
+ __begin[(__k + __p) % __n]
|
||||
+ __begin[(__k - 1) % __n]);
|
||||
_Type __r3 = __arg ^ (__arg << 27);
|
||||
__r3 = __detail::__mod<_Type, 1566083941U, 0U,
|
||||
__detail::_Shift<_Type, 32>::__value>(__r3);
|
||||
__r3 = __detail::__mod<_Type, __detail::_Shift<_Type, 32>::__value,
|
||||
1566083941u, 0u>(__r3);
|
||||
_Type __r4 = __r3 - __k % __n;
|
||||
__r4 = __detail::__mod<_Type, 1U, 0U,
|
||||
__detail::_Shift<_Type, 32>::__value>(__r4);
|
||||
__r4 = __detail::__mod<_Type,
|
||||
__detail::_Shift<_Type, 32>::__value>(__r4);
|
||||
__begin[(__k + __p) % __n] ^= __r4;
|
||||
__begin[(__k + __q) % __n] ^= __r3;
|
||||
__begin[__k % __n] = __r4;
|
||||
|
|
Loading…
Add table
Reference in a new issue