From 4cdf3fe427b4fdc271733d0404a66e2d5613cb16 Mon Sep 17 00:00:00 2001 From: Benoit Steiner Date: Wed, 14 Jan 2015 15:30:47 -0800 Subject: [PATCH] Misc fixes --- .../Eigen/CXX11/src/Tensor/TensorDimensions.h | 136 ++++++------------ 1 file changed, 44 insertions(+), 92 deletions(-) diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h b/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h index 6d9e09318..6c9a67c58 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h @@ -40,6 +40,10 @@ template struct IndexPair { // Boilerplate code namespace internal { +template struct dget { + static const std::size_t value = get::value; +}; + template struct fixed_size_tensor_index_linearization_helper @@ -49,7 +53,7 @@ struct fixed_size_tensor_index_linearization_helper const Dimensions& dimensions) { return array_get(indices) + - get::value * + dget::value * fixed_size_tensor_index_linearization_helper::run(indices, dimensions); } }; @@ -75,6 +79,10 @@ struct Sizes : internal::numeric_list { typedef internal::numeric_list Base; static const std::size_t total_size = internal::arg_prod(Indices...); + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t rank() const { + return Base::count; + } + static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::size_t TotalSize() { return internal::arg_prod(Indices...); } @@ -85,6 +93,7 @@ struct Sizes : internal::numeric_list { // todo: add assertion } #ifdef EIGEN_HAS_VARIADIC_TEMPLATES + template Sizes(DenseIndex... indices) { } explicit Sizes(std::initializer_list /*l*/) { // todo: add assertion } @@ -121,11 +130,15 @@ struct non_zero_size<0> { typedef internal::null_type type; }; -template struct Sizes : typename internal::make_type_list::type, typename non_zero_size::type, typename non_zero_size::type, typename non_zero_size::type, typename non_zero_size::type >::type { +template struct Sizes { typedef typename internal::make_type_list::type, typename non_zero_size::type, typename non_zero_size::type, typename non_zero_size::type, typename non_zero_size::type >::type Base; static const size_t count = Base::count; static const std::size_t total_size = internal::arg_prod::value; + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t rank() const { + return count; + } + static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t TotalSize() { return internal::arg_prod::value; } @@ -160,11 +173,11 @@ template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t IndexOfColMajor(const array& indices) const { - return internal::fixed_size_tensor_index_linearization_helper::run(indices, *static_cast(this)); + return internal::fixed_size_tensor_index_linearization_helper::run(indices, *static_cast(this); } template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t IndexOfRowMajor(const array& indices) const { - return internal::fixed_size_tensor_index_linearization_helper::run(indices, *static_cast(this)); + return internal::fixed_size_tensor_index_linearization_helper::run(indices, *static_cast(this); } }; @@ -208,6 +221,10 @@ struct DSizes : array { typedef array Base; static const std::size_t count = NumDims; + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t rank() const { + return NumDims; + } + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t TotalSize() const { return internal::array_prod(*static_cast(this)); } @@ -219,31 +236,44 @@ struct DSizes : array { } EIGEN_DEVICE_FUNC explicit DSizes(const array& a) : Base(a) { } +#ifdef EIGEN_HAS_VARIADIC_TEMPLATES + template EIGEN_DEVICE_FUNC + EIGEN_STRONG_INLINE explicit DSizes(DenseIndex firstDimension, IndexTypes... otherDimensions) { + EIGEN_STATIC_ASSERT(sizeof...(otherDimensions) + 1 == NumDims, YOU_MADE_A_PROGRAMMING_MISTAKE) + (*this) = array{{firstDimension, otherDimensions...}}; + } +#else EIGEN_DEVICE_FUNC explicit DSizes(const DenseIndex i0) { + eigen_assert(NumDims == 1); (*this)[0] = i0; } EIGEN_DEVICE_FUNC explicit DSizes(const DenseIndex i0, const DenseIndex i1) { + eigen_assert(NumDims == 2); (*this)[0] = i0; (*this)[1] = i1; } EIGEN_DEVICE_FUNC explicit DSizes(const DenseIndex i0, const DenseIndex i1, const DenseIndex i2) { + eigen_assert(NumDims == 3); (*this)[0] = i0; (*this)[1] = i1; (*this)[2] = i2; } EIGEN_DEVICE_FUNC explicit DSizes(const DenseIndex i0, const DenseIndex i1, const DenseIndex i2, const DenseIndex i3) { + eigen_assert(NumDims == 4); (*this)[0] = i0; (*this)[1] = i1; (*this)[2] = i2; (*this)[3] = i3; } EIGEN_DEVICE_FUNC explicit DSizes(const DenseIndex i0, const DenseIndex i1, const DenseIndex i2, const DenseIndex i3, const DenseIndex i4) { + eigen_assert(NumDims == 5); (*this)[0] = i0; (*this)[1] = i1; (*this)[2] = i2; (*this)[3] = i3; (*this)[4] = i4; } +#endif DSizes& operator = (const array& other) { *static_cast(this) = other; @@ -287,84 +317,6 @@ struct tensor_vsize_index_linearization_helper }; } // end namespace internal -template -struct VSizes : std::vector { - typedef std::vector Base; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t TotalSize() const { - return internal::array_prod(*static_cast(this)); - } - - EIGEN_DEVICE_FUNC VSizes() { } - EIGEN_DEVICE_FUNC explicit VSizes(const std::vector& a) : Base(a) { } - - template - EIGEN_DEVICE_FUNC explicit VSizes(const array& a) { - this->resize(NumDims); - for (int i = 0; i < NumDims; ++i) { - (*this)[i] = a[i]; - } - } - - EIGEN_DEVICE_FUNC explicit VSizes(const DenseIndex i0) { - this->resize(1); - (*this)[0] = i0; - } - EIGEN_DEVICE_FUNC explicit VSizes(const DenseIndex i0, const DenseIndex i1) { - this->resize(2); - (*this)[0] = i0; - (*this)[1] = i1; - } - EIGEN_DEVICE_FUNC explicit VSizes(const DenseIndex i0, const DenseIndex i1, const DenseIndex i2) { - this->resize(3); - (*this)[0] = i0; - (*this)[1] = i1; - (*this)[2] = i2; - } - EIGEN_DEVICE_FUNC explicit VSizes(const DenseIndex i0, const DenseIndex i1, const DenseIndex i2, const DenseIndex i3) { - this->resize(4); - (*this)[0] = i0; - (*this)[1] = i1; - (*this)[2] = i2; - (*this)[3] = i3; - } - EIGEN_DEVICE_FUNC explicit VSizes(const DenseIndex i0, const DenseIndex i1, const DenseIndex i2, const DenseIndex i3, const DenseIndex i4) { - this->resize(5); - (*this)[0] = i0; - (*this)[1] = i1; - (*this)[2] = i2; - (*this)[3] = i3; - (*this)[4] = i4; - } - - VSizes& operator = (const std::vector& other) { - *static_cast(this) = other; - return *this; - } - - // A constexpr would be so much better here - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t IndexOfColMajor(const array& indices) const { - return internal::tensor_vsize_index_linearization_helper::run(indices, *static_cast(this)); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t IndexOfRowMajor(const array& indices) const { - return internal::tensor_vsize_index_linearization_helper::run(indices, *static_cast(this)); - } -}; - - -// Boilerplate -namespace internal { -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex array_prod(const VSizes& sizes) { - DenseIndex total_size = 1; - for (int i = 0; i < sizes.size(); ++i) { - total_size *= sizes[i]; - } - return total_size; -} -} namespace internal { @@ -381,8 +333,8 @@ static const size_t value = Sizes::count; template struct array_size > { static const size_t value = Sizes::count; }; - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::size_t array_get(const Sizes) { - return get::Base>::value; +template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::size_t array_get(const Sizes& a) { + return get >::value; } #else template struct array_size > { @@ -412,17 +364,17 @@ struct sizes_match_up_to_dim { } }; -template -bool dimensions_match(Dims1& dims1, Dims2& dims2) { - if (array_size::value != array_size::value) { - return false; - } - return sizes_match_up_to_dim::value-1>::run(dims1, dims2); -} - } // end namespace internal +template +bool dimensions_match(Dims1& dims1, Dims2& dims2) { + if (internal::array_size::value != internal::array_size::value) { + return false; + } + return internal::sizes_match_up_to_dim::value-1>::run(dims1, dims2); +} + } // end namespace Eigen #endif // EIGEN_CXX11_TENSOR_TENSOR_DIMENSIONS_H