diff --git a/include/aidge/backend/TensorImpl.hpp b/include/aidge/backend/TensorImpl.hpp index 510e243eba684bda3c43eaf49dbeae639da8f7c9..0f3132c118f1e67bac530a6dfb74d0dbacf03eb1 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 baa33d8e91197894fcbc7081f5acc2f42c5d4a46..13af8656d83031175f0dc7f47efb8eddcfa31cfb 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 b9ec6389b2379f30b9168da12e72e362e0276662..28f90e7002f74df662f467c3a7713d700070bb67 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();