mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-12-01 15:14:16 +01:00
0d40b37954
python3 doesn't allow dictionaries to be initialized with non-string keywords. This presents problems on systems in which "python" means "python3". We instead initalize the dictionary using the dict comprehension and then update it with the values from the tree. This will work with both python2 and python3.
33 lines
1.3 KiB
Python
33 lines
1.3 KiB
Python
# Generate all possible single-root message thread structures of size
|
|
# argv[1]. Each output line is a thread structure, where the n'th
|
|
# field is either a number giving the parent of message n or "None"
|
|
# for the root.
|
|
import sys
|
|
from itertools import chain, combinations
|
|
|
|
def subsets(s):
|
|
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
|
|
|
|
nodes = set(range(int(sys.argv[1])))
|
|
|
|
# Queue of (tree, free, to_expand) where tree is a {node: parent}
|
|
# dictionary, free is a set of unattached nodes, and to_expand is
|
|
# itself a queue of nodes in the tree that need to be expanded.
|
|
# The queue starts with all single-node trees.
|
|
queue = [({root: None}, nodes - {root}, (root,)) for root in nodes]
|
|
|
|
# Process queue
|
|
while queue:
|
|
tree, free, to_expand = queue.pop()
|
|
|
|
if len(to_expand) == 0:
|
|
# Only print full-sized trees
|
|
if len(free) == 0:
|
|
print(" ".join(map(str, [msg[1] for msg in sorted(tree.items())])))
|
|
else:
|
|
# Expand node to_expand[0] with each possible set of children
|
|
for children in subsets(free):
|
|
ntree = {child: to_expand[0] for child in children}
|
|
ntree.update(tree)
|
|
nfree = free.difference(children)
|
|
queue.append((ntree, nfree, to_expand[1:] + tuple(children)))
|