[tor-commits] [sbws/maint-1.1] fix: scaling: Stop returning 1 as the means minima
juga at torproject.org
juga at torproject.org
Tue Mar 16 14:17:53 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