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