def traceback(self): # Run the traceback. m = self.ts.num_sites match = np.zeros(m, dtype=int) recombination_tree = np.zeros(self.ts.num_nodes, dtype=int) - 1 tree = tskit.Tree(self.ts) tree.last() current_node = -1 rr_index = len(self.recombination_required) - 1 for site in reversed(self.ts.sites()): while tree.interval[0] > site.position: tree.prev() assert tree.interval[0] <= site.position < tree.interval[1] # Fill in the recombination tree j = rr_index while self.recombination_required[j][0] == site.id: u, required = self.recombination_required[j][1:] recombination_tree[u] = required j -= 1 if current_node == -1: current_node = self.choose_sample(site.id, tree) match[site.id] = current_node # Now traverse up the tree from the current node. The first marked node # we meet tells us whether we need to recombine. u = current_node while u != -1 and recombination_tree[u] == -1: u = tree.parent(u) assert u != -1 if recombination_tree[u] == 1: # Need to switch at the next site. current_node = -1 # Reset the nodes in the recombination tree. j = rr_index while self.recombination_required[j][0] == site.id: u, required = self.recombination_required[j][1:] recombination_tree[u] = -1 j -= 1 rr_index = j return match
def __init__(self, ts, rho, mu, alleles, precision=10): self.ts = ts self.mu = mu self.rho = rho self.alleles = check_alleles(alleles, ts.num_sites) self.precision = precision # The array of ValueTransitions. self.T = [] # indexes in to the T array for each node. self.T_index = np.zeros(ts.num_nodes, dtype=int) - 1 # The number of nodes underneath each element in the T array. self.N = np.zeros(ts.num_nodes, dtype=int) # Efficiently compute the allelic state at a site self.allelic_state = np.zeros(ts.num_nodes, dtype=int) - 1 # Diffs so we can can update T and T_index between trees. self.edge_diffs = self.ts.edge_diffs() self.parent = np.zeros(self.ts.num_nodes, dtype=int) - 1 self.tree = tskit.Tree(self.ts) self.output = None
def moving_along_tree_sequence(): ts = msprime.simulate(5, recombination_rate=1, random_seed=42) print(f"Tree sequence has {ts.num_trees} trees") print() for tree in ts.trees(): print("Tree {} covers [{:.2f}, {:.2f}); TMRCA = {:.4f}".format( tree.index, *tree.interval, tree.time(tree.root))) print() for tree in reversed(ts.trees()): print("Tree {} covers [{:.2f}, {:.2f}); TMRCA = {:.4f}".format( tree.index, *tree.interval, tree.time(tree.root))) print() for tree in list(ts.trees()): print("Tree {} covers [{:.2f}, {:.2f}): id={:x}".format( tree.index, *tree.interval, id(tree))) print() for tree in ts.aslist(): print("Tree {} covers [{:.2f}, {:.2f}): id={:x}".format( tree.index, *tree.interval, id(tree))) print() tree = ts.at(0.5) print("Tree {} covers [{:.2f}, {:.2f}): id={:x}".format( tree.index, *tree.interval, id(tree))) tree = ts.at_index(0) print("Tree {} covers [{:.2f}, {:.2f}): id={:x}".format( tree.index, *tree.interval, id(tree))) tree = ts.at_index(-1) print("Tree {} covers [{:.2f}, {:.2f}): id={:x}".format( tree.index, *tree.interval, id(tree))) print() tree = tskit.Tree(ts) tree.seek_index(ts.num_trees // 2) print("Tree {} covers [{:.2f}, {:.2f})".format(tree.index, *tree.interval)) tree.seek(0.95) print("Tree {} covers [{:.2f}, {:.2f})".format(tree.index, *tree.interval)) print() tree.prev() print("Tree {} covers [{:.2f}, {:.2f})".format(tree.index, *tree.interval)) tree.next() print("Tree {} covers [{:.2f}, {:.2f})".format(tree.index, *tree.interval)) print() tree = tskit.Tree(ts) print(f"Tree {tree.index}: parent_dict = {tree.parent_dict}") tree.first() print(f"Tree {tree.index}: parent_dict = {tree.parent_dict}") tree.prev() print(f"Tree {tree.index}: parent_dict = {tree.parent_dict}") tree = tskit.Tree(ts) while tree.next(): print("Tree {} covers [{:.2f}, {:.2f})".format(tree.index, *tree.interval)) print("After loop: tree index =", tree.index) while tree.prev(): print("Tree {} covers [{:.2f}, {:.2f})".format(tree.index, *tree.interval))