[tor-commits] [metrics-tasks/master] Display all five path selection probabilities (#6329).

karsten at torproject.org karsten at torproject.org
Fri Jul 20 14:00:01 UTC 2012


commit 4c9568f88b012aefa183b918555e50b4f725e591
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Fri Jul 20 14:46:54 2012 +0200

    Display all five path selection probabilities (#6329).
---
 task-6329/tor-relays-stats.py |   67 ++++++++++++++++++++++++++++-------------
 1 files changed, 46 insertions(+), 21 deletions(-)

diff --git a/task-6329/tor-relays-stats.py b/task-6329/tor-relays-stats.py
index 038a22d..4d10488 100755
--- a/task-6329/tor-relays-stats.py
+++ b/task-6329/tor-relays-stats.py
@@ -54,10 +54,15 @@ class RelayStats(object):
     def format_and_sort_groups(self, grouped_relays, by_country=False, by_as_number=False):
         formatted_groups = {}
         for group in grouped_relays.viewvalues():
-            group_consensus_weight_fraction = 0
+            group_weights = (0, 0, 0, 0, 0)
             relays_in_group = 0
             for relay in group:
-                group_consensus_weight_fraction += relay.get('consensus_weight_fraction', 0)
+                weights = (relay.get('consensus_weight_fraction', 0),
+                           relay.get('advertised_bandwidth_fraction', 0),
+                           relay.get('guard_probability', 0),
+                           relay.get('middle_probability', 0),
+                           relay.get('exit_probability', 0))
+                group_weights = tuple(sum(x) for x in zip(group_weights, weights))
                 nickname = relay['nickname']
                 fingerprint = relay['fingerprint']
                 exit = 'Exit' if 'Exit' in set(relay['flags']) else ''
@@ -67,8 +72,8 @@ class RelayStats(object):
                 as_name = relay.get('as_name', '')
                 relays_in_group += 1
             if by_country or by_as_number:
-                nickname = "*"
-                fingerprint = "*            %5d relays" % relays_in_group
+                nickname = "(%d relays)" % relays_in_group
+                fingerprint = "*"
                 exit = "*"
                 guard = "*"
             if by_country and not by_as_number:
@@ -76,28 +81,48 @@ class RelayStats(object):
                 as_name = "*"
             if by_as_number and not by_country:
                 country = "*"
-            formatted_group = "%8.4f%% %-19s %-40s %-4s %-5s %-2s %-9s %s" % (
-                              group_consensus_weight_fraction * 100.0, nickname, fingerprint,
+            formatted_group = "%8.4f%% %8.4f%% %8.4f%% %8.4f%% %8.4f%% %-19s %-40s %-4s %-5s %-2s %-9s %s" % (
+                              group_weights[0] * 100.0,
+                              group_weights[1] * 100.0,
+                              group_weights[2] * 100.0,
+                              group_weights[3] * 100.0,
+                              group_weights[4] * 100.0,
+                              nickname, fingerprint,
                               exit, guard, country, as_number, as_name)
-            formatted_groups[formatted_group] = group_consensus_weight_fraction
+            formatted_groups[formatted_group] = group_weights
         sorted_groups = sorted(formatted_groups.iteritems(), key=operator.itemgetter(1))
         sorted_groups.reverse()
         return sorted_groups
 
-    def print_groups(self, sorted_groups, count=10):
-        print "       CW Nickname            Fingerprint                              Exit Guard CC AS_num    AS_name"
-        for formatted_group, _ in sorted_groups[:count]:
+    def print_groups(self, sorted_groups, count=10, by_country=False, by_as_number=False):
+        print "       CW    adv_bw   P_guard  P_middle    P_exit Nickname            Fingerprint                              Exit Guard CC AS_num    AS_name"
+
+        for formatted_group, weight in sorted_groups[:count]:
             print formatted_group
         if len(sorted_groups) > count:
-            other_consensus_weight_fraction = 0
-            for _, weight in sorted_groups[count:]:
-                other_consensus_weight_fraction += weight
-            print "%8.4f%% (%d others)" % (other_consensus_weight_fraction * 100.0, len(sorted_groups) - count)
-        selection_consensus_weight_fraction = 0
-        for _, weight in sorted_groups:
-            selection_consensus_weight_fraction += weight
-        if selection_consensus_weight_fraction < 0.999:
-            print "%8.4f%% (total in selection)" % (selection_consensus_weight_fraction * 100.0)
+            if by_country and by_as_number:
+                type = "countries and ASes"
+            elif by_country:
+                type = "countries"
+            elif by_as_number:
+                type = "ASes"
+            else:
+                type = "relays"
+            other_weights = (0, 0, 0, 0, 0)
+            for _, weights in sorted_groups[count:]:
+                other_weights = tuple(sum(x) for x in zip(other_weights, weights))
+            print "%8.4f%% %8.4f%% %8.4f%% %8.4f%% %8.4f%% (%d other %s)" % (
+                  other_weights[0] * 100.0, other_weights[1] * 100.0,
+                  other_weights[2] * 100.0, other_weights[3] * 100.0,
+                  other_weights[4] * 100.0, len(sorted_groups) - count, type)
+        selection_weights = (0, 0, 0, 0, 0)
+        for _, weights in sorted_groups:
+            selection_weights = tuple(sum(x) for x in zip(selection_weights, weights))
+        if selection_weights[0] < 0.999:
+            print "%8.4f%% %8.4f%% %8.4f%% %8.4f%% %8.4f%% (total in selection)" % (
+                  selection_weights[0] * 100.0, selection_weights[1] * 100.0,
+                  selection_weights[2] * 100.0, selection_weights[3] * 100.0,
+                  selection_weights[4] * 100.0)
 
     def output_countries(self, count='10', flags=''):
         count = int(count)
@@ -105,7 +130,7 @@ class RelayStats(object):
         relays = self.get_relays(flags)
         grouped_relays = self.group_relays(relays, by_country=True)
         sorted_groups = self.format_and_sort_groups(grouped_relays, by_country=True)
-        self.print_groups(sorted_groups, count)
+        self.print_groups(sorted_groups, count, by_country=True)
 
     def output_as_sets(self, count='10', flags='', countries=''):
         count = int(count)
@@ -113,7 +138,7 @@ class RelayStats(object):
         relays = self.get_relays(flags, countries)
         grouped_relays = self.group_relays(relays, by_as_number=True)
         sorted_groups = self.format_and_sort_groups(grouped_relays, by_as_number=True)
-        self.print_groups(sorted_groups, count)
+        self.print_groups(sorted_groups, count, by_as_number=True)
 
     def output_relays(self, count='10', flags='', countries='', as_sets=''):
         count = int(count)





More information about the tor-commits mailing list