From e1f2e4029a063ea744e193ee8d72c2bee9dffcae Mon Sep 17 00:00:00 2001
From: Thibault Hallouin <thibault.hallouin@inrae.fr>
Date: Wed, 19 Apr 2023 17:42:21 +0200
Subject: [PATCH] fix bug in generating masks from conditions due to NaN in
 series

`xt::median` and `xt::quantile` are not NaN-proof, and do not have
equivalent NaN functions (like `xt::mean` and `xt::nanmean`) so
it required a filter to drop the NaN before computing the corresponding
condition value
---
 include/evalhyd/detail/masks.hpp | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/include/evalhyd/detail/masks.hpp b/include/evalhyd/detail/masks.hpp
index a0706c5..d1d503e 100644
--- a/include/evalhyd/detail/masks.hpp
+++ b/include/evalhyd/detail/masks.hpp
@@ -232,17 +232,29 @@ namespace evalhyd
                         {
                             return std::stod(num);
                         }
-                        else if (str == "median")
-                        {
-                            return xt::median(q);
-                        }
-                        else if (str == "mean")
-                        {
-                            return xt::mean(q)();
-                        }
-                        else  // (str == "qtl")
+                        else
                         {
-                            return xt::quantile(q, {std::stod(num)})();
+                            auto q_filtered = xt::filter(q, !xt::isnan(q));
+
+                            if (q_filtered.size() > 0)
+                            {
+                                if (str == "median")
+                                {
+                                    return xt::median(q_filtered);
+                                }
+                                else if (str == "mean")
+                                {
+                                    return xt::mean(q_filtered)();
+                                }
+                                else  // (str == "qtl")
+                                {
+                                    return xt::quantile(q_filtered, {std::stod(num)})();
+                                }
+                            }
+                            else
+                            {
+                                return double(NAN);
+                            }
                         }
                     };
 
-- 
GitLab