MyraMath
csyrkU


Source: tests/dense/syrk2.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/syrk.h>
23 #include <myramath/dense/tril.h>
24 #include <myramath/dense/triu.h>
25 
26 // Reporting.
27 #include <tests/myratest.h>
28 
29 using namespace myra;
30 
31 namespace {
32 
33 template<class Number> void test(int I, int J, typename ReflectPrecision<Number>::type tolerance)
34  {
35  // Useful typedef.
36  typedef typename ReflectPrecision<Number>::type Precision;
37  myra::out() << typestring<Number>() << std::endl;
38  // Make random nonsquare matrix A.
39  auto A = Matrix<Number>::random(I,J);
40  Number alpha = random<Number>();
41  Number beta = random<Number>();
42  // Compare syrk_inplace('N') to gemm_inplace(A,'N',A,'T')
43  {
44  auto C1 = Matrix<Number>::random(I,I);
45  Matrix<Number> C2 = C1;
46  gemm_inplace(C1,A,'N',A,'T',alpha,beta);
47  syrk_inplace(C2,'U',A,'N',alpha,beta);
48  Precision error = frobenius(triu(C1-C2));
49  myra::out() << " |syrk('N')-gemm('N','T')| = " << error << std::endl;
50  REQUIRE(error < tolerance);
51  }
52  // Compare syrk_inplace('T') to gemm_inplace(A,'T',A,'N')
53  {
54  auto C1 = Matrix<Number>::random(J,J);
55  Matrix<Number> C2 = C1;
56  gemm_inplace(C1,A,'T',A,'N',alpha,beta);
57  syrk_inplace(C2,'U',A,'T',alpha,beta);
58  Precision error = frobenius(triu(C1-C2));
59  myra::out() << " |syrk('T')-gemm('T','N')| = " << error << std::endl;
60  REQUIRE(error < tolerance);
61  }
62  // Compare syrk_inplace('C') to gemm_inplace(A,'C',A,'H')
63  {
64  auto C1 = Matrix<Number>::random(I,I);
65  Matrix<Number> C2 = C1;
66  gemm_inplace(C1,A,'C',A,'H',alpha,beta);
67  syrk_inplace(C2,'U',A,'C',alpha,beta);
68  Precision error = frobenius(triu(C1-C2));
69  myra::out() << " |syrk('C')-gemm('C','H')| = " << error << std::endl;
70  REQUIRE(error < tolerance);
71  }
72  // Compare syrk_inplace('H') to gemm(A,'H',A,'C')
73  {
74  auto C1 = Matrix<Number>::random(J,J);
75  Matrix<Number> C2 = C1;
76  gemm_inplace(C1,A,'H',A,'C',alpha,beta);
77  syrk_inplace(C2,'U',A,'H',alpha,beta);
78  Precision error = frobenius(triu(C1-C2));
79  myra::out() << " |syrk('H')-gemm('H','C')| = " << error << std::endl;
80  REQUIRE(error < tolerance);
81  }
82  }
83 
84 } // namespace
85 
86 ADD_TEST("ssyrkU","[dense][blas]")
87  { test<NumberS>(57,24,1.0e-4f); }
88 
89 ADD_TEST("dsyrkU","[dense][blas]")
90  { test<NumberD>(57,24,1.0e-8); }
91 
92 ADD_TEST("csyrkU","[dense][blas]")
93  { test<NumberC>(57,24,1.0e-4f); }
94 
95 ADD_TEST("zhsykU","[dense][blas]")
96  { test<NumberZ>(57,24,1.0e-8); }
97 
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 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.
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.
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('C')-gemm('C','H')| = 0
|syrk('H')-gemm('H','C')| = 0


Go back to Summary of /test programs.