Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 49 additions & 43 deletions src/sage/combinat/abstract_tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ def pre_order_traversal_iter(self):
sage: v = BinaryTree([u, u])
sage: w = BinaryTree([v, v])
sage: t = BinaryTree([w, w])
sage: t.node_number()
sage: t.n_nodes()
7
sage: l = [1 for i in t.pre_order_traversal_iter()]
sage: len(l)
Expand Down Expand Up @@ -259,7 +259,7 @@ def iterative_pre_order_traversal(self, action=None):
sage: v = BinaryTree([u, u])
sage: w = BinaryTree([v, v])
sage: t = BinaryTree([w, w])
sage: t.node_number()
sage: t.n_nodes()
7
sage: l = []
sage: t.iterative_pre_order_traversal(lambda node: l.append(1))
Expand Down Expand Up @@ -376,7 +376,7 @@ def pre_order_traversal(self, action=None):
sage: v = BinaryTree([u, u])
sage: w = BinaryTree([v, v])
sage: t = BinaryTree([w, w])
sage: t.node_number()
sage: t.n_nodes()
7
sage: l = []
sage: t.pre_order_traversal(lambda node: l.append(1))
Expand Down Expand Up @@ -471,7 +471,7 @@ def post_order_traversal_iter(self):
sage: v = BinaryTree([u, u])
sage: w = BinaryTree([v, v])
sage: t = BinaryTree([w, w])
sage: t.node_number()
sage: t.n_nodes()
7
sage: l = [1 for i in t.post_order_traversal_iter()]
sage: len(l)
Expand Down Expand Up @@ -543,7 +543,7 @@ def post_order_traversal(self, action=None):
sage: v = BinaryTree([u, u])
sage: w = BinaryTree([v, v])
sage: t = BinaryTree([w, w])
sage: t.node_number()
sage: t.n_nodes()
7
sage: l = []
sage: t.post_order_traversal(lambda node: l.append(1))
Expand Down Expand Up @@ -617,7 +617,7 @@ def iterative_post_order_traversal(self, action=None):
sage: v = BinaryTree([u, u])
sage: w = BinaryTree([v, v])
sage: t = BinaryTree([w, w])
sage: t.node_number()
sage: t.n_nodes()
7
sage: l = []
sage: t.iterative_post_order_traversal(lambda node: l.append(1))
Expand Down Expand Up @@ -710,7 +710,7 @@ def contour_traversal(self, first_action=None, middle_action=None, final_action=
sage: v = BinaryTree([u, u])
sage: w = BinaryTree([v, v])
sage: t = BinaryTree([w, w])
sage: t.node_number()
sage: t.n_nodes()
7
sage: l = []
sage: t.contour_traversal(first_action = lambda node: l.append(0))
Expand Down Expand Up @@ -852,7 +852,7 @@ def paths_at_depth(self, depth, path=[]):

.. SEEALSO::

:meth:`paths`, :meth:`paths_to_the_right`, :meth:`node_number_at_depth`
:meth:`paths`, :meth:`paths_to_the_right`, :meth:`number_of_nodes_at_depth`

EXAMPLES::

Expand Down Expand Up @@ -886,7 +886,7 @@ def paths_at_depth(self, depth, path=[]):
for i in range(len(self)):
yield from self[i].paths_at_depth(depth - 1, path + [i])

def node_number_at_depth(self, depth):
def number_of_nodes_at_depth(self, depth):
r"""
Return the number of nodes at a given depth.

Expand All @@ -900,7 +900,7 @@ def node_number_at_depth(self, depth):

.. SEEALSO::

:meth:`node_number`, :meth:`node_number_to_the_right`, :meth:`paths_at_depth`
:meth:`n_nodes`, :meth:`number_of_nodes_to_the_right`, :meth:`paths_at_depth`

EXAMPLES::

Expand All @@ -915,7 +915,7 @@ def node_number_at_depth(self, depth):
o o
|
o
sage: [T.node_number_at_depth(i) for i in range(6)]
sage: [T.number_of_nodes_at_depth(i) for i in range(6)]
[1, 3, 4, 2, 1, 0]

TESTS:
Expand All @@ -927,15 +927,15 @@ def node_number_at_depth(self, depth):
.
sage: T.is_empty()
True
sage: [T.node_number_at_depth(i) for i in range(3)]
sage: [T.number_of_nodes_at_depth(i) for i in range(3)]
[0, 0, 0]

Check that we do not hit a recursion limit::

sage: T = OrderedTree([])
sage: for _ in range(9999):
....: T = OrderedTree([T])
sage: T.node_number_at_depth(2000)
sage: T.number_of_nodes_at_depth(2000)
1
"""
if self.is_empty():
Expand Down Expand Up @@ -965,6 +965,8 @@ def lf_action(node):
self.contour_traversal(fr_action, m_action, fn_action, lf_action)
return Integer(m)

node_number_at_depth = number_of_nodes_at_depth

def paths_to_the_right(self, path):
r"""
Return a generator of paths for all nodes at the same
Expand All @@ -979,7 +981,7 @@ def paths_to_the_right(self, path):

.. SEEALSO::

:meth:`paths`, :meth:`paths_at_depth`, :meth:`node_number_to_the_right`
:meth:`paths`, :meth:`paths_at_depth`, :meth:`number_of_nodes_to_the_right`

EXAMPLES::

Expand Down Expand Up @@ -1023,7 +1025,7 @@ def paths_to_the_right(self, path):
for p in self[path[0]].paths_to_the_right(path[1:]):
yield tuple([path[0]] + list(p))

def node_number_to_the_right(self, path):
def number_of_nodes_to_the_right(self, path):
r"""
Return the number of nodes at the same depth and to the right of
the node identified by ``path``.
Expand All @@ -1033,7 +1035,7 @@ def node_number_to_the_right(self, path):

.. SEEALSO::

:meth:`node_number`, :meth:`node_number_at_depth`, :meth:`paths_to_the_right`
:meth:`n_nodes`, :meth:`number_of_nodes_at_depth`, :meth:`paths_to_the_right`

EXAMPLES::

Expand All @@ -1048,28 +1050,30 @@ def node_number_to_the_right(self, path):
o o
|
o
sage: T.node_number_to_the_right(())
sage: T.number_of_nodes_to_the_right(())
0
sage: T.node_number_to_the_right((0,))
sage: T.number_of_nodes_to_the_right((0,))
2
sage: T.node_number_to_the_right((0,1))
sage: T.number_of_nodes_to_the_right((0,1))
2
sage: T.node_number_to_the_right((0,1,0))
sage: T.number_of_nodes_to_the_right((0,1,0))
1

sage: T = OrderedTree([])
sage: T.node_number_to_the_right(())
sage: T.number_of_nodes_to_the_right(())
0
"""
depth = len(path)
if depth == 0:
return Integer(0)
result = sum(son.node_number_at_depth(depth - 1)
result = sum(son.number_of_nodes_at_depth(depth - 1)
for son in self[path[0] + 1:])
if path[0] < len(self) and path[0] >= 0:
result += self[path[0]].node_number_to_the_right(path[1:])
result += self[path[0]].number_of_nodes_to_the_right(path[1:])
return result

node_number_to_the_right = number_of_nodes_to_the_right

def subtrees(self):
"""
Return a generator for all nonempty subtrees of ``self``.
Expand Down Expand Up @@ -1099,12 +1103,12 @@ def subtrees(self):
TESTS::

sage: t = OrderedTree([[], [[], [[], []], [[], []]], [[], []]])
sage: t.node_number() == len(list(t.subtrees()))
sage: t.n_nodes() == len(list(t.subtrees()))
True
sage: list(BinaryTree().subtrees())
[]
sage: bt = BinaryTree([[],[[],[]]])
sage: bt.node_number() == len(list(bt.subtrees()))
sage: bt.n_nodes() == len(list(bt.subtrees()))
True
"""
return self.pre_order_traversal_iter()
Expand Down Expand Up @@ -1142,12 +1146,12 @@ def paths(self):
TESTS::

sage: t = OrderedTree([[], [[], [[], []], [[], []]], [[], []]])
sage: t.node_number() == len(list(t.paths()))
sage: t.n_nodes() == len(list(t.paths()))
True
sage: list(BinaryTree().paths())
[]
sage: bt = BinaryTree([[],[[],[]]])
sage: bt.node_number() == len(list(bt.paths()))
sage: bt.n_nodes() == len(list(bt.paths()))
True
"""
if not self.is_empty():
Expand All @@ -1156,36 +1160,36 @@ def paths(self):
for p in t.paths():
yield (i,) + p

def node_number(self):
def n_nodes(self):
"""
Return the number of nodes of ``self``.

.. SEEALSO::

:meth:`node_number_at_depth`, :meth:`node_number_to_the_right`
:meth:`number_of_nodes_at_depth`, :meth:`number_of_nodes_to_the_right`

EXAMPLES::

sage: OrderedTree().node_number()
sage: OrderedTree().n_nodes()
1
sage: OrderedTree([]).node_number()
sage: OrderedTree([]).n_nodes()
1
sage: OrderedTree([[],[]]).node_number()
sage: OrderedTree([[],[]]).n_nodes()
3
sage: OrderedTree([[],[[]]]).node_number()
sage: OrderedTree([[],[[]]]).n_nodes()
4
sage: OrderedTree([[], [[], [[], []], [[], []]], [[], []]]).node_number()
sage: OrderedTree([[], [[], [[], []], [[], []]], [[], []]]).n_nodes()
13

EXAMPLES::

sage: BinaryTree(None).node_number()
sage: BinaryTree(None).n_nodes()
0
sage: BinaryTree([]).node_number()
sage: BinaryTree([]).n_nodes()
1
sage: BinaryTree([[], None]).node_number()
sage: BinaryTree([[], None]).n_nodes()
2
sage: BinaryTree([[None, [[], []]], None]).node_number()
sage: BinaryTree([[None, [[], []]], None]).n_nodes()
5

TESTS:
Expand All @@ -1195,7 +1199,7 @@ def node_number(self):
sage: T = OrderedTree([])
sage: for _ in range(9999):
....: T = OrderedTree([T])
sage: T.node_number()
sage: T.n_nodes()
10000
"""
count = 0
Expand All @@ -1207,6 +1211,8 @@ def incr(node):
self.iterative_pre_order_traversal(incr)
return Integer(count)

node_number = n_nodes

def depth(self):
"""
Return the depth of ``self``.
Expand Down Expand Up @@ -1523,7 +1529,7 @@ def canonical_labelling(self, shift=1):
deca = 1
for subtree in self:
liste += [subtree.canonical_labelling(shift + deca)]
deca += subtree.node_number()
deca += subtree.n_nodes()
return LTR._element_constructor_(liste, label=shift)

def to_hexacode(self):
Expand Down Expand Up @@ -1566,7 +1572,7 @@ def to_hexacode(self):
"""
if len(self) > 15:
raise ValueError("the width of the tree is too large")
if self.node_number() == 1:
if self.n_nodes() == 1:
return "0"
return ("%x" % len(self)) + "".join(u.to_hexacode() for u in self)

Expand Down Expand Up @@ -1594,7 +1600,7 @@ def tree_factorial(self):
sage: BinaryTree().tree_factorial()
1
"""
nb = self.node_number()
nb = self.n_nodes()
if nb <= 1:
return Integer(1)
return nb * prod(s.tree_factorial() for s in self)
Expand Down Expand Up @@ -2359,7 +2365,7 @@ def leaf_labels(self):
sage: LBT(None).leaf_labels()
[]
"""
return [t.label() for t in self.subtrees() if t.node_number() == 1]
return [t.label() for t in self.subtrees() if t.n_nodes() == 1]

def __eq__(self, other):
"""
Expand Down
4 changes: 2 additions & 2 deletions src/sage/combinat/bijectionist.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@
....: else:
....: return m+1
sage: bij = Bijectionist(A, B, tau)
sage: bij.set_statistics((lambda a: a.size(), lambda b: b.node_number()-1))
sage: bij.set_statistics((lambda a: a.size(), lambda b: b.n_nodes()-1))
sage: from sage.combinat.cyclic_sieving_phenomenon import orbit_decomposition
sage: bij.set_constant_blocks(orbit_decomposition(A, theta))
sage: list(bij.solutions_iterator())
Expand All @@ -173,7 +173,7 @@
....: B2.to_dyck_word()).to_binary_tree()
sage: bij = Bijectionist(A, B)
sage: bij.set_intertwining_relations((2, concat_path, concat_tree))
sage: bij.set_statistics((lambda d: d.semilength(), lambda t: t.node_number()))
sage: bij.set_statistics((lambda d: d.semilength(), lambda t: t.n_nodes()))
sage: for D in sorted(bij.minimal_subdistributions_iterator(), key=lambda x: (len(x[0][0]), x)):
....: ascii_art(D)
( [ /\ ], [ o ] )
Expand Down Expand Up @@ -3131,7 +3131,7 @@
sage: bij = Bijectionist(sum(As, []), sum(Bs, []))
sage: bij.set_statistics((lambda x: x[0], lambda x: x[0]))
sage: bij.set_intertwining_relations((2, c1, c1), (1, c2, c2))
sage: l = list(bij.solutions_iterator()); len(l) # long time -- (2.7 seconds with SCIP on AMD Ryzen 5 PRO 3500U w/ Radeon Vega Mobile Gfx)

Check warning on line 3134 in src/sage/combinat/bijectionist.py

View workflow job for this annotation

GitHub Actions / test-long (src/sage/[a-f]*)

Warning: slow doctest:

slow doctest:: Test ran for 33.99s cpu, 34.21s wall Check ran for 0.00s cpu, 0.00s wall
64

A brute force check would be difficult::
Expand Down Expand Up @@ -3159,7 +3159,7 @@
sage: A = sum(As, [])
sage: respects_c1 = lambda s: all(c1(a1, a2) not in A or s[c1(a1, a2)] == c1(s[a1], s[a2]) for a1 in A for a2 in A)
sage: respects_c2 = lambda s: all(c2(a1) not in A or s[c2(a1)] == c2(s[a1]) for a1 in A)
sage: l2 = [s for s in it if respects_c1(s) and respects_c2(s)] # long time -- (17 seconds on AMD Ryzen 5 PRO 3500U w/ Radeon Vega Mobile Gfx)

Check warning on line 3162 in src/sage/combinat/bijectionist.py

View workflow job for this annotation

GitHub Actions / test-long (src/sage/[a-f]*)

Warning: slow doctest:

slow doctest:: Test ran for 96.80s cpu, 97.23s wall Check ran for 0.00s cpu, 0.00s wall
sage: sorted(l1, key=lambda s: tuple(s.items())) == l2 # long time
True

Expand Down
Loading
Loading