[tor-commits] [sbws/master] fix: scaling: Stop returning 1 as the means minima

juga at torproject.org juga at torproject.org
Tue Mar 16 14:19:10 UTC 2021


commit a82c26184097bea3ca405ae19773de7c4354a541
Author: juga0 <juga at riseup.net>
Date:   Wed Mar 10 10:34:56 2021 +0000

    fix: scaling: Stop returning 1 as the means minima
    
    since they are used as the numerator when calculating the ratio and the
    rounding already returns a minimum of 1.
---
 sbws/lib/scaling.py            | 25 ++++++++++++++++++++++++-
 sbws/lib/v3bwfile.py           |  7 +++++--
 tests/unit/lib/test_scaling.py |  2 +-
 3 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/sbws/lib/scaling.py b/sbws/lib/scaling.py
index 4b21e79..2f63886 100644
--- a/sbws/lib/scaling.py
+++ b/sbws/lib/scaling.py
@@ -14,10 +14,13 @@ def bw_filt(bw_measurements):
     It is the equivalent to Torflow's ``filt_sbw``.
     ``mu`` in this function is the equivalent to Torflow's ``sbw``.
     """
+    # It's safe to return 0 here, because:
+    # 1. this value will be the numerator when calculating the ratio.
+    # 2. `kb_round_x_sig_dig` returns a minimum of 1.
     # This should never be the case, as the measurements come from successful
     # results.
     if not bw_measurements:
-        return 1
+        return 0
     # Torflow is rounding to an integer, so is `bw_mean_from_results` in
     # `v3bwfile.py`
     mu = round(mean(bw_measurements))
@@ -25,3 +28,23 @@ def bw_filt(bw_measurements):
     if bws_gte_mean:
         return round(mean(bws_gte_mean))
     return 1
+
+
+def network_means_by_relay_type(bw_lines, router_statuses_d):
+    # Temporarily assign the type of relay to calculate network stream and
+    # filtered bandwidth by type
+    for line in bw_lines:
+        rs = None
+        if router_statuses_d:
+            rs = router_statuses_d.get(line.node_id.replace("$", ""), None)
+        line.set_relay_type(rs_relay_type(rs))
+
+    mu_type = muf_type = {}
+    for rt in RELAY_TYPES:
+        bw_lines_type = [line for line in bw_lines if line.relay_type == rt]
+        if len(bw_lines_type) > 0:
+            # Torflow does not round these values.
+            # Ensure they won't be 0 to avoid division by 0 Exception
+            mu_type[rt] = mean([line.bw_mean for line in bw_lines_type]) or 1
+            muf_type[rt] = mean([line.bw_filt for line in bw_lines_type]) or 1
+    return mu_type, muf_type
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index 362c696..22cf155 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -875,9 +875,12 @@ class V3BWLine(object):
     def bw_mean_from_results(results):
         bws = [dl['amount'] / dl['duration']
                for r in results for dl in r.downloads]
+        # It's safe to return 0 here, because:
+        # 1. this value will be the numerator when calculating the ratio.
+        # 2. `kb_round_x_sig_dig` returns a minimum of 1.
         if bws:
-            return max(round(mean(bws)), 1)
-        return 1
+            return round(mean(bws))
+        return 0
 
     @staticmethod
     def last_time_from_results(results):
diff --git a/tests/unit/lib/test_scaling.py b/tests/unit/lib/test_scaling.py
index 4a02359..e55c2b0 100644
--- a/tests/unit/lib/test_scaling.py
+++ b/tests/unit/lib/test_scaling.py
@@ -18,7 +18,7 @@ def test_bw_filt():
     # When there are no measurements what can not be the case for successful
     # results.
     bw_measurements = []
-    assert 1 == scaling.bw_filt(bw_measurements)
+    assert 0 == scaling.bw_filt(bw_measurements)
 
     bw_measurements = [1, 0]
     # Because rounded to int





More information about the tor-commits mailing list