MyraMath
dimmR


Source: tests/dense/dimm.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.
12 #include <myramath/dense/Matrix.h>
16 
17 // Algorithms.
18 #include <myramath/dense/dimm.h>
19 #include <myramath/dense/gemm.h>
21 
22 // Reporting.
23 #include <tests/myratest.h>
24 
25 using namespace myra;
26 
27 namespace {
28 
29 // Make random D and X, try all dimm('L',op) variations.
30 template<class Number> void test1(int I, int J, typename ReflectPrecision<Number>::type tolerance)
31  {
32  typedef typename ReflectPrecision<Number>::type Precision;
34  auto X = Matrix<Number>::random(I,J);
35  Precision errorN = frobenius(dimm('L','N',D,X)-gemm(D.make_Matrix(),'N',X,'N'));
36  Precision errorT = frobenius(dimm('L','T',D,X)-gemm(D.make_Matrix(),'T',X,'N'));
37  Precision errorH = frobenius(dimm('L','H',D,X)-gemm(D.make_Matrix(),'H',X,'N'));
38  Precision errorC = frobenius(dimm('L','C',D,X)-gemm(D.make_Matrix(),'C',X,'N'));
39  myra::out() << "error |D^N * X| = " << errorN << std::endl;
40  myra::out() << "error |D^T * X| = " << errorT << std::endl;
41  myra::out() << "error |D^H * X| = " << errorH << std::endl;
42  myra::out() << "error |D^C * X| = " << errorC << std::endl;
43  REQUIRE(errorN < tolerance);
44  REQUIRE(errorT < tolerance);
45  REQUIRE(errorH < tolerance);
46  REQUIRE(errorC < tolerance);
47  }
48 
49 // Make random D and X, try all dimm('R',op) variations.
50 template<class Number> void test2(int I, int J, typename ReflectPrecision<Number>::type tolerance)
51  {
52  typedef typename ReflectPrecision<Number>::type Precision;
54  auto X = Matrix<Number>::random(I,J);
55  Precision errorN = frobenius(dimm('R','N',D,X)-gemm(X,'N',D.make_Matrix(),'N'));
56  Precision errorT = frobenius(dimm('R','T',D,X)-gemm(X,'N',D.make_Matrix(),'T'));
57  Precision errorH = frobenius(dimm('R','H',D,X)-gemm(X,'N',D.make_Matrix(),'H'));
58  Precision errorC = frobenius(dimm('R','C',D,X)-gemm(X,'N',D.make_Matrix(),'C'));
59  myra::out() << "error |X * D^N| = " << errorN << std::endl;
60  myra::out() << "error |X * D^T| = " << errorT << std::endl;
61  myra::out() << "error |X * D^H| = " << errorH << std::endl;
62  myra::out() << "error |X * D^C| = " << errorC << std::endl;
63  REQUIRE(errorN < tolerance);
64  REQUIRE(errorT < tolerance);
65  REQUIRE(errorH < tolerance);
66  REQUIRE(errorC < tolerance);
67  }
68 
69 } // namespace
70 
71 ADD_TEST("dimmL","[dense]")
72  {
73  test1<NumberS>(10,5,1.0e-4f);
74  test1<NumberD>(10,5,1.0e-10);
75  test1<NumberC>(10,5,1.0e-4f);
76  test1<NumberZ>(10,5,1.0e-10);
77  }
78 
79 ADD_TEST("dimmR","[dense]")
80  {
81  test2<NumberS>(10,5,1.0e-4f);
82  test2<NumberD>(10,5,1.0e-10);
83  test2<NumberC>(10,5,1.0e-4f);
84  test2<NumberZ>(10,5,1.0e-10);
85  };
Interface class for representing subranges of DiagonalMatrix&#39;s.
Interface class for representing subranges of dense Matrix&#39;s.
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
Routines for multiplying by a DiagonalMatrix.
Definition: syntax.dox:1
static DiagonalMatrix< Number > random(int N)
Generates a random DiagonalMatrix of specified size.
Definition: DiagonalMatrix.cpp:217
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
Container for a diagonal matrix, O(n) storage. Used by SVD, row/column scaling, etc.
Variety of routines all for dense Matrix*Matrix multiplies. Delegates to the BLAS.


Results: [PASS]

error |X * D^N| = 0
error |X * D^T| = 0
error |X * D^H| = 0
error |X * D^C| = 0
error |X * D^N| = 0
error |X * D^T| = 0
error |X * D^H| = 0
error |X * D^C| = 0
error |X * D^N| = 0
error |X * D^T| = 0
error |X * D^H| = 0
error |X * D^C| = 0
error |X * D^N| = 0
error |X * D^T| = 0
error |X * D^H| = 0
error |X * D^C| = 0


Go back to Summary of /test programs.