From f67869d98a24991442a9c1dbff2b82a235cdc21a Mon Sep 17 00:00:00 2001
From: Olivier BICHLER <olivier.bichler@cea.fr>
Date: Tue, 17 Oct 2023 14:10:07 +0200
Subject: [PATCH] Padding interface change to match ONNX

---
 .../cpu/operator/PadImpl_forward_kernels.hpp  | 22 +++++++++----------
 unit_tests/operator/Test_PadImpl.cpp          | 12 +++++-----
 2 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/include/aidge/backend/cpu/operator/PadImpl_forward_kernels.hpp b/include/aidge/backend/cpu/operator/PadImpl_forward_kernels.hpp
index 1babc3ec..8b793257 100644
--- a/include/aidge/backend/cpu/operator/PadImpl_forward_kernels.hpp
+++ b/include/aidge/backend/cpu/operator/PadImpl_forward_kernels.hpp
@@ -37,8 +37,8 @@ void PadImpl2D_cpu_forward_kernel(const Pad_Op<2>::Attrs &attrs, const std::arra
     const I *input = static_cast<const I *>(input_);
     O *output = static_cast<O *>(output_);
 
-    const std::size_t oySize = dims[2] + std::get<0>(attrs)[0][0] + std::get<0>(attrs)[0][1];
-    const std::size_t oxSize = dims[3] + std::get<0>(attrs)[1][0] + std::get<0>(attrs)[1][1];
+    const std::size_t oySize = dims[2] + std::get<0>(attrs)[0] + std::get<0>(attrs)[1];
+    const std::size_t oxSize = dims[3] + std::get<0>(attrs)[2] + std::get<0>(attrs)[3];
 
     for (std::size_t batch = 0; batch < dims[0]; ++batch) {
         for (std::size_t ch = 0; ch < dims[1]; ++ch) {
@@ -52,22 +52,22 @@ void PadImpl2D_cpu_forward_kernel(const Pad_Op<2>::Attrs &attrs, const std::arra
                     O outputValue = std::get<2>(attrs);
 
                     if (std::get<1>(attrs) == PadBorderType::Constant) {
-                        int ix = static_cast<int>(ox) - static_cast<int>(std::get<0>(attrs)[1][1]);
-                        int iy = static_cast<int>(oy) - static_cast<int>(std::get<0>(attrs)[0][1]);
+                        int ix = static_cast<int>(ox) - static_cast<int>(std::get<0>(attrs)[3]);
+                        int iy = static_cast<int>(oy) - static_cast<int>(std::get<0>(attrs)[1]);
 
                         if (ix >= 0  && ix < static_cast<int>(dims[3]) && iy >= 0  && iy < static_cast<int>(dims[2])) {
                             outputValue = input[iIndex + static_cast<std::size_t>(ix)*dims[2] + static_cast<std::size_t>(iy)];
                         }
                     }
-                    else if (std::get<1>(attrs) == PadBorderType::Replicate) {
-                        int ix = std::max(0, std::min(static_cast<int>(dims[3]) - 1, static_cast<int>(ox) - static_cast<int>(std::get<0>(attrs)[1][1])));
-                        int iy = std::max(0, std::min(static_cast<int>(dims[2]) - 1, static_cast<int>(oy) - static_cast<int>(std::get<0>(attrs)[0][1])));
+                    else if (std::get<1>(attrs) == PadBorderType::Edge) {
+                        int ix = std::max(0, std::min(static_cast<int>(dims[3]) - 1, static_cast<int>(ox) - static_cast<int>(std::get<0>(attrs)[3])));
+                        int iy = std::max(0, std::min(static_cast<int>(dims[2]) - 1, static_cast<int>(oy) - static_cast<int>(std::get<0>(attrs)[1])));
 
                         outputValue = input[iIndex + static_cast<std::size_t>(ix)*dims[2] + static_cast<std::size_t>(iy)];
                     }
                     else if (std::get<1>(attrs) == PadBorderType::Reflect) {
-                        int ix = static_cast<int>(ox) - static_cast<int>(std::get<0>(attrs)[1][1]);
-                        int iy = static_cast<int>(oy) - static_cast<int>(std::get<0>(attrs)[0][1]);
+                        int ix = static_cast<int>(ox) - static_cast<int>(std::get<0>(attrs)[3]);
+                        int iy = static_cast<int>(oy) - static_cast<int>(std::get<0>(attrs)[1]);
 
                         if (ix < 0)
                             ix = 0 - ix;
@@ -81,8 +81,8 @@ void PadImpl2D_cpu_forward_kernel(const Pad_Op<2>::Attrs &attrs, const std::arra
                         outputValue = input[iIndex + static_cast<std::size_t>(ix)*dims[2] + static_cast<std::size_t>(iy)];
                     }
                     else if (std::get<1>(attrs) == PadBorderType::Wrap) {
-                        int ix = (static_cast<int>(dims[3]) + static_cast<int>(ox) - static_cast<int>(std::get<0>(attrs)[1][1])) % static_cast<int>(dims[3]);
-                        int iy = (static_cast<int>(dims[2]) + static_cast<int>(oy) - static_cast<int>(std::get<0>(attrs)[0][1])) % static_cast<int>(dims[2]);
+                        int ix = (static_cast<int>(dims[3]) + static_cast<int>(ox) - static_cast<int>(std::get<0>(attrs)[3])) % static_cast<int>(dims[3]);
+                        int iy = (static_cast<int>(dims[2]) + static_cast<int>(oy) - static_cast<int>(std::get<0>(attrs)[1])) % static_cast<int>(dims[2]);
 
                         outputValue = input[iIndex + static_cast<std::size_t>(ix)*dims[2] + static_cast<std::size_t>(iy)];
                     }
diff --git a/unit_tests/operator/Test_PadImpl.cpp b/unit_tests/operator/Test_PadImpl.cpp
index f40b62fa..0799aefa 100644
--- a/unit_tests/operator/Test_PadImpl.cpp
+++ b/unit_tests/operator/Test_PadImpl.cpp
@@ -24,7 +24,7 @@ TEST_CASE("[cpu/operator] Pad(forward)") {
     SECTION("Symmetric Pad") {
         const int pv = 0; // pad value
 
-        std::shared_ptr<Node> myPad = Pad({{1, 1}, {1, 1}}, "mypad", PadBorderType::Constant, static_cast<double>(pv));
+        std::shared_ptr<Node> myPad = Pad({1, 1, 1, 1}, "mypad", PadBorderType::Constant, static_cast<double>(pv));
         myPad->getOperator()->setDatatype(DataType::Int32);
         myPad->getOperator()->setBackend("cpu");
         std::shared_ptr<Tensor> myInput = std::make_shared<Tensor>(Array4D<int,2,3,5,5> { //NCHW
@@ -134,7 +134,7 @@ TEST_CASE("[cpu/operator] Pad(forward)") {
     SECTION("Asymmetric Pad") {
         const int pv = 0; // pad value
 
-        std::shared_ptr<Node> myPad = Pad({{1, 0}, {0, 1}}, "mypad", PadBorderType::Constant, static_cast<double>(pv));
+        std::shared_ptr<Node> myPad = Pad({1, 0, 0, 1}, "mypad", PadBorderType::Constant, static_cast<double>(pv));
         myPad->getOperator()->setDatatype(DataType::Int32);
         myPad->getOperator()->setBackend("cpu");
         std::shared_ptr<Tensor> myInput = std::make_shared<Tensor>(Array4D<int,2,3,5,5> { //NCHW
@@ -235,8 +235,8 @@ TEST_CASE("[cpu/operator] Pad(forward)") {
         REQUIRE(*(myPad->getOperator()->getOutput(0)) == *myOutput);
     }
 
-    SECTION("Pad Replicate") {
-        std::shared_ptr<Node> myPad = Pad({{1, 1}, {1, 1}}, "mypad", PadBorderType::Replicate);
+    SECTION("Pad Edge") {
+        std::shared_ptr<Node> myPad = Pad({1, 1, 1, 1}, "mypad", PadBorderType::Edge);
         myPad->getOperator()->setDatatype(DataType::Int32);
         myPad->getOperator()->setBackend("cpu");
         std::shared_ptr<Tensor> myInput = std::make_shared<Tensor>(Array4D<int,2,3,5,5> { //NCHW
@@ -344,7 +344,7 @@ TEST_CASE("[cpu/operator] Pad(forward)") {
     }
 
     SECTION("Pad Reflect") {
-        std::shared_ptr<Node> myPad = Pad({{1, 1}, {1, 1}}, "mypad", PadBorderType::Reflect);
+        std::shared_ptr<Node> myPad = Pad({1, 1, 1, 1}, "mypad", PadBorderType::Reflect);
         myPad->getOperator()->setDatatype(DataType::Int32);
         myPad->getOperator()->setBackend("cpu");
         std::shared_ptr<Tensor> myInput = std::make_shared<Tensor>(Array4D<int,2,3,5,5> { //NCHW
@@ -460,7 +460,7 @@ TEST_CASE("[cpu/operator] Pad(forward)") {
     }
 
     SECTION("Pad Wrap") {
-        std::shared_ptr<Node> myPad = Pad({{1, 1}, {1, 1}}, "mypad", PadBorderType::Wrap);
+        std::shared_ptr<Node> myPad = Pad({1, 1, 1, 1}, "mypad", PadBorderType::Wrap);
         myPad->getOperator()->setDatatype(DataType::Int32);
         myPad->getOperator()->setBackend("cpu");
         std::shared_ptr<Tensor> myInput = std::make_shared<Tensor>(Array4D<int,2,3,5,5> { //NCHW
-- 
GitLab