Skip to content

Commit f955bae

Browse files
duncanMRmergify[bot]
authored andcommitted
Remove tree_pos iterator from KC distance and haplotype matching
1 parent 35ea58d commit f955bae

File tree

4 files changed

+39
-85
lines changed

4 files changed

+39
-85
lines changed

c/tskit/haplotype_matching.c

+6-15
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,6 @@ int
209209
tsk_ls_hmm_free(tsk_ls_hmm_t *self)
210210
{
211211
tsk_tree_free(&self->tree);
212-
tsk_tree_position_free(&self->tree_pos);
213212
tsk_safe_free(self->recombination_rate);
214213
tsk_safe_free(self->mutation_rate);
215214
tsk_safe_free(self->recombination_rate);
@@ -247,11 +246,6 @@ tsk_ls_hmm_reset(tsk_ls_hmm_t *self, double value)
247246
tsk_memset(self->transition_parent, 0xff,
248247
self->max_transitions * sizeof(*self->transition_parent));
249248

250-
tsk_tree_position_free(&self->tree_pos);
251-
ret = tsk_tree_position_init(&self->tree_pos, self->tree_sequence, 0);
252-
if (ret != 0) {
253-
goto out;
254-
}
255249
samples = tsk_treeseq_get_samples(self->tree_sequence);
256250
for (j = 0; j < self->num_samples; j++) {
257251
u = samples[j];
@@ -260,7 +254,6 @@ tsk_ls_hmm_reset(tsk_ls_hmm_t *self, double value)
260254
self->transition_index[u] = (tsk_id_t) j;
261255
}
262256
self->num_transitions = self->num_samples;
263-
out:
264257
return ret;
265258
}
266259

@@ -309,13 +302,11 @@ tsk_ls_hmm_update_tree(tsk_ls_hmm_t *self, int direction)
309302
tsk_value_transition_t *restrict T = self->transitions;
310303
tsk_id_t u, c, p, j, e;
311304
tsk_value_transition_t *vt;
305+
tsk_tree_position_t tree_pos;
312306

