9 #include "../utils/model-generator.hpp" 
   11 #include <boost/test/unit_test.hpp> 
   12 #include <boost/utility/binary.hpp> 
   16 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
 
   22   using CppAD::NearEqual;
 
   30   Eigen::VectorXd 
q2 = Eigen::VectorXd::Random(
model.nq);
 
   31   Eigen::VectorXd 
q1 = Eigen::VectorXd::Random(
model.nq);
 
   35   Eigen::VectorXd 
v = Eigen::VectorXd::Random(
model.nv);
 
   36   std::vector<Eigen::VectorXd> results_q(2, Eigen::VectorXd::Zero(
model.nq));
 
   37   std::vector<Eigen::VectorXd> results_v(2, Eigen::VectorXd::Zero(
model.nv));
 
   46   typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1> VectorX;
 
   47   typedef Eigen::Matrix<ADScalar, Eigen::Dynamic, 1> VectorXAD;
 
   48   typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> MatrixX;
 
   49   typedef Eigen::Matrix<ADScalar, Eigen::Dynamic, Eigen::Dynamic> MatrixXAD;
 
   55     CppAD::Independent(ad_x);
 
   56     ad_q1 = ad_x.head(
model.nq);
 
   57     ad_v = ad_x.tail(
model.nv);
 
   59     VectorXAD ad_y(
model.nq);
 
   61     CppAD::ADFun<Scalar> ad_fun(ad_x, ad_y);
 
   63     CPPAD_TESTVECTOR(
Scalar) x_eval((
size_t)(ad_x.size()));
 
   64     Eigen::Map<VectorX>(x_eval.data(), ad_x.size()) << 
q1, 
v;
 
   65     CPPAD_TESTVECTOR(
Scalar) y_eval((
size_t)(ad_y.size()));
 
   66     y_eval = ad_fun.Forward(0, x_eval);
 
   67     results_q[0] = Eigen::Map<VectorX>(y_eval.data(), ad_y.size());
 
   70     BOOST_CHECK(results_q[0].
isApprox(results_q[1]));
 
   72     Eigen::Map<VectorX>(x_eval.data(), ad_x.size()) << 
q1, VectorX::Zero(
model.nv);
 
   73     y_eval = ad_fun.Forward(0, x_eval);
 
   74     results_q[0] = Eigen::Map<VectorX>(y_eval.data(), ad_y.size());
 
   82     CppAD::Independent(ad_x);
 
   83     ad_q1 = ad_x.head(
model.nq);
 
   84     ad_q2 = ad_x.tail(
model.nq);
 
   86     VectorXAD ad_y(
model.nv);
 
   88     CppAD::ADFun<Scalar> ad_fun(ad_x, ad_y);
 
   90     CPPAD_TESTVECTOR(
Scalar) x_eval((
size_t)(ad_x.size()));
 
   91     Eigen::Map<VectorX>(x_eval.data(), ad_x.size()) << 
q1, 
q2;
 
   92     CPPAD_TESTVECTOR(
Scalar) y_eval((
size_t)(ad_y.size()));
 
   93     y_eval = ad_fun.Forward(0, x_eval);
 
   94     results_v[0] = Eigen::Map<VectorX>(y_eval.data(), ad_y.size());
 
   97     BOOST_CHECK(results_v[0].
isApprox(results_v[1]));
 
   99     Eigen::Map<VectorX>(x_eval.data(), ad_x.size()) << 
q1, 
q1;
 
  100     y_eval = ad_fun.Forward(0, x_eval);
 
  101     results_v[0] = Eigen::Map<VectorX>(y_eval.data(), ad_y.size());
 
  102     BOOST_CHECK(results_v[0].
isZero());
 
  106   std::vector<MatrixX> results_J0(2, MatrixX::Zero(
model.nv, 
model.nv));
 
  107   std::vector<MatrixX> results_J1(2, MatrixX::Zero(
model.nv, 
model.nv));
 
  111     CppAD::Independent(ad_x);
 
  112     ad_q1 = ad_x.head(
model.nq);
 
  113     ad_q2 = ad_x.tail(
model.nq);
 
  118     VectorXAD ad_y_flatten = Eigen::Map<VectorXAD>(ad_y.data(), ad_y.size());
 
  119     CppAD::ADFun<Scalar> ad_fun(ad_x, ad_y_flatten);
 
  121     CPPAD_TESTVECTOR(
Scalar) x_eval((
size_t)(ad_x.size()));
 
  122     Eigen::Map<VectorX>(x_eval.data(), ad_x.size()) << 
q1, 
q2;
 
  123     CPPAD_TESTVECTOR(
Scalar) y_eval((
size_t)(ad_y.size()));
 
  124     y_eval = ad_fun.Forward(0, x_eval);
 
  125     results_J0[0] = Eigen::Map<MatrixX>(y_eval.data(), ad_y.rows(), ad_y.cols()).topRows(
model.nv);
 
  127       Eigen::Map<MatrixX>(y_eval.data(), ad_y.rows(), ad_y.cols()).bottomRows(
model.nv);
 
  131     BOOST_CHECK(results_J0[0].
isApprox(results_J0[1]));
 
  135     BOOST_CHECK(results_J1[0].
isApprox(results_J1[1]));
 
  137     Eigen::Map<VectorX>(x_eval.data(), ad_x.size()) << 
q1, 
q1;
 
  138     y_eval = ad_fun.Forward(0, x_eval);
 
  139     results_J0[0] = Eigen::Map<MatrixX>(y_eval.data(), ad_y.rows(), ad_y.cols()).topRows(
model.nv);
 
  141       Eigen::Map<MatrixX>(y_eval.data(), ad_y.rows(), ad_y.cols()).bottomRows(
model.nv);
 
  143     BOOST_CHECK((-results_J0[0]).isIdentity());
 
  144     BOOST_CHECK(results_J1[0].isIdentity());
 
  148 BOOST_AUTO_TEST_SUITE_END()