Skip to content

Commit 2c264be

Browse files
Convert LS HMM code to use tree_position_t
1 parent 63b317c commit 2c264be

File tree

2 files changed

+36
-34
lines changed

2 files changed

+36
-34
lines changed

c/tskit/haplotype_matching.c

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ int
209209
tsk_ls_hmm_free(tsk_ls_hmm_t *self)
210210
{
211211
tsk_tree_free(&self->tree);
212-
tsk_diff_iter_free(&self->diffs);
212+
tsk_tree_position_free(&self->tree_pos);
213213
tsk_safe_free(self->recombination_rate);
214214
tsk_safe_free(self->mutation_rate);
215215
tsk_safe_free(self->recombination_rate);
@@ -248,9 +248,8 @@ tsk_ls_hmm_reset(tsk_ls_hmm_t *self)
248248
tsk_memset(self->transition_parent, 0xff,
249249
self->max_transitions * sizeof(*self->transition_parent));
250250

251-
/* This is safe because we've already zero'd out the memory. */
252-
tsk_diff_iter_free(&self->diffs);
253-
ret = tsk_diff_iter_init_from_ts(&self->diffs, self->tree_sequence, false);
251+
tsk_tree_position_free(&self->tree_pos);
252+
ret = tsk_tree_position_init(&self->tree_pos, self->tree_sequence, 0);
254253
if (ret != 0) {
255254
goto out;
256255
}
@@ -306,47 +305,48 @@ tsk_ls_hmm_update_tree(tsk_ls_hmm_t *self)
306305
int ret = 0;
307306
tsk_id_t *restrict parent = self->parent;
308307
tsk_id_t *restrict T_index = self->transition_index;
308+
const tsk_id_t *restrict edges_child = self->tree_sequence->tables->edges.child;
309+
const tsk_id_t *restrict edges_parent = self->tree_sequence->tables->edges.parent;
309310
tsk_value_transition_t *restrict T = self->transitions;
310-
tsk_edge_list_node_t *record;
311-
tsk_edge_list_t records_out, records_in;
312-
tsk_edge_t edge;
313-
double left, right;
314-
tsk_id_t u;
311+
tsk_id_t u, c, p, j, e;
315312
tsk_value_transition_t *vt;
316313

317-
ret = tsk_diff_iter_next(&self->diffs, &left, &right, &records_out, &records_in);
318-
if (ret < 0) {
319-
goto out;
320-
}
314+
tsk_tree_position_next(&self->tree_pos);
315+
tsk_bug_assert(self->tree_pos.index != -1);
316+
tsk_bug_assert(self->tree_pos.index == self->tree.index);
321317

322-
for (record = records_out.head; record != NULL; record = record->next) {
323-
u = record->edge.child;
318+
for (j = self->tree_pos.out.start; j < self->tree_pos.out.stop; j++) {
319+
e = self->tree_pos.out.order[j];
320+
c = edges_child[e];
321+
u = c;
324322
if (T_index[u] == TSK_NULL) {
325323
/* Ensure the subtree we're detaching has a transition at the root */
326324
while (T_index[u] == TSK_NULL) {
327325
u = parent[u];
328326
tsk_bug_assert(u != TSK_NULL);
329327
}
330328
tsk_bug_assert(self->num_transitions < self->max_transitions);
331-
T_index[record->edge.child] = (tsk_id_t) self->num_transitions;
332-
T[self->num_transitions].tree_node = record->edge.child;
329+
T_index[c] = (tsk_id_t) self->num_transitions;
330+
T[self->num_transitions].tree_node = c;
333331
T[self->num_transitions].value = T[T_index[u]].value;
334332
self->num_transitions++;
335333
}
336-
parent[record->edge.child] = TSK_NULL;
334+
parent[c] = TSK_NULL;
337335
}
338336

339-
for (record = records_in.head; record != NULL; record = record->next) {
340-
edge = record->edge;
341-
parent[edge.child] = edge.parent;
342-
u = edge.parent;
343-
if (parent[edge.parent] == TSK_NULL) {
337+
for (j = self->tree_pos.in.start; j < self->tree_pos.in.stop; j++) {
338+
e = self->tree_pos.in.order[j];
339+
c = edges_child[e];
340+
p = edges_parent[e];
341+
parent[c] = p;
342+
u = p;
343+
if (parent[p] == TSK_NULL) {
344344
/* Grafting onto a new root. */
345-
if (T_index[record->edge.parent] == TSK_NULL) {
346-
T_index[edge.parent] = (tsk_id_t) self->num_transitions;
345+
if (T_index[p] == TSK_NULL) {
346+
T_index[p] = (tsk_id_t) self->num_transitions;
347347
tsk_bug_assert(self->num_transitions < self->max_transitions);
348-
T[self->num_transitions].tree_node = edge.parent;
349-
T[self->num_transitions].value = T[T_index[edge.child]].value;
348+
T[self->num_transitions].tree_node = p;
349+
T[self->num_transitions].value = T[T_index[c]].value;
350350
self->num_transitions++;
351351
}
352352
} else {
@@ -356,18 +356,17 @@ tsk_ls_hmm_update_tree(tsk_ls_hmm_t *self)
356356
}
357357
tsk_bug_assert(u != TSK_NULL);
358358
}
359-
tsk_bug_assert(T_index[u] != -1 && T_index[edge.child] != -1);
360-
if (T[T_index[u]].value == T[T_index[edge.child]].value) {
361-
vt = &T[T_index[edge.child]];
359+
tsk_bug_assert(T_index[u] != -1 && T_index[c] != -1);
360+
if (T[T_index[u]].value == T[T_index[c]].value) {
361+
vt = &T[T_index[c]];
362362
/* Mark the value transition as unusued */
363363
vt->value = -1;
364364
vt->tree_node = TSK_NULL;
365-
T_index[edge.child] = TSK_NULL;
365+
T_index[c] = TSK_NULL;
366366
}
367367
}
368368

369369
ret = tsk_ls_hmm_remove_dead_roots(self);
370-
out:
371370
return ret;
372371
}
373372

c/tskit/haplotype_matching.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* MIT License
33
*
4-
* Copyright (c) 2019-2022 Tskit Developers
4+
* Copyright (c) 2019-2023 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,7 +98,10 @@ typedef struct _tsk_ls_hmm_t {
9898
tsk_size_t num_nodes;
9999
/* state */
100100
tsk_tree_t tree;
101-
tsk_diff_iter_t diffs;
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;
102105
tsk_id_t *parent;
103106
/* The probability value transitions on the tree */
104107
tsk_value_transition_t *transitions;

0 commit comments

Comments
 (0)