cxx11_tensor_random: use retry loop for low-precision RNG collisions

libeigen/eigen!2269

Co-authored-by: Rasmus Munk Larsen <rmlarsen@gmail.com>
This commit is contained in:
Rasmus Munk Larsen
2026-03-08 16:19:48 -07:00
parent f80d7b8254
commit a3cb1c6591

View File

@@ -14,44 +14,44 @@
template <typename Scalar> template <typename Scalar>
static void test_default() { static void test_default() {
Tensor<Scalar, 1> vec(6); Tensor<Scalar, 1> vec(6);
vec.setRandom();
// Fixme: we should check that the generated numbers follow a uniform // Fixme: we should check that the generated numbers follow a uniform
// distribution instead. // distribution instead.
// For low-precision types (half, bfloat16), the RNG has limited distinct // For low-precision types (half, bfloat16), the RNG has limited distinct
// values (e.g. 128 for bfloat16), so adjacent collisions are statistically // values (e.g. 128 for bfloat16), so adjacent collisions are possible.
// inevitable. Only verify that not all values are identical. // Retry a few times to avoid spurious failures.
if (sizeof(Scalar) <= 2) { bool all_distinct = false;
bool has_distinct = false; for (int attempt = 0; attempt < 10 && !all_distinct; ++attempt) {
for (int i = 1; i < 6 && !has_distinct; ++i) { vec.setRandom();
if (vec(i) != vec(i - 1)) has_distinct = true; all_distinct = true;
}
VERIFY(has_distinct);
} else {
for (int i = 1; i < 6; ++i) { for (int i = 1; i < 6; ++i) {
VERIFY_IS_NOT_EQUAL(vec(i), vec(i - 1)); if (vec(i) == vec(i - 1)) {
all_distinct = false;
break;
}
} }
} }
VERIFY(all_distinct);
} }
template <typename Scalar> template <typename Scalar>
static void test_normal() { static void test_normal() {
Tensor<Scalar, 1> vec(6); Tensor<Scalar, 1> vec(6);
vec.template setRandom<Eigen::internal::NormalRandomGenerator<Scalar>>();
// Fixme: we should check that the generated numbers follow a gaussian // Fixme: we should check that the generated numbers follow a gaussian
// distribution instead. // distribution instead.
if (sizeof(Scalar) <= 2) { bool all_distinct = false;
bool has_distinct = false; for (int attempt = 0; attempt < 10 && !all_distinct; ++attempt) {
for (int i = 1; i < 6 && !has_distinct; ++i) { vec.template setRandom<Eigen::internal::NormalRandomGenerator<Scalar>>();
if (vec(i) != vec(i - 1)) has_distinct = true; all_distinct = true;
}
VERIFY(has_distinct);
} else {
for (int i = 1; i < 6; ++i) { for (int i = 1; i < 6; ++i) {
VERIFY_IS_NOT_EQUAL(vec(i), vec(i - 1)); if (vec(i) == vec(i - 1)) {
all_distinct = false;
break;
}
} }
} }
VERIFY(all_distinct);
} }
struct MyGenerator { struct MyGenerator {