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 :
|