MyraMath
csymmL


Source: tests/dense/symm1.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>
19 #include <myramath/dense/tril.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 lower triangle, fill upper triangle with random data.
40  Matrix<Number> L = tril(A);
41  for (int j = 0; j < I; ++j)
42  for (int i = 0; i < j; ++i)
43  L(i,j) = random<Number>();
44  // Check symm('L','L')
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', 'L', C2, L, B, alpha, beta);
51  Precision error = frobenius(C1-C2);
52  myra::out() << " |symm('L','L')-gemm()| = " << error << std::endl;
53  REQUIRE(error < tolerance);
54  }
55  // Check symm('R','L')
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', 'L', C2, L, B, alpha, beta);
62  Precision error = frobenius(C1-C2);
63  myra::out() << " |symm('R','L')-gemm()| = " << error << std::endl;
64  REQUIRE(error < tolerance);
65  }
66  }
67 
68 } // namespace
69 
70 ADD_TEST("ssymmL","[dense][blas]")
71  { test<NumberS>(51,32, 1.0e-4f); }
72 
73 ADD_TEST("dsymmL","[dense][blas]")
74  { test<NumberD>(51,32, 1.0e-8); }
75 
76 ADD_TEST("csymmL","[dense][blas]")
77  { test<NumberC>(51,32, 1.0e-4f); }
78 
79 ADD_TEST("zsymmL","[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 lower 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','L')-gemm()| = 3.36535e-05
|symm('R','L')-gemm()| = 3.68141e-05


Go back to Summary of /test programs.