9#define PINOCCHIO_WITH_CASADI_SUPPORT 15#include <casadi/casadi.hpp> 18#include <Eigen/SparseCore> 19#include <unsupported/Eigen/CXX11/Tensor> 21#include <boost/math/constants/constants.hpp> 23#include "pinocchio/fwd.hpp" 24#include "pinocchio/macros.hpp" 25#include "pinocchio/eigen-common.hpp" 26#include "pinocchio/math.hpp" 27#include "pinocchio/spatial.hpp" 39 struct constant_pi<::casadi::SX> : constant_pi<double>
43 template<
typename Scalar>
44 struct constant_pi<::casadi::Matrix<Scalar>> : constant_pi<Scalar>
55 inline bool operator||(
const bool x, const ::casadi::Matrix<SXElem> & )
66 template<
typename Scalar>
67 struct cast_impl<::casadi::Matrix<Scalar>, Scalar>
70 static inline Scalar run(const ::casadi::Matrix<Scalar> & x)
72 return static_cast<Scalar
>(x);
77#if EIGEN_VERSION_AT_LEAST(3, 4, 90) 84 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
bool 85 is_exactly_zero(const ::casadi::Matrix<::casadi::SXElem> & x)
98 template<
typename Scalar>
99 struct NumTraits<::casadi::Matrix<Scalar>>
101 using Real = ::casadi::Matrix<Scalar>;
102 using NonInteger = ::casadi::Matrix<Scalar>;
103 using Literal = ::casadi::Matrix<Scalar>;
104 using Nested = ::casadi::Matrix<Scalar>;
115 RequireInitialization = 1,
122 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
static inline ::casadi::Matrix<Scalar> epsilon()
124 return ::casadi::Matrix<Scalar>(std::numeric_limits<double>::epsilon());
127 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
static inline ::casadi::Matrix<Scalar> dummy_precision()
129 return ::casadi::Matrix<Scalar>(NumTraits<double>::dummy_precision());
132 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
static inline ::casadi::Matrix<Scalar> highest()
134 return ::casadi::Matrix<Scalar>(std::numeric_limits<double>::max());
137 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
static inline ::casadi::Matrix<Scalar> lowest()
139 return ::casadi::Matrix<Scalar>(std::numeric_limits<double>::min());
142 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
static inline int digits10()
144 return std::numeric_limits<double>::digits10;
147 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
static inline int digits()
149 return NumTraits<double>::digits();
152#if EIGEN_VERSION_AT_LEAST(3, 4, 90) 153 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
static inline int max_digits10()
155 return NumTraits<double>::max_digits10();
166 template<
typename MT,
typename Scalar>
167 inline void copy(::casadi::Matrix<Scalar>
const & src, Eigen::MatrixBase<MT> & dst)
169 Eigen::Index
const m = src.size1();
170 Eigen::Index
const n = src.size2();
174 for (Eigen::Index i = 0; i < m; ++i)
175 for (Eigen::Index j = 0; j < n; ++j)
176 dst(i, j) = src(i, j);
180 template<
typename TensorDerived,
typename Scalar>
181 inline void copy(::casadi::Matrix<Scalar>
const & src, Eigen::TensorBase<TensorDerived> & dst_)
183 TensorDerived & dst =
static_cast<TensorDerived &
>(dst_);
184 Eigen::Index
const m = src.size1();
185 Eigen::Index
const n = src.size2();
190 for (Eigen::Index i = 0; i < m; ++i)
191 for (Eigen::Index j = 0; j < n; ++j)
192 dst(0, i, j) = src(i, j);
196 template<
typename TensorDerived,
typename Scalar>
197 inline void copy(Eigen::TensorBase<TensorDerived>
const & _src, ::casadi::Matrix<Scalar> & dst)
199 const TensorDerived & src =
static_cast<const TensorDerived &
>(_src);
200 Eigen::Index
const m = src.dimension(1);
201 Eigen::Index
const n = src.dimension(2);
203 PINOCCHIO_CHECK_ARGUMENT_SIZE(src.dimension(0), 1);
206 for (Eigen::Index i = 0; i < m; ++i)
207 for (Eigen::Index j = 0; j < n; ++j)
208 dst(i, j) = src(0, i, j);
212 template<
typename MT,
typename Scalar>
213 inline void copy(Eigen::MatrixBase<MT>
const & src, ::casadi::Matrix<Scalar> & dst)
215 Eigen::Index
const m = src.rows();
216 Eigen::Index
const n = src.cols();
220 for (Eigen::Index i = 0; i < m; ++i)
221 for (Eigen::Index j = 0; j < n; ++j)
222 dst(i, j) = src(i, j);
226 template<
typename MT,
typename Scalar>
227 inline void copy(Eigen::SparseMatrixBase<MT>
const & src, ::casadi::Matrix<Scalar> & dst)
229 Eigen::Index
const m = src.rows();
230 Eigen::Index
const n = src.cols();
236 for (Eigen::Index i = 0; i < m; ++i)
237 for (Eigen::Index j = 0; j < n; ++j)
238 dst(i, j) = src.derived().coeff(i, j);
242 template<
typename MatrixDerived>
243 inline void sym(
const Eigen::MatrixBase<MatrixDerived> & eig_mat, std::string
const & name)
245 typedef typename MatrixDerived::Scalar SX;
247 MatrixDerived & eig_mat_ = PINOCCHIO_EIGEN_CONST_CAST(MatrixDerived, eig_mat);
248 for (Eigen::Index i = 0; i < eig_mat.rows(); ++i)
249 for (Eigen::Index j = 0; j < eig_mat.cols(); ++j)
250 eig_mat_(i, j) = SX::sym(name +
"_" + std::to_string(i) +
"_" + std::to_string(j));
257#include "pinocchio/src/autodiff/casadi/math/alias.hxx" 263 template<
typename Scalar>
264 struct ScalarBinaryOpTraits<
265 ::casadi::Matrix<Scalar>,
266 ::casadi::Matrix<Scalar>,
267 internal::scalar_max_op<::casadi::Matrix<Scalar>, ::casadi::Matrix<Scalar>>>
269 typedef ::casadi::Matrix<Scalar> ReturnType;
272 template<
typename S1,
typename S2>
273 struct ScalarBinaryOpTraits<
274 ::casadi::Matrix<S1>,
276 internal::scalar_max_op<::casadi::Matrix<S1>, S2>>
278 typedef ::casadi::Matrix<S1> ReturnType;
281 template<
typename S1,
typename S2>
282 struct ScalarBinaryOpTraits<
284 ::casadi::Matrix<S2>,
285 internal::scalar_max_op<S1, ::casadi::Matrix<S2>>>
287 typedef ::casadi::Matrix<S1> ReturnType;
293 template<
typename Scalar>
294 struct scalar_max_op<::casadi::Matrix<Scalar>, ::casadi::Matrix<Scalar>>
295 : binary_op_base<::casadi::Matrix<Scalar>, ::casadi::Matrix<Scalar>>
297 typedef ::casadi::Matrix<Scalar> LhsScalar;
298 typedef ::casadi::Matrix<Scalar> RhsScalar;
300 typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_max_op>::ReturnType result_type;
302 EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op)
303 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type
304 operator()(
const LhsScalar & a,
const RhsScalar & b)
const 306 return ::pinocchio::math::internal::call_max<LhsScalar, RhsScalar>::run(a, b);
310 template<
typename S1,
typename S2>
311 struct scalar_max_op<S1, ::casadi::Matrix<S2>> : binary_op_base<S1, ::casadi::Matrix<S2>>
313 typedef S1 LhsScalar;
314 typedef ::casadi::Matrix<S2> RhsScalar;
316 typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_max_op>::ReturnType result_type;
318 EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op)
319 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type
320 operator()(
const LhsScalar & a,
const RhsScalar & b)
const 322 return ::pinocchio::math::internal::call_max<LhsScalar, RhsScalar>::run(a, b);
326 template<
typename S1,
typename S2>
327 struct scalar_max_op<::casadi::Matrix<S1>, S2> : binary_op_base<::casadi::Matrix<S1>, S2>
329 typedef ::casadi::Matrix<S1> LhsScalar;
330 typedef S2 RhsScalar;
332 typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_max_op>::ReturnType result_type;
334 EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op)
335 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type
336 operator()(
const LhsScalar & a,
const RhsScalar & b)
const 338 return ::pinocchio::math::internal::call_max<LhsScalar, RhsScalar>::run(a, b);
345#include "pinocchio/src/autodiff/casadi/math/taylor-series-expansion.hxx" 346#include "pinocchio/src/autodiff/casadi/math/alias.hxx" 347#include "pinocchio/src/autodiff/casadi/math/matrix.hxx" 348#include "pinocchio/src/autodiff/casadi/math/quaternion.hxx" 349#include "pinocchio/src/autodiff/casadi/math/triangular-matrix.hxx" 350#include "pinocchio/src/autodiff/casadi/spatial/se3-tpl.hxx" 351#include "pinocchio/src/autodiff/casadi/utils/static-if.hxx" Main pinocchio namespace.