MyraMath
strmmL


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


Results: [PASS]

float
|L*X-B| = 9.81828e-07
|transpose(L)*X-B| = 8.12303e-07
|hermitian(L)*X-B| = 8.21886e-07
|conjugate(L)*X-B| = 8.90141e-07
|X*L-B| = 0
|X*tranpose(L)-B| = 9.61046e-07
|X*hermitian(L)-B| = 8.80624e-07
|X*conjugate(L)-B| = 0


Go back to Summary of /test programs.