From bd4e2a314d67a125fcc7eba63116dccd719f1653 Mon Sep 17 00:00:00 2001
From: Andre Anjos <andre.dos.anjos@gmail.com>
Date: Wed, 22 Jul 2020 15:11:49 +0200
Subject: [PATCH] [utils.measure] Return tuple instead of list for base
 measures;  Formalize special by-zero division

---
 bob/ip/binseg/utils/measure.py | 24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/bob/ip/binseg/utils/measure.py b/bob/ip/binseg/utils/measure.py
index 3871f695..84eb811c 100644
--- a/bob/ip/binseg/utils/measure.py
+++ b/bob/ip/binseg/utils/measure.py
@@ -28,6 +28,12 @@ class SmoothedValue:
         return d.mean().item()
 
 
+def tricky_division(n, d):
+    """Divides n by d.  Returns 0.0 in case of a division by zero"""
+
+    return n/(d+(d==0))
+
+
 def base_measures(tp, fp, tn, fn):
     """Calculates measures from true/false positive and negative counts
 
@@ -105,16 +111,14 @@ def base_measures(tp, fp, tn, fn):
 
     """
 
-    tp = float(tp)
-    tn = float(tn)
-    precision = tp / (tp + fp + ((tp + fp) == 0))
-    recall = tp / (tp + fn + ((tp + fn) == 0))
-    specificity = tn / (fp + tn + ((fp + tn) == 0))
-    accuracy = (tp + tn) / (tp + fp + fn + tn)
-    jaccard = tp / (tp + fp + fn + ((tp + fp + fn) == 0))
-    f1_score = (2.0 * tp) / (2.0 * tp + fp + fn + ((2.0 * tp + fp + fn) == 0))
-    # f1_score = (2.0 * precision * recall) / (precision + recall)
-    return [precision, recall, specificity, accuracy, jaccard, f1_score]
+    return (
+            tricky_division(tp, tp + fp),                #precision
+            tricky_division(tp, tp + fn),                #recall
+            tricky_division(tn, fp + tn),                #specificity
+            tricky_division(tp + tn, tp + fp + fn + tn), #accuracy
+            tricky_division(tp, tp + fp + fn),           #jaccard index
+            tricky_division(2*tp, (2*tp) + fp + fn),     #f1-score
+            )
 
 
 def auc(x, y):
-- 
GitLab