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++)
71 using CppAD::NearEqual;
75 typedef Matrix<double, Dynamic, Dynamic> eigen_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);
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)] =
99 CppAD::Independent(a_x);
106 for (j = 0; j <
size; j++)
108 X((Eigen::DenseIndex)
i, (Eigen::DenseIndex)j) =
x[(Eigen::DenseIndex)(
i *
size + j)];
110 a_X((Eigen::DenseIndex)
i, (Eigen::DenseIndex)j) = a_x[(Eigen::DenseIndex)(
i *
size + j)];
115 a_y[0] =
log(a_X.determinant());
118 CppAD::ADFun<double>
f(a_x, a_y);
121 double eps = 100. * CppAD::numeric_limits<double>::epsilon();
122 CppAD::det_by_minor<double> det(
size);
123 BOOST_CHECK(NearEqual(Value(a_y[0]),
log(det(
x)),
eps,
eps));
126 eigen_vector
jac =
f.Jacobian(
x);
130 eigen_matrix inv_X =
X.inverse();
133 for (j = 0; j <
size; j++)
134 BOOST_CHECK(NearEqual(
135 jac[(Eigen::DenseIndex)(
i *
size + j)], 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));
230 using namespace CppAD;
233 typedef AD<double> ADScalar;
235 typedef Eigen::Matrix<ADScalar, Eigen::Dynamic, 1> ADVector;
237 ADVector vec_zero(ADVector::Zero(100));
238 BOOST_CHECK(vec_zero.isZero());
240 ADVector vec_ones(100);
242 BOOST_CHECK(vec_ones.isOnes());
247 CppAD::AD<double> ad_value;
254 CppAD::AD<double> theta,
x,
y;
255 x = pinocchio::math::cos(theta);
256 y = pinocchio::math::sin(theta);
258 pinocchio::math::atan2(
y,
x);
261 BOOST_AUTO_TEST_SUITE_END()