13
13
#include "CubicMinimum.h"
14
14
15
15
#include "gtest/gtest.h"
16
- #include <cmath>
17
16
18
17
19
18
class CubicFunction {
20
19
public :
21
- static double value (double alpha )
22
- {
23
- return pow (alpha , 3.0 ) - pow (alpha , 2.0 );
24
- }
25
-
26
- static double tangent (double alpha )
27
- {
28
- return 3.0 * pow (alpha ,2.0 ) - 2.0 * alpha ;
29
- }
20
+ static double value (double x ) { return (x * x - x )* x ; }
21
+ static double tangent (double x ) { return (3.0 * x - 2.0 )* x ; }
30
22
};
31
23
32
24
33
25
class LinearFunction {
34
26
public :
35
- static double value (double alpha )
36
- {
37
- return alpha ;
38
- }
39
-
40
- static double tangent (double alpha )
41
- {
42
- return 1.0 ;
43
- }
27
+ static double value (double x ) { return x ; }
28
+ static double tangent (double ) { return 1.0 ; }
44
29
};
45
30
46
31
47
32
class QuadraticFunction {
48
33
public :
49
- static double value (double alpha )
50
- {
51
- return (alpha + 0.25 )* (alpha + 0.75 );
52
- }
53
-
54
- static double tangent (double alpha )
55
- {
56
- return 2 * alpha + 1 ;
57
- }
34
+ static double value (double x ) { return (x + 0.25 )* (x + 0.75 ); }
35
+ static double tangent (double x ) { return x + x + 1.0 ; }
58
36
};
59
37
60
38
61
39
TEST (TestCubicMinimum , CubicFunction )
62
40
{
63
41
double alpha ;
64
- std ::vector < double > params (10 );
65
- std ::vector < double > vals (10 );
66
- std ::vector < double > tgts (10 );
42
+ std ::vector < double > params (10 ), vals (10 ), tgts (10 );
43
+
67
44
for (size_t i = 0 ; i < 10 ; ++ i ) {
68
45
params [i ] = -1.0 + 2.0 /9.0 * i ;
69
46
vals [i ] = CubicFunction ::value (params [i ]);
70
47
tgts [i ] = CubicFunction ::tangent (params [i ]);
71
48
}
72
-
73
49
ASSERT_TRUE (CubicMinimum ::Find (alpha , params , vals , tgts ));
74
50
ASSERT_FLOAT_EQ (alpha , 2.0 /3.0 );
75
51
@@ -78,7 +54,6 @@ TEST(TestCubicMinimum, CubicFunction)
78
54
vals [i ] = CubicFunction ::value (params [i ]);
79
55
tgts [i ] = CubicFunction ::tangent (params [i ]);
80
56
}
81
-
82
57
ASSERT_TRUE (CubicMinimum ::Find (alpha , params , vals , tgts ));
83
58
ASSERT_FLOAT_EQ (alpha , 2.0 /3.0 );
84
59
}
@@ -87,9 +62,8 @@ TEST(TestCubicMinimum, CubicFunction)
87
62
TEST (TestCubicMinimum , QuadraticFunction )
88
63
{
89
64
double alpha ;
90
- std ::vector < double > params (10 );
91
- std ::vector < double > vals (10 );
92
- std ::vector < double > tgts (10 );
65
+ std ::vector < double > params (10 ), vals (10 ), tgts (10 );
66
+
93
67
for (size_t i = 0 ; i < 10 ; ++ i ) {
94
68
params [i ] = -1.0 + 2.0 /9.0 * i ;
95
69
vals [i ] = QuadraticFunction ::value (params [i ]);
@@ -103,17 +77,15 @@ TEST(TestCubicMinimum, QuadraticFunction)
103
77
vals [i ] = QuadraticFunction ::value (params [i ]);
104
78
tgts [i ] = QuadraticFunction ::tangent (params [i ]);
105
79
}
106
-
107
80
ASSERT_FALSE (CubicMinimum ::Find (alpha , params , vals , tgts ));
108
81
}
109
82
110
83
111
84
TEST (TestCubicMinimum , LinearFunction )
112
85
{
113
86
double alpha ;
114
- std ::vector < double > params (10 );
115
- std ::vector < double > vals (10 );
116
- std ::vector < double > tgts (10 );
87
+ std ::vector < double > params (10 ), vals (10 ), tgts (10 );
88
+
117
89
for (size_t i = 0 ; i < 10 ; ++ i ) {
118
90
params [i ] = -1.0 + 2.0 /9.0 * i ;
119
91
vals [i ] = LinearFunction ::value (params [i ]);
@@ -128,3 +100,21 @@ TEST(TestCubicMinimum, LinearFunction)
128
100
}
129
101
ASSERT_FALSE (CubicMinimum ::Find (alpha , params , vals , tgts ));
130
102
}
103
+
104
+
105
+ TEST (TestCubicMinimum , DiscreteValues )
106
+ {
107
+ double alpha ;
108
+ std ::vector < double > params (10 );
109
+ for (size_t i = 0 ; i < 10 ; ++ i )
110
+ params [i ] = -1.0 + 2.0 /9.0 * i ;
111
+
112
+ std ::vector < double > vals ({ 0.668273 , 0.668279 , 0.668284 , 0.66829 , 0.668296 ,
113
+ 0.668301 , 0.668307 , 0.668311 , 0.668306 , 0.6683 });
114
+
115
+ std ::vector < double > tgts ({ 1.15625e-06 , 1.00442e-06 , 8.52527e-07 , 7.00576e-07 , 5.48567e-07 ,
116
+ 3.96498e-07 , 2.44365e-07 , 8.6514e-08 , -1.15779e-07 , -3.17837e-07 });
117
+
118
+ ASSERT_TRUE (CubicMinimum ::Find (alpha , params , vals , tgts ));
119
+ ASSERT_NEAR (alpha , -1.0 , 1.0e-8 );
120
+ }
0 commit comments