MyraMath
dtrmmLower


Source: tests/dense/trmm3.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>
17 
18 // Algorithms.
20 #include <myramath/dense/tril.h>
21 #include <myramath/dense/gemm.h>
22 #include <myramath/dense/trmm.h>
27 
28 // Reporting.
29 #include <tests/myratest.h>
30 
31 using namespace myra;
32 
33 namespace {
34 
35 template<class Number> void test(typename ReflectPrecision<Number>::type tolerance)
36  {
37  // Useful typedef.
38  typedef typename ReflectPrecision<Number>::type Precision;
39  myra::out() << typestring<Number>() << std::endl;
40  // Take the lower triangle L of a random square matrix A.
41  int I = 35;
42  int J = 44;
45  Number alpha = random<Number>();
46  char diag = 'N';
47  // Case 1: multiply L*X=B
48  {
49  auto X = Matrix<Number>::random(I,J);
50  Matrix<Number> B = alpha*A*X;
51  trmm_inplace('L','N',L,X,diag,alpha);
52  Precision error = frobenius(B-X);
53  myra::out() << " |L*X (gemm) - L*X (trmm)| = " << error << std::endl;
54  REQUIRE(error < tolerance);
55  }
56  // Case 2: multiply transpose(L)*X=B
57  {
58  auto X = Matrix<Number>::random(I,J);
59  Matrix<Number> B = alpha*transpose(A)*X;
60  trmm_inplace('L','T',L,X,diag,alpha);
61  Precision error = frobenius(B-X);
62  myra::out() << " |transpose(L)*X (gemm) - transpose(L)*X (trmm)| = " << error << std::endl;
63  REQUIRE(error < tolerance);
64  }
65  // Case 3: multiply hermitian(L)*X=B
66  {
67  auto X = Matrix<Number>::random(I,J);
68  Matrix<Number> B = alpha*hermitian(A)*X;
69  trmm_inplace('L','H',L,X,diag,alpha);
70  Precision error = frobenius(B-X);
71  myra::out() << " |hermitian(L)*X (gemm) - hermitian(L)*X (trmm)| = " << error << std::endl;
72  REQUIRE(error < tolerance);
73  }
74  // Case 4: multiply conjugate(L)*X=B
75  {
76  auto X = Matrix<Number>::random(I,J);
77  Matrix<Number> B = alpha*conjugate(A)*X;
78  trmm_inplace('L','C',L,X,diag,alpha);
79  Precision error = frobenius(B-X);
80  myra::out() << " |conjugate(L)*X (gemm) - conjugate(L)*X (trmm)| = " << error << std::endl;
81  REQUIRE(error < tolerance);
82  }
83  // Case 5: multiply X*L = B
84  {
85  auto X = Matrix<Number>::random(J,I);
86  Matrix<Number> B = alpha*X*A;
87  trmm_inplace('R','N',L,X,diag,alpha);
88  Precision error = frobenius(B-X);
89  myra::out() << " |X*L (gemm) - X*L (trmm)| = " << error << std::endl;
90  REQUIRE(error < tolerance);
91  }
92  // Case 6: multiply X*transpose(L) = B
93  {
94  auto X = Matrix<Number>::random(J,I);
95  Matrix<Number> B = alpha*X*transpose(A);
96  trmm_inplace('R','T',L,X,diag,alpha);
97  Precision error = frobenius(B-X);
98  myra::out() << " |X*transpose(L) (gemm) - X*tranpose(L) (trmm)| = " << error << std::endl;
99  REQUIRE(error < tolerance);
100  }
101  // Case 7: multiply X*hermitian(L) = B
102  {
103  auto X = Matrix<Number>::random(J,I);
104  Matrix<Number> B = alpha*X*hermitian(A);
105  trmm_inplace('R','H',L,X,diag,alpha);
106  Precision error = frobenius(B-X);
107  myra::out() << " |X*hermitian(L) (gemm) - X*hermitian(L) (trmm)| = " << error << std::endl;
108  REQUIRE(error < tolerance);
109  }
110  // Case 8: multiply X*conjugate(L) = B
111  {
112  auto X = Matrix<Number>::random(J,I);
113  Matrix<Number> B = alpha*X*conjugate(A);
114  trmm_inplace('R','C',L,X,diag,alpha);
115  Precision error = frobenius(B-X);
116  myra::out() << " |X*conjugate(L) (gemm) - X*conjugate(L) (trmm)| = " << error << std::endl;
117  REQUIRE(error < tolerance);
118  }
119  }
120 
121 } // namespace
122 
123 ADD_TEST("strmmLower","[dense][lapack]")
124  { test<NumberS>(1.0e-4f); }
125 
126 ADD_TEST("dtrmmLower","[dense][lapack]")
127  { test<NumberD>(1.0e-10); }
128 
129 ADD_TEST("ctrmmLower","[dense][lapack]")
130  { test<NumberC>(1.0e-4f); }
131 
132 ADD_TEST("ztrmmLower","[dense][lapack]")
133  { test<NumberZ>(1.0e-10); }
Returns a conjugated copy of a Matrix or Vector. Or, conjugate one inplace.
Interface class for representing subranges of dense Matrix&#39;s.
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
Range construct for a lower triangular matrix stored in rectangular packed format.
Definition: syntax.dox:1
Routines for multiplying by a triangular Matrix or LowerMatrix.
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.
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
Variety of routines all for dense Matrix*Matrix multiplies. Delegates to the BLAS.


Results: [PASS]

double
|L*X (gemm) - L*X (trmm)| = 9.16888e-15
|transpose(L)*X (gemm) - transpose(L)*X (trmm)| = 9.84126e-15
|hermitian(L)*X (gemm) - hermitian(L)*X (trmm)| = 9.94787e-15
|conjugate(L)*X (gemm) - conjugate(L)*X (trmm)| = 9.67413e-15
|X*L (gemm) - X*L (trmm)| = 7.94848e-15
|X*transpose(L) (gemm) - X*tranpose(L) (trmm)| = 8.23117e-15
|X*hermitian(L) (gemm) - X*hermitian(L) (trmm)| = 7.67924e-15
|X*conjugate(L) (gemm) - X*conjugate(L) (trmm)| = 9.38727e-15


Go back to Summary of /test programs.