Skip to content

Commit f46946e

Browse files
gtsambosmergify-bot
authored andcommitted
Added an extra min_length threshold check in find_ibd.
Added extra find_ibd tests using min_length input.
1 parent 515a6e2 commit f46946e

File tree

3 files changed

+58
-11
lines changed

3 files changed

+58
-11
lines changed

c/tskit/tables.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7415,17 +7415,19 @@ tsk_ibd_finder_enqueue_segment(
74157415
void *p;
74167416

74177417
tsk_bug_assert(left < right);
7418-
/* Make sure we always have room for one more segment in the queue so we
7419-
* can put a tail sentinel on it */
7420-
if (self->segment_queue_size == self->max_segment_queue_size - 1) {
7421-
self->max_segment_queue_size *= 2;
7422-
p = tsk_realloc(self->segment_queue,
7423-
self->max_segment_queue_size * sizeof(*self->segment_queue));
7424-
if (p == NULL) {
7425-
ret = TSK_ERR_NO_MEMORY;
7426-
goto out;
7418+
if (right - left > self->min_length) {
7419+
/* Make sure we always have room for one more segment in the queue so we
7420+
* can put a tail sentinel on it */
7421+
if (self->segment_queue_size == self->max_segment_queue_size - 1) {
7422+
self->max_segment_queue_size *= 2;
7423+
p = tsk_realloc(self->segment_queue,
7424+
self->max_segment_queue_size * sizeof(*self->segment_queue));
7425+
if (p == NULL) {
7426+
ret = TSK_ERR_NO_MEMORY;
7427+
goto out;
7428+
}
7429+
self->segment_queue = p;
74277430
}
7428-
self->segment_queue = p;
74297431
}
74307432
seg = self->segment_queue + self->segment_queue_size;
74317433
seg->left = left;

python/tests/ibd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ def find_ibd_segments(self):
266266
max(seg.left, s.left),
267267
min(seg.right, s.right),
268268
)
269-
if intvl[1] - intvl[0] > 0:
269+
if intvl[1] - intvl[0] > self.min_length:
270270
list_to_add.add(Segment(intvl[0], intvl[1], s.node))
271271
s = s.next
272272

python/tests/test_ibd.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,51 @@ def test_defaults(self):
778778
assert ibd_is_equal(ibd_segs, true_segs)
779779

780780

781+
class TestIbdLengthThreshold:
782+
"""
783+
Tests the behaviour of the min_length argument in niche cases.
784+
"""
785+
786+
# 2
787+
# | 3
788+
# 1 2 | / \
789+
# / \ | / \
790+
# 0 0 1 | 0 1
791+
# |------------|----------|
792+
# 0.0 0.4 1.0
793+
nodes = io.StringIO(
794+
"""\
795+
id is_sample time
796+
0 1 0
797+
1 1 0
798+
2 0 1
799+
3 0 1.5
800+
"""
801+
)
802+
edges = io.StringIO(
803+
"""\
804+
left right parent child
805+
0 0.4 2 0,1
806+
0.4 1.0 3 0,1
807+
"""
808+
)
809+
ts = tskit.load_text(nodes=nodes, edges=edges, strict=False)
810+
811+
def test_length_exceeds_segment(self):
812+
ibd_segs = find_ibd(self.ts, sample_pairs=[(0, 1)], min_length=1.1)
813+
true_segs = {(0, 1): []}
814+
assert ibd_is_equal(ibd_segs, true_segs)
815+
816+
def test_length_is_negative(self):
817+
with pytest.raises(tskit.LibraryError):
818+
find_ibd(self.ts, sample_pairs=[(0, 1)], min_length=-0.1)
819+
820+
def test_equal_to_length(self):
821+
ibd_segs = find_ibd(self.ts, sample_pairs=[(0, 1)], min_length=0.4)
822+
true_segs = {(0, 1): [ibd.Segment(0.4, 1.0, 3)]}
823+
assert ibd_is_equal(ibd_segs, true_segs)
824+
825+
781826
class TestIbdRandomExamples:
782827
"""
783828
Randomly generated test cases.

0 commit comments

Comments
 (0)