From 1c8312c811344beaa06f7ae9258f66c38337c607 Mon Sep 17 00:00:00 2001 From: Benoit Steiner Date: Mon, 26 Oct 2015 14:29:26 -0700 Subject: [PATCH] Started to add support for tensors of rank 0 --- unsupported/Eigen/CXX11/src/Tensor/Tensor.h | 31 +++++++++++++++++++ unsupported/Eigen/CXX11/src/Tensor/TensorIO.h | 5 ++- .../CXX11/src/Tensor/TensorInitializer.h | 12 +++++++ .../Eigen/CXX11/src/Tensor/TensorStorage.h | 12 +++++-- 4 files changed, 57 insertions(+), 3 deletions(-) diff --git a/unsupported/Eigen/CXX11/src/Tensor/Tensor.h b/unsupported/Eigen/CXX11/src/Tensor/Tensor.h index 3ac465d24..0df1345c2 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/Tensor.h +++ b/unsupported/Eigen/CXX11/src/Tensor/Tensor.h @@ -140,6 +140,12 @@ class Tensor : public TensorBase= 0 && index < size()); @@ -174,6 +180,12 @@ class Tensor : public TensorBase= 0 && index < size()); @@ -234,6 +246,12 @@ class Tensor : public TensorBase::value == 1) { + static const int rank = internal::array_size::value; + if (rank == 0) { + os << tensor.coeff(0); + } else if (rank == 1) { Map > array(const_cast(tensor.data()), total_size); os << array; } else { diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h b/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h index 4303e3536..ad2a1e6ac 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h @@ -55,6 +55,18 @@ struct Initializer { } }; +template +struct Initializer { + typedef typename traits::Scalar InitList; + + static void run(TensorEvaluator& tensor, + Eigen::array::Index, traits::NumDimensions>*/* indices*/, + const InitList& v) { + tensor.coeffRef(0) = v; + } +}; + + template void initialize_tensor(TensorEvaluator& tensor, const typename Initializer::NumDimensions>::InitList& vals) { diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h b/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h index 9e4cf039d..ee6f14b8f 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h @@ -71,7 +71,11 @@ class TensorStorage, Options_> typedef DSizes Dimensions; typedef TensorStorage, Options_> Self; - EIGEN_DEVICE_FUNC TensorStorage() : m_data(0), m_dimensions() {} + EIGEN_DEVICE_FUNC TensorStorage() : m_data(0), m_dimensions() { + if (NumIndices_ == 0) { + m_data = internal::conditional_aligned_new_auto(1); + } + } EIGEN_DEVICE_FUNC TensorStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_dimensions(internal::template repeat(0)) {} EIGEN_DEVICE_FUNC TensorStorage(Index size, const array& dimensions) @@ -101,13 +105,17 @@ class TensorStorage, Options_> EIGEN_DEVICE_FUNC void resize(Index size, const array& nbDimensions) { + eigen_assert(size >= 1); const Index currentSz = internal::array_prod(m_dimensions); if(size != currentSz) { internal::conditional_aligned_delete_auto(m_data, currentSz); if (size) m_data = internal::conditional_aligned_new_auto(size); - else + else if (NumIndices_ == 0) { + m_data = internal::conditional_aligned_new_auto(1); + } + else m_data = 0; EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN }