-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_bidiag.cpp
103 lines (77 loc) · 2.66 KB
/
test_bidiag.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <gtest/gtest.h>
#include "../src/algorithms/bidiagonalization.h"
#include "../src/matrix_utils/checks.h"
#include "helpers.h"
namespace {
template <typename T = long double>
using Complex = std::complex<T>;
template <typename T = long double>
using Matrix = LinearKit::Matrix<T>;
using namespace LinearKit::Algorithm;
using namespace LinearKit::Utils;
using namespace LinearKit::MatrixUtils;
using LinearKit::Tests::RandomGenerator;
template <MatrixType M, MatrixType F, MatrixType S, MatrixType K>
void CheckBidiag(const M &matrix, const F &U, const S &B, const K &VT) {
EXPECT_TRUE(IsUnitary(U));
EXPECT_TRUE(IsUnitary(VT));
EXPECT_TRUE(IsBidiagonal(B));
EXPECT_TRUE(AreEqualMatrices(matrix, U * B * VT));
}
TEST(TEST_BIDIAG, BidiagClear) {
using Matrix = Matrix<long double>;
Matrix matrix;
auto [U, B, VT] = Bidiagonalize(matrix);
CheckBidiag(matrix, U, B, VT);
}
TEST(TEST_BIDIAG, BidiagSquare) {
using Matrix = Matrix<long double>;
Matrix matrix = {
{1, 2, 2, 4}, {6, 6, 7, 8}, {9, 10, 11, 11}, {12, 13, 14, 17}};
auto [U, B, VT] = Bidiagonalize(matrix);
CheckBidiag(matrix, U, B, VT);
}
TEST(TEST_BIDIAG, BidiagRectangle) {
using Matrix = Matrix<long double>;
{
Matrix matrix = {{1, 2, 3, 4, 5, 6}};
auto [U, B, VT] = Bidiagonalize(matrix);
CheckBidiag(matrix, U, B, VT);
}
{
Matrix matrix = {{4, 4, 5}, {4, 1, 2}, {7, 9, 3}, {1, 1, 2}};
auto [U, B, VT] = Bidiagonalize(matrix);
CheckBidiag(matrix, U, B, VT);
}
}
TEST(TEST_BIDIAG, BidiagComplex) {
using Matrix = Matrix<Complex<long double>>;
Matrix matrix = {{{1, 2}, {3, 4}, {-1, 2}}, {{7, -3}, {-3, 2}, {-5, -3}}};
auto [U, B, VT] = Bidiagonalize(matrix);
CheckBidiag(matrix, U, B, VT);
}
TEST(TEST_BIDIAG, BidiagView) {
using Matrix = Matrix<long double>;
Matrix matrix = {
{1, 2, 2, 4}, {6, 6, 7, 8}, {9, 10, 11, 11}, {12, 13, 14, 17}};
auto view = matrix.GetSubmatrix({1, -1}, {0, -1});
auto [U, B, VT] = Bidiagonalize(view);
CheckBidiag(view, U, B, VT);
}
TEST(TEST_BIDIAG, Stress) {
using Type = Complex<long double>;
using MatrixGenerator = RandomGenerator<Type>;
using Matrix = Matrix<Type>;
const size_t it_count = 10u;
for (int32_t seed = 1; seed < 10; ++seed) {
MatrixGenerator gen(seed);
for (size_t it = 0; it < it_count; ++it) {
int32_t rows = gen.GetMatrixSize();
int32_t columns = gen.GetMatrixSize();
auto matrix = gen.GetMatrix(rows, columns);
auto [U, B, VT] = Bidiagonalize(matrix);
CheckBidiag(matrix, U, B, VT);
}
}
}
} // namespace