From fa52eab5b0a34b9b1d719e2f3024c8ddf8f77388 Mon Sep 17 00:00:00 2001
From: Giovanni La Mura <giovanni.lamura@inaf.it>
Date: Wed, 13 Mar 2024 11:22:03 +0100
Subject: [PATCH] Use adaptive scaling to distinguish between warnings and
 errors

---
 src/scripts/pycompare.py | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/scripts/pycompare.py b/src/scripts/pycompare.py
index 37207017..2add23e6 100755
--- a/src/scripts/pycompare.py
+++ b/src/scripts/pycompare.py
@@ -24,7 +24,7 @@ from math import log10
 from sys import argv
 
 ## \cond
-number_reg = re.compile(r'-?[0-9]\.[0-9]+E[-+][0-9]{2,2}')
+number_reg = re.compile(r'-?[0-9]\.[0-9]+E?[-+][0-9]{2,5}')
 ## \endcond
 
 ## \brief Main execution code
@@ -291,6 +291,18 @@ def mismatch_severities(str_f_values, str_c_values, config):
     result = [0 for ri in range(len(str_f_values))]
     for i in range(len(str_f_values)):
         if (str_f_values[i] != str_c_values[i]):
+            # Add the exponent marker if it is missing
+            temp_str_value = str_f_values[i][1:]
+            split_temp = temp_str_value.split('-')
+            if len(split_temp) > 1:
+                if (split_temp[0][-1] != 'E'):
+                    str_f_values[i] = str_f_values[i][0] + split_temp[0] + "E-" + split_temp[1]
+            temp_str_value = str_c_values[i][1:]
+            split_temp = temp_str_value.split('-')
+            if len(split_temp) > 1:
+                if (split_temp[0][-1] != 'E'):
+                    str_c_values[i] = str_c_values[i][0] + split_temp[0] + "E-" + split_temp[1]
+            # End of missing exponent marker correction
             f_values = [float(str_f_values[j]) for j in range(len(str_f_values))]
             c_values = [float(str_c_values[j]) for j in range(len(str_c_values))]
             if (len(f_values) != len(c_values)): return []
@@ -298,22 +310,27 @@ def mismatch_severities(str_f_values, str_c_values, config):
             c_log_values = [0.0 for j in range(len(c_values))]
             max_f_log = -1.0e12
             max_c_log = -1.0e12
+            min_f_log = 1.0e12
+            min_c_log = 1.0e12
             for j in range(len(f_values)) :
                 if f_values[j] < 0.0: f_values[j] *= -1.0
                 if c_values[j] < 0.0: c_values[j] *= -1.0
                 f_log_values[j] = log10(f_values[j]) if f_values[j] > 0.0 else -999
                 c_log_values[j] = log10(c_values[j]) if c_values[j] > 0.0 else -999
                 if (f_log_values[j] > max_f_log): max_f_log = f_log_values[j]
-                if (c_log_values[j] > max_c_log): max_c_log = f_log_values[j]
+                if (c_log_values[j] > max_c_log): max_c_log = c_log_values[j]
+                if (f_log_values[j] < min_f_log): min_f_log = f_log_values[j]
+                if (c_log_values[j] < min_c_log): min_c_log = c_log_values[j]
             if (c_log_values[i] < max_c_log - 5.0 and f_log_values[i] < max_f_log - 5.0):
                 result[i] = 1
             else:
+                warning_scale = 10.0**(int(max_f_log - f_log_values[i]))
                 difference = c_values[i] - f_values[i]
                 fractional = 1.0
                 if (f_values[i] != 0.0):
                     fractional = difference / f_values[i]
                 if (fractional < 0.0): fractional *= -1.0
-                if (fractional < config['warning_threshold']): result[i] = 2
+                if (fractional < warning_scale * config['warning_threshold']): result[i] = 2
                 else: result[i] = 3
     return result
     
-- 
GitLab