pinocchio  2.2.1-dirty
tensor.hpp
1 //
2 // Copyright (c) 2019 INRIA
3 //
4 
5 #ifndef __pinocchio_math_tensor_hpp__
6 #define __pinocchio_math_tensor_hpp__
7 
8 #include "pinocchio/fwd.hpp"
9 
10 #ifdef PINOCCHIO_WITH_CXX11_SUPPORT
11  #include <unsupported/Eigen/CXX11/Tensor>
12 #endif
13 
14 #if !EIGEN_VERSION_AT_LEAST(3,2,90)
15  #define EIGEN_DEVICE_FUNC
16 #endif
17 
18 namespace pinocchio
19 {
20 
21 #ifndef PINOCCHIO_WITH_CXX11_SUPPORT
22 
23  // Mimic the Eigen::Tensor module only available for C++11 and more
24  template<typename Scalar_, int NumIndices_, int Options_ = 0, typename IndexType = Eigen::DenseIndex>
25  struct Tensor
26  {
27  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
28 
29  typedef Scalar_ Scalar;
30  enum
31  {
32  Options = Options_,
33  NumIndices = NumIndices_
34  };
35  typedef IndexType Index;
36 
37  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rank() const
38  {
39  return NumIndices;
40  }
41 
42  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index dimension(std::size_t n) const
43  {
44  assert(n <= NumIndices && "n is larger than the dimension of the tensor.");
45  return m_dimensions[n];
46  }
47 
48  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size() const
49  {
50  return m_storage.size();
51  }
52 
53  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar *data()
54  {
55  return m_storage.data();
56  }
57 
58  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar *data() const
59  {
60  return m_storage.data();
61  }
62 
63  EIGEN_DEVICE_FUNC
64  EIGEN_STRONG_INLINE Tensor& setZero()
65  {
66  return setConstant(Scalar(0));
67  }
68 
69  EIGEN_DEVICE_FUNC
70  EIGEN_STRONG_INLINE Tensor& setConstant(const Scalar & val)
71  {
72  m_storage.setConstant(val);
73  return *this;
74  }
75 
76  EIGEN_DEVICE_FUNC
77  EIGEN_STRONG_INLINE Tensor& setRandom()
78  {
79  m_storage.setRandom();
80  return *this;
81  }
82 
83  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit Tensor(Index dim1)
84  : m_storage(dim1)
85  {
86  m_dimensions[0] = dim1;
87  EIGEN_STATIC_ASSERT(1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
88  }
89 
90  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index dim1, Index dim2)
91  : m_storage(dim1*dim2)
92  {
93  m_dimensions[0] = dim1;
94  m_dimensions[1] = dim2;
95  EIGEN_STATIC_ASSERT(2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
96  }
97 
98  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index dim1, Index dim2, Index dim3)
99  : m_storage(dim1*dim2*dim3)
100  {
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)
105  }
106 
107  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index dim1, Index dim2, Index dim3, Index dim4)
108  : m_storage(dim1*dim2*dim3*dim4)
109  {
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)
115  }
116 
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)
119  {
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)
126  }
127 
128  EIGEN_DEVICE_FUNC
129  EIGEN_STRONG_INLINE const Scalar& operator()(Index i0) const
130  {
131  EIGEN_STATIC_ASSERT(1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
132  return m_storage.coeff(i0);
133  }
134 
135  EIGEN_DEVICE_FUNC
136  EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1) const
137  {
138  EIGEN_STATIC_ASSERT(2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
139  return m_storage.coeff(i0 + i1 * m_dimensions[0]);
140  }
141 
142  EIGEN_DEVICE_FUNC
143  EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2) const
144  {
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]);
147  }
148 
149  EIGEN_DEVICE_FUNC
150  EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2, Index i3) const
151  {
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]);
154  }
155 
156  EIGEN_DEVICE_FUNC
157  EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2, Index i3, Index i4) const
158  {
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]);
161  }
162 
163  protected:
164 
165  typedef Eigen::Matrix<Scalar,Eigen::Dynamic,1,Options> StorageType;
166  StorageType m_storage;
167 
168  Index m_dimensions[NumIndices];
169 
170  };
171 
172 #else
173 
174  // Use the default Eigen::Tensor module
175  template<typename Scalar_, int NumIndices_, int Options_ = 0, typename IndexType = Eigen::DenseIndex>
176  using Tensor = Eigen::Tensor<Scalar_,NumIndices_,Options_,IndexType>;
177 
178 #endif // ifndef PINOCCHIO_WITH_CXX11_SUPPORT
179 
180 }
181 
182 #if !EIGEN_VERSION_AT_LEAST(3,2,90)
183  #undef EIGEN_DEVICE_FUNC
184 #endif
185 
186 #endif // ifndef __pinocchio_math_tensor_hpp__
Main pinocchio namespace.
Definition: treeview.dox:24