mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-01-12 14:25:16 +08:00
Don't crash when attempting to shuffle an empty tensor.
This commit is contained in:
parent
bbfc4d54cd
commit
aab747021b
@ -142,7 +142,8 @@ struct TensorEvaluator<const TensorShufflingOp<Shuffle, ArgType>, Device>
|
|||||||
m_unshuffledInputStrides[i] =
|
m_unshuffledInputStrides[i] =
|
||||||
m_unshuffledInputStrides[i - 1] * input_dims[i - 1];
|
m_unshuffledInputStrides[i - 1] * input_dims[i - 1];
|
||||||
m_outputStrides[i] = m_outputStrides[i - 1] * m_dimensions[i - 1];
|
m_outputStrides[i] = m_outputStrides[i - 1] * m_dimensions[i - 1];
|
||||||
m_fastOutputStrides[i] = internal::TensorIntDivisor<Index>(m_outputStrides[i]);
|
m_fastOutputStrides[i] = internal::TensorIntDivisor<Index>(
|
||||||
|
m_outputStrides[i] > 0 ? m_outputStrides[i] : Index(1));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
m_unshuffledInputStrides[NumDims - 1] = 1;
|
m_unshuffledInputStrides[NumDims - 1] = 1;
|
||||||
@ -151,7 +152,8 @@ struct TensorEvaluator<const TensorShufflingOp<Shuffle, ArgType>, Device>
|
|||||||
m_unshuffledInputStrides[i] =
|
m_unshuffledInputStrides[i] =
|
||||||
m_unshuffledInputStrides[i + 1] * input_dims[i + 1];
|
m_unshuffledInputStrides[i + 1] * input_dims[i + 1];
|
||||||
m_outputStrides[i] = m_outputStrides[i + 1] * m_dimensions[i + 1];
|
m_outputStrides[i] = m_outputStrides[i + 1] * m_dimensions[i + 1];
|
||||||
m_fastOutputStrides[i] = internal::TensorIntDivisor<Index>(m_outputStrides[i]);
|
m_fastOutputStrides[i] = internal::TensorIntDivisor<Index>(
|
||||||
|
m_outputStrides[i] > 0 ? m_outputStrides[i] : Index(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,6 +215,59 @@ static void test_shuffle_unshuffle()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <int DataLayout>
|
||||||
|
static void test_empty_shuffling()
|
||||||
|
{
|
||||||
|
Tensor<float, 4, DataLayout> tensor(2,3,0,7);
|
||||||
|
tensor.setRandom();
|
||||||
|
array<ptrdiff_t, 4> shuffles;
|
||||||
|
shuffles[0] = 0;
|
||||||
|
shuffles[1] = 1;
|
||||||
|
shuffles[2] = 2;
|
||||||
|
shuffles[3] = 3;
|
||||||
|
|
||||||
|
Tensor<float, 4, DataLayout> no_shuffle;
|
||||||
|
no_shuffle = tensor.shuffle(shuffles);
|
||||||
|
|
||||||
|
VERIFY_IS_EQUAL(no_shuffle.dimension(0), 2);
|
||||||
|
VERIFY_IS_EQUAL(no_shuffle.dimension(1), 3);
|
||||||
|
VERIFY_IS_EQUAL(no_shuffle.dimension(2), 0);
|
||||||
|
VERIFY_IS_EQUAL(no_shuffle.dimension(3), 7);
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
for (int k = 0; k < 0; ++k) {
|
||||||
|
for (int l = 0; l < 7; ++l) {
|
||||||
|
VERIFY_IS_EQUAL(tensor(i,j,k,l), no_shuffle(i,j,k,l));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
shuffles[0] = 2;
|
||||||
|
shuffles[1] = 3;
|
||||||
|
shuffles[2] = 1;
|
||||||
|
shuffles[3] = 0;
|
||||||
|
Tensor<float, 4, DataLayout> shuffle;
|
||||||
|
shuffle = tensor.shuffle(shuffles);
|
||||||
|
|
||||||
|
VERIFY_IS_EQUAL(shuffle.dimension(0), 0);
|
||||||
|
VERIFY_IS_EQUAL(shuffle.dimension(1), 7);
|
||||||
|
VERIFY_IS_EQUAL(shuffle.dimension(2), 3);
|
||||||
|
VERIFY_IS_EQUAL(shuffle.dimension(3), 2);
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
for (int k = 0; k < 0; ++k) {
|
||||||
|
for (int l = 0; l < 7; ++l) {
|
||||||
|
VERIFY_IS_EQUAL(tensor(i,j,k,l), shuffle(k,l,j,i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
EIGEN_DECLARE_TEST(cxx11_tensor_shuffling)
|
EIGEN_DECLARE_TEST(cxx11_tensor_shuffling)
|
||||||
{
|
{
|
||||||
CALL_SUBTEST(test_simple_shuffling<ColMajor>());
|
CALL_SUBTEST(test_simple_shuffling<ColMajor>());
|
||||||
@ -225,4 +278,6 @@ EIGEN_DECLARE_TEST(cxx11_tensor_shuffling)
|
|||||||
CALL_SUBTEST(test_shuffling_as_value<RowMajor>());
|
CALL_SUBTEST(test_shuffling_as_value<RowMajor>());
|
||||||
CALL_SUBTEST(test_shuffle_unshuffle<ColMajor>());
|
CALL_SUBTEST(test_shuffle_unshuffle<ColMajor>());
|
||||||
CALL_SUBTEST(test_shuffle_unshuffle<RowMajor>());
|
CALL_SUBTEST(test_shuffle_unshuffle<RowMajor>());
|
||||||
|
CALL_SUBTEST(test_empty_shuffling<ColMajor>());
|
||||||
|
CALL_SUBTEST(test_empty_shuffling<RowMajor>());
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user