313-
tsk_tree_position_step(&self->tree_pos, direction);
314-
tsk_bug_assert(self->tree_pos.index != -1);
315-
tsk_bug_assert(self->tree_pos.index == self->tree.index);
316-
317-
for (j = self->tree_pos.out.start; j != self->tree_pos.out.stop; j += direction) {
318-
e = self->tree_pos.out.order[j];
307+
tree_pos = self->tree.tree_pos;
308+
for (j = tree_pos.out.start; j != tree_pos.out.stop; j += direction) {
309+
e = tree_pos.out.order[j];
319310
c = edges_child[e];
320311
u = c;
321312
if (T_index[u] == TSK_NULL) {
@@ -333,8 +324,8 @@ tsk_ls_hmm_update_tree(tsk_ls_hmm_t *self, int direction)
333324
parent[c] = TSK_NULL;
334325
}
335326

336-
for (j = self->tree_pos.in.start; j != self->tree_pos.in.stop; j += direction) {
337-
e = self->tree_pos.in.order[j];
327+
for (j = tree_pos.in.start; j != tree_pos.in.stop; j += direction) {
328+
e = tree_pos.in.order[j];
338329
c = edges_child[e];
339330
p = edges_parent[e];
340331
parent[c] = p;

c/tskit/haplotype_matching.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* MIT License
33
*
4-
* Copyright (c) 2019-2023 Tskit Developers
4+
* Copyright (c) 2019-2024 Tskit Developers
55
*
66
* Permission is hereby granted, free of charge, to any person obtaining a copy
77
* of this software and associated documentation files (the "Software"), to deal
@@ -98,10 +98,6 @@ typedef struct _tsk_ls_hmm_t {
9898
tsk_size_t num_nodes;
9999
/* state */
100100
tsk_tree_t tree;
101-
/* NOTE: this tree_position will be redundant once we integrate the top-level
102-
* tree class with this.
103-
*/
104-
tsk_tree_position_t tree_pos;
105101
tsk_id_t *parent;
106102
/* The probability value transitions on the tree */
107103
tsk_value_transition_t *transitions;

c/tskit/trees.c

+32-63
Original file line numberDiff line numberDiff line change
@@ -4554,19 +4554,6 @@ tsk_tree_position_prev(tsk_tree_position_t *self)
45544554
return self->index != -1;
45554555
}
45564556

4557-
bool
4558-
tsk_tree_position_step(tsk_tree_position_t *self, int direction)
4559-
{
4560-
bool ret = false;
4561-
4562-
if (direction == TSK_DIR_FORWARD) {
4563-
ret = tsk_tree_position_next(self);
4564-
} else if (direction == TSK_DIR_REVERSE) {
4565-
ret = tsk_tree_position_prev(self);
4566-
}
4567-
return ret;
4568-
}
4569-
45704557
int TSK_WARN_UNUSED
45714558
tsk_tree_position_seek_forward(tsk_tree_position_t *self, tsk_id_t index)
45724559
{
@@ -5674,18 +5661,20 @@ tsk_tree_next(tsk_tree_t *self)
56745661
const tsk_id_t *restrict edge_parent = tables->edges.parent;
56755662
const tsk_id_t *restrict edge_child = tables->edges.child;
56765663
tsk_id_t j, e;
5664+
tsk_tree_position_t tree_pos;
56775665
bool valid;
56785666

56795667
valid = tsk_tree_position_next(&self->tree_pos);
5668+
tree_pos = self->tree_pos;
56805669

56815670
if (valid) {
5682-
for (j = self->tree_pos.out.start; j != self->tree_pos.out.stop; j++) {
5683-
e = self->tree_pos.out.order[j];
5671+
for (j = tree_pos.out.start; j != tree_pos.out.stop; j++) {
5672+
e = tree_pos.out.order[j];
56845673
tsk_tree_remove_edge(self, edge_parent[e], edge_child[e]);
56855674
}
56865675

5687-
for (j = self->tree_pos.in.start; j != self->tree_pos.in.stop; j++) {
5688-
e = self->tree_pos.in.order[j];
5676+
for (j = tree_pos.in.start; j != tree_pos.in.stop; j++) {
5677+
e = tree_pos.in.order[j];
56895678
tsk_tree_insert_edge(self, edge_parent[e], edge_child[e], e);
56905679
}
56915680
ret = TSK_TREE_OK;
@@ -5704,18 +5693,20 @@ tsk_tree_prev(tsk_tree_t *self)
57045693
const tsk_id_t *restrict edge_parent = tables->edges.parent;
57055694
const tsk_id_t *restrict edge_child = tables->edges.child;
57065695
tsk_id_t j, e;
5696+
tsk_tree_position_t tree_pos;
57075697
bool valid;
57085698

57095699
valid = tsk_tree_position_prev(&self->tree_pos);
5700+
tree_pos = self->tree_pos;
57105701

57115702
if (valid) {
5712-
for (j = self->tree_pos.out.start; j != self->tree_pos.out.stop; j--) {
5713-
e = self->tree_pos.out.order[j];
5703+
for (j = tree_pos.out.start; j != tree_pos.out.stop; j--) {
5704+
e = tree_pos.out.order[j];
57145705
tsk_tree_remove_edge(self, edge_parent[e], edge_child[e]);
57155706
}
57165707

5717-
for (j = self->tree_pos.in.start; j != self->tree_pos.in.stop; j--) {
5718-
e = self->tree_pos.in.order[j];
5708+
for (j = tree_pos.in.start; j != tree_pos.in.stop; j--) {
5709+
e = tree_pos.in.order[j];
57195710
tsk_tree_insert_edge(self, edge_parent[e], edge_child[e], e);
57205711
}
57215712
ret = TSK_TREE_OK;
@@ -5741,12 +5732,12 @@ tsk_tree_seek_from_null(tsk_tree_t *self, double x, tsk_flags_t TSK_UNUSED(optio
57415732
const tsk_id_t *restrict edge_child = tables->edges.child;
57425733
const double *restrict edge_left = tables->edges.left;
57435734
const double *restrict edge_right = tables->edges.right;
5744-
double interval_left = self->interval.left;
5745-
double interval_right = self->interval.right;
5735+
double interval_left, interval_right;
57465736
const double *restrict breakpoints = self->tree_sequence->breakpoints;
57475737
const tsk_size_t num_trees = self->tree_sequence->num_trees;
57485738
const double L = tsk_treeseq_get_sequence_length(self->tree_sequence);
57495739
tsk_id_t j, e, index;
5740+
tsk_tree_position_t tree_pos;
57505741

57515742
index = (tsk_id_t) tsk_search_sorted(breakpoints, num_trees + 1, x);
57525743
if (breakpoints[index] > x) {
@@ -5758,9 +5749,11 @@ tsk_tree_seek_from_null(tsk_tree_t *self, double x, tsk_flags_t TSK_UNUSED(optio
57585749
if (ret != 0) {
57595750
goto out;
57605751
}
5761-
interval_left = self->tree_pos.interval.left;
5762-
for (j = self->tree_pos.in.start; j != self->tree_pos.in.stop; j++) {
5763-
e = self->tree_pos.in.order[j];
5752+
// Since we are seeking from null, there are no edges to remove
5753+
tree_pos = self->tree_pos;
5754+
interval_left = tree_pos.interval.left;
5755+
for (j = tree_pos.in.start; j != tree_pos.in.stop; j++) {
5756+
e = tree_pos.in.order[j];
57645757
if (edge_left[e] <= interval_left && interval_left < edge_right[e]) {
57655758
tsk_tree_insert_edge(self, edge_parent[e], edge_child[e], e);
57665759
}
@@ -5770,9 +5763,10 @@ tsk_tree_seek_from_null(tsk_tree_t *self, double x, tsk_flags_t TSK_UNUSED(optio
57705763
if (ret != 0) {
57715764
goto out;
57725765
}
5773-
interval_right = self->tree_pos.interval.right;
5774-
for (j = self->tree_pos.in.start; j != self->tree_pos.in.stop; j--) {
5775-
e = self->tree_pos.in.order[j];
5766+
tree_pos = self->tree_pos;
5767+
interval_right = tree_pos.interval.right;
5768+
for (j = tree_pos.in.start; j != tree_pos.in.stop; j--) {
5769+
e = tree_pos.in.order[j];
57765770
if (edge_right[e] >= interval_right && interval_right > edge_left[e]) {
57775771
tsk_tree_insert_edge(self, edge_parent[e], edge_child[e], e);
57785772
}
@@ -6962,23 +6956,19 @@ update_kc_subtree_state(
69626956
}
69636957

69646958
static int
6965-
update_kc_incremental(
6966-
tsk_tree_t *tree, kc_vectors *kc, tsk_tree_position_t *tree_pos, tsk_size_t *depths)
6959+
update_kc_incremental(tsk_tree_t *tree, kc_vectors *kc, tsk_size_t *depths)
69676960
{
69686961
int ret = 0;
69696962
tsk_id_t u, v, e, j;
69706963
double root_time, time;
69716964
const double *restrict times = tree->tree_sequence->tables->nodes.time;
69726965
const tsk_id_t *restrict edges_child = tree->tree_sequence->tables->edges.child;
69736966
const tsk_id_t *restrict edges_parent = tree->tree_sequence->tables->edges.parent;
6974-
6975-
tsk_bug_assert(tree_pos->index == tree->index);
6976-
tsk_bug_assert(tree_pos->interval.left == tree->interval.left);
6977-
tsk_bug_assert(tree_pos->interval.right == tree->interval.right);
6967+
tsk_tree_position_t tree_pos = tree->tree_pos;
69786968

69796969
/* Update state of detached subtrees */
6980-
for (j = tree_pos->out.stop - 1; j >= tree_pos->out.start; j--) {
6981-
e = tree_pos->out.order[j];
6970+
for (j = tree_pos.out.stop - 1; j >= tree_pos.out.start; j--) {
6971+
e = tree_pos.out.order[j];
69826972
u = edges_child[e];
69836973
depths[u] = 0;
69846974

@@ -6992,8 +6982,8 @@ update_kc_incremental(
69926982
}
69936983

69946984
/* Propagate state change down into reattached subtrees. */
6995-
for (j = tree_pos->in.stop - 1; j >= tree_pos->in.start; j--) {
6996-
e = tree_pos->in.order[j];
6985+
for (j = tree_pos.in.stop - 1; j >= tree_pos.in.start; j--) {
6986+
e = tree_pos.in.order[j];
69976987
u = edges_child[e];
69986988
v = edges_parent[e];
69996989

@@ -7026,17 +7016,11 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
70267016
const tsk_treeseq_t *treeseqs[2] = { self, other };
70277017
tsk_tree_t trees[2];
70287018
kc_vectors kcs[2];
7029-
/* TODO the tree_pos here is redundant because we should be using this interally
7030-
* in the trees to do the advancing. Once we have converted the tree over to using
7031-
* tree_pos internally, we can get rid of these tree_pos variables and use
7032-
* the values stored in the trees themselves */
7033-
tsk_tree_position_t tree_pos[2];
70347019
tsk_size_t *depths[2];
70357020
int ret = 0;
70367021

70377022
for (i = 0; i < 2; i++) {
70387023
tsk_memset(&trees[i], 0, sizeof(trees[i]));
7039-
tsk_memset(&tree_pos[i], 0, sizeof(tree_pos[i]));
70407024
tsk_memset(&kcs[i], 0, sizeof(kcs[i]));
70417025
depths[i] = NULL;
70427026
}
@@ -7052,10 +7036,6 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
70527036
if (ret != 0) {
70537037
goto out;
70547038
}
7055-
ret = tsk_tree_position_init(&tree_pos[i], treeseqs[i], 0);
7056-
if (ret != 0) {
7057-
goto out;
7058-
}
70597039
ret = kc_vectors_alloc(&kcs[i], n);
70607040
if (ret != 0) {
70617041
goto out;
@@ -7079,10 +7059,8 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
70797059
if (ret != 0) {
70807060
goto out;
70817061
}
7082-
tsk_tree_position_next(&tree_pos[0]);
7083-
tsk_bug_assert(tree_pos[0].index == 0);
70847062

7085-
ret = update_kc_incremental(&trees[0], &kcs[0], &tree_pos[0], depths[0]);
7063+
ret = update_kc_incremental(&trees[0], &kcs[0], depths[0]);
70867064
if (ret != 0) {
70877065
goto out;
70887066
}
@@ -7091,17 +7069,11 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
70917069
if (ret != 0) {
70927070
goto out;
70937071
}
7094-
tsk_tree_position_next(&tree_pos[1]);
7095-
tsk_bug_assert(tree_pos[1].index != -1);
70967072

7097-
ret = update_kc_incremental(&trees[1], &kcs[1], &tree_pos[1], depths[1]);
7073+
ret = update_kc_incremental(&trees[1], &kcs[1], depths[1]);
70987074
if (ret != 0) {
70997075
goto out;
71007076
}
7101-
tsk_bug_assert(trees[0].interval.left == tree_pos[0].interval.left);
7102-
tsk_bug_assert(trees[0].interval.right == tree_pos[0].interval.right);
7103-
tsk_bug_assert(trees[1].interval.left == tree_pos[1].interval.left);
7104-
tsk_bug_assert(trees[1].interval.right == tree_pos[1].interval.right);
71057077
while (trees[0].interval.right < trees[1].interval.right) {
71067078
span = trees[0].interval.right - left;
71077079
total += norm_kc_vectors(&kcs[0], &kcs[1], lambda_) * span;
@@ -7113,9 +7085,7 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
71137085
if (ret != 0) {
71147086
goto out;
71157087
}
7116-
tsk_tree_position_next(&tree_pos[0]);
7117-
tsk_bug_assert(tree_pos[0].index != -1);
7118-
ret = update_kc_incremental(&trees[0], &kcs[0], &tree_pos[0], depths[0]);
7088+
ret = update_kc_incremental(&trees[0], &kcs[0], depths[0]);
71197089
if (ret != 0) {
71207090
goto out;
71217091
}
@@ -7132,7 +7102,6 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
71327102
out:
71337103
for (i = 0; i < 2; i++) {
71347104
tsk_tree_free(&trees[i]);
7135-
tsk_tree_position_free(&tree_pos[i]);
71367105
kc_vectors_free(&kcs[i]);
71377106
tsk_safe_free(depths[i]);
71387107
}

c/tskit/trees.h

-2
Original file line numberDiff line numberDiff line change
@@ -1850,10 +1850,8 @@ int tsk_tree_position_free(tsk_tree_position_t *self);
18501850
int tsk_tree_position_print_state(const tsk_tree_position_t *self, FILE *out);
18511851
bool tsk_tree_position_next(tsk_tree_position_t *self);
18521852
bool tsk_tree_position_prev(tsk_tree_position_t *self);
1853-
bool tsk_tree_position_step(tsk_tree_position_t *self, int direction);
18541853
int tsk_tree_position_seek_forward(tsk_tree_position_t *self, tsk_id_t index);
18551854
int tsk_tree_position_seek_backward(tsk_tree_position_t *self, tsk_id_t index);
1856-
int tsk_tree_position_seek(tsk_tree_position_t *self, double position);
18571855

18581856
#ifdef __cplusplus
18591857
}

0 commit comments

Comments
 (0)