Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
536 changes: 341 additions & 195 deletions stl/inc/random

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ void add_tests(vector<fp_t>& tests) {
microtest<URNG, uint32_t, 2, uint32_max - 3>,
microtest<URNG, int64_t, int64_min, int64_max>,
microtest<URNG, int64_t, int64_min + 2, int64_max - 3>,
microtest<URNG, uint64_t, 0, uint64_max>, // Test DDB-181509 "TR1 VC9 SP1: Infinite loop in
// uniform_int<unsigned long long>::_Eval()".
microtest<URNG, uint64_t, 0, uint64_max>, // Test DDB-181509 (infinite loop in
// uniform_int_distribution<unsigned long long>)
microtest<URNG, uint64_t, 2, uint64_max - 3>,

microtest<URNG, int32_t, -4, 4>,
Expand Down Expand Up @@ -95,11 +95,11 @@ class Wacky {

typedef unsigned long result_type;

static result_type min() {
static constexpr result_type min() {
return 0;
}

static result_type max() {
static constexpr result_type max() {
return 90000;
}

Expand Down
5 changes: 5 additions & 0 deletions tests/std/tests/P0952R2_new_generate_canonical/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ void test_lwg2524() {
assert((generate_canonical<float, 32>) (mt2) < 1.0f);
}

#if _HAS_TR1_NAMESPACE
void test_tr1_16() {
using E_std = linear_congruential_engine<uint32_t, 75, 74, 65537>;
using E_tr1 = linear_congruential<uint32_t, 75, 74, 65537>;
Expand Down Expand Up @@ -98,6 +99,7 @@ void test_tr1_64() {
assert(dist_64(std_eng) == dist_64(tr1_eng));
}
}
#endif // _HAS_TR1_NAMESPACE

template <class Real, size_t Bits, class Engine>
Real generate_with_ibe() {
Expand Down Expand Up @@ -197,9 +199,12 @@ int main() {
assert((generate_canonical<double, 64, Engine>) (eng) == expected);
}

#if _HAS_TR1_NAMESPACE
test_tr1_16();
test_tr1_32();
test_tr1_64();
#endif // _HAS_TR1_NAMESPACE

test_lwg2524();

return 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1073,12 +1073,14 @@ void engine_test_impl() {
common_engine_test_impl<Engine>(ss);
}

#if _HAS_TR1_NAMESPACE
template <typename Engine>
void tr1_engine_test_impl() {
random_device rd{};
mt19937 gen(rd());
common_engine_test_impl<Engine>(gen);
}
#endif // _HAS_TR1_NAMESPACE

void random_test() {
seed_seq ss0({1, 2, 3, 4, 5, 6});
Expand All @@ -1091,22 +1093,21 @@ void random_test() {
mt19937 gen(rd());
(void) generate_canonical<double, 10>(gen);

engine_test_impl<minstd_rand0>(); // linear congruential engine
engine_test_impl<mt19937>(); // mersenne twister engine
engine_test_impl<minstd_rand0>(); // linear_congruential_engine
engine_test_impl<mt19937>(); // mersenne_twister_engine
engine_test_impl<ranlux24_base>(); // subtract_with_carry_engine
engine_test_impl<ranlux24>(); // discard block engine
engine_test_impl<ranlux24>(); // discard_block_engine
engine_test_impl<knuth_b>(); // shuffle_order_engine
engine_test_impl<independent_bits_engine<minstd_rand0, 2, uint32_t>>();
engine_test_impl<mt19937_64>();
engine_test_impl<ranlux48_base>();
engine_test_impl<ranlux48>();

#if _HAS_TR1_NAMESPACE
linear_congruential<uint_fast32_t, 16807, 0, 2147483647> minstd_rand_eng(gen);
minstd_rand_eng.seed(gen);

tr1_engine_test_impl<linear_congruential<uint_fast32_t, 16807, 0, 2147483647>>();

#if _HAS_TR1_NAMESPACE
tr1_engine_test_impl<ranlux3>();
tr1_engine_test_impl<ranlux4>();
tr1_engine_test_impl<ranlux3_01>();
Expand Down
6 changes: 6 additions & 0 deletions tests/tr1/include/tspec_random.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,14 @@ void test_random() { // test all of the distributions
TESTR(geometric_distribution);
TESTR(normal_distribution);
TESTR(poisson_distribution);

#if _HAS_TR1_NAMESPACE
TESTR(uniform_int);
TESTR(uniform_real);
#else // ^^^ _HAS_TR1_NAMESPACE / !_HAS_TR1_NAMESPACE vvv
TESTR(uniform_int_distribution);
TESTR(uniform_real_distribution);
#endif // ^^^ !_HAS_TR1_NAMESPACE ^^^

TESTR(cauchy_distribution);
TESTR(chi_squared_distribution);
Expand Down
38 changes: 38 additions & 0 deletions tests/tr1/include/tspec_random_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ One_arg poisson_distribution_vals[] = {
{FLIT(99.0), FLIT(0.03986496337366227799), FLIT(0.0)},
};

#if _HAS_TR1_NAMESPACE
typedef unsigned int uniform_int_type;
uniform_int<uniform_int_type> uniform_int_dist(10, 90);
int uniform_int_smaller_ok = 0;
Expand Down Expand Up @@ -164,6 +165,43 @@ One_arg uniform_real_vals[] = {
{FLIT(88.0), FLIT(0.0), FLIT(0.0)},
{FLIT(99.0), FLIT(0.0), FLIT(0.0)},
};
#else // ^^^ _HAS_TR1_NAMESPACE / !_HAS_TR1_NAMESPACE vvv
typedef unsigned int uniform_int_distribution_type;
uniform_int_distribution<uniform_int_distribution_type> uniform_int_distribution_dist(10, 90);
int uniform_int_distribution_smaller_ok = 0;
int uniform_int_distribution_larger_ok = 0;

One_arg uniform_int_distribution_vals[] = {
{FLIT(0.0), FLIT(0.0), FLIT(0.0)},
{FLIT(11.0), FLIT(0.012345679012345678328), FLIT(0.0)},
{FLIT(22.0), FLIT(0.012345679012345678328), FLIT(0.0)},
{FLIT(33.0), FLIT(0.012345679012345678328), FLIT(0.0)},
{FLIT(44.0), FLIT(0.012345679012345678328), FLIT(0.0)},
{FLIT(55.0), FLIT(0.012345679012345678328), FLIT(0.0)},
{FLIT(66.0), FLIT(0.012345679012345678328), FLIT(0.0)},
{FLIT(77.0), FLIT(0.012345679012345678328), FLIT(0.0)},
{FLIT(88.0), FLIT(0.012345679012345678328), FLIT(0.0)},
{FLIT(99.0), FLIT(0.0), FLIT(0.0)},
};

typedef double uniform_real_distribution_type;
uniform_real_distribution<uniform_real_distribution_type> uniform_real_distribution_dist(40.2, 60.5);
int uniform_real_distribution_smaller_ok = 0;
int uniform_real_distribution_larger_ok = 0;

One_arg uniform_real_distribution_vals[] = {
{FLIT(0.0), FLIT(0.0), FLIT(0.0)},
{FLIT(11.0), FLIT(0.0), FLIT(0.0)},
{FLIT(22.0), FLIT(0.0), FLIT(0.0)},
{FLIT(33.0), FLIT(0.0), FLIT(0.0)},
{FLIT(44.0), FLIT(0.049261083743842366821), FLIT(0.0)},
{FLIT(55.0), FLIT(0.049261083743842366821), FLIT(0.0)},
{FLIT(66.0), FLIT(0.0), FLIT(0.0)},
{FLIT(77.0), FLIT(0.0), FLIT(0.0)},
{FLIT(88.0), FLIT(0.0), FLIT(0.0)},
{FLIT(99.0), FLIT(0.0), FLIT(0.0)},
};
#endif // ^^^ !_HAS_TR1_NAMESPACE ^^^

typedef double cauchy_distribution_type;
cauchy_distribution<cauchy_distribution_type> cauchy_distribution_dist(50.0, 20.0);
Expand Down
58 changes: 55 additions & 3 deletions tests/tr1/tests/random1/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,12 @@ struct test_globals { // tests engine global functions
}
};

static void tlinear() { // test linear_congruential
static void tlinear() {
#if _HAS_TR1_NAMESPACE
typedef STD linear_congruential<Uint32, 16807, 0, 2147483647> rng_t;
#else // ^^^ _HAS_TR1_NAMESPACE / !_HAS_TR1_NAMESPACE vvv
typedef STD linear_congruential_engine<Uint32, 16807, 0, 2147483647> rng_t;
#endif // ^^^ !_HAS_TR1_NAMESPACE ^^^

CHECK_INT(rng_t::multiplier, 16807);
CHECK_INT(rng_t::increment, 0);
Expand All @@ -79,6 +83,7 @@ static void tlinear() { // test linear_congruential
CHECK_INT(rng1.max(), 2147483646);
CHECK_INT(rng1(), 33614);

#if _HAS_TR1_NAMESPACE
generator<Uint32> g;
Uint32 init[] = {1, 2};
g.reset(init, 2);
Expand All @@ -94,6 +99,7 @@ static void tlinear() { // test linear_congruential
CHECK_INT(rng3.max(), 2147483646);
CHECK_INT(rng3(), 33614);
CHECK_INT(g.index(), 2);
#endif // ^^^ _HAS_TR1_NAMESPACE ^^^

rng.seed(1);
CHECK_INT(rng.min(), 1);
Expand All @@ -105,6 +111,7 @@ static void tlinear() { // test linear_congruential
CHECK_INT(rng.max(), 2147483646);
CHECK_INT(rng(), 33614);

#if _HAS_TR1_NAMESPACE
g.reset(init, 2);
rng3.seed(g);
CHECK_INT(rng3.min(), 1);
Expand All @@ -117,14 +124,19 @@ static void tlinear() { // test linear_congruential
CHECK_INT(rng3.max(), 2147483646);
CHECK_INT(rng3(), 33614);
CHECK_INT(g.index(), 2);
#endif // ^^^ _HAS_TR1_NAMESPACE ^^^

test_globals<rng_t>::test();

// check large values
typedef unsigned long long int_type;
const int_type max_val = (int_type) -1;

#if _HAS_TR1_NAMESPACE
typedef STD linear_congruential<int_type, max_val - 1, 0, max_val> rng4_t;
#else // ^^^ _HAS_TR1_NAMESPACE / !_HAS_TR1_NAMESPACE vvv
typedef STD linear_congruential_engine<int_type, max_val - 1, 0, max_val> rng4_t;
#endif // ^^^ !_HAS_TR1_NAMESPACE ^^^
rng4_t rng4(1);
CHECK(rng4() == max_val - 1);
CHECK(rng4() == 1);
Expand Down Expand Up @@ -157,18 +169,34 @@ static void tminstd_rand() {
}

static void tmersenne() {
#if _HAS_TR1_NAMESPACE
typedef STD mersenne_twister<Uint32, 32, 624, 397, 31, 0x9908b0df, 11, 7, 0x9d2c5680, 15, 0xefc60000, 18> rng_t;
#else // ^^^ _HAS_TR1_NAMESPACE / !_HAS_TR1_NAMESPACE vvv
typedef STD mt19937 rng_t;
#endif // ^^^ !_HAS_TR1_NAMESPACE ^^^
CHECK_INT(rng_t::word_size, 32);
CHECK_INT(rng_t::state_size, 624);
CHECK_INT(rng_t::shift_size, 397);
CHECK_INT(rng_t::mask_bits, 31);
#if _HAS_TR1_NAMESPACE
CHECK_INT((int) rng_t::parameter_a, (int) 0x9908b0df);
CHECK_INT(rng_t::output_u, 11);
CHECK_INT(rng_t::output_s, 7);
CHECK_INT((int) rng_t::output_b, (int) 0x9d2c5680);
CHECK_INT(rng_t::output_t, 15);
CHECK_INT((int) rng_t::output_c, (int) 0xefc60000);
CHECK_INT(rng_t::output_l, 18);
#else // ^^^ _HAS_TR1_NAMESPACE / !_HAS_TR1_NAMESPACE vvv
CHECK_INT(rng_t::xor_mask, 0x9908b0df);
CHECK_INT(rng_t::tempering_u, 11);
CHECK_INT(rng_t::tempering_d, 0xffffffff);
CHECK_INT(rng_t::tempering_s, 7);
CHECK_INT(rng_t::tempering_b, 0x9d2c5680);
CHECK_INT(rng_t::tempering_t, 15);
CHECK_INT(rng_t::tempering_c, 0xefc60000);
CHECK_INT(rng_t::tempering_l, 18);
CHECK_INT(rng_t::initialization_multiplier, 1812433253);
#endif // ^^^ !_HAS_TR1_NAMESPACE ^^^
bool st = STD is_same<rng_t::result_type, Uint32>::value;
CHECK(st);

Expand All @@ -182,6 +210,7 @@ static void tmersenne() {
CHECK_INT(ptr_rng1->max(), 0xffffffff);
CHECK_INT((*ptr_rng1)(), 1791095845);

#if _HAS_TR1_NAMESPACE
STD linear_congruential<Uint32, 69069, 0, 0> init_gen(4357);

const auto ptr_rng2 = STD make_unique<rng_t>(init_gen);
Expand All @@ -193,6 +222,7 @@ static void tmersenne() {
CHECK_INT(rng3.min(), 0);
CHECK_INT(rng3.max(), 0xffffffff);
CHECK_INT(rng3(), (int) 2649890907u);
#endif // ^^^ _HAS_TR1_NAMESPACE ^^^

rng.seed(1);
CHECK_INT(rng.min(), 0);
Expand All @@ -204,6 +234,7 @@ static void tmersenne() {
CHECK_INT(rng.max(), 0xffffffff);
CHECK_INT(rng(), 1872583848);

#if _HAS_TR1_NAMESPACE
init_gen.seed(4357);
rng3.seed(init_gen);
CHECK_INT(rng3.min(), 0);
Expand All @@ -214,6 +245,7 @@ static void tmersenne() {
CHECK_INT(rng3.min(), 0);
CHECK_INT(rng3.max(), 0xffffffff);
CHECK_INT(rng3(), (int) 2649890907u);
#endif // ^^^ _HAS_TR1_NAMESPACE ^^^

test_globals<rng_t>::test();
}
Expand Down Expand Up @@ -274,8 +306,13 @@ static void tmt19937() {
}

static void tsubtract() {
#if _HAS_TR1_NAMESPACE
typedef STD subtract_with_carry<Uint32, 1 << 24, 10, 24> rng_t;
CHECK_INT(rng_t::modulus, 1 << 24);
#else // ^^^ _HAS_TR1_NAMESPACE / !_HAS_TR1_NAMESPACE vvv
typedef STD subtract_with_carry_engine<Uint32, 24, 10, 24> rng_t;
CHECK_INT(rng_t::word_size, 24);
#endif // ^^^ !_HAS_TR1_NAMESPACE ^^^
CHECK_INT(rng_t::short_lag, 10);
CHECK_INT(rng_t::long_lag, 24);
bool st = STD is_same<rng_t::result_type, Uint32>::value;
Expand All @@ -291,6 +328,7 @@ static void tsubtract() {
CHECK_INT(rng1.max(), (1 << 24) - 1);
CHECK_INT(rng1(), 8871692);

#if _HAS_TR1_NAMESPACE
STD linear_congruential<Uint32, 40014, 0, 2147483563> init_gen(19780503);

rng_t rng2(init_gen);
Expand All @@ -302,6 +340,7 @@ static void tsubtract() {
CHECK_INT(rng3.min(), 0);
CHECK_INT(rng3.max(), (1 << 24) - 1);
CHECK_INT(rng3(), 6319224);
#endif // ^^^ _HAS_TR1_NAMESPACE ^^^

rng.seed(1);
CHECK_INT(rng.min(), 0);
Expand All @@ -313,6 +352,7 @@ static void tsubtract() {
CHECK_INT(rng.max(), (1 << 24) - 1);
CHECK_INT(rng(), 966168);

#if _HAS_TR1_NAMESPACE
init_gen.seed(19780503);
rng3.seed(init_gen);
CHECK_INT(rng3.min(), 0);
Expand All @@ -323,6 +363,7 @@ static void tsubtract() {
CHECK_INT(rng3.min(), 0);
CHECK_INT(rng3.max(), (1 << 24) - 1);
CHECK_INT(rng3(), 6319224);
#endif // ^^^ _HAS_TR1_NAMESPACE ^^^

test_globals<rng_t>::test();
}
Expand Down Expand Up @@ -377,7 +418,11 @@ static void tsubtract_01() {
CHECK_DOUBLE(rng1.max(), 1.0);
CHECK_DOUBLE(rng1(), 8871692 * factor);

#if _HAS_TR1_NAMESPACE
STD linear_congruential<unsigned int, 40014, 0, 2147483563> init_gen(19780503);
#else // ^^^ _HAS_TR1_NAMESPACE / !_HAS_TR1_NAMESPACE vvv
STD linear_congruential_engine<unsigned int, 40014, 0, 2147483563> init_gen(19780503);
#endif // ^^^ !_HAS_TR1_NAMESPACE ^^^

rng_t rng2(init_gen);
CHECK_DOUBLE(rng2.min(), 0.0);
Expand Down Expand Up @@ -464,8 +509,13 @@ static void tranlux4_01() {

static void tdiscard() {
int i;
#if _HAS_TR1_NAMESPACE
typedef STD subtract_with_carry<Uint32, 1 << 24, 10, 24> rng_base_t;
typedef STD discard_block<rng_base_t, 223, 24> rng_t;
#else // ^^^ _HAS_TR1_NAMESPACE / !_HAS_TR1_NAMESPACE vvv
typedef STD subtract_with_carry_engine<Uint32, 24, 10, 24> rng_base_t;
typedef STD discard_block_engine<rng_base_t, 223, 24> rng_t;
#endif // ^^^ !_HAS_TR1_NAMESPACE ^^^
CHECK_INT(rng_t::block_size, 223);
CHECK_INT(rng_t::used_block, 24);
#if _HAS_TR1_NAMESPACE
Expand All @@ -481,6 +531,7 @@ static void tdiscard() {
CHECK_INT(rng.max(), (1 << 24) - 1);
CHECK_INT(rng(), 15039276);

#if _HAS_TR1_NAMESPACE
STD linear_congruential<unsigned int, 40014, 0, 2147483563> init_gen(19780503);

rng_t rng2(init_gen);
Expand All @@ -503,14 +554,15 @@ static void tdiscard() {
CHECK_INT(rng3.min(), 0);
CHECK_INT(rng3.max(), (1 << 24) - 1);
CHECK_INT(rng3(), 6319224);
#endif // ^^^ _HAS_TR1_NAMESPACE ^^^

rng_base_t rng4;
rng_t rng5;
for (i = 0; i < rng_t::used_block; ++i) {
for (i = 0; i < static_cast<int>(rng_t::used_block); ++i) {
CHECK_INT(rng4(), rng5());
}
CHECK(rng4() != rng5());
for (; i < rng_t::block_size; ++i) {
for (; i < static_cast<int>(rng_t::block_size); ++i) {
(void) rng4();
}

Expand Down
Loading
Loading