MyraMath
diagcat_SparseMatrix_cpp11


Source: tests/sparse/diagcat.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.
17 
18 // Algorithms.
21 
22 // Reporting.
23 #include <tests/myratest.h>
24 
25 using namespace myra;
26 
27 namespace {
28 
29 // SparseMatrix/SparseMatrixRange
30 
31 // Test vertcat(A,B)
32 template<class Number> void test1(typename ReflectPrecision<Number>::type tolerance)
33  {
34  typedef typename ReflectPrecision<Number>::type Precision;
35  auto A = SparseMatrix<Number>::random(20,20,50);
36  auto B = SparseMatrix<Number>::random(10,10,15);
37  auto C = diagcat(A,B);
38  Precision error_A = frobenius( C.window(0,20,0,20) - A);
39  Precision error_B = frobenius( C.window(20,30,20,30) - B);
40  myra::out() << " |C.window - A| = " << error_A << std::endl;
41  myra::out() << " |C.window - B| = " << error_B << std::endl;
42  REQUIRE(error_A < tolerance);
43  REQUIRE(error_B < tolerance);
44  }
45 
46 #ifdef MYRAMATH_ENABLE_CPP11
47 
48 // Test vertcat({A,B,C})
49 template<class Number> void test2(typename ReflectPrecision<Number>::type tolerance)
50  {
51  typedef typename ReflectPrecision<Number>::type Precision;
52  auto A = SparseMatrix<Number>::random(20,30,50);
53  auto B = SparseMatrix<Number>::random(10,20,15);
54  auto C = SparseMatrix<Number>::random(15,25,20);
55  auto D = diagcat({A,B,C});
56  Precision error_A = frobenius( D.window(0,20,0,30) - A);
57  Precision error_B = frobenius( D.window(20,30,30,50) - B);
58  Precision error_C = frobenius( D.window(30,45,50,75) - C);
59  myra::out() << " |D.window - A| = " << error_A << std::endl;
60  myra::out() << " |D.window - B| = " << error_B << std::endl;
61  myra::out() << " |D.window - C| = " << error_C << std::endl;
62  REQUIRE(error_A < tolerance);
63  REQUIRE(error_B < tolerance);
64  REQUIRE(error_C < tolerance);
65  }
66 
67 #endif
68 
69 // Pattern/PatternRange
70 
71 // Test vertcat(A,B)
72 void test3()
73  {
74  auto A = Pattern::random(20,20,50);
75  auto B = Pattern::random(10,10,15);
76  auto C = diagcat(A,B);
77  bool equal_A = (C.window(0,20,0,20) == A);
78  bool equal_B = (C.window(20,30,20,30) == B);
79  myra::out() << " C.window == A : " << (equal_A?"true":"false") << std::endl;
80  myra::out() << " C.window == B : " << (equal_B?"true":"false") << std::endl;
81  REQUIRE(equal_A);
82  REQUIRE(equal_B);
83  }
84 
85 #ifdef MYRAMATH_ENABLE_CPP11
86 
87 // Test vertcat({A,B,C})
88 void test4()
89  {
90  auto A = Pattern::random(20,30,50);
91  auto B = Pattern::random(10,20,15);
92  auto C = Pattern::random(15,25,20);
93  auto D = diagcat({A,B,C});
94  bool equal_A = (D.window(0,20,0,30) == A);
95  bool equal_B = (D.window(20,30,30,50) == B);
96  bool equal_C = (D.window(30,45,50,75) == C);
97  myra::out() << " D.window == A : " << (equal_A?"true":"false") << std::endl;
98  myra::out() << " D.window == B : " << (equal_B?"true":"false") << std::endl;
99  myra::out() << " D.window == C : " << (equal_C?"true":"false") << std::endl;
100  REQUIRE(equal_A);
101  REQUIRE(equal_B);
102  REQUIRE(equal_C);
103  }
104 
105 #endif
106 
107 } // namespace
108 
109 ADD_TEST("diagcat_SparseMatrix","[sparse]")
110  {
111  test1<NumberS>(1.0e-5f);
112  test1<NumberD>(1.0e-10);
113  test1<NumberC>(1.0e-5f);
114  test1<NumberZ>(1.0e-10);
115  }
116 
117 #ifdef MYRAMATH_ENABLE_CPP11
118 
119 ADD_TEST("diagcat_SparseMatrix_cpp11","[sparse]")
120  {
121  test2<NumberS>(1.0e-5f);
122  test2<NumberD>(1.0e-10);
123  test2<NumberC>(1.0e-5f);
124  test2<NumberZ>(1.0e-10);
125  }
126 
127 #endif
128 
129 ADD_TEST("diagcat_Pattern","[sparse]")
130  { test3(); }
131 
132 #ifdef MYRAMATH_ENABLE_CPP11
133 
134 ADD_TEST("diagcat_Pattern_cpp11","[sparse]")
135  { test4(); }
136 
137 #endif
Container of values, allows random (i) access.
static SparseMatrix< Number > random(int I, int J, int N)
Generates a random SparseMatrix with size IxJ and (approximately) N nonzeros.
Definition: SparseMatrix.cpp:493
General purpose compressed-sparse-column (CSC) container.
Definition: syntax.dox:1
CMatrixRange< Number > window(int i0, int i1, int j0, int j1) const
Returns a MatrixRange over this(i0:i1,j0:j1)
Definition: Matrix.cpp:142
static Pattern random(int I, int J, int N)
Generates a random Pattern with size IxJ and (approximately) N nonzeros.
Definition: Pattern.cpp:300
Range/Iterator types associated with Pattern.
Reflects Precision trait for a Number, scalar Number types should specialize it.
Definition: Number.h:33
Container class for a sparse nonzero pattern, used in reordering/symbolic analysis.
Returns frobenius norm of a SparseMatrix.
Routines to concatenate SparseMatrix&#39;s in diagonal fashion.
Range/Iterator types associated with SparseMatrix.


Results: [PASS]

|D.window - A| = 0
|D.window - B| = 0
|D.window - C| = 0
|D.window - A| = 0
|D.window - B| = 0
|D.window - C| = 0
|D.window - A| = 0
|D.window - B| = 0
|D.window - C| = 0
|D.window - A| = 0
|D.window - B| = 0
|D.window - C| = 0


Go back to Summary of /test programs.