From 4c3b6ff3fb85b7b474e0c04129a31c1c20942904 Mon Sep 17 00:00:00 2001
From: Christophe Guillon <christophe.guillon@inria.fr>
Date: Wed, 20 Nov 2024 12:05:07 +0100
Subject: [PATCH] fix : Tensor assertion with no implementation on toString()

Set toString() method to always return a valid string even
in the case where the Tensor has no implementaiton or when
the tensor is undefined (i.e. no specified size).
---
 python_binding/data/pybind_Tensor.cpp |  6 +-----
 src/data/Tensor.cpp                   | 11 +++++++----
 unit_tests/data/Test_Tensor.cpp       |  2 +-
 3 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/python_binding/data/pybind_Tensor.cpp b/python_binding/data/pybind_Tensor.cpp
index fc800816b..b972c87dc 100644
--- a/python_binding/data/pybind_Tensor.cpp
+++ b/python_binding/data/pybind_Tensor.cpp
@@ -336,11 +336,7 @@ void init_Tensor(py::module& m){
     .def("cpy_transpose", (void (Tensor::*)(const Tensor& src, const std::vector<DimSize_t>& transpose)) &Tensor::copyTranspose, py::arg("src"), py::arg("transpose"))
 
     .def("__str__", [](Tensor& b) {
-        if (b.empty() && b.undefined()) {
-                return std::string("{}");
-        } else {
-            return b.toString();
-        }
+        return b.toString();
     })
     .def("__repr__", [](Tensor& b) {
         return fmt::format("Tensor(dims = {}, dtype = {})", b.dims(), std::string(EnumStrings<DataType>::data[static_cast<int>(b.dataType())]));
diff --git a/src/data/Tensor.cpp b/src/data/Tensor.cpp
index 6f60d2f15..3dcdcc65d 100644
--- a/src/data/Tensor.cpp
+++ b/src/data/Tensor.cpp
@@ -235,10 +235,11 @@ void Aidge::Tensor::resize(const std::vector<Aidge::DimSize_t>& dims,
 }
 
 std::string Aidge::Tensor::toString() const {
-    AIDGE_ASSERT(
-        mImpl && (undefined() || (dims() == std::vector<DimSize_t>({0})) ||
-                  (mImpl->hostPtr() != nullptr)),
-        "tensor should have a valid host pointer");
+
+    if (!hasImpl() || undefined()) {
+        // Return no value on no implementation or undefined size
+        return std::string("{}");
+    }
 
     // TODO: move lambda elsewhere?
     auto ptrToString = [](DataType dt, void* ptr, std::size_t idx) {
@@ -272,8 +273,10 @@ std::string Aidge::Tensor::toString() const {
     };
 
     if (dims().empty()) {
+        // The Tensor is defined with rank 0, hence scalar
         return ptrToString(mDataType, mImpl->hostPtr(), 0);
     }
+
     std::string res;
     std::size_t dim = 0;
     std::size_t counter = 0;
diff --git a/unit_tests/data/Test_Tensor.cpp b/unit_tests/data/Test_Tensor.cpp
index c313675e1..4462eb91e 100644
--- a/unit_tests/data/Test_Tensor.cpp
+++ b/unit_tests/data/Test_Tensor.cpp
@@ -458,7 +458,7 @@ TEST_CASE("[core/data] Tensor(other)", "[Tensor][extract][zeros][print]") {
     SECTION("Pretty printing for debug") {
         Tensor x{};
         // Empty Tensor
-        REQUIRE_THROWS(x.print());
+        REQUIRE_NOTHROW(x.print());
         // scalar
         x = Tensor(42);
         REQUIRE_NOTHROW(x.print());
-- 
GitLab