MyraMath
csyrkLower


Source: tests/dense/syrk3.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>
16 
17 // Algorithms.
19 #include <myramath/dense/gemm.h>
20 #include <myramath/dense/syrk.h>
25 #include <myramath/dense/tril.h>
26 #include <myramath/dense/triu.h>
27 
28 // Reporting.
29 #include <tests/myratest.h>
30 
31 using namespace myra;
32 
33 namespace {
34 
35 template<class Number> void test(int I, int J, typename ReflectPrecision<Number>::type tolerance)
36  {
37  // Useful typedef.
38  typedef typename ReflectPrecision<Number>::type Precision;
39  myra::out() << typestring<Number>() << std::endl;
40  // Make random nonsquare matrix A.
41  auto A = Matrix<Number>::random(I,J);
42  // Compare syrk(A,'N') to gemm(A,'N',A,'T')
43  {
44  LowerMatrix<Number> C1(gemm(A,'N',A,'T'));
45  LowerMatrix<Number> C2 = syrk(A,'N');
46  Precision error = frobenius(C2-C1);
47  myra::out() << " |syrk('N')-gemm('N','T')| = " << error << std::endl;
48  REQUIRE(error < tolerance);
49  }
50  // Compare syrk(A,'T') to gemm(A,'T',A,'N')
51  {
52  LowerMatrix<Number> C1(gemm(A,'T',A,'N'));
53  LowerMatrix<Number> C2 = syrk(A,'T');
54  Precision error = frobenius(C2-C1);
55  myra::out() << " |syrk('T')-gemm('T','N')| = " << error << std::endl;
56  REQUIRE(error < tolerance);
57  }
58  // Compare syrk(A,'H') to gemm(A,'H',A,'C')
59  {
60  LowerMatrix<Number> C1(gemm(A,'H',A,'C'));
61  LowerMatrix<Number> C2 = syrk(A,'H');
62  Precision error = frobenius(C2-C1);
63  myra::out() << " |syrk('H')-gemm('H','C')| = " << error << std::endl;
64  REQUIRE(error < tolerance);
65  }
66  // Compare syrk(A,'C') to gemm(A,'C',A,'H')
67  {
68  LowerMatrix<Number> C1(gemm(A,'C',A,'H'));
69  LowerMatrix<Number> C2 = syrk(A,'C');
70  Precision error = frobenius(C2-C1);
71  myra::out() << " |syrk('C')-gemm('C','H')| = " << error << std::endl;
72  REQUIRE(error < tolerance);
73  }
74  }
75 
76 } // namespace
77 
78 ADD_TEST("ssyrkLower","[dense][blas]")
79  { test<NumberS>(57,24,1.0e-4f); }
80 
81 ADD_TEST("dsyrkLower","[dense][blas]")
82  { test<NumberD>(57,24,1.0e-8); }
83 
84 ADD_TEST("csyrkLower","[dense][blas]")
85  { test<NumberC>(57,24,1.0e-4f); }
86 
87 ADD_TEST("zhsykLower","[dense][blas]")
88  { test<NumberZ>(57,24,1.0e-8); }
89 
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
Range construct for a lower triangular matrix stored in rectangular packed format.
Definition: syntax.dox:1
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...
Returns the lower triangle of a dense Matrix.
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
Returns a hermitian copy of a Matrix. The inplace version only works on a square operand.
Simplistic random number functions.
Stores a lower triangular matrix in rectangular packed format.
Definition: conjugate.h:22
Routines for symmetric rank-k updates, a specialized form of Matrix*Matrix multiplication.
Variety of routines all for dense Matrix*Matrix multiplies. Delegates to the BLAS.


Results: [PASS]

std::complex<float>
|syrk('N')-gemm('N','T')| = 0
|syrk('T')-gemm('T','N')| = 0
|syrk('H')-gemm('H','C')| = 0
|syrk('C')-gemm('C','H')| = 0


Go back to Summary of /test programs.