26 #include <tests/myratest.h> 36 myra::out() << typestring<Number>() << std::endl;
37 auto R = sy_rotate2(A);
38 auto B = R*A*transpose(R);
40 Precision B_error = scalar_norm1( B(1,0) );
41 Precision R_error = frobenius(hermitian(R)*R-I);
42 myra::out() <<
"|(R*A*Rt)(1,0)| = " << B_error << std::endl;
43 myra::out() <<
"|Rh*R-I| = " << R_error << std::endl;
44 REQUIRE(B_error < tolerance);
45 REQUIRE(R_error < tolerance);
52 myra::out() << typestring<Number>() << std::endl;
53 auto R = he_rotate2(A);
54 auto B = R*A*hermitian(R);
56 Precision B_error = scalar_norm1( B(1,0) );
57 Precision R_error = frobenius(hermitian(R)*R-I);
58 myra::out() <<
"|(R*A*Rh)(1,0)| = " << B_error << std::endl;
59 myra::out() <<
"|Rh*R-I| = " << R_error << std::endl;
60 REQUIRE(B_error < tolerance);
61 REQUIRE(R_error < tolerance);
73 Precision A_error = frobenius(A-U*S*V);
74 Precision U_error = frobenius(hermitian(U)*U-I);
75 Precision V_error = frobenius(V*hermitian(V)-I);
76 myra::out() <<
"|A-U*S*V| = " << A_error << std::endl;
77 myra::out() <<
"|U'*U-I| = " << U_error << std::endl;
78 myra::out() <<
"|V*V'-I| = " << V_error << std::endl;
79 REQUIRE(A_error < tolerance);
80 REQUIRE(U_error < tolerance);
81 REQUIRE(V_error < tolerance);
89 return A*D*transpose(A);
97 return A*D*hermitian(A);
103 ADD_TEST(
"ssy_rotate2",
"[dense][lapack]")
105 for (
int t = 0; t < 10; ++t)
109 ADD_TEST(
"dsy_rotate2",
"[dense][lapack]")
111 for (
int t = 0; t < 10; ++t)
114 ADD_TEST(
"csy_rotate2",
"[dense][lapack]")
116 for (
int t = 0; t < 10; ++t)
119 ADD_TEST(
"zsy_rotate2",
"[dense][lapack]")
121 for (
int t = 0; t < 10; ++t)
126 ADD_TEST(
"sy_rotate2_special",
"[dense][lapack]")
149 for (
int t = 0; t < 10; ++t)
150 test_sy(sy_singular<NumberS>(), 1.0e-5f);
151 for (
int t = 0; t < 10; ++t)
152 test_sy(sy_singular<NumberD>(), 1.0e-10);
153 for (
int t = 0; t < 10; ++t)
154 test_sy(sy_singular<NumberC>(), 1.0e-5f);
155 for (
int t = 0; t < 10; ++t)
156 test_sy(sy_singular<NumberZ>(), 1.0e-10);
160 ADD_TEST(
"che_rotate2",
"[dense][lapack]")
162 for (
int t = 0; t < 1; ++t)
165 ADD_TEST(
"zhe_rotate2",
"[dense][lapack]")
167 for (
int t = 0; t < 1; ++t)
172 ADD_TEST(
"he_rotate2_special",
"[dense][lapack]")
187 for (
int t = 0; t < 10; ++t)
188 test_he<float>(he_singular<NumberC>(), 1.0e-5f);
189 for (
int t = 0; t < 10; ++t)
190 test_he<double>(he_singular<NumberZ>(), 1.0e-10);
194 ADD_TEST(
"gesvd2",
"[dense][lapack]")
204 ADD_TEST(
"gesvd2_special",
"[dense][lapack]")
static Matrix22< Number > random()
Generates a random Matrix22.
Definition: Matrix22.cpp:150
Interface class for representing subranges of dense Matrix's.
static Matrix22< Number > zeros()
Generates a zeros Matrix of specified size.
Definition: Matrix22.cpp:175
Matrix type with fixed size of 2x2, algorithms that operate upon them.
Returns a transposed copy of a Matrix. The inplace version only works on a square operand...
Reflects a Precision type into a complex type.
Definition: Number.h:46
static Matrix22< Number > identity()
Generates an identity Matrix22.
Definition: Matrix22.cpp:137
Various utility functions/classes related to scalar Number types.
static Matrix22< Number > fill_cmajor(Number a00, Number a10, Number a01, Number a11)
Fills from four aij values in column major order, A = [a00 a01; a10 a11].
Definition: Matrix22.cpp:205
static Matrix22< Number > ones()
Generates a ones Matrix of specified size.
Definition: Matrix22.cpp:179
Matrix type with fixed size 2x2.
Definition: Matrix22.h:25
static Matrix22< Number > fill_rmajor(Number a00, Number a01, Number a10, Number a11)
Fills from four aij values in row major order, A = [a00 a01; a10 a11].
Definition: Matrix22.cpp:194
Reflects Precision trait for a Number, scalar Number types should specialize it.
Definition: Number.h:33
Returns a hermitian copy of a Matrix. The inplace version only works on a square operand.
Simplistic random number functions.
Streams that serialize/deserialize to/from files.
Variety of routines all for dense Matrix*Matrix multiplies. Delegates to the BLAS.
Computes a plane rotation, either single sided (rotate1) or double sided (rotate2).
std::complex<float>
|(R*A*Rt)(1,0)| = 3.6365e-07
|Rh*R-I| = 2.07549e-07
std::complex<float>
|(R*A*Rt)(1,0)| = 5.96046e-08
|Rh*R-I| = 1.49384e-07
std::complex<float>
|(R*A*Rt)(1,0)| = 2.45756e-07
|Rh*R-I| = 2.10734e-07
std::complex<float>
|(R*A*Rt)(1,0)| = 1.8128e-07
|Rh*R-I| = 1.68587e-07
std::complex<float>
|(R*A*Rt)(1,0)| = 6.664e-08
|Rh*R-I| = 2.80364e-07
std::complex<float>
|(R*A*Rt)(1,0)| = 8.42937e-08
|Rh*R-I| = 1.88486e-07
std::complex<float>
|(R*A*Rt)(1,0)| = 4.47035e-08
|Rh*R-I| = 1.76627e-07
std::complex<float>
|(R*A*Rt)(1,0)| = 2.68635e-08
|Rh*R-I| = 1.26879e-07
std::complex<float>
|(R*A*Rt)(1,0)| = 3.332e-08
|Rh*R-I| = 1.21058e-07
std::complex<float>
|(R*A*Rt)(1,0)| = 1.63404e-07
|Rh*R-I| = 1.91119e-07