Re: [eigen] Bug report on Tensor

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


The assertion that caused the crash is in fact unnecessary.. I deleted it and added a test to make sure that you can you the assignment operator on empty tensors. Let me know if the fix works for you, its available in commit https://bitbucket.org/eigen/eigen/commits/53c33c0e87d4db617eaf2b1f0e040c6bafd95089

On Wed, Jan 27, 2016 at 11:51 AM, Mathieu Dutour <mathieu.dutour@xxxxxxxxx> wrote:
Hi all,

I had a problem with the Eigen::Tensor<double,3>.
The segmentation fault happens exactly when I am
moving data from one function to another.

That is I have a
struct RecVar {
   ... some double
   .... some std::string
   ... some int
   ... some Eigen::Matrix
  Eigen::Tensor<double,3> Tens3;
};

When returning the value, we have Tens3 which is unset.
Error that happens is
MERGE_field: /home/mathieu/opt/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h:108: void Eigen::Tensor\
Storage<T, Eigen::DSizes<IndexType, NumIndices_>, Options_>::resize(Eigen::TensorStorage<T, Eigen::DSizes<IndexType, NumIndices_>, Options_>::Index, Eigen::array<IndexType, NumIndices_>&) [with T = double; int Options_ = 0; IndexType = long int; int NumIndices_ = 3; Eigen::TensorStorage<T, Eigen::DSizes<IndexType, NumIndices_>, Options_>::Index = long int; Eigen::array<IndexType, NumIndices_> = std::array<long int, 3ul>]: Assertion `size >= 1' failed.

The backtrack with gdb gives me the error as
#0  0x00000038eb232625 in raise () from /lib64/libc.so.6
#1  0x00000038eb233e05 in abort () from /lib64/libc.so.6
#2  0x00000038eb22b74e in __assert_fail_base () from /lib64/libc.so.6
#3  0x00000038eb22b810 in __assert_fail () from /lib64/libc.so.6
#4  0x000000000046841e in Eigen::Tensor<double, 3, 0, long>::operator=(Eigen::Tensor<double, 3, 0, long> const&) () at /home/mathieu/opt/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h:108
#5  0x0000000000468605 in RecVar::operator=(RecVar&&) () at Basic_Ocean_types.h:12

So, it seems a move operator makes assumptions which are not correct,
though I am not sure. The move operator is the one provided by the compiler
to RecVar which is a POD.

All hints on how to solve it would be appreciated. In particular I am interested
in writing some operator /= for the tensor class just like we have for the matrix
class.

Error happens with gcc 5.1.0 and with gcc 5.3.0. I know it is unsupported,
still any help would be much appreciated.

  Mathieu



--


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/