LCOV - code coverage report
Current view: top level - source/tests - TestOpGradient.cpp (source / functions) Hit Total Coverage
Test: LibForBES Unit Tests Lines: 58 58 100.0 %
Date: 2016-04-18 Functions: 11 11 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * File:   TestOpGradient.cpp
       3             :  * Author: chung
       4             :  *
       5             :  * Created on Sep 16, 2015, 1:57:49 AM
       6             :  */
       7             : 
       8             : #include "TestOpGradient.h"
       9             : #include "OpAdjoint.h"
      10             : #include <cmath>
      11             : 
      12             : void testOperatorLinearity(LinearOperator* op);
      13             : 
      14           1 : CPPUNIT_TEST_SUITE_REGISTRATION(TestOpGradient);
      15             : 
      16           3 : TestOpGradient::TestOpGradient() {
      17           3 : }
      18             : 
      19           6 : TestOpGradient::~TestOpGradient() {
      20           6 : }
      21             : 
      22           3 : void TestOpGradient::setUp() {
      23           3 : }
      24             : 
      25           3 : void TestOpGradient::tearDown() {
      26           3 : }
      27             : 
      28           1 : void TestOpGradient::testCall() {
      29           1 :     const size_t n = 40;
      30           1 :     const double tol = 1e-8;
      31             : 
      32           1 :     LinearOperator * op = new OpGradient(n);
      33             : 
      34           1 :     _ASSERT_EQ(n, op->dimensionIn().first);
      35           1 :     _ASSERT_EQ(n - 1, op->dimensionOut().first);
      36           1 :     _ASSERT_NOT(op->isSelfAdjoint());
      37             : 
      38           1 :     Matrix x(n, 1);
      39           2 :     Matrix y(n - 1, 1);
      40             : 
      41          41 :     for (size_t i = 0; i < n; i++) {
      42          40 :         x.set(i, 0, i + 1);
      43             :     }
      44             : 
      45          40 :     for (size_t i = 0; i < n - 1; i++) {
      46          39 :         y.set(i, 0, 3 * i + 1);
      47             :     }
      48             : 
      49           2 :     Matrix Tx = op->call(x);
      50           2 :     Matrix Tstar_y = op->callAdjoint(y);
      51             : 
      52           2 :     Matrix err = y * Tx;
      53           2 :     Matrix temp = x*Tstar_y;
      54           1 :     Matrix::add(err, -1.0, temp, 1.0);
      55             : 
      56           1 :     _ASSERT(std::abs(err.get(0, 0)) < tol);
      57             : 
      58           2 :     delete op;
      59           1 : }
      60             : 
      61           2 : void testOperatorLinearity(LinearOperator* op) {
      62             : 
      63           2 :     double a = 10.0 * static_cast<double> (std::rand()) / static_cast<double> (RAND_MAX);
      64           2 :     double b = 10.0 * static_cast<double> (std::rand()) / static_cast<double> (RAND_MAX);
      65             : 
      66           2 :     Matrix x = MatrixFactory::MakeRandomMatrix(op->dimensionIn().first, op->dimensionIn().second, 0.0, 1.0);
      67           4 :     Matrix y = MatrixFactory::MakeRandomMatrix(op->dimensionIn().first, op->dimensionIn().second, 0.0, 1.0);
      68             : 
      69             :     // create z = ax + by
      70           4 :     Matrix z(x);
      71           2 :     Matrix::add(z, b, y, a);
      72             :     
      73           4 :     Matrix Tx = op->call(x);
      74           4 :     Matrix Ty = op->call(y);
      75             :     
      76             :     // create aTx + bTy
      77           4 :     Matrix T(Tx);
      78           2 :     Matrix::add(T, b, Ty, a);
      79             :     
      80           4 :     Matrix T2 = op->call(z);
      81             :     
      82           4 :     _ASSERT_EQ(T,T2);    
      83             :    
      84           2 : }
      85             : 
      86           1 : void TestOpGradient::testLinearity() {
      87           1 :     const size_t n = 50;
      88           1 :     LinearOperator * op = new OpGradient(n);
      89           1 :     testOperatorLinearity(op);
      90           1 :     delete op;
      91           1 : }
      92             : 
      93           1 : void TestOpGradient::testAdjointLinearity() {
      94           1 :     const size_t n = 50;
      95           1 :     LinearOperator * op = new OpGradient(n);
      96           1 :     LinearOperator *adj = new OpAdjoint(*op);
      97           1 :     testOperatorLinearity(adj);
      98           1 :     delete op;
      99           1 :     delete adj;
     100           4 : }

Generated by: LCOV version 1.10