def minimise(table): """Minimise a routing table.""" # Remove default entries table_ = rde_minimise(table, None) # Split the table into sub-tables with the same route. subtables = defaultdict(list) for entry in table_: subtables[entry.route].append((entry.key, entry.mask)) # Minimise each subtable in turn mintables = dict() for i, (route, keymasks) in enumerate(iteritems(subtables)): trie = Node() for key, mask in keymasks: insert(trie, key, mask) mintables[route] = list(trie.get_keys_and_masks()) # Return to routing table form return [ RoutingTableEntry(r, k, m) for r, kms in iteritems(mintables) for k, m in kms ]
def my_minimize(chip, table, whole_table, provide_offset, remove_default_entries, times=list()): sys.stdout.write("({:3d}, {:3d})\t{:4d}\t".format( chip[0], chip[1], len(table))) sys.stdout.flush() table_ = table if remove_default_entries: table_ = rde_minimise(table, None) if whole_table: new_table = use_espresso_on_entire_table(table_, provide_offset) else: new_table = use_espresso(table_, times, provide_offset) assert table_is_subset_of(table, new_table) sys.stdout.write("\033[{}m{:4d}\033[39m\t{:.2f}%\n".format( 32 if len(new_table) < 1024 else 31, len(new_table), 100. * float(len(table) - len(new_table)) / len(table) )) return chip, new_table