From cd824d73919d0204fba052c18dd4e3da5c23ee9f Mon Sep 17 00:00:00 2001
From: NAUD Maxence <maxence.naud@cea.fr>
Date: Mon, 31 Mar 2025 15:26:45 +0200
Subject: [PATCH] fix: move back 'castFromFloat' function in
 GloabalAvgPoolingImpl_kernel as 'static_cast' truncates and does not round as
 intended

---
 .../operator/GlobalAveragePoolingImpl_kernels.hpp  | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_kernels.hpp b/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_kernels.hpp
index 40dd3a69..cbe4f110 100644
--- a/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_kernels.hpp
+++ b/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_kernels.hpp
@@ -43,6 +43,18 @@ static stableMean(const T* vec, std::size_t size) {
     return mean;
 }
 
+template <typename T>
+typename std::enable_if_t<std::is_floating_point<T>::value, T>
+static castFromFloat(T value) {
+    return value;
+}
+
+template <typename T>
+typename std::enable_if_t<!std::is_floating_point<T>::value, T>
+static castFromFloat(double value) {
+    return static_cast<T>(std::nearbyint(value));
+}
+
 template <DataType DT_I, DataType DT_O = DT_I>
 void GlobalAveragePoolingImpl_cpu_forward_kernel(const std::shared_ptr<Tensor>& inputTensor, void *output_) {
 
@@ -61,7 +73,7 @@ void GlobalAveragePoolingImpl_cpu_forward_kernel(const std::shared_ptr<Tensor>&
     std::size_t output_idx = 0;
     for (DimSize_t batch = 0; batch < dims[0]; ++batch) {
         for (DimSize_t channel = 0; channel < dims[1]; ++channel) {
-            output[output_idx++] = static_cast<O>(stableMean<I>(input + input_idx, strides_channels));
+            output[output_idx++] = castFromFloat<O>(stableMean<I>(input + input_idx, strides_channels));
             input_idx += strides_channels;
         }
     }
-- 
GitLab