I'm getting a segmentation fault when trying to use tensor contractions combined with the autodiff module. This is my minimal reproducible example:
#include <unsupported/Eigen/CXX11/Tensor>
#include <unsupported/Eigen/AutoDiff>
typedef typename Eigen::AutoDiffScalar<Eigen::VectorXf> AutoDiff_T;
typedef typename Eigen::Tensor<AutoDiff_T, 2>::DimensionPair DimPair;
int main(int, char **)
{
Eigen::Tensor<AutoDiff_T, 2> X(2, 2);
Eigen::Tensor<AutoDiff_T, 2> W(2, 2);
const int size = X.size() + W.size();
X(0, 0).value() = 1.f;
X(0, 0).derivatives() = Eigen::VectorXf::Unit(size, 0);
X(1, 0).value() = 1.f;
X(1, 0).derivatives() = Eigen::VectorXf::Unit(size, 1);
X(0, 1).value() = 1.f;
X(0, 1).derivatives() = Eigen::VectorXf::Unit(size, 2);
X(1, 1).value() = 1.f;
X(1, 1).derivatives() = Eigen::VectorXf::Unit(size, 3);
W(0, 0).value() = 1.f;
W(0, 0).derivatives() = Eigen::VectorXf::Unit(size, 4);
W(1, 0).value() = 1.f;
W(1, 0).derivatives() = Eigen::VectorXf::Unit(size, 5);
W(0, 1).value() = 1.f;
W(0, 1).derivatives() = Eigen::VectorXf::Unit(size, 6);
W(1, 1).value() = 1.f;
W(1, 1).derivatives() = Eigen::VectorXf::Unit(size, 7);
Eigen::array<DimPair, 1> dims;
dims[0] = DimPair(1, 0);
Eigen::Tensor<AutoDiff_T, 2> Z = X.contract(W, dims);
return 0;
}
I'm using GCC 11 on ubuntu:
$ uname -a
Linux delegion 6.2.0-31-generic #31~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Aug 16 13:45:26 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
$ g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
And compiling with:
g++ example_1.cpp -fsanitize=address -o example_1 -I/eigen/
By running the program, the sanitizer outputs:
AddressSanitizer:DEADLYSIGNAL
=================================================================
==9912==ERROR: AddressSanitizer: SEGV on unknown address (pc 0x563e8bc52c23 bp 0x7ffee40b1050 sp 0x7ffee40b1030 T0)
==9912==The signal is caused by a READ memory access.
==9912==Hint: this fault was caused by a dereference of a high value address (see register values below). Dissassemble the provided pc to learn which register was used.
#0 0x563e8bc52c23 in Eigen::internal::handmade_aligned_free(void*) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x6c23)
#1 0x563e8bc52ce0 in Eigen::internal::aligned_free(void*) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x6ce0)
#2 0x563e8bc570ee in void Eigen::internal::conditional_aligned_free<true>(void*) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xb0ee)
#3 0x563e8bc5a0a2 in void Eigen::internal::conditional_aligned_delete_auto<float, true>(float*, unsigned long) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xe0a2)
#4 0x563e8bcba886 in Eigen::DenseStorage<float, -1, -1, 1, 0>::resize(long, long, long) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x6e886)
#5 0x563e8bc60a80 in Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >::resize(long, long) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x14a80)
#6 0x563e8bcda3a2 in void Eigen::internal::resize_if_allowed<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, float, float>(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, Eigen::internal::assign_op<float, float> const&) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x8e3a2)
#7 0x563e8bcd20b9 in void Eigen::internal::call_dense_assignment_loop<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::internal::assign_op<float, float> >(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, Eigen::internal::assign_op<float, float> const&) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x860b9)
#8 0x563e8bcc1179 in Eigen::internal::Assignment<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::internal::assign_op<float, float>, Eigen::internal::Dense2Dense, void>::run(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, Eigen::internal::assign_op<float, float> const&) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x75179)
#9 0x563e8bcba6e8 in void Eigen::internal::call_assignment_no_alias<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::internal::assign_op<float, float> >(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, Eigen::internal::assign_op<float, float> const&) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x6e6e8)
#10 0x563e8bc6090c in void Eigen::internal::call_assignment<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::internal::assign_op<float, float> >(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, Eigen::internal::assign_op<float, float> const&, std::enable_if<!Eigen::internal::evaluator_assume_aliasing<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::internal::evaluator_traits<Eigen::Matrix<float, -1, 1, 0, -1, 1> >::Shape>::value, void*>::type) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x1490c)
#11 0x563e8bc5b901 in void Eigen::internal::call_assignment<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xf901)
#12 0x563e8bc5af74 in Eigen::Matrix<float, -1, 1, 0, -1, 1>& Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >::_set<Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xef74)
#13 0x563e8bc5a78a in Eigen::Matrix<float, -1, 1, 0, -1, 1>::operator=(Eigen::Matrix<float, -1, 1, 0, -1, 1> const&) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xe78a)
#14 0x563e8bc59ee0 in Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >::operator=(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xdee0)
#15 0x563e8bcd4eb4 in void Eigen::internal::pstore<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> > >(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*, Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x88eb4)
#16 0x563e8bcc3a2e in Eigen::internal::gemm_pack_lhs<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, Eigen::internal::TensorContractionSubMapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 1, Eigen::TensorEvaluator<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::DefaultDevice>, std::array<long, 1ul>, std::array<long, 1ul>, 1, true, false, 0, Eigen::MakePointer>, 2, 1, Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 0, false, false>::operator()(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*, Eigen::internal::TensorContractionSubMapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 1, Eigen::TensorEvaluator<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::DefaultDevice>, std::array<long, 1ul>, std::array<long, 1ul>, 1, true, false, 0, Eigen::MakePointer> const&, long, long, long, long) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x77a2e)
#17 0x563e8bcbd11e in Eigen::internal::TensorContractionKernel<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, Eigen::internal::blas_data_mapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 0, 0, 1>, Eigen::internal::TensorContractionInputMapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 1, Eigen::TensorEvaluator<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::DefaultDevice>, std::array<long, 1ul>, std::array<long, 1ul>, 1, true, false, 0, Eigen::MakePointer>, Eigen::internal::TensorContractionInputMapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 0, Eigen::TensorEvaluator<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::DefaultDevice>, std::array<long, 1ul>, std::array<long, 1ul>, 1, true, false, 0, Eigen::MakePointer> >::packLhs(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >**, Eigen::internal::TensorContractionSubMapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 1, Eigen::TensorEvaluator<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::DefaultDevice>, std::array<long, 1ul>, std::array<long, 1ul>, 1, true, false, 0, Eigen::MakePointer> const&, long, long) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x7111e)
#18 0x563e8bc769c3 in void Eigen::TensorContractionEvaluatorBase<Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice> >::evalGemmPartial<true, true, false, 0, true>(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*, long, long, int) const (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x2a9c3)
#19 0x563e8bc5cfcc in void Eigen::TensorContractionEvaluatorBase<Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice> >::evalGemm<true, true, false, 0>(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) const (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x10fcc)
#20 0x563e8bc5b558 in void Eigen::TensorContractionEvaluatorBase<Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice> >::evalProductSequential<true, true, false, 0>(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) const (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xf558)
#21 0x563e8bc5ad71 in void Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice>::evalProduct<0>(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) const (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xed71)
#22 0x563e8bc5a67c in Eigen::TensorContractionEvaluatorBase<Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice> >::evalTo(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) const (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xe67c)
#23 0x563e8bc59c46 in Eigen::TensorContractionEvaluatorBase<Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice> >::evalSubExprsIfNeeded(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xdc46)
#24 0x563e8bc578e8 in Eigen::TensorEvaluator<Eigen::TensorAssignOp<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long>, Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const> const, Eigen::DefaultDevice>::evalSubExprsIfNeeded(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xb8e8)
#25 0x563e8bc56d7c in Eigen::internal::TensorExecutor<Eigen::TensorAssignOp<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long>, Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const> const, Eigen::DefaultDevice, false, (Eigen::internal::TiledEvaluation)0>::run(Eigen::TensorAssignOp<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long>, Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const> const&, Eigen::DefaultDevice const&) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xad7c)
#26 0x563e8bc56362 in Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long>::Tensor<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> >(Eigen::TensorBase<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const>, 0> const&) (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0xa362)
#27 0x563e8bc5261d in main (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x661d)
#28 0x7fe98b429d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#29 0x7fe98b429e3f in __libc_start_main_impl ../csu/libc-start.c:392
#30 0x563e8bc515c4 in _start (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x55c4)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/home/doleron/book-workspace/eigen_autodiff_SEGV/example_1+0x6c23) in Eigen::internal::handmade_aligned_free(void*)
==9912==ABORTING
I'm not sure if I'm doing something wrong in my test case or if there exist an actual bug in Eigen. To get more insight, I tested two other scenarios which run without cause segmentation errors:
Running the contraction without autodiff:
#include <unsupported/Eigen/CXX11/Tensor> typedef typename Eigen::Tensor<float, 2>::DimensionPair DimPair; int main(int, char **) { Eigen::Tensor<float, 2> X(2, 2); Eigen::Tensor<float, 2> W(2, 2); const int size = X.size() + W.size(); X(0, 0) = 1.f; X(1, 0) = 1.f; X(0, 1) = 1.f; X(1, 1) = 1.f; W(0, 0) = 1.f; W(1, 0) = 1.f; W(0, 1) = 1.f; W(1, 1) = 1.f; Eigen::array<DimPair, 1> dims; dims[0] = DimPair(1, 0); Eigen::Tensor<float, 2> Z = X.contract(W, dims); return 0; }Running convolution with autodiff:
#include <unsupported/Eigen/CXX11/Tensor> #include <unsupported/Eigen/AutoDiff> typedef typename Eigen::AutoDiffScalar<Eigen::VectorXf> AutoDiff_T; typedef typename Eigen::Tensor<AutoDiff_T, 2>::DimensionPair DimPair; int main(int, char **) { Eigen::Tensor<AutoDiff_T, 2> X(2, 2); Eigen::Tensor<AutoDiff_T, 2> W(2, 2); const int size = X.size() + W.size(); X(0, 0).value() = 1.f; X(0, 0).derivatives() = Eigen::VectorXf::Unit(size, 0); X(1, 0).value() = 1.f; X(1, 0).derivatives() = Eigen::VectorXf::Unit(size, 1); X(0, 1).value() = 1.f; X(0, 1).derivatives() = Eigen::VectorXf::Unit(size, 2); X(1, 1).value() = 1.f; X(1, 1).derivatives() = Eigen::VectorXf::Unit(size, 3); W(0, 0).value() = 1.f; W(0, 0).derivatives() = Eigen::VectorXf::Unit(size, 4); W(1, 0).value() = 1.f; W(1, 0).derivatives() = Eigen::VectorXf::Unit(size, 5); W(0, 1).value() = 1.f; W(0, 1).derivatives() = Eigen::VectorXf::Unit(size, 6); W(1, 1).value() = 1.f; W(1, 1).derivatives() = Eigen::VectorXf::Unit(size, 7); Eigen::array<ptrdiff_t, 2> dims({0, 1}); Eigen::Tensor<AutoDiff_T, 2> Z = X.convolve(W, dims); return 0; }
In these last cases, the programs successful ran without errors.
Can someone point out what I'm doing wrong? Or is it a bug in Eigen Tensor/Autodiff modules?
PS.: I opened an issue on Eigen gitlab repository as well: https://gitlab.com/libeigen/eigen/-/issues/2714