[tor-commits] [compass/master] Cleaned up the select_relays function

karsten at torproject.org karsten at torproject.org
Mon Jan 7 07:09:40 UTC 2013


commit 13ed67e31420d647a9b5a9e85447bc718bd28eaf
Author: Chris Wacek <cwacek at cs.georgetown.edu>
Date:   Fri Dec 21 15:27:28 2012 -0500

    Cleaned up the select_relays function
---
 compass.py |  115 ++++--------------------------------------------------------
 1 files changed, 7 insertions(+), 108 deletions(-)

diff --git a/compass.py b/compass.py
index 1ce991b..8e6c203 100755
--- a/compass.py
+++ b/compass.py
@@ -365,7 +365,7 @@ class RelayStats(object):
               }
 
 
-    def select_relays(self, grouped_relays, country=None, ases=None, by_country=False, by_as_number=False, links=False):
+    def select_relays(self, grouped_relays, options): 
       """
       Return a Pythonic representation of the relays result set. Return it as a set of Result objects.
       """
@@ -381,7 +381,7 @@ class RelayStats(object):
                 group_weights[weight] += relay.get(weight, 0)
 
             result.nick = relay['nickname']
-            result.link = links
+            result.link = options.links
             result.fp = relay['fingerprint']
 
             if 'Exit' in set(relay['flags']) and not 'BadExit' in set(relay['flags']):
@@ -403,15 +403,15 @@ class RelayStats(object):
 
         # If we want to group by things, we need to handle some fields
         # specially
-        if by_country or by_as_number:
+        if options.by_country or options.by_as:
             result.nick = "*"
             result.fp = "(%d relays)" % relays_in_group
             result.exit = "(%d)" % exits_in_group
             result.guard = "(%d)" % guards_in_group
-            if not by_as_number and not ases:
+            if not options.by_as and not options.ases:
                 result.as_info = "(%s)" % len(ases_in_group)
-            if not by_country and not country:
-                country = "*"
+            if not options.by_country and not options.country:
+                options.country = "*"
 
         #Include our weight values
         for weight in group_weights.iterkeys():
@@ -425,102 +425,6 @@ class RelayStats(object):
 
       return results
 
