MyraMath
csymmU


Source: tests/dense/symm2.cpp

1 // ========================================================================= //
2 // This file is part of MyraMath, copyright (c) 2014-2019 by Ryan A Chilton //
3 // and distributed by MyraCore, LLC. See LICENSE.txt for license terms. //
4 // ========================================================================= //
5 
11 // Containers.
13 #include <myramath/dense/Matrix.h>
14 
15 // Algorithms.
17 #include <myramath/dense/gemm.h>
18 #include <myramath/dense/symm.h>
21 #include <myramath/dense/triu.h>
22 
23 // Reporting.
24 #include <tests/myratest.h>
25 
26 using namespace myra;
27 
28 namespace {
29 
30 template<class Number> void test(int I, int J, typename ReflectPrecision<Number>::type tolerance)
31  {
32  typedef typename ReflectPrecision<Number>::type Precision;
33  myra::out() << typestring<Number>() << std::endl;
34  // Make random symmetric matrix A.
35  auto A = Matrix<Number>::random(I,I);
36  A = A + transpose(A);
37  Number alpha = random<Number>();
38  Number beta = random<Number>();
39  // Extract upper triangle, fill lower triangle with random data.
40  Matrix<Number> U = triu(A);
41  for (int j = 0; j < I; ++j)
42  for (int i = j+1; i < I; ++i)
43  U(i,j) = random<Number>();
44  // Check symm('L','U')
45  {
46  auto B = Matrix<Number>::random(I,J);
47  auto C1 = Matrix<Number>::random(I,J);
48  Matrix<Number> C2 = C1;
49  gemm_inplace(C1, A, 'N', B, 'N', alpha, beta);
50  symm_inplace('L', 'U', C2, U, B, alpha, beta);
51  Precision error = frobenius(C1-C2);
52  myra::out() << " |symm('L','U')-gemm()| = " << error << std::endl;
53  REQUIRE(error < tolerance);
54  }
55  // Check symm('R','U')
56  {
57  auto B = Matrix<Number>::random(J,I);
58  auto C1 = Matrix<Number>::random(J,I);
59  Matrix<Number> C2 = C1;
60  gemm_inplace(C1, B, 'N', A, 'N', alpha, beta);
61  symm_inplace('R', 'U', C2, U, B, alpha, beta);
62  Precision error = frobenius(C1-C2);
63  myra::out() << " |symm('R','U')-gemm()| = " << error << std::endl;
64  REQUIRE(error < tolerance);
65  }
66  }
67 
68 } // namespace
69 
70 ADD_TEST("ssymmU","[dense][blas]")
71  { test<NumberS>(51,32, 1.0e-4f); }
72 
73 ADD_TEST("dsymmU","[dense][blas]")
74  { test<NumberD>(51,32, 1.0e-8); }
75 
76 ADD_TEST("csymmU","[dense][blas]")
77  { test<NumberC>(51,32, 1.0e-4f); }
78 
79 ADD_TEST("zsymmU","[dense][blas]")
80  { test<NumberZ>(51,32, 1.0e-8); }
81 
Tabulates an IxJ matrix. Allows random access, has column major layout to be compatible with BLAS/LAP...
Definition: bdsqr.h:20
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
Definition: syntax.dox:1
Returns a transposed copy of a Matrix. The inplace version only works on a square operand...
Returns the upper triangle of a dense Matrix.
Various utility functions/classes related to scalar Number types.
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
Simplistic random number functions.
Routines for symmetric Matrix * dense Matrix multiplication.
Variety of routines all for dense Matrix*Matrix multiplies. Delegates to the BLAS.


Results: [PASS]

std::complex<float>
|symm('L','U')-gemm()| = 2.65646e-05
|symm('R','U')-gemm()| = 2.9027e-05


Go back to Summary of /test programs.