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;
24 typedef AD<Scalar> ADScalar;
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));
40 typedef ADModel::ConfigVectorType ADConfigVectorType;
41 ADModel ad_model =
model.cast<ADScalar>();
42 ADConfigVectorType ad_q1(
model.nq);
43 ADConfigVectorType ad_q2(
model.nq);
44 ADConfigVectorType ad_v(
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;
54 ad_x <<
q1.cast<ADScalar>(),
v.cast<ADScalar>();
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());
81 ad_x <<
q1.cast<ADScalar>(),
q2.cast<ADScalar>();
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));
110 ad_x <<
q1.cast<ADScalar>(),
q2.cast<ADScalar>();
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()