30 #include <tests/myratest.h> 39 myra::out() << typestring<Number>() << std::endl;
49 solver.solve(B,
'L',
'N');
50 Precision error = frobenius(B-X)/frobenius(X);
51 myra::out() <<
" |inv(A)*B-X| = " << error << std::endl;
52 REQUIRE(error < tolerance);
57 auto B = transpose(A)*X;
58 solver.solve(B,
'L',
'T');
59 Precision error = frobenius(B-X)/frobenius(X);
60 myra::out() <<
" |inv(A^T)*B-X| = " << error << std::endl;
61 REQUIRE(error < tolerance);
66 auto B = hermitian(A)*X;
67 solver.solve(B,
'L',
'H');
68 Precision error = frobenius(B-X)/frobenius(X);
69 myra::out() <<
" |inv(A^H)*B-X| = " << error << std::endl;
70 REQUIRE(error < tolerance);
75 auto B = conjugate(A)*X;
76 solver.solve(B,
'L',
'C');
77 Precision error = frobenius(B-X)/frobenius(X);
78 myra::out() <<
" |inv(A^C)*B-X| = " << error << std::endl;
79 REQUIRE(error < tolerance);
85 solver.solve(B,
'R',
'N');
86 Precision error = frobenius(B-X)/frobenius(X);
87 myra::out() <<
" |B*inv(A)-X| = " << error << std::endl;
88 REQUIRE(error < tolerance);
93 auto B = X*transpose(A);
94 solver.solve(B,
'R',
'T');
95 Precision error = frobenius(B-X)/frobenius(X);
96 myra::out() <<
" |B*inv(A^T)-X| = " << error << std::endl;
97 REQUIRE(error < tolerance);
102 auto B = X*hermitian(A);
103 solver.solve(B,
'R',
'H');
104 Precision error = frobenius(B-X)/frobenius(X);
105 myra::out() <<
" |B*inv(A^H)-X| = " << error << std::endl;
106 REQUIRE(error < tolerance);
111 auto B = X*conjugate(A);
112 solver.solve(B,
'R',
'C');
113 Precision error = frobenius(B-X)/frobenius(X);
114 myra::out() <<
" |B*inv(A^C)-X| = " << error << std::endl;
115 REQUIRE(error < tolerance);
124 saved.solve(B,
'L',
'N');
125 Precision error = frobenius(B-X)/frobenius(X);
126 myra::out() <<
" |inv(A)*B-X| = " << error << std::endl;
127 REQUIRE(error < tolerance);
133 ADD_TEST(
"sLUSolver",
"[dense][solver]")
134 { test<NumberS>(200,120,1.0e-2f); }
136 ADD_TEST(
"dLUSolver",
"[dense][solver]")
137 { test<NumberD>(200,120,1.0e-10); }
139 ADD_TEST(
"cLUSolver",
"[dense][solver]")
140 { test<NumberC>(200,120,1.0e-2f); }
142 ADD_TEST(
"zLUSolver",
"[dense][solver]")
143 { test<NumberZ>(200,120,1.0e-10); }
Returns a conjugated copy of a Matrix or Vector. Or, conjugate one inplace.
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
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.
Reflects Precision trait for a Number, scalar Number types should specialize it.
Definition: Number.h:33
General purpose linear solver, no symmetry/definiteness assumptions upon A (just square) ...
Factors a square matrix A into L*U, presents solve methods.
Definition: LUSolver.h:30
Returns a hermitian copy of a Matrix. The inplace version only works on a square operand.
Variety of routines all for dense Matrix*Matrix multiplies. Delegates to the BLAS.
Interface class for representing subranges of contiguous int's.
std::complex<double>
|inv(A)*B-X| = 6.50334e-14
|inv(A^T)*B-X| = 6.92375e-14
|inv(A^H)*B-X| = 6.28447e-14
|inv(A^C)*B-X| = 6.13314e-14
|B*inv(A)-X| = 6.36775e-14
|B*inv(A^T)-X| = 6.53646e-14
|B*inv(A^H)-X| = 6.61393e-14
|B*inv(A^C)-X| = 6.7714e-14
|inv(A)*B-X| = 6.65871e-14