Source code for hstrat.test_drive.perfect_tracking._PerfectBacktrackHandle

import typing


class PerfectBacktrackHandle:
    """Breadcrumb for perfectly backtracking a phylogenetic chain of descent.

    Because only backwards references are held, Python garbage collection takes
    care of pruning away extinct lineages.
    """

    # Achieves 60% the performance of C++ shared_ptr-based implementation in
    # tracking a unbranching linked list and outperforms the C++ implementation
    # by 30% in tracking a phylogenetic tree with random selection
    #
    #   p = [impl() for __ in range(100)]
    #   for __ in tqdm(range(10000000)):
    #       p[random.randrange(len(p))] = random.choice(p).CreateDescendant()
    #
    # see https://gist.github.com/mmore500/d6ee9011e38355f1be6c02a70db5b785
    # and https://gist.github.com/mmore500/71eb2f3f14afb02fba476dd2cea45210
    # (didn't complete debugging, but is representative of speed)

    # tried a dict-based database approach, but even with native implementaiton
    # was aboutt 3x slower than this approach
    # see https://gist.github.com/mmore500/7e9b85f005882d1e4b0206a9ef6d1de2

    parent: "PerfectBacktrackHandle"
    data: typing.Any

    __slots__ = ("parent", "data")

[docs] def __init__( self: "PerfectBacktrackHandle", parent: "PerfectBacktrackHandle" = None, data: typing.Any = None, ) -> None: """Create backtracking breadcrumb, with `parent` as preceding breadcrumb in line of descent or `None` if associated with seed organism.""" self.parent = parent self.data = data
[docs] def CreateDescendant( self: "PerfectBacktrackHandle", data: typing.Any = None ) -> "PerfectBacktrackHandle": """Convenience factory method to create backtracking breadcrumbs succeeding `self` in line of descent.""" cls = self.__class__ return cls(self, data)