Re: [eigen] Tensor Module: Index mapping support (PATCH) |
[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]
Here is the patch I came up with today to incorporate the
CustomIndex type I used SFINAE for the new template function to be choosen correctly. ( needed some is_base_of meta, which I dont know if this is good) but as far as I understood is the standart indices type -> array<Index,NumIndices> (I checked the compiler fully optimizes out the additional conversion: http://pastebin.com/n1pnbAUf I only added this to the Tensor class, not the TensorBase, I thought before adapting also the other stuff, it would be good if you would look over it and check if that "try" is of any use :-) I am not new to Eigen, but not aware of all the little nitty gritty details :-) Please have a look at the patch and the added test : cxx11_tensor_customIndex.cpp Is that appropriate? Should the conversion (with SFINAE) also be applied to all other stuff in TensorBase like reduce , stride .... etc... some functions are already tempalted on a generic IndexType or Dimension ... ? Have a look at the comment on line 433 in Tensor.h , is this overload needed? Thanks! BR Gabriel On 10/08/2015 07:49 PM, Benoit Steiner
wrote:
|
# HG changeset patch # User Gabriel Nützi <gnuetzi@xxxxxx> # Date 1444410608 -7200 # Fri Oct 09 19:10:08 2015 +0200 # Node ID d12a137840741d6eae7eea1ce419c36ee8db1e7a # Parent da340856f99bca9b46b6e6c3fca46f4a0b31e884 name changes 2 user: Gabriel Nützi <gnuetzi@xxxxxx> branch 'default' changed unsupported/Eigen/CXX11/src/Tensor/Tensor.h changed unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h diff --git a/unsupported/Eigen/CXX11/src/Tensor/Tensor.h b/unsupported/Eigen/CXX11/src/Tensor/Tensor.h --- a/unsupported/Eigen/CXX11/src/Tensor/Tensor.h +++ b/unsupported/Eigen/CXX11/src/Tensor/Tensor.h @@ -129,17 +129,17 @@ class Tensor : public TensorBase<Tensor< } // custom indices template<typename CustomIndices, EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::value) ) > EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(const CustomIndices & indices) const { - return coeff(internal::CustomIndices2Array<Index,NumIndices>(indices)); + return coeff(internal::customIndices2Array<Index,NumIndices>(indices)); } EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const { eigen_internal_assert(index >= 0 && index < size()); return m_storage.data()[index]; @@ -163,17 +163,17 @@ class Tensor : public TensorBase<Tensor< } // custom indices template<typename CustomIndices, EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::value) ) > EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(const CustomIndices & indices) { - return coeffRef(internal::CustomIndices2Array<Index,NumIndices>(indices)); + return coeffRef(internal::customIndices2Array<Index,NumIndices>(indices)); } EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) { eigen_internal_assert(index >= 0 && index < size()); return m_storage.data()[index]; } @@ -211,17 +211,17 @@ class Tensor : public TensorBase<Tensor< // custom indices template<typename CustomIndices, EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::value) ) > EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(const CustomIndices & indices) const { //eigen_assert(checkIndexRange(indices)); /* already in coeff */ - return coeff(internal::CustomIndices2Array<Index,NumIndices>(indices)); + return coeff(internal::customIndices2Array<Index,NumIndices>(indices)); } // normal indices EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(const array<Index, NumIndices>& indices) const { //eigen_assert(checkIndexRange(indices)); /* already in coeff */ return coeff(indices); } @@ -279,17 +279,17 @@ class Tensor : public TensorBase<Tensor< // custom indices template<typename CustomIndices, EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::value) ) > EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(const CustomIndices & indices) { //eigen_assert(checkIndexRange(indices)); /* already in coeff */ - return coeffRef(internal::CustomIndices2Array<Index,NumIndices>(indices)); + return coeffRef(internal::customIndices2Array<Index,NumIndices>(indices)); } EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index index) { eigen_assert(index >= 0 && index < size()); return coeffRef(index); } @@ -354,17 +354,17 @@ class Tensor : public TensorBase<Tensor< { EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED } /** Custom Dimension (delegating constructor c++11) */ template<typename CustomDimension, EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomDimension>::value) ) > - inline explicit Tensor(const CustomDimension & dimensions) : Tensor(internal::CustomIndices2Array<Index,NumIndices>(dimensions)) + inline explicit Tensor(const CustomDimension & dimensions) : Tensor(internal::customIndices2Array<Index,NumIndices>(dimensions)) {} template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(const TensorBase<OtherDerived, ReadOnlyAccessors>& other) { typedef TensorAssignOp<Tensor, const OtherDerived> Assign; Assign assign(*this, other.derived()); @@ -441,17 +441,17 @@ class Tensor : public TensorBase<Tensor< /** Custom Dimension */ template<typename CustomDimension, EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomDimension>::value) ) > EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(const CustomDimension & dimensions) { //eigen_assert(checkIndexRange(indices)); /* already in coeff */ - return coeffRef(internal::CustomIndices2Array<Index,NumIndices>(dimensions)); + return coeffRef(internal::customIndices2Array<Index,NumIndices>(dimensions)); } #ifndef EIGEN_EMULATE_CXX11_META_H template <typename std::ptrdiff_t... Indices> EIGEN_DEVICE_FUNC void resize(const Sizes<Indices...>& dimensions) { array<Index, NumIndices> dims; diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h b/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h --- a/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h @@ -88,25 +88,25 @@ bool operator!=(const Tuple<U, V>& x, co namespace internal{ template<typename IndexType, Index... Is> EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - array<Index,sizeof...(Is)> customIndex2Array(const IndexType & idx, numeric_list<Index,Is...>) { + array<Index,sizeof...(Is)> customIndices2Array(const IndexType & idx, numeric_list<Index,Is...>) { return { idx(Is)... }; } /** Make an array (for index/dimensions) out of a custom index */ template<typename Index, int NumIndices, typename IndexType> EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - array<Index,NumIndices> customIndex2Array(const IndexType & idx) { - return customIndex2Array(idx, typename gen_numeric_list<Index,NumIndices>::type{}); + array<Index,NumIndices> customIndices2Array(const IndexType & idx) { + return customIndices2Array(idx, typename gen_numeric_list<Index,NumIndices>::type{}); } template <typename B, typename D> struct is_base_of { typedef char (&yes)[1];
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |