5 #include "pinocchio/autodiff/cppad.hpp" 6 #include <cppad/speed/det_by_minor.hpp> 8 #include <boost/variant.hpp> 12 #include <boost/test/unit_test.hpp> 13 #include <boost/utility/binary.hpp> 15 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
20 using CppAD::NearEqual;
24 typedef Matrix< AD<double> , Dynamic, 1 > eigen_vector;
31 eigen_vector a_x(n), a_y(
m);
34 for(j = 0; j <
n; j++)
36 a_x[(Eigen::DenseIndex)j] =
double(1 + j);
38 CppAD::Independent(a_x);
41 a_y = a_x.array() + a_x.array().sin();
44 CppAD::ADFun<double> f(a_x, a_y);
47 CPPAD_TESTVECTOR(
double)
x(n);
48 for(j = 0; j <
n; j++)
50 x[j] = double(j) + 1.0 / double(j+1);
52 CPPAD_TESTVECTOR(
double) jac = f.Jacobian(
x);
55 double eps = 100. * CppAD::numeric_limits<double>::epsilon();
56 for(i = 0; i <
m; i++)
58 for(j = 0; j <
n; j++)
60 double check = 1.0 + cos(
x[i]);
61 if( i != j ) check = 0.0;
62 BOOST_CHECK(NearEqual(jac[i * n + j], check, eps, eps));
71 using CppAD::NearEqual;
75 typedef Matrix< double , Dynamic, Dynamic > eigen_matrix;
76 typedef Matrix< AD<double> , Dynamic, Dynamic > eigen_ad_matrix;
78 typedef Matrix< double , Dynamic , 1> eigen_vector;
79 typedef Matrix< AD<double> , Dynamic , 1> eigen_ad_vector;
85 eigen_ad_vector a_x(
n), a_y(m);
89 for(i = 0; i <
size; i++)
91 for(j = 0; j <
size; j++)
93 a_x[(Eigen::DenseIndex)(i * size + j)] = x[(Eigen::DenseIndex)(i * size + j)] = 0.0;
95 a_x[(Eigen::DenseIndex)(i * size + j)] = x[(Eigen::DenseIndex)(i * size + j)] = double(1 + i + j);
98 CppAD::Independent(a_x);
101 eigen_ad_matrix a_X(size, size);
102 eigen_matrix
X(size, size);
103 for(i = 0; i <
size; i++)
105 for(j = 0; j <
size; j++)
107 X((Eigen::DenseIndex)i, (Eigen::DenseIndex)j) = x[(Eigen::DenseIndex)(i * size + j)];
109 a_X((Eigen::DenseIndex)i, (Eigen::DenseIndex)j) = a_x[(Eigen::DenseIndex)(i * size + j)];
114 a_y[0] =
log( a_X.determinant() );
117 CppAD::ADFun<double> f(a_x, a_y);
120 double eps = 100. * CppAD::numeric_limits<double>::epsilon();
121 CppAD::det_by_minor<double> det(size);
122 BOOST_CHECK(NearEqual(Value(a_y[0]) ,
log(det(x)), eps, eps));
125 eigen_vector jac = f.Jacobian(x);
129 eigen_matrix inv_X = X.inverse();
130 for(i = 0; i <
size; i++)
132 for(j = 0; j <
size; j++)
133 BOOST_CHECK(NearEqual(jac[(Eigen::DenseIndex)(i * size + j)],
134 inv_X((Eigen::DenseIndex)j, (Eigen::DenseIndex)i),
143 using CppAD::NearEqual;
144 double eps99 = 99.0 * std::numeric_limits<double>::epsilon();
146 typedef AD<double> AD_double;
149 CPPAD_TESTVECTOR(AD_double)
x(1),
y(1), z(1);
151 CppAD::Independent(
x);
153 y[0] = CppAD::cos(
x[0]);
154 BOOST_CHECK(NearEqual(
y[0],std::cos(x0),eps99,eps99));
155 CppAD::ADFun<double> fcos(
x,
y);
157 CPPAD_TESTVECTOR(
double) x_eval(1);
159 CPPAD_TESTVECTOR(
double) dy(1);
160 dy = fcos.Jacobian(x_eval);
161 BOOST_CHECK(NearEqual(dy[0],-std::sin(x0),eps99,eps99));
163 CppAD::Independent(
x);
164 z[0] = CppAD::sin(
x[0]);
165 BOOST_CHECK(NearEqual(z[0],std::sin(x0),eps99,eps99));
167 CppAD::ADFun<double> fsin(
x, z);
169 CPPAD_TESTVECTOR(
double) dz(1);
170 dz = fsin.Jacobian(x_eval);
171 BOOST_CHECK(NearEqual(dz[0],std::cos(x0),eps99,eps99));
179 typedef AD<double> ADScalar;
180 Eigen::Matrix<ADScalar, Eigen::Dynamic, 1> ad_X;
181 Eigen::Matrix<ADScalar, Eigen::Dynamic, 1> ad_Y;
185 Eigen::Vector2d x_test(-1,1);
186 Eigen::Vector2d y_test = x_test.array().min(
Scalar(0.));
188 CppAD::Independent(ad_X);
190 ad_Y = ad_X.array().min(
Scalar(0.));
191 CppAD::ADFun<Scalar> ad_fun(ad_X,ad_Y);
193 CPPAD_TESTVECTOR(Scalar)
x((
size_t)2);
194 Eigen::Map<Eigen::Vector2d>(
x.data(),2,1) = x_test;
196 CPPAD_TESTVECTOR(Scalar)
y = ad_fun.Forward(0,
x);
198 BOOST_CHECK(Eigen::Map<Eigen::Vector2d>(y.data(),2,1).
isApprox(y_test));
206 typedef AD<double> ADScalar;
207 Eigen::Matrix<ADScalar, Eigen::Dynamic, 1> ad_X;
208 Eigen::Matrix<ADScalar, Eigen::Dynamic, 1> ad_Y;
212 Eigen::Vector2d x_test(-1,1);
213 Eigen::Vector2d y_test = x_test.array().max(
Scalar(0.));
215 CppAD::Independent(ad_X);
217 ad_Y = ad_X.array().max(
Scalar(0.));
218 CppAD::ADFun<Scalar> ad_fun(ad_X,ad_Y);
220 CPPAD_TESTVECTOR(Scalar)
x((
size_t)2);
221 Eigen::Map<Eigen::Vector2d>(
x.data(),2,1) = x_test;
223 CPPAD_TESTVECTOR(Scalar)
y = ad_fun.Forward(0,
x);
225 BOOST_CHECK(Eigen::Map<Eigen::Vector2d>(y.data(),2,1).
isApprox(y_test));
231 using namespace CppAD;
234 typedef AD<double> ADScalar;
236 typedef Eigen::Matrix<ADScalar,Eigen::Dynamic,1> ADVector;
238 ADVector vec_zero(ADVector::Zero(100));
239 BOOST_CHECK(vec_zero.isZero());
241 ADVector vec_ones(100);
243 BOOST_CHECK(vec_ones.isOnes());
249 CppAD::AD<double> ad_value;
256 CppAD::AD<double> theta,
x,
y;
257 x = pinocchio::math::cos(theta); y = pinocchio::math::sin(theta);
259 pinocchio::math::atan2(y,x);
263 BOOST_AUTO_TEST_SUITE_END()
bool check(const T &value, const T &other)
bool isApprox(const Shape &s1, const Shape &s2, const FCL_REAL tol)
BOOST_AUTO_TEST_CASE(test_example1_cppad)