31 #include <tests/myratest.h> 37 template<
class Precision>
void test(
int I,
int J, Precision tolerance)
39 typedef std::complex<Precision> Number;
40 myra::out() << typestring<Number>() << std::endl;
53 solver.solve(B,
'L',
'N');
54 Precision error = frobenius(X-B)/frobenius(X);
55 myra::out() <<
" |inv(A)*B-X| = " << error << std::endl;
56 REQUIRE(error < tolerance);
61 auto B = transpose(A)*X;
62 solver.solve(B,
'L',
'T');
63 Precision error = frobenius(X-B)/frobenius(X);
64 myra::out() <<
" |inv(A^T)*B-X| = " << error << std::endl;
65 REQUIRE(error < tolerance);
70 auto B = hermitian(A)*X;
71 solver.solve(B,
'L',
'H');
72 Precision error = frobenius(X-B)/frobenius(X);
73 myra::out() <<
" |inv(A^H)*B-X| = " << error << std::endl;
74 REQUIRE(error < tolerance);
79 auto B = conjugate(A)*X;
80 solver.solve(B,
'L',
'C');
81 Precision error = frobenius(X-B)/frobenius(X);
82 myra::out() <<
" |inv(A^C)*B-X| = " << error << std::endl;
83 REQUIRE(error < tolerance);
89 solver.solve(B,
'R',
'N');
90 Precision error = frobenius(X-B)/frobenius(X);
91 myra::out() <<
" |B*inv(A)-X| = " << error << std::endl;
92 REQUIRE(error < tolerance);
97 auto B = X*transpose(A);
98 solver.solve(B,
'R',
'T');
99 Precision error = frobenius(X-B)/frobenius(X);
100 myra::out() <<
" |B*inv(A^T)-X| = " << error << std::endl;
101 REQUIRE(error < tolerance);
106 auto B = X*hermitian(A);
107 solver.solve(B,
'R',
'H');
108 Precision error = frobenius(X-B)/frobenius(X);
109 myra::out() <<
" |B*inv(A^H)-X| = " << error << std::endl;
110 REQUIRE(error < tolerance);
115 auto B = X*conjugate(A);
116 solver.solve(B,
'R',
'C');
117 Precision error = frobenius(X-B)/frobenius(X);
118 myra::out() <<
" |B*inv(A^C)-X| = " << error << std::endl;
119 REQUIRE(error < tolerance);
129 saved.solve(B,
'L',
'N');
130 Precision error = frobenius(X-B)/frobenius(X);
131 myra::out() <<
" |inv(A)*B-X| (saved) = " << error << std::endl;
132 REQUIRE(error < tolerance);
138 ADD_TEST(
"cCholeskySolver",
"[dense][solver]")
139 { test<float>(25,14,1.0e-2f); }
141 ADD_TEST(
"zCholeskySolver",
"[dense][solver]")
142 { test<double>(82,45,1.0e-10); }
Returns a conjugated copy of a Matrix or Vector. Or, conjugate one inplace.
Tabulates an IxJ matrix. Allows random access, has column major layout to be compatible with BLAS/LAP...
Definition: bdsqr.h:20
Routines for hermitian rank-k updates, a specialized form of Matrix*Matrix multiplication.
Routines for computing Frobenius norms of various algebraic containers.
static Matrix< Number > random(int I, int J)
Generates a random Matrix of specified size.
Definition: Matrix.cpp:353
Wraps a std::vector<char>, presents it as both an InputStream and OutputStream. Useful for hygienic u...
Definition: VectorStream.h:22
Specialized container for a lower triangular matrix, O(N^2/2) storage. Used by symmetry exploiting ma...
Returns a transposed copy of a Matrix. The inplace version only works on a square operand...
Various utility functions/classes related to scalar Number types.
A stream that serialize/deserializes to std::vector<char> buffer.
General purpose dense matrix container, O(i*j) storage.
A solver suitable for a complex hermitian positive definite Matrix.
Returns a hermitian copy of a Matrix. The inplace version only works on a square operand.
Factors complex hermitian A into L*L', presents solve methods.
Definition: ZCholeskySolver.h:27
Stores a lower triangular matrix in rectangular packed format.
Definition: conjugate.h:22
Variety of routines all for dense Matrix*Matrix multiplies. Delegates to the BLAS.
std::complex<double>
|inv(A)*B-X| = 5.11768e-13
|inv(A^T)*B-X| = 5.78896e-13
|inv(A^H)*B-X| = 5.26593e-13
|inv(A^C)*B-X| = 5.13542e-13
|B*inv(A)-X| = 5.32481e-13
|B*inv(A^T)-X| = 5.09338e-13
|B*inv(A^H)-X| = 5.25113e-13
|B*inv(A^C)-X| = 5.55489e-13
|inv(A)*B-X| (saved) = 5.37226e-13