5 #ifndef __pinocchio_autodiff_cppad_math_quaternion_hpp__ 
    6 #define __pinocchio_autodiff_cppad_math_quaternion_hpp__ 
   18       template<
typename _Scalar>
 
   23         template<
typename Matrix3, 
typename QuaternionDerived>
 
   24         static inline void run(Eigen::QuaternionBase<QuaternionDerived> & 
q, 
const Matrix3 & mat)
 
   27             typename Eigen::internal::traits<QuaternionDerived>::Coefficients QuatCoefficients;
 
   30           typedef Eigen::Quaternion<ADScalar, QuatCoefficientsPlainType::Options> QuaternionPlain;
 
   31           QuaternionPlain quat_t_positive;
 
   36           QuaternionPlain quat_t_negative_0, quat_t_negative_1, quat_t_negative_2;
 
   43           for (Eigen::DenseIndex k = 0; k < 4; ++k)
 
   45             ADScalar t_is_negative_cond1 = CppAD::CondExpGt<Scalar>(
 
   46               mat.coeff(1, 1), 
mat.coeff(0, 0), quat_t_negative_1.coeffs().coeff(k),
 
   47               quat_t_negative_0.coeffs().coeff(k));
 
   49             ADScalar t_is_negative_cond2 = CppAD::CondExpGt<Scalar>(
 
   50               mat.coeff(2, 2), 
mat.coeff(0, 0), quat_t_negative_2.coeffs().coeff(k),
 
   51               CppAD::CondExpGt<Scalar>(
 
   52                 mat.coeff(1, 1), 
mat.coeff(0, 0),
 
   53                 CppAD::CondExpGt<Scalar>(
 
   54                   mat.coeff(2, 2), 
mat.coeff(1, 1), quat_t_negative_2.coeffs().coeff(k),
 
   56                 t_is_negative_cond1));
 
   57             q.coeffs().coeffRef(k) = CppAD::CondExpGt<Scalar>(
 
   58               t, 
ADScalar(0), quat_t_positive.coeffs().coeff(k), t_is_negative_cond2);
 
   69 #endif // ifndef __pinocchio_autodiff_casadi_math_quaternion_hpp__