Skip to content

Commit 5c5fcc4

Browse files
committed
debug eigen tests
match parentheses Set active variables still debugging using no typename catch all typename
1 parent 441024f commit 5c5fcc4

File tree

2 files changed

+93
-53
lines changed

2 files changed

+93
-53
lines changed

include/boost/math/differentiation/autodiff_eigen.hpp

+44-32
Original file line numberDiff line numberDiff line change
@@ -20,40 +20,52 @@ struct NumTraits<boost::math::differentiation::autodiff_v1::detail::
2020
};
2121
};
2222

23-
template <typename RealType, size_t Order, typename BinaryOp, typename A>
24-
struct ScalarBinaryOpTraits<boost::math::differentiation::autodiff_v1::detail::
25-
template fvar<RealType, Order>,
26-
A, BinaryOp> {
27-
typedef boost::math::differentiation::autodiff_v1::detail::template fvar<
28-
RealType, Order>
29-
ReturnType;
30-
};
23+
// #define BOOST_AUTODIFF_EIGEN_SCALAR_TRAITS(A) \
24+
// template <class Scalar, size_t Order, typename BinaryOp> \
25+
// struct ScalarBinaryOpTraits<boost::math::differentiation::autodiff_v1:: \
26+
// detail::template fvar<Scalar, Order>, \
27+
// A, BinaryOp> { \
28+
// typedef boost::math::differentiation::autodiff_v1::detail::template fvar< \
29+
// Scalar, Order> \
30+
// ReturnType; \
31+
// }; \
32+
// template <class Scalar, size_t Order, typename BinaryOp> \
33+
// struct ScalarBinaryOpTraits<A, \
34+
// boost::math::differentiation::autodiff_v1:: \
35+
// detail::template fvar<Scalar, Order>, \
36+
// BinaryOp> { \
37+
// typedef boost::math::differentiation::autodiff_v1::detail::template fvar< \
38+
// Scalar, Order> \
39+
// ReturnType; \
40+
// };
3141

32-
template <typename RealType, size_t Order, typename BinaryOp, typename A>
33-
struct ScalarBinaryOpTraits<A,
34-
boost::math::differentiation::autodiff_v1::detail::
35-
template fvar<RealType, Order>,
36-
BinaryOp> {
37-
typedef boost::math::differentiation::autodiff_v1::detail::template fvar<
38-
RealType, Order>
39-
ReturnType;
40-
};
42+
// BOOST_AUTODIFF_EIGEN_SCALAR_TRAITS(float);
43+
// BOOST_AUTODIFF_EIGEN_SCALAR_TRAITS(double);
44+
// BOOST_AUTODIFF_EIGEN_SCALAR_TRAITS(long double);
45+
// BOOST_AUTODIFF_EIGEN_SCALAR_TRAITS(short);
46+
// BOOST_AUTODIFF_EIGEN_SCALAR_TRAITS(unsigned short);
47+
// BOOST_AUTODIFF_EIGEN_SCALAR_TRAITS(int);
48+
// BOOST_AUTODIFF_EIGEN_SCALAR_TRAITS(unsigned int);
49+
// BOOST_AUTODIFF_EIGEN_SCALAR_TRAITS(long);
50+
// BOOST_AUTODIFF_EIGEN_SCALAR_TRAITS(unsigned long);
4151

42-
template <typename RealType, size_t Order, typename RealType2, size_t Order2,
43-
typename BinaryOp>
44-
struct ScalarBinaryOpTraits<
45-
boost::math::differentiation::autodiff_v1::detail::template fvar<RealType,
46-
Order>,
47-
boost::math::differentiation::autodiff_v1::detail::template fvar<RealType2,
48-
Order2>,
49-
BinaryOp> {
50-
typedef ScalarBinaryOpTraits<RealType, RealType2, BinaryOp>::ReturnType
51-
RealReturn;
52-
const size_t ReturnOrder = (Order > Order2) ? Order : Order2;
53-
typedef boost::math::differentiation::autodiff_v1::detail::template fvar<
54-
RealReturn, ReturnOrder>
55-
ReturnType;
56-
}
52+
// template <typename RealType, size_t Order, typename RealType2, size_t Order2,
53+
// typename BinaryOp>
54+
// struct ScalarBinaryOpTraits<
55+
// boost::math::differentiation::autodiff_v1::detail::template
56+
// fvar<RealType,
57+
// Order>,
58+
// boost::math::differentiation::autodiff_v1::detail::template
59+
// fvar<RealType2,
60+
// Order2>,
61+
// BinaryOp> {
62+
// typedef ScalarBinaryOpTraits<RealType, RealType2, BinaryOp>::ReturnType
63+
// RealReturn;
64+
// const size_t ReturnOrder = (Order > Order2) ? Order : Order2;
65+
// typedef boost::math::differentiation::autodiff_v1::detail::template fvar<
66+
// RealReturn, ReturnOrder>
67+
// ReturnType;
68+
// };
5769
} // namespace Eigen
5870

5971
#endif // BOOST_MATH_DIFFERENTIATION_AUTODIFF_EIGEN_HPP

test/test_autodiff_9.cpp

+49-21
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55

66
BOOST_AUTO_TEST_SUITE(test_autodiff_9)
77

8+
using boost::math::differentiation::autodiff_v1::detail::fvar;
9+
810
BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_init, T, all_float_types) {
911
constexpr int size = 5;
1012

1113
constexpr std::size_t n = 5;
12-
typedef typename fvar<T, n> fTn;
14+
typedef fvar<T, n> fTn;
1315
Eigen::Matrix<fTn, size, 1> x;
1416
x[0] = fTn(1.5);
1517
x[1] = make_fvar<T, n - 1>(2.5);
@@ -18,7 +20,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_init, T, all_float_types) {
1820
x[4] = 5.5;
1921

2022
constexpr std::size_t m = 2;
21-
typedef typename fvar<T, n> fTm;
23+
typedef fvar<T, n> fTm;
2224
Eigen::Matrix<fTm, size, 1> y;
2325
y = x.template cast<fTn>();
2426
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) {
2830
BOOST_CHECK_EQUAL(x[4].derivative(0), y[4].derivative(0));
2931

3032
constexpr std::size_t p = 3;
31-
typedef typename fvar<T, p> fTp;
33+
typedef fvar<T, p> fTp;
3234
Eigen::Matrix<fTp, 1, size> z =
3335
Eigen::Matrix<fTn, size, 1>::Random().transpose().template cast<fTp>();
3436
}
@@ -44,12 +46,12 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_general, T, all_float_types) {
4446
constexpr std::size_t n = 2;
4547
constexpr double p = 3.456;
4648

47-
typedef typename fvar<T, n> fTn;
49+
typedef fvar<T, n> fTn;
4850
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);
5355

5456
Eigen::Matrix<fTn, dim, 1> y1, y2, y3, y4, y5;
5557
y1 = sin(x);
@@ -119,20 +121,20 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_general, T, all_float_types) {
119121
(p - 1) * p * pow(x[3].derivative(0), p - 2));
120122

121123
// 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));
128130
}
129131

130132
BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_scalar, T, all_float_types) {
131133
constexpr int dim = 4;
132134
constexpr size_t n = 4;
133135

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);
136138
Eigen::Matrix<fTn, dim, 1> X;
137139
Eigen::Matrix<fTn, dim, 1> Z;
138140
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) {
170172
constexpr int dim = 3;
171173
constexpr size_t n = 4;
172174

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);
175177
T xD0 = x.derivative(0);
176178
Eigen::Matrix<fTn, dim, 1> X;
177179
X[0] = 1;
@@ -224,6 +226,32 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(eigen_vector, T, all_float_types) {
224226
xD0 * sin(xD0) - 4 * cos(xD0));
225227
}
226228

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

Comments
 (0)