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

          Line data    Source code
       1             : /*
       2             :  * File:   TestIndSOC.cpp
       3             :  * Author: Lorenzo Stella
       4             :  *
       5             :  * Created on Sept 21, 2015
       6             :  */
       7             : 
       8             : #include <math.h>
       9             : #include <cmath>
      10             : #include "TestIndSOC.h"
      11             : #include "Matrix.h"
      12             : #include "MatrixFactory.h"
      13             : 
      14           1 : CPPUNIT_TEST_SUITE_REGISTRATION(TestIndSOC);
      15             : 
      16           2 : TestIndSOC::TestIndSOC() {
      17           2 : }
      18             : 
      19           4 : TestIndSOC::~TestIndSOC() {
      20           4 : }
      21             : 
      22           2 : void TestIndSOC::setUp() {
      23           2 : }
      24             : 
      25           2 : void TestIndSOC::tearDown() {
      26           2 : }
      27             : 
      28           1 : void TestIndSOC::testCall() {
      29           1 :     Function * F = new IndSOC(5);
      30             : 
      31           1 :     Matrix x(5, 1);
      32           1 :     x[0] = 1.0;
      33           1 :     x[1] = 2.0;
      34           1 :     x[2] = 3.0;
      35           1 :     x[3] = 4.0;
      36           1 :     x[4] = 5.0;
      37             : 
      38           1 :     double fval = -1;
      39           1 :     _ASSERT(F->category().defines_f());
      40           1 :     _ASSERT_EQ(ForBESUtils::STATUS_OK, F->call(x, fval));
      41           1 :     _ASSERT(isinf(fval));
      42             : 
      43           1 :     x[4] = 6.0;
      44           1 :     fval = -1;
      45           1 :     _ASSERT_EQ(ForBESUtils::STATUS_OK, F->call(x, fval));
      46           1 :     _ASSERT_EQ(0.0, fval);
      47             : 
      48           1 :     x[4] = -6.0;
      49           1 :     fval = -1;
      50           1 :     _ASSERT_EQ(ForBESUtils::STATUS_OK, F->call(x, fval));
      51           1 :     _ASSERT(isinf(fval));
      52             : 
      53           1 :     _ASSERT_OK(delete F);
      54           1 : }
      55             : 
      56           1 : void TestIndSOC::testCallProx() {
      57           1 :     Function * F = new IndSOC(5);
      58             :     int status;
      59             :     int eqflag;
      60             :     double fval;
      61             :     
      62             : 
      63           1 :     Matrix x(5, 1);
      64           1 :     x[0] = 1.0;
      65           1 :     x[1] = 2.0;
      66           1 :     x[2] = 3.0;
      67           1 :     x[3] = 4.0;
      68           1 :     x[4] = 5.0;
      69             :     
      70           2 :     Matrix ref(5, 1);
      71           1 :     ref[0] = 9.564354645876385e-01;
      72           1 :     ref[1] = 1.912870929175277e+00;
      73           1 :     ref[2] = 2.869306393762916e+00;
      74           1 :     ref[3] = 3.825741858350554e+00;
      75           1 :     ref[4] = 5.238612787525831e+00;
      76             :     
      77           2 :     Matrix y(5, 1);
      78           1 :     fval = -1;
      79           1 :     _ASSERT(F->category().defines_prox());
      80           1 :     status = F->callProx(x, 1.0, y, fval);
      81           1 :     eqflag = 1;
      82           1 :     _ASSERT_EQ(ForBESUtils::STATUS_OK, status);
      83           1 :     _ASSERT_EQ(0.0, fval);
      84           6 :     for (int i=0; i<5; i++) {
      85           5 :         if (abs(y[i]-ref[i]) >= 1e-14) {
      86           0 :                 eqflag = 0;
      87           0 :                 break;
      88             :         }
      89             :         }
      90           1 :         _ASSERT_EQ(1, eqflag);
      91             : 
      92           1 :     x[4] = 6.0;
      93           1 :     fval = -1;
      94           1 :     status = F->callProx(x, 1.0, y, fval);
      95           1 :     eqflag = 1;
      96           1 :     _ASSERT_EQ(ForBESUtils::STATUS_OK, status);
      97           1 :     _ASSERT_EQ(0.0, fval);
      98           6 :     for (int i=0; i<5; i++) {
      99           5 :         if (x[i] != y[i]) {
     100           0 :                 eqflag = 0;
     101           0 :                 break;
     102             :         }
     103             :         }
     104           1 :         _ASSERT_EQ(1, eqflag);
     105             : 
     106           1 :     x[4] = -6.0;
     107           1 :     fval = -1;
     108           1 :     status = F->callProx(x, 1.0, y, fval);
     109           1 :     eqflag = 1;
     110           1 :     _ASSERT_EQ(ForBESUtils::STATUS_OK, status);
     111           1 :     _ASSERT_EQ(0.0, fval);
     112           6 :         for (int i=0; i<5; i++) {
     113           5 :         if (y[i] != 0.0) {
     114           0 :                 eqflag = 0;
     115           0 :                 break;
     116             :         }
     117             :         }
     118           1 :         _ASSERT_EQ(1, eqflag);
     119             :         
     120           2 :     _ASSERT_OK(delete F);
     121           4 : }
     122             : 
     123             : 

Generated by: LCOV version 1.10