diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h b/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h index e5cf93ab0..c102a43fb 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h @@ -641,7 +641,7 @@ struct TensorEvaluator, Device> return; } - const Dimensions& input_dims = m_impl.dimensions(); + const Dimensions& input_dims = Dimensions(m_impl.dimensions()); // Pre-fill input_block_sizes, broadcast_block_sizes, // broadcast_block_strides, and broadcast_tensor_strides. Later on we will diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h b/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h index 7c26b1682..fe0d57f31 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h @@ -290,6 +290,16 @@ struct DSizes : array { } } +#ifdef EIGEN_HAS_INDEX_LIST + EIGEN_DEVICE_FUNC + template + DSizes(const Eigen::IndexList& dimensions) { + for (int i = 0; i < dimensions.count; ++i) { + (*this)[i] = dimensions[i]; + } + } +#endif + #ifndef EIGEN_EMULATE_CXX11_META_H template EIGEN_DEVICE_FUNC DSizes(const Sizes& a) { diff --git a/unsupported/test/cxx11_tensor_broadcasting.cpp b/unsupported/test/cxx11_tensor_broadcasting.cpp index 2f8ab6afd..7df5b53d6 100644 --- a/unsupported/test/cxx11_tensor_broadcasting.cpp +++ b/unsupported/test/cxx11_tensor_broadcasting.cpp @@ -115,7 +115,7 @@ static void test_static_broadcasting() Tensor tensor(8,3,5); tensor.setRandom(); -#if EIGEN_HAS_CONSTEXPR +#if defined(EIGEN_HAS_INDEX_LIST) Eigen::IndexList, Eigen::type2index<3>, Eigen::type2index<4>> broadcasts; #else Eigen::array broadcasts; diff --git a/unsupported/test/cxx11_tensor_morphing.cpp b/unsupported/test/cxx11_tensor_morphing.cpp index 6365cd89a..4cbe15b63 100644 --- a/unsupported/test/cxx11_tensor_morphing.cpp +++ b/unsupported/test/cxx11_tensor_morphing.cpp @@ -41,6 +41,28 @@ static void test_simple_reshape() } } +template +static void test_static_reshape() { +#if defined(EIGEN_HAS_INDEX_LIST) + using Eigen::type2index; + + Tensor tensor(2, 3, 1, 7, 1); + tensor.setRandom(); + + // New dimensions: [2, 3, 7] + Eigen::IndexList, type2index<3>, type2index<7>> dim; + Tensor reshaped = tensor.reshape(dim); + + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < 3; ++j) { + for (int k = 0; k < 7; ++k) { + VERIFY_IS_EQUAL(tensor(i, j, 0, k, 0), reshaped(i, j, k)); + } + } + } +#endif +} + template static void test_reshape_in_expr() { MatrixXf m1(2,3*5*7*11); @@ -462,6 +484,7 @@ static void test_composition() EIGEN_DECLARE_TEST(cxx11_tensor_morphing) { CALL_SUBTEST_1(test_simple_reshape()); + CALL_SUBTEST_1(test_static_reshape()); CALL_SUBTEST_1(test_reshape_in_expr()); CALL_SUBTEST_1(test_reshape_as_lvalue());