5 #ifndef __pinocchio_math_tensor_hpp__ 6 #define __pinocchio_math_tensor_hpp__ 8 #include "pinocchio/fwd.hpp" 10 #ifdef PINOCCHIO_WITH_CXX11_SUPPORT 11 #include <unsupported/Eigen/CXX11/Tensor> 14 #if !EIGEN_VERSION_AT_LEAST(3,2,90) 15 #define EIGEN_DEVICE_FUNC 21 #ifndef PINOCCHIO_WITH_CXX11_SUPPORT 24 template<
typename Scalar_,
int NumIndices_,
int Options_ = 0,
typename IndexType = Eigen::DenseIndex>
27 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
29 typedef Scalar_ Scalar;
33 NumIndices = NumIndices_
35 typedef IndexType Index;
37 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rank()
const 42 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index dimension(std::size_t n)
const 44 assert(n <= NumIndices &&
"n is larger than the dimension of the tensor.");
45 return m_dimensions[n];
48 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size()
const 50 return m_storage.size();
53 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar *data()
55 return m_storage.data();
58 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar *data()
const 60 return m_storage.data();
64 EIGEN_STRONG_INLINE
Tensor& setZero()
66 return setConstant(Scalar(0));
70 EIGEN_STRONG_INLINE
Tensor& setConstant(
const Scalar & val)
72 m_storage.setConstant(val);
77 EIGEN_STRONG_INLINE
Tensor& setRandom()
79 m_storage.setRandom();
83 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit Tensor(Index dim1)
86 m_dimensions[0] = dim1;
87 EIGEN_STATIC_ASSERT(1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
90 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index dim1, Index dim2)
91 : m_storage(dim1*dim2)
93 m_dimensions[0] = dim1;
94 m_dimensions[1] = dim2;
95 EIGEN_STATIC_ASSERT(2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
98 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index dim1, Index dim2, Index dim3)
99 : m_storage(dim1*dim2*dim3)
101 m_dimensions[0] = dim1;
102 m_dimensions[1] = dim2;
103 m_dimensions[2] = dim3;
104 EIGEN_STATIC_ASSERT(3 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
107 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index dim1, Index dim2, Index dim3, Index dim4)
108 : m_storage(dim1*dim2*dim3*dim4)
110 m_dimensions[0] = dim1;
111 m_dimensions[1] = dim2;
112 m_dimensions[2] = dim3;
113 m_dimensions[3] = dim4;
114 EIGEN_STATIC_ASSERT(4 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
117 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index dim1, Index dim2, Index dim3, Index dim4, Index dim5)
118 : m_storage(dim1*dim2*dim3*dim4*dim5)
120 m_dimensions[0] = dim1;
121 m_dimensions[1] = dim2;
122 m_dimensions[2] = dim3;
123 m_dimensions[3] = dim4;
124 m_dimensions[4] = dim5;
125 EIGEN_STATIC_ASSERT(5 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
129 EIGEN_STRONG_INLINE
const Scalar& operator()(Index i0)
const 131 EIGEN_STATIC_ASSERT(1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
132 return m_storage.coeff(i0);
136 EIGEN_STRONG_INLINE
const Scalar& operator()(Index i0, Index i1)
const 138 EIGEN_STATIC_ASSERT(2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
139 return m_storage.coeff(i0 + i1 * m_dimensions[0]);
143 EIGEN_STRONG_INLINE
const Scalar& operator()(Index i0, Index i1, Index i2)
const 145 EIGEN_STATIC_ASSERT(3 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
146 return m_storage.coeff(i0 + i1 * m_dimensions[0] + i2 * m_dimensions[1] * m_dimensions[0]);
150 EIGEN_STRONG_INLINE
const Scalar& operator()(Index i0, Index i1, Index i2, Index i3)
const 152 EIGEN_STATIC_ASSERT(4 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
153 return coeff(i0 + i1 * m_dimensions[0] + i2 * m_dimensions[1] * m_dimensions[0] + i3 * m_dimensions[2] * m_dimensions[1] * m_dimensions[0]);
157 EIGEN_STRONG_INLINE
const Scalar& operator()(Index i0, Index i1, Index i2, Index i3, Index i4)
const 159 EIGEN_STATIC_ASSERT(5 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
160 return coeff(i0 + i1 * m_dimensions[0] + i2 * m_dimensions[1] * m_dimensions[0] + i3 * m_dimensions[2] * m_dimensions[1] * m_dimensions[0] + i4 * m_dimensions[3] * m_dimensions[2] * m_dimensions[1] * m_dimensions[0]);
165 typedef Eigen::Matrix<Scalar,Eigen::Dynamic,1,Options> StorageType;
166 StorageType m_storage;
168 Index m_dimensions[NumIndices];
175 template<
typename Scalar_,
int NumIndices_,
int Options_ = 0,
typename IndexType = Eigen::DenseIndex>
176 using Tensor = Eigen::Tensor<Scalar_,NumIndices_,Options_,IndexType>;
178 #endif // ifndef PINOCCHIO_WITH_CXX11_SUPPORT 182 #if !EIGEN_VERSION_AT_LEAST(3,2,90) 183 #undef EIGEN_DEVICE_FUNC 186 #endif // ifndef __pinocchio_math_tensor_hpp__
Main pinocchio namespace.