-    def format_and_sort_groups(self, grouped_relays, country=None, ases=None, by_country=False, by_as_number=False, links=False):
-
-        formatted_groups = {}
-        for group in grouped_relays.values():
-            group_weights = dict.fromkeys(RelayStats.WEIGHTS, 0)
-            relays_in_group, exits_in_group, guards_in_group = 0, 0, 0
-            ases_in_group = set()
-            for relay in group:
-                for weight in RelayStats.WEIGHTS:
-                    group_weights[weight] += relay.get(weight, 0)
-                nickname = relay['nickname']
-                fingerprint = relay['fingerprint'] if not links else "https://atlas.torproject.org/#details/%s" % relay['fingerprint']
-                if 'Exit' in set(relay['flags']) and not 'BadExit' in set(relay['flags']):
-                    exit = 'Exit'
-                    exits_in_group += 1
-                else:
-                    exit = '-'
-                if 'Guard' in set(relay['flags']):
-                    guard = 'Guard'
-                    guards_in_group += 1
-                else:
-                    guard = '-'
-                country = relay.get('country', '??')
-                as_number = relay.get('as_number', '??')
-                as_name = relay.get('as_name', '??')
-                as_info = "%s %s" %(as_number, as_name)
-                ases_in_group.add(as_info)
-                relays_in_group += 1
-            if by_country or by_as_number:
-                nickname = "*"
-                fingerprint = "(%d relays)" % relays_in_group
-                exit = "(%d)" % exits_in_group
-                guard = "(%d)" % guards_in_group
-                if not by_as_number and not ases:
-                    as_info = "(%s)" % len(ases_in_group)
-                if not by_country and not country:
-                    country = "*"
-            if links:
-                format_string = "%8.4f%% %8.4f%% %8.4f%% %8.4f%% %8.4f%% %-19s %-78s %-5s %-5s %-2s %-9s"
-            else:
-                format_string = "%8.4f%% %8.4f%% %8.4f%% %8.4f%% %8.4f%% %-19s %-40s %-5s %-5s %-2s %-9s"
-            formatted_group = format_string % (
-                              group_weights['consensus_weight_fraction'] * 100.0,
-                              group_weights['advertised_bandwidth_fraction'] * 100.0,
-                              group_weights['guard_probability'] * 100.0,
-                              group_weights['middle_probability'] * 100.0,
-                              group_weights['exit_probability'] * 100.0,
-                              nickname, fingerprint,
-                              exit, guard, country, as_info)
-            formatted_groups[formatted_group] = group_weights
-        sorted_groups = sorted(formatted_groups.iteritems(), key=lambda gs: gs[1]['consensus_weight_fraction'])
-        sorted_groups.reverse()
-        return sorted_groups
-
-    def print_groups(self, sorted_groups, count=10, by_country=False, by_as_number=False, short=False, links=False):
-        output_string = []
-        if links:
-            output_string.append("       CW    adv_bw   P_guard  P_middle    P_exit Nickname            Link                                                                           Exit  Guard CC Autonomous System"[:short])
-        else:
-            output_string.append("       CW    adv_bw   P_guard  P_middle    P_exit Nickname            Fingerprint                              Exit  Guard CC Autonomous System"[:short])
-        if count < 0: count = len(sorted_groups)
-        for formatted_group, weight in sorted_groups[:count]:
-            output_string.append(formatted_group[:short])
-        if len(sorted_groups) > count:
-            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 = dict.fromkeys(RelayStats.WEIGHTS, 0)
-            for _, weights in sorted_groups[count:]:
-                for weight in RelayStats.WEIGHTS:
-                    other_weights[weight] += weights[weight]
-            output_string.append("%8.4f%% %8.4f%% %8.4f%% %8.4f%% %8.4f%% (%d other %s)" % (
-                  other_weights['consensus_weight_fraction'] * 100.0,
-                  other_weights['advertised_bandwidth_fraction'] * 100.0,
-                  other_weights['guard_probability'] * 100.0,
-                  other_weights['middle_probability'] * 100.0,
-                  other_weights['exit_probability'] * 100.0,
-                  len(sorted_groups) - count, type))
-        selection_weights = dict.fromkeys(RelayStats.WEIGHTS, 0)
-        for _, weights in sorted_groups:
-            for weight in RelayStats.WEIGHTS:
-                selection_weights[weight] += weights[weight]
-        if len(sorted_groups) > 1 and selection_weights['consensus_weight_fraction'] < 0.999:
-            output_string.append("%8.4f%% %8.4f%% %8.4f%% %8.4f%% %8.4f%% (total in selection)" % (
-                  selection_weights['consensus_weight_fraction'] * 100.0,
-                  selection_weights['advertised_bandwidth_fraction'] * 100.0,
-                  selection_weights['guard_probability'] * 100.0,
-                  selection_weights['middle_probability'] * 100.0,
-                  selection_weights['exit_probability'] * 100.0))
-        return output_string
-
 def create_option_parser():
     parser = OptionParser()
     parser.add_option("-d", "--download", action="store_true",
@@ -640,12 +544,7 @@ if '__main__' == __name__:
         parser.error("Did not find details.json.  Re-run with --download.")
 
     stats = RelayStats(options)
-    results = stats.select_relays(stats.relays,
-                                  by_country=options.by_country,
-                                  by_as_number=options.by_as,
-                                  country=options.country,
-                                  ases=options.ases,
-                                  links=options.links)
+    results = stats.select_relays(stats.relays,options)
 
     sorted_results = stats.sort_and_reduce(results,options)
 





More information about the tor-commits mailing list