Line data Source code
1 : /*
2 : * File: TestOpAdjoint.cpp
3 : * Author: Pantelis Sopasakis
4 : *
5 : * Created on Sep 15, 2015, 3:01:47 PM
6 : */
7 :
8 : #include "TestOpAdjoint.h"
9 : #include "OpAdjoint.h"
10 :
11 :
12 1 : CPPUNIT_TEST_SUITE_REGISTRATION(TestOpAdjoint);
13 :
14 3 : TestOpAdjoint::TestOpAdjoint() {
15 3 : }
16 :
17 6 : TestOpAdjoint::~TestOpAdjoint() {
18 6 : }
19 :
20 3 : void TestOpAdjoint::setUp() {
21 3 : }
22 :
23 3 : void TestOpAdjoint::tearDown() {
24 3 : }
25 :
26 1 : void TestOpAdjoint::testCall() {
27 1 : const size_t n = 16;
28 1 : const double tol = 1e-10;
29 1 : Matrix A = MatrixFactory::MakeRandomMatrix(n, n, 0.0, 1.0, Matrix::MATRIX_DENSE);
30 2 : Matrix x = MatrixFactory::MakeRandomMatrix(n, 1, 0.0, 1.0, Matrix::MATRIX_DENSE);
31 :
32 1 : LinearOperator *T = new MatrixOperator(A);
33 1 : LinearOperator *Tstar = new OpAdjoint(*T);
34 :
35 2 : Matrix Tx_adj = T->callAdjoint(x); /* T*(x) */
36 2 : Matrix Tstarx = Tstar -> call(x); /* T*(x) */
37 :
38 17 : for (size_t i = 0; i < n; i++) {
39 16 : _ASSERT_NUM_EQ(Tx_adj.get(i, 0), Tstarx.get(i, 0), tol);
40 : }
41 :
42 :
43 2 : Matrix T_star_star_x = Tstar->callAdjoint(x); /* T**(x) */
44 2 : Matrix T_x = T->call(x); /* T(x) */
45 :
46 1 : _ASSERT_EQ(T_x, T_star_star_x);
47 1 : _ASSERT_EQ(T->isSelfAdjoint(), Tstar->isSelfAdjoint());
48 :
49 1 : delete T;
50 2 : delete Tstar;
51 1 : }
52 :
53 1 : void TestOpAdjoint::testCallAdjoint() {
54 1 : const size_t n = 16;
55 1 : const size_t m = 11;
56 1 : const double tol = 1e-8;
57 1 : Matrix A = MatrixFactory::MakeRandomMatrix(m, n, 0.0, 1.0, Matrix::MATRIX_DENSE);
58 2 : Matrix x = MatrixFactory::MakeRandomMatrix(m, 1, 0.0, 1.0, Matrix::MATRIX_DENSE);
59 :
60 1 : LinearOperator *T = new MatrixOperator(A);
61 1 : LinearOperator *Tstar = new OpAdjoint(*T);
62 :
63 2 : Matrix Tx = T->callAdjoint(x);
64 2 : Matrix T_doubleAdj_x = Tstar->call(x);
65 :
66 1 : _ASSERT_EQ(n, T->dimensionIn().first);
67 1 : _ASSERT_EQ(m, T->dimensionOut().first);
68 1 : _ASSERT_EQ(m, Tstar->dimensionIn().first);
69 1 : _ASSERT_EQ(n, Tstar->dimensionOut().first);
70 :
71 17 : for (size_t i = 0; i < n; i++) {
72 16 : _ASSERT_NUM_EQ(Tx.get(i, 0), T_doubleAdj_x.get(i, 0), tol);
73 : }
74 :
75 1 : delete T;
76 2 : delete Tstar;
77 1 : }
78 :
79 1 : void TestOpAdjoint::testSelfAdjoint() {
80 1 : const size_t n = 5;
81 1 : Matrix A = MatrixFactory::MakeRandomMatrix(n, n, 0.0, 1.0, Matrix::MATRIX_SYMMETRIC);
82 :
83 1 : LinearOperator *T = new MatrixOperator(A);
84 1 : LinearOperator *Tstar = new OpAdjoint(*T);
85 :
86 1 : _ASSERT(T->isSelfAdjoint());
87 1 : _ASSERT(Tstar->isSelfAdjoint());
88 :
89 1 : delete T;
90 1 : delete Tstar;
91 4 : }
|