Eigen Tensor contraction with Autodiff causes Segmentation Error

93 Views Asked by At

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:

  1. 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;
     }
    
  2. 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

0

There are 0 best solutions below