Skip to content

Commit 8da3634

Browse files
Encapulate IBD results in object.
This is a transitional implementation as we figure out the right interface for specifying how to work with large sets of IBD segments.
1 parent 7a20263 commit 8da3634

File tree

8 files changed

+801
-587
lines changed

8 files changed

+801
-587
lines changed

c/tests/test_tables.c

Lines changed: 84 additions & 118 deletions
Large diffs are not rendered by default.

c/tskit/tables.c

Lines changed: 312 additions & 201 deletions
Large diffs are not rendered by default.

c/tskit/tables.h

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -626,26 +626,17 @@ typedef struct _tsk_segment_t {
626626
} tsk_segment_t;
627627

628628
typedef struct {
629-
tsk_id_t *pairs;
629+
const tsk_id_t *pairs;
630630
tsk_size_t num_pairs;
631631
tsk_size_t num_nodes;
632632
tsk_size_t num_unique_nodes_in_pair;
633633
int64_t *pair_map;
634-
double sequence_length;
635-
tsk_table_collection_t *tables;
634+
tsk_id_t *paired_nodes_index;
636635
tsk_segment_t **ibd_segments_head;
637636
tsk_segment_t **ibd_segments_tail;
637+
tsk_size_t total_segments;
638638
tsk_blkalloc_t segment_heap;
639-
bool *is_sample;
640-
tsk_id_t *paired_nodes_index;
641-
double min_length;
642-
double max_time;
643-
tsk_segment_t **ancestor_map_head;
644-
tsk_segment_t **ancestor_map_tail;
645-
tsk_segment_t *segment_queue;
646-
tsk_size_t segment_queue_size;
647-
tsk_size_t max_segment_queue_size;
648-
} tsk_ibd_finder_t;
639+
} tsk_ibd_result_t;
649640

650641
/****************************************************************************/
651642
/* Common function options */
@@ -3404,6 +3395,12 @@ tsk_id_t tsk_table_collection_check_integrity(
34043395

34053396
/* Undocumented methods */
34063397

3398+
/* TODO be systematic about where "result" should be in the params
3399+
* list, different here and in link_ancestors. */
3400+
int tsk_table_collection_find_ibd(const tsk_table_collection_t *self,
3401+
tsk_ibd_result_t *result, const tsk_id_t *samples, tsk_size_t num_samples,
3402+
double min_length, double max_time, tsk_flags_t options);
3403+
34073404
int tsk_table_collection_link_ancestors(tsk_table_collection_t *self, tsk_id_t *samples,
34083405
tsk_size_t num_samples, tsk_id_t *ancestors, tsk_size_t num_ancestors,
34093406
tsk_flags_t options, tsk_edge_table_t *result);
@@ -3494,15 +3491,12 @@ int tsk_squash_edges(
34943491
tsk_edge_t *edges, tsk_size_t num_edges, tsk_size_t *num_output_edges);
34953492

34963493
/* IBD finder API. This is experimental and the interface may change. */
3497-
int tsk_ibd_finder_init(tsk_ibd_finder_t *ibd_finder, tsk_table_collection_t *tables,
3498-
tsk_id_t *pairs, tsk_size_t num_pairs);
3499-
int tsk_ibd_finder_set_min_length(tsk_ibd_finder_t *self, double min_length);
3500-
int tsk_ibd_finder_set_max_time(tsk_ibd_finder_t *self, double max_time);
3501-
int tsk_ibd_finder_free(tsk_ibd_finder_t *self);
3502-
int tsk_ibd_finder_run(tsk_ibd_finder_t *ibd_finder);
3503-
int tsk_ibd_finder_get_ibd_segments(tsk_ibd_finder_t *ibd_finder, tsk_id_t pair_index,
3504-
tsk_segment_t **ret_ibd_segments_head);
3505-
void tsk_ibd_finder_print_state(tsk_ibd_finder_t *self, FILE *out);
3494+
3495+
tsk_size_t tsk_ibd_result_get_total_segments(const tsk_ibd_result_t *self);
3496+
void tsk_ibd_result_print_state(tsk_ibd_result_t *self, FILE *out);
3497+
int tsk_ibd_result_free(tsk_ibd_result_t *self);
3498+
int tsk_ibd_result_get(const tsk_ibd_result_t *self, tsk_id_t sample_a,
3499+
tsk_id_t sample_b, tsk_segment_t **ret_head);
35063500

35073501
#ifdef __cplusplus
35083502
}

0 commit comments

Comments
 (0)