5 #ifndef __eigenpy_numpy_allocator_hpp__
6 #define __eigenpy_numpy_allocator_hpp__
15 template <
typename EigenType,
typename BaseType>
18 template <
typename EigenType>
21 template <
typename MatType>
23 MatType,
Eigen::MatrixBase<typename remove_const_reference<MatType>::type> >
26 template <
typename MatType>
29 const
Eigen::MatrixBase<typename remove_const_reference<MatType>::type> >
37 template <
typename MatType>
41 template <
typename EigenType,
45 template <
typename MatType>
47 template <
typename SimilarMatrixType>
49 const Eigen::MatrixBase<SimilarMatrixType> &
mat, npy_intp nd,
51 typedef typename SimilarMatrixType::Scalar Scalar;
53 const int code = Register::getTypeCode<Scalar>();
55 static_cast<int>(nd), shape, code);
64 #ifdef EIGENPY_WITH_TENSOR_SUPPORT
66 template <
typename TensorType>
67 struct numpy_allocator_impl_tensor;
69 template <
typename TensorType>
70 struct numpy_allocator_impl<TensorType,
Eigen::TensorBase<TensorType> >
71 : numpy_allocator_impl_tensor<TensorType> {};
73 template <
typename TensorType>
74 struct numpy_allocator_impl<const TensorType,
75 const
Eigen::TensorBase<TensorType> >
76 : numpy_allocator_impl_tensor<const TensorType> {};
78 template <
typename TensorType>
79 struct numpy_allocator_impl_tensor {
80 template <
typename TensorDerived>
81 static PyArrayObject *allocate(
const TensorDerived &tensor, npy_intp nd,
83 const int code = Register::getTypeCode<typename TensorDerived::Scalar>();
85 static_cast<int>(nd), shape, code);
89 static_cast<const TensorDerived &
>(tensor), pyArray);
96 template <
typename MatType>
98 template <
typename SimilarMatrixType>
99 static PyArrayObject *
allocate(Eigen::PlainObjectBase<SimilarMatrixType> &
mat,
100 npy_intp nd, npy_intp *shape) {
101 typedef typename SimilarMatrixType::Scalar Scalar;
103 NPY_ARRAY_MEMORY_CONTIGUOUS =
104 SimilarMatrixType::IsRowMajor ? NPY_ARRAY_CARRAY : NPY_ARRAY_FARRAY
108 const int Scalar_type_code = Register::getTypeCode<Scalar>();
111 mat.data(), NPY_ARRAY_MEMORY_CONTIGUOUS | NPY_ARRAY_ALIGNED);
120 #if EIGEN_VERSION_AT_LEAST(3, 2, 0)
122 template <
typename MatType,
int Options,
typename Str
ide>
123 struct numpy_allocator_impl_matrix<
Eigen::Ref<MatType, Options, Stride> > {
124 typedef Eigen::Ref<MatType, Options, Stride> RefType;
126 static PyArrayObject *
allocate(RefType &
mat, npy_intp nd, npy_intp *shape) {
127 typedef typename RefType::Scalar Scalar;
129 NPY_ARRAY_MEMORY_CONTIGUOUS =
130 RefType::IsRowMajor ? NPY_ARRAY_CARRAY : NPY_ARRAY_FARRAY
134 const int Scalar_type_code = Register::getTypeCode<Scalar>();
135 const bool reverse_strides = MatType::IsRowMajor || (
mat.rows() == 1);
136 Eigen::DenseIndex inner_stride = reverse_strides ?
mat.outerStride()
138 outer_stride = reverse_strides ?
mat.innerStride()
141 #if NPY_ABI_VERSION < 0x02000000
147 npy_intp strides[2] = {elsize * inner_stride, elsize * outer_stride};
151 strides,
mat.data(), NPY_ARRAY_MEMORY_CONTIGUOUS | NPY_ARRAY_ALIGNED);
155 return NumpyAllocator<MatType>::allocate(
mat, nd, shape);
162 template <
typename MatType>
164 template <
typename SimilarMatrixType>
166 const Eigen::PlainObjectBase<SimilarMatrixType> &
mat, npy_intp nd,
168 typedef typename SimilarMatrixType::Scalar Scalar;
170 NPY_ARRAY_MEMORY_CONTIGUOUS_RO = SimilarMatrixType::IsRowMajor
171 ? NPY_ARRAY_CARRAY_RO
172 : NPY_ARRAY_FARRAY_RO
176 const int Scalar_type_code = Register::getTypeCode<Scalar>();
179 const_cast<Scalar *
>(
mat.data()),
180 NPY_ARRAY_MEMORY_CONTIGUOUS_RO | NPY_ARRAY_ALIGNED);
189 #if EIGEN_VERSION_AT_LEAST(3, 2, 0)
191 template <
typename MatType,
int Options,
typename Str
ide>
192 struct numpy_allocator_impl_matrix<
193 const
Eigen::Ref<const MatType, Options, Stride> > {
194 typedef const Eigen::Ref<const MatType, Options, Stride> RefType;
196 static PyArrayObject *
allocate(RefType &
mat, npy_intp nd, npy_intp *shape) {
197 typedef typename RefType::Scalar Scalar;
199 NPY_ARRAY_MEMORY_CONTIGUOUS_RO =
200 RefType::IsRowMajor ? NPY_ARRAY_CARRAY_RO : NPY_ARRAY_FARRAY_RO
204 const int Scalar_type_code = Register::getTypeCode<Scalar>();
206 const bool reverse_strides = MatType::IsRowMajor || (
mat.rows() == 1);
207 Eigen::DenseIndex inner_stride = reverse_strides ?
mat.outerStride()
209 outer_stride = reverse_strides ?
mat.innerStride()
212 #if NPY_ABI_VERSION < 0x02000000
218 npy_intp strides[2] = {elsize * inner_stride, elsize * outer_stride};
222 strides,
const_cast<Scalar *
>(
mat.data()),
223 NPY_ARRAY_MEMORY_CONTIGUOUS_RO | NPY_ARRAY_ALIGNED);
227 return NumpyAllocator<MatType>::allocate(
mat, nd, shape);
234 #ifdef EIGENPY_WITH_TENSOR_SUPPORT
235 template <
typename TensorType>
236 struct numpy_allocator_impl_tensor<
Eigen::TensorRef<TensorType> > {
237 typedef Eigen::TensorRef<TensorType> RefType;
239 static PyArrayObject *allocate(RefType &tensor, npy_intp nd,
241 typedef typename RefType::Scalar Scalar;
242 static const bool IsRowMajor = TensorType::Options & Eigen::RowMajorBit;
244 NPY_ARRAY_MEMORY_CONTIGUOUS =
245 IsRowMajor ? NPY_ARRAY_CARRAY : NPY_ARRAY_FARRAY
249 const int Scalar_type_code = Register::getTypeCode<Scalar>();
257 getPyArrayType(),
static_cast<int>(nd), shape, Scalar_type_code, NULL,
258 const_cast<Scalar *
>(tensor.data()),
259 NPY_ARRAY_MEMORY_CONTIGUOUS | NPY_ARRAY_ALIGNED);
263 return NumpyAllocator<TensorType>::allocate(tensor, nd, shape);
268 template <
typename TensorType>
269 struct numpy_allocator_impl_tensor<const
Eigen::TensorRef<const TensorType> > {
270 typedef const Eigen::TensorRef<const TensorType> RefType;
272 static PyArrayObject *allocate(RefType &tensor, npy_intp nd,
274 typedef typename RefType::Scalar Scalar;
275 static const bool IsRowMajor = TensorType::Options & Eigen::RowMajorBit;
277 NPY_ARRAY_MEMORY_CONTIGUOUS_RO =
278 IsRowMajor ? NPY_ARRAY_CARRAY_RO : NPY_ARRAY_FARRAY_RO
282 const int Scalar_type_code = Register::getTypeCode<Scalar>();
285 getPyArrayType(),
static_cast<int>(nd), shape, Scalar_type_code, NULL,
286 const_cast<Scalar *
>(tensor.data()),
287 NPY_ARRAY_MEMORY_CONTIGUOUS_RO | NPY_ARRAY_ALIGNED);
291 return NumpyAllocator<TensorType>::allocate(tensor, nd, shape);
299 #endif // ifndef __eigenpy_numpy_allocator_hpp__