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));
 
  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));
 
  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;
 
  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()