random (subtract_with_carry_01<>::_M_initialize_npows): New.

2006-08-29  Paolo Carlini  <pcarlini@suse.de>

	* include/tr1/random (subtract_with_carry_01<>::_M_initialize_npows):
	New.
	(subtract_with_carry_01<>::subtract_with_carry_01(),
	subtract_with_carry_01<>::subtract_with_carry_01(unsigned long),
	subtract_with_carry_01<>::subtract_with_carry_01(_Gen&)): Use it.
	* include/tr1/random.tcc: Define.

	* include/tr1/random (xor_combine<>::_M_initialize_max()): New.
	(xor_combine<>::xor_combine(), xor_combine<>::xor_combine(const
	base1_type&, const base2_type&), xor_combine<>::xor_combine(unsigned
	long), xor_combine<>::xor_combine(_Gen&)): Use it.
	(xor_combine<>::min, xor_combine<>::max): Adjust.
	* include/tr1/random.tcc: Define.

From-SVN: r116559
This commit is contained in:
Paolo Carlini 2006-08-29 11:46:54 +00:00 committed by Paolo Carlini
parent d99cc02542
commit a3b6119721
3 changed files with 95 additions and 21 deletions

View File

@ -1,3 +1,19 @@
2006-08-29 Paolo Carlini <pcarlini@suse.de>
* include/tr1/random (subtract_with_carry_01<>::_M_initialize_npows):
New.
(subtract_with_carry_01<>::subtract_with_carry_01(),
subtract_with_carry_01<>::subtract_with_carry_01(unsigned long),
subtract_with_carry_01<>::subtract_with_carry_01(_Gen&)): Use it.
* include/tr1/random.tcc: Define.
* include/tr1/random (xor_combine<>::_M_initialize_max()): New.
(xor_combine<>::xor_combine(), xor_combine<>::xor_combine(const
base1_type&, const base2_type&), xor_combine<>::xor_combine(unsigned
long), xor_combine<>::xor_combine(_Gen&)): Use it.
(xor_combine<>::min, xor_combine<>::max): Adjust.
* include/tr1/random.tcc: Define.
2006-08-29 Benjamin Kosnik <bkoz@redhat.com>
* acinclude.m4(glibcxx_PCHFLAGS): Set to stdtr1c++.h.

View File

@ -944,7 +944,10 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
* number generator.
*/
subtract_with_carry_01()
{ this->seed(); }
{
this->seed();
_M_initialize_npows();
}
/**
* Constructs an explicitly seeded % subtract_with_carry_01 random number
@ -952,7 +955,10 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
*/
explicit
subtract_with_carry_01(unsigned long __value)
{ this->seed(__value); }
{
this->seed(__value);
_M_initialize_npows();
}
/**
* Constructs a % subtract_with_carry_01 random number generator engine
@ -962,7 +968,10 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
*/
template<class _Gen>
subtract_with_carry_01(_Gen& __g)
{ this->seed(__g); }
{
this->seed(__g);
_M_initialize_npows();
}
/**
* Seeds the initial state @f$ x_0 @f$ of the random number generator.
@ -1081,6 +1090,9 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
seed(_Gen& __g, false_type);
private:
void
_M_initialize_npows();
static const int __n = (__w + 31) / 32;
_UInt32Type _M_x[long_lag][__n];
@ -1372,17 +1384,22 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
static const int shift2 = __s2;
// constructors and member function
xor_combine() { }
xor_combine()
: _M_b1(), _M_b2()
{ _M_initialize_max(); }
xor_combine(const base1_type& __rng1, const base2_type& __rng2)
: _M_b1(__rng1), _M_b2(__rng2) { }
: _M_b1(__rng1), _M_b2(__rng2)
{ _M_initialize_max(); }
xor_combine(unsigned long __s)
: _M_b1(__s), _M_b2(__s + 1) { }
: _M_b1(__s), _M_b2(__s + 1)
{ _M_initialize_max(); }
template<class _Gen>
xor_combine(_Gen& __g)
: _M_b1(__g), _M_b2(__g) { }
: _M_b1(__g), _M_b2(__g)
{ _M_initialize_max(); }
void
seed()
@ -1407,15 +1424,14 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
base2() const
{ return _M_b2; }
// FIXME: Cannot be always correct. FWIW, the solution in N2032
// in practice isn't much better..
// XXX Per N2032, but aren't always right...
result_type
min() const
{ return _M_b1.min() ^ _M_b2.min(); }
{ return 0; }
result_type
max() const
{ return _M_b1.max() | _M_b2.max(); }
{ return _M_max; }
/**
* Gets the next random number in the sequence.
@ -1492,8 +1508,12 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
_UniformRandomNumberGenerator21, __s21>& __x);
private:
base1_type _M_b1;
base2_type _M_b2;
void
_M_initialize_max();
base1_type _M_b1;
base2_type _M_b2;
result_type _M_max;
};

View File

@ -445,6 +445,19 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
}
template<typename _RealType, int __w, int __s, int __r>
void
subtract_with_carry_01<_RealType, __w, __s, __r>::
_M_initialize_npows()
{
for (int __j = 0; __j < __n; ++__j)
#if _GLIBCXX_USE_C99_MATH_TR1
_M_npows[__j] = std::tr1::ldexp(_RealType(1), -__w + __j * 32);
#else
_M_npows[__j] = std::pow(_RealType(2), -__w + __j * 32);
#endif
}
template<typename _RealType, int __w, int __s, int __r>
void
subtract_with_carry_01<_RealType, __w, __s, __r>::
@ -484,14 +497,6 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
}
_M_p = 0;
// Initialize the array holding the negative powers of 2.
for (int __j = 0; __j < __n; ++__j)
#if _GLIBCXX_USE_C99_MATH_TR1
_M_npows[__j] = std::tr1::ldexp(_RealType(1), -__w + __j * 32);
#else
_M_npows[__j] = std::pow(_RealType(2), -__w + __j * 32);
#endif
}
template<typename _RealType, int __w, int __s, int __r>
@ -637,6 +642,39 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
}
template<class _UniformRandomNumberGenerator1, int __s1,
class _UniformRandomNumberGenerator2, int __s2>
void
xor_combine<_UniformRandomNumberGenerator1, __s1,
_UniformRandomNumberGenerator2, __s2>::
_M_initialize_max()
{
const int __lshift = std::abs(__s1 - __s2);
result_type __m1 = _M_b1.max() - _M_b1.min();
result_type __m2 = _M_b2.max() - _M_b2.min();
// NB: in TR1 s1 is not required to be >= s2.
if (__s1 >= __s2)
__m1 <<= __lshift;
else
__m2 <<= __lshift;
result_type __a = __m1 & __m2;
const result_type __b = __m1 | __m2;
result_type __c = 0;
if (__a)
{
result_type __k;
for (__k = 0; __a != 1; __a >>= 1)
++__k;
__c = (result_type(1) << __k) - 1;
}
_M_max = (__c | __b) << __lshift;
}
template<class _UniformRandomNumberGenerator1, int __s1,
class _UniformRandomNumberGenerator2, int __s2,
typename _CharT, typename _Traits>