commit a82c26184097bea3ca405ae19773de7c4354a541 Author: juga0 juga@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
tor-commits@lists.torproject.org