5
5
6
6
BOOST_AUTO_TEST_SUITE (test_autodiff_9)
7
7
8
+ using boost::math::differentiation::autodiff_v1::detail::fvar;
9
+
8
10
BOOST_AUTO_TEST_CASE_TEMPLATE (eigen_init, T, all_float_types) {
9
11
constexpr int size = 5 ;
10
12
11
13
constexpr std::size_t n = 5 ;
12
- typedef typename fvar<T, n> fTn ;
14
+ typedef fvar<T, n> fTn ;
13
15
Eigen::Matrix<fTn , size, 1 > x;
14
16
x[0 ] = fTn (1.5 );
15
17
x[1 ] = make_fvar<T, n - 1 >(2.5 );
@@ -18,7 +20,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_init, T, all_float_types) {
18
20
x[4 ] = 5.5 ;
19
21
20
22
constexpr std::size_t m = 2 ;
21
- typedef typename fvar<T, n> fTm ;
23
+ typedef fvar<T, n> fTm ;
22
24
Eigen::Matrix<fTm , size, 1 > y;
23
25
y = x.template cast <fTn >();
24
26
BOOST_CHECK_EQUAL (x[0 ].derivative (0 ), y[0 ].derivative (0 ));
@@ -28,7 +30,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_init, T, all_float_types) {
28
30
BOOST_CHECK_EQUAL (x[4 ].derivative (0 ), y[4 ].derivative (0 ));
29
31
30
32
constexpr std::size_t p = 3 ;
31
- typedef typename fvar<T, p> fTp ;
33
+ typedef fvar<T, p> fTp ;
32
34
Eigen::Matrix<fTp , 1 , size> z =
33
35
Eigen::Matrix<fTn , size, 1 >::Random ().transpose ().template cast <fTp >();
34
36
}
@@ -44,12 +46,12 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_general, T, all_float_types) {
44
46
constexpr std::size_t n = 2 ;
45
47
constexpr double p = 3.456 ;
46
48
47
- typedef typename fvar<T, n> fTn ;
49
+ typedef fvar<T, n> fTn ;
48
50
Eigen::Matrix<fTn , dim, 1 > x;
49
- x[0 ] = - 1 ;
50
- x[1 ] = 0 ;
51
- x[2 ] = 1 ;
52
- x[3 ] = 5 ;
51
+ x[0 ] = make_fvar<T, n>(- 1 ) ;
52
+ x[1 ] = make_fvar<T, n>( 0 ) ;
53
+ x[2 ] = make_fvar<T, n>( 1 ) ;
54
+ x[3 ] = make_fvar<T, n>( 5 ) ;
53
55
54
56
Eigen::Matrix<fTn , dim, 1 > y1 , y2, y3, y4, y5;
55
57
y1 = sin (x);
@@ -119,20 +121,20 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_general, T, all_float_types) {
119
121
(p - 1 ) * p * pow (x[3 ].derivative (0 ), p - 2 ));
120
122
121
123
// Check log
122
- BOOST_CHECK_EQUAL (y5[2 ].derivative (0 ), log (x[0 ].derivative (0 ));
123
- BOOST_CHECK_EQUAL (y5[3 ].derivative (0 ), log (x[3 ].derivative (0 ));
124
- BOOST_CHECK_EQUAL (y5[2 ].derivative (1 ), 1 / x[2 ].derivative (0 ));
125
- BOOST_CHECK_EQUAL (y5[3 ].derivative (1 ), 1 / x[3 ].derivative (0 ));
126
- BOOST_CHECK_EQUAL (y5[2 ].derivative (2 ), -1 / pow (x[2 ].derivative (0 ), 2 ));
127
- BOOST_CHECK_EQUAL (y5[3 ].derivative (2 ), -1 / pow (x[3 ].derivative (0 ), 2 ));
124
+ BOOST_CHECK_EQUAL (y5[2 ].derivative (0 ), log (x[0 ].derivative (0 ))) ;
125
+ BOOST_CHECK_EQUAL (y5[3 ].derivative (0 ), log (x[3 ].derivative (0 ))) ;
126
+ BOOST_CHECK_EQUAL (y5[2 ].derivative (1 ), 1 / x[2 ].derivative (0 ));
127
+ BOOST_CHECK_EQUAL (y5[3 ].derivative (1 ), 1 / x[3 ].derivative (0 ));
128
+ BOOST_CHECK_EQUAL (y5[2 ].derivative (2 ), -1 / pow (x[2 ].derivative (0 ), 2 ));
129
+ BOOST_CHECK_EQUAL (y5[3 ].derivative (2 ), -1 / pow (x[3 ].derivative (0 ), 2 ));
128
130
}
129
131
130
132
BOOST_AUTO_TEST_CASE_TEMPLATE (eigen_scalar, T, all_float_types) {
131
133
constexpr int dim = 4 ;
132
134
constexpr size_t n = 4 ;
133
135
134
- typedef typename fvar<T, n> fTn ;
135
- fTn x = 4 ;
136
+ typedef fvar<T, n> fTn ;
137
+ fTn x = make_fvar<T, n>( 4 ) ;
136
138
Eigen::Matrix<fTn , dim, 1 > X;
137
139
Eigen::Matrix<fTn , dim, 1 > Z;
138
140
Eigen::Matrix<fTn , dim, dim> I = Eigen::Matrix<fTn , dim, dim>::Identity ();
@@ -170,8 +172,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_vector, T, all_float_types) {
170
172
constexpr int dim = 3 ;
171
173
constexpr size_t n = 4 ;
172
174
173
- typedef typename fvar<T, n> fTn ;
174
- fTn x = 5 ;
175
+ typedef fvar<T, n> fTn ;
176
+ fTn x = make_fvar<T, n>( 5 ) ;
175
177
T xD0 = x.derivative (0 );
176
178
Eigen::Matrix<fTn , dim, 1 > X;
177
179
X[0 ] = 1 ;
@@ -224,6 +226,32 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_vector, T, all_float_types) {
224
226
xD0 * sin (xD0) - 4 * cos (xD0));
225
227
}
226
228
227
- // BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_determinant, T, all_float_types) {
228
- // constexpr int dim = 4;
229
- // }
229
+ BOOST_AUTO_TEST_CASE_TEMPLATE (eigen_determinant, T, all_float_types) {
230
+ using std::cos ;
231
+ using std::sin ;
232
+ constexpr int dim = 4 ;
233
+ constexpr size_t n = 1 ;
234
+
235
+ typedef fvar<T, n> fTn ;
236
+ fTn x = make_fvar<T, n>(3 );
237
+ T xD0 = x.derivative (0 );
238
+ Eigen::Matrix<fTn , dim, dim> M = 10 * Eigen::Matrix<fTn , dim, dim>::Random ();
239
+ M (0 , 3 ) = x;
240
+ M (1 , 0 ) = 3 * x;
241
+ M (1 , 2 ) = 1 / x;
242
+ M (2 , 2 ) = x * x;
243
+ M (3 , 1 ) = sin (x);
244
+ fTn y = M.determinant ();
245
+
246
+ Eigen::Matrix<T, dim, dim> dMdx = Eigen::Matrix<T, dim, dim>::Zero ();
247
+ dMdx (0 , 3 ) = 1 ;
248
+ dMdx (1 , 0 ) = 3 ;
249
+ dMdx (1 , 2 ) = -1 / (xD0 * xD0);
250
+ dMdx (2 , 2 ) = 2 * xD0;
251
+ dMdx (3 , 1 ) = cos (xD0);
252
+
253
+ T ans = y.derivative (0 ) * (M.inverse () * dMdx).trace ();
254
+ BOOST_CHECK_EQUAL (y.derivative (1 ), ans);
255
+ }
256
+
257
+ BOOST_AUTO_TEST_SUITE_END ()
0 commit comments