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