Skip to content

Commit

Permalink
Add order argument to ts.nodes()
Browse files Browse the repository at this point in the history
  • Loading branch information
hyanwong committed Aug 23, 2022
1 parent 1fe9ab7 commit d8a96f1
Showing 1 changed file with 21 additions and 4 deletions.
25 changes: 21 additions & 4 deletions python/tskit/trees.py
Original file line number Diff line number Diff line change
Expand Up @@ -3802,8 +3802,11 @@ class SimpleContainerSequence:
python sequence, allowing forward and reverse iteration.
"""

def __init__(self, getter, length):
self.getter = getter
def __init__(self, getter, length, order=None):
if order is None:
self.getter = getter
else:
self.getter = lambda index: getter(order[index])
self.length = length

def __len__(self):
Expand Down Expand Up @@ -4463,15 +4466,29 @@ def individuals(self):
"""
return SimpleContainerSequence(self.individual, self.num_individuals)

def nodes(self):
def nodes(self, *, order=None):
"""
Returns an iterable sequence of all the :ref:`nodes <sec_node_table_definition>`
in this tree sequence.
:param str order: The order in which the nodes should be returned: must be
one of "id" (Default), "timeasc" (ascending order of time, then by ascending
node id), or "timedesc" (descending order of time, then by ascending
node id).
:return: An iterable sequence of all nodes.
:rtype: Sequence(:class:`.Node`)
"""
return SimpleContainerSequence(self.node, self.num_nodes)
order = "id" if order is None else order
if order not in ["id", "timedesc", "timeasc"]:
raise ValueError('order must be "id", "timedesc", or "timeasc"')
if order == "id":
odr = None
elif order == "timeasc":
odr = np.lexsort((np.arange(self.num_nodes), self.tables.nodes.time))
elif order == "timedesc":
odr = np.lexsort((np.arange(self.num_nodes), -self.tables.nodes.time))

return SimpleContainerSequence(self.node, self.num_nodes, order=odr)

def edges(self):
"""
Expand Down

0 comments on commit d8a96f1

Please sign in to comment.