From 78e1d297bbd4a1b32c0f302dbf6915acde506881 Mon Sep 17 00:00:00 2001 From: ls232920 <laurent.soulier@cea.fr> Date: Thu, 19 Oct 2023 15:47:29 +0000 Subject: [PATCH] [TBV][FUN][MAJ] Tensor extract fix aidge_core#5 fix aidge_core#32 related to aidge_core#38 --- include/aidge/backend/TensorImpl.hpp | 23 ++++++++++++++++------- include/aidge/data/Tensor.hpp | 9 +++++---- src/data/Tensor.cpp | 8 ++++---- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/include/aidge/backend/TensorImpl.hpp b/include/aidge/backend/TensorImpl.hpp index 510e243eb..0f3132c11 100644 --- a/include/aidge/backend/TensorImpl.hpp +++ b/include/aidge/backend/TensorImpl.hpp @@ -45,7 +45,7 @@ public: mvDimensions(i_Dimensions) { assert( - detail::IsAreaValid(i_FirstDataCoordinates, i_Dimensions) + detail::isAreaValid(i_FirstDataCoordinates, i_Dimensions) && "Tensors requested area is invalid"); mScalarSize = detail::sizeOf(mDataType); computeLayout(); @@ -209,7 +209,7 @@ public: && (coordIdx[i] >= mvFirstDataCoordinates[i]) && "Coordinates dimensions does not fit the dimensions of the " "tensor"); - flatIdx += (coordIdx[i] * mvLayout[i]); + flatIdx += ((coordIdx[i] - mvFirstDataCoordinates[i]) * mvLayout[i]); } return flatIdx / mScalarSize; } @@ -373,19 +373,28 @@ protected: mvLayout[0] * mvDimensions[0] == size() * mvLayout[NbDims - 1] && "Error while computing layout"); } - /// Â @brief Copy all the characteristics of a given TensorImpl but not its data - /// @param i_TensorImpl source TensorImpl object - void cloneProperties(TensorImpl const &i_TensorImpl) + /// @brief Copy all the characteristics of a given TensorImpl, except it's area and + /// its data. + /// @param i_TensorImpl source TensorImpl object + /// @note Cloning properties invalidates held data. + void clonePropertiesExceptArea(TensorImpl const &i_TensorImpl) { + Release(); mDataType = i_TensorImpl.mDataType; - /// @warning Copying backend string is ill-defined + /// @todo FIXME Copying backend string is ill-defined mBackend = i_TensorImpl.mBackend; mNbElts = i_TensorImpl.mNbElts; mScalarSize = i_TensorImpl.mScalarSize; + } + /// @brief Copy all the characteristics of a given TensorImpl but not its data + /// @param i_TensorImpl source TensorImpl object + /// @note Cloning properties invalidates held data. + void cloneProperties(TensorImpl const &i_TensorImpl) + { + clonePropertiesExceptArea(i_TensorImpl); mvDimensions = i_TensorImpl.mvDimensions; mvFirstDataCoordinates = i_TensorImpl.mvFirstDataCoordinates; mvLayout = i_TensorImpl.mvLayout; - Release(); } /// Â @brief Release internal storage virtual void Release() = 0; diff --git a/include/aidge/data/Tensor.hpp b/include/aidge/data/Tensor.hpp index baa33d8e9..13af8656d 100644 --- a/include/aidge/data/Tensor.hpp +++ b/include/aidge/data/Tensor.hpp @@ -43,7 +43,7 @@ using ImplPtr_t = std::shared_ptr<TensorImpl>; /// @brief Mandatory function used to release TensorImpl ressource when a Tensor is /// destroyed. /// @param PImpl Referenced TensorImpl to be released -inline void releasePImpl(ImplPtr_t &PImpl) +inline void releasePImpl(ImplPtr_t &PImpl) noexcept { // for a shared_ptr, merely remove a ref PImpl = nullptr; @@ -62,7 +62,7 @@ inline void releasePImpl(ImplPtr_t &PImpl) /// All values must be within Tensors limits. /// @return true if sub-area is included inside the other one, false otherwise. /// @sa Coord_t -bool IsSubTensorIncluded( +bool isSubTensorIncluded( std::vector<Coord_t> const &i_SubFirstDataLogicalCoordinates, std::vector<DimSize_t> const &i_SubDimensions, std::vector<Coord_t> const &i_FirstDataLogicalCoordinates, @@ -77,7 +77,7 @@ bool IsSubTensorIncluded( /// All values must be within Tensors limits. /// @return true for valid area, false otherwise. /// @sa Coord_t -bool IsAreaValid( +bool isAreaValid( std::vector<Coord_t> const &i_FirstDataLogicalCoordinates, std::vector<DimSize_t> const &i_Dimensions); @@ -503,7 +503,8 @@ public: /** * @brief Change the shape of the Tensor object according to the given argument. * @param dims - * @note Current API reset origin coordinates to null values + * @note Current API reset origin coordinates to null values and loses pre-existing + * values */ void resize(const std::vector<DimSize_t> &dims); diff --git a/src/data/Tensor.cpp b/src/data/Tensor.cpp index b9ec6389b..28f90e700 100644 --- a/src/data/Tensor.cpp +++ b/src/data/Tensor.cpp @@ -15,7 +15,7 @@ namespace Aidge { /// @brief Check if a valid area is included in another one. -bool detail::IsSubTensorIncluded( +bool detail::isSubTensorIncluded( std::vector<Coord_t> const &i_SubFirstDataLogicalCoordinates, std::vector<DimSize_t> const &i_SubDimensions, std::vector<Coord_t> const &i_FirstDataLogicalCoordinates, @@ -34,7 +34,7 @@ bool detail::IsSubTensorIncluded( } /// @brief Check if a given area is valid -bool detail::IsAreaValid( +bool detail::isAreaValid( std::vector<Coord_t> const &i_FirstDataLogicalCoordinates, std::vector<DimSize_t> const &i_Dimensions) { @@ -232,10 +232,10 @@ Tensor::Tensor( { assert(otherTensor.hasImpl() && "Trying to make a view inside an incomplete Tensor"); assert( - detail::IsAreaValid(mvActiveAreaOrigin, mDims) + detail::isAreaValid(mvActiveAreaOrigin, mDims) && "Requested active area is invalid"); assert( - detail::IsSubTensorIncluded( + detail::isSubTensorIncluded( mvActiveAreaOrigin, mDims, otherTensor.mvActiveAreaOrigin, otherTensor.mDims) && "Requested active area is not available inside source Tensor"); computeSize(); -- GitLab