Fix random number generation and floating point comparison in matrix-… · llvm/llvm-test-suite@4bdbe4a (original) (raw)
`@@ -8,15 +8,54 @@
`
8
8
`#include
`
9
9
`#include <stdlib.h>
`
10
10
``
11
``
`-
#define EXPECT_MATRIX_EQ(A, B, R, C) \
`
12
``
`-
do { \
`
13
``
`-
for (unsigned r = 0; r < R; r++) \
`
14
``
`-
for (unsigned c = 0; c < C; c++) \
`
15
``
`-
if (A[r + c * R] != B[r + c * R]) { \
`
16
``
`-
std::cerr << "mismatch at " << r << ":" << c << "\n"; \
`
17
``
`-
exit(1); \
`
18
``
`-
} \
`
19
``
`-
} while (false)
`
``
11
`+
#define ABSTOL 0.000001
`
``
12
`+
#define RELTOL 0.00001
`
``
13
`+
bool fpcmp(double V1, double V2, double AbsTolerance, double RelTolerance) {
`
``
14
`+
// Check to see if these are inside the absolute tolerance
`
``
15
`+
if (AbsTolerance < fabs(V1 - V2)) {
`
``
16
`+
// Nope, check the relative tolerance...
`
``
17
`+
double Diff;
`
``
18
`+
if (V2)
`
``
19
`+
Diff = fabs(V1 / V2 - 1.0);
`
``
20
`+
else if (V1)
`
``
21
`+
Diff = fabs(V2 / V1 - 1.0);
`
``
22
`+
else
`
``
23
`+
Diff = 0; // Both zero.
`
``
24
`+
if (Diff > RelTolerance) {
`
``
25
`+
return true;
`
``
26
`+
}
`
``
27
`+
}
`
``
28
`+
return false;
`
``
29
`+
}
`
``
30
+
``
31
`+
template <typename ElementTy, typename std::enable_if_t<
`
``
32
`+
std::is_integral::value, int> = 0>
`
``
33
`+
void expectMatrixEQ(ElementTy *A, ElementTy *B, unsigned R, unsigned C) {
`
``
34
`+
do {
`
``
35
`+
for (unsigned r = 0; r < R; r++)
`
``
36
`+
for (unsigned c = 0; c < C; c++)
`
``
37
`+
if (A[r + c * R] != B[r + c * R]) {
`
``
38
`+
std::cerr << "mismatch at " << r << ":" << c << "\n";
`
``
39
`+
exit(1);
`
``
40
`+
}
`
``
41
`+
} while (false);
`
``
42
`+
}
`
``
43
+
``
44
`+
template <typename ElementTy,
`
``
45
`+
typename std::enable_if_t<std::is_floating_point::value,
`
``
46
`+
int> = 0>
`
``
47
`+
void expectMatrixEQ(ElementTy *A, ElementTy *B, unsigned R,
`
``
48
`+
unsigned C) {
`
``
49
`+
do {
`
``
50
`+
for (unsigned r = 0; r < R; r++)
`
``
51
`+
for (unsigned c = 0; c < C; c++)
`
``
52
`+
if (fpcmp(A[r + c * R], B[r + c * R], ABSTOL, RELTOL)) {
`
``
53
`+
std::cerr << "mismatch at " << r << ":" << c << "\n";
`
``
54
`+
exit(1);
`
``
55
`+
}
`
``
56
`+
} while (false);
`
``
57
`+
}
`
``
58
+
20
59
``
21
60
`template
`
22
61
`void zeroMatrix(EltTy *M, unsigned Rows, unsigned Cols) {
`
`@@ -33,13 +72,25 @@ template void print(EltTy *X, unsigned Rows, unsigned Cols) {
`
33
72
` }
`
34
73
`}
`
35
74
``
36
``
`-
template void initRandom(Ty *A, unsigned Rows, unsigned Cols) {
`
``
75
`+
template <typename ElementTy,
`
``
76
`+
typename std::enable_if_t<std::is_floating_point::value,
`
``
77
`+
int> = 0>
`
``
78
`+
void initRandom(ElementTy *A, unsigned Rows, unsigned Cols) {
`
``
79
`+
std::default_random_engine generator;
`
``
80
`+
std::uniform_real_distribution distribution(-10.0, 10.0);
`
``
81
+
``
82
`+
for (unsigned i = 0; i < Rows * Cols; i++)
`
``
83
`+
A[i] = distribution(generator);
`
``
84
`+
}
`
``
85
+
``
86
`+
template <typename ElementTy, typename std::enable_if_t<
`
``
87
`+
std::is_integral::value, int> = 0>
`
``
88
`+
void initRandom(ElementTy *A, unsigned Rows, unsigned Cols) {
`
37
89
` std::default_random_engine generator;
`
38
``
`-
std::uniform_int_distribution distribution(-10.0, 10.0);
`
39
``
`-
auto random_double = std::bind(distribution, generator);
`
``
90
`+
std::uniform_int_distribution distribution(-10, 10);
`
40
91
``
41
92
`for (unsigned i = 0; i < Rows * Cols; i++)
`
42
``
`-
A[i] = random_double();
`
``
93
`+
A[i] = distribution(generator);
`
43
94
`}
`
44
95
``
45
96
`template <typename EltTy, unsigned R, unsigned C>
`
`@@ -82,8 +133,8 @@ template <typename EltTy, unsigned R0, unsigned C0> void testTranspose() {
`
82
133
` transposeSpec<EltTy, R0, C0>(ResSpec, X);
`
83
134
` transposeBuiltin<EltTy, R0, C0>(ResBuiltin, X);
`
84
135
``
85
``
`-
EXPECT_MATRIX_EQ(ResBase, ResBuiltin, R0, C0);
`
86
``
`-
EXPECT_MATRIX_EQ(ResBase, ResSpec, C0, R0);
`
``
136
`+
expectMatrixEQ(ResBase, ResBuiltin, R0, C0);
`
``
137
`+
expectMatrixEQ(ResBase, ResSpec, C0, R0);
`
87
138
`}
`
88
139
``
89
140
`template <typename EltTy, unsigned R0, unsigned C0, unsigned C1>
`
`@@ -150,9 +201,9 @@ void testMultiply() {
`
150
201
` multiplySpec<EltTy, R0, C0, C1>(ResSpec, X, Y);
`
151
202
` multiplyBuiltin<EltTy, R0, C0, C1>(ResBuiltin, X, Y);
`
152
203
``
153
``
`-
EXPECT_MATRIX_EQ(ResSpec, ResBuiltin, R0, C1);
`
154
``
`-
EXPECT_MATRIX_EQ(ResBase, ResBuiltin, R0, C1);
`
155
``
`-
EXPECT_MATRIX_EQ(ResBase, ResSpec, R0, C1);
`
``
204
`+
expectMatrixEQ(ResSpec, ResBuiltin, R0, C1);
`
``
205
`+
expectMatrixEQ(ResBase, ResBuiltin, R0, C1);
`
``
206
`+
expectMatrixEQ(ResBase, ResSpec, R0, C1);
`
156
207
`}
`
157
208
``
158
209
`int main(void) {
`