Skip to content

Commit 921c646

Browse files
committed
Implementation of time windows for the AFS,
and testing version of time windows for general stat test fixture cleanup remove not-run tests small issue with Tajimas D tests
1 parent 2710dcc commit 921c646

File tree

11 files changed

+919
-355
lines changed

11 files changed

+919
-355
lines changed

c/tests/test_stats.c

Lines changed: 135 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*/
2424

2525
#include "testlib.h"
26+
#include <math.h>
2627
#include <tskit/stats.h>
2728

2829
#include <unistd.h>
@@ -602,7 +603,7 @@ verify_pair_coalescence_rates(tsk_treeseq_t *ts)
602603
epochs[B] = DBL_MAX;
603604
ret = tsk_treeseq_pair_coalescence_rates(ts, P, sample_set_sizes, sample_sets, I,
604605
index_tuples, T, breakpoints, B, node_bin_map, epochs, 0, C);
605-
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_TIME_WINDOWS);
606+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_TIME_WINDOWS_END);
606607
epochs[B] = INFINITY;
607608

608609
node_bin_map[0] = (tsk_id_t) B;
@@ -868,6 +869,84 @@ verify_one_way_stat_func_errors(tsk_treeseq_t *ts, one_way_sample_stat_method *m
868869
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_WINDOWS);
869870
}
870871

872+
// Temporary definition for time_windows in tsk_treeseq_allele_frequency_spectrum
873+
typedef int one_way_sample_stat_method_tw(const tsk_treeseq_t *self,
874+
tsk_size_t num_sample_sets, const tsk_size_t *sample_set_sizes,
875+
const tsk_id_t *sample_sets, tsk_size_t num_windows, const double *windows,
876+
tsk_size_t num_time_windows, const double *time_windows, tsk_flags_t options,
877+
double *result);
878+
879+
// Temporary duplicate for time-windows-having methods
880+
static void
881+
verify_one_way_stat_func_errors_tw(
882+
tsk_treeseq_t *ts, one_way_sample_stat_method_tw *method)
883+
{
884+
int ret;
885+
tsk_id_t num_nodes = (tsk_id_t) tsk_treeseq_get_num_nodes(ts);
886+
tsk_id_t samples[] = { 0, 1, 2, 3 };
887+
tsk_size_t sample_set_sizes = 4;
888+
double windows[] = { 0, 0, 0 };
889+
double time_windows[] = { -1, 0.5, INFINITY };
890+
double result;
891+
892+
ret = method(ts, 0, &sample_set_sizes, samples, 0, NULL, 0, NULL, 0, &result);
893+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_INSUFFICIENT_SAMPLE_SETS);
894+
895+
samples[0] = TSK_NULL;
896+
ret = method(ts, 1, &sample_set_sizes, samples, 0, NULL, 0, NULL, 0, &result);
897+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NODE_OUT_OF_BOUNDS);
898+
samples[0] = -10;
899+
ret = method(ts, 1, &sample_set_sizes, samples, 0, NULL, 0, NULL, 0, &result);
900+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NODE_OUT_OF_BOUNDS);
901+
samples[0] = num_nodes;
902+
ret = method(ts, 1, &sample_set_sizes, samples, 0, NULL, 0, NULL, 0, &result);
903+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NODE_OUT_OF_BOUNDS);
904+
samples[0] = num_nodes + 1;
905+
ret = method(ts, 1, &sample_set_sizes, samples, 0, NULL, 0, NULL, 0, &result);
906+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NODE_OUT_OF_BOUNDS);
907+
908+
samples[0] = num_nodes - 1;
909+
ret = method(ts, 1, &sample_set_sizes, samples, 0, NULL, 0, NULL, 0, &result);
910+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_SAMPLES);
911+
912+
samples[0] = 1;
913+
ret = method(ts, 1, &sample_set_sizes, samples, 0, NULL, 0, NULL, 0, &result);
914+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_DUPLICATE_SAMPLE);
915+
916+
samples[0] = 0;
917+
sample_set_sizes = 0;
918+
ret = method(ts, 1, &sample_set_sizes, samples, 0, NULL, 0, NULL, 0, &result);
919+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_EMPTY_SAMPLE_SET);
920+
921+
sample_set_sizes = 4;
922+
/* Window errors */
923+
ret = method(ts, 1, &sample_set_sizes, samples, 0, windows, 0, NULL, 0, &result);
924+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_NUM_WINDOWS);
925+
926+
ret = method(ts, 1, &sample_set_sizes, samples, 2, windows, 0, NULL, 0, &result);
927+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_WINDOWS);
928+
929+
/* Time window errors */
930+
ret = method(
931+
ts, 1, &sample_set_sizes, samples, 0, NULL, 0, time_windows, 0, &result);
932+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_TIME_WINDOWS_DIM);
933+
934+
ret = method(
935+
ts, 1, &sample_set_sizes, samples, 0, NULL, 2, time_windows, 0, &result);
936+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_TIME_WINDOWS);
937+
938+
time_windows[0] = 0.1;
939+
ret = method(
940+
ts, 1, &sample_set_sizes, samples, 0, NULL, 2, time_windows, 0, &result);
941+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_TIME_WINDOWS);
942+
943+
time_windows[0] = 0;
944+
time_windows[1] = 0;
945+
ret = method(
946+
ts, 1, &sample_set_sizes, samples, 0, NULL, 2, time_windows, 0, &result);
947+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_TIME_WINDOWS);
948+
}
949+
871950
static void
872951
verify_two_way_stat_func_errors(
873952
tsk_treeseq_t *ts, general_sample_stat_method *method, tsk_flags_t options)
@@ -1180,6 +1259,7 @@ verify_afs(tsk_treeseq_t *ts)
11801259
int ret;
11811260
tsk_size_t n = tsk_treeseq_get_num_samples(ts);
11821261
tsk_size_t sample_set_sizes[2];
1262+
double time_windows[] = { 0, 1 };
11831263
const tsk_id_t *samples = tsk_treeseq_get_samples(ts);
11841264
double *result = tsk_malloc(n * n * sizeof(*result));
11851265

@@ -1188,23 +1268,28 @@ verify_afs(tsk_treeseq_t *ts)
11881268
sample_set_sizes[0] = n - 2;
11891269
sample_set_sizes[1] = 2;
11901270
ret = tsk_treeseq_allele_frequency_spectrum(
1191-
ts, 2, sample_set_sizes, samples, 0, NULL, 0, result);
1271+
ts, 2, sample_set_sizes, samples, 0, NULL, 0, NULL, 0, result);
11921272
CU_ASSERT_EQUAL_FATAL(ret, 0);
11931273

11941274
ret = tsk_treeseq_allele_frequency_spectrum(
1195-
ts, 2, sample_set_sizes, samples, 0, NULL, TSK_STAT_POLARISED, result);
1275+
ts, 2, sample_set_sizes, samples, 0, NULL, 0, NULL, TSK_STAT_POLARISED, result);
11961276
CU_ASSERT_EQUAL_FATAL(ret, 0);
11971277

11981278
ret = tsk_treeseq_allele_frequency_spectrum(ts, 2, sample_set_sizes, samples, 0,
1199-
NULL, TSK_STAT_POLARISED | TSK_STAT_SPAN_NORMALISE, result);
1279+
NULL, 0, NULL, TSK_STAT_POLARISED | TSK_STAT_SPAN_NORMALISE, result);
12001280
CU_ASSERT_EQUAL_FATAL(ret, 0);
12011281

12021282
ret = tsk_treeseq_allele_frequency_spectrum(ts, 2, sample_set_sizes, samples, 0,
1203-
NULL, TSK_STAT_BRANCH | TSK_STAT_POLARISED | TSK_STAT_SPAN_NORMALISE, result);
1283+
NULL, 0, NULL, TSK_STAT_BRANCH | TSK_STAT_POLARISED | TSK_STAT_SPAN_NORMALISE,
1284+
result);
12041285
CU_ASSERT_EQUAL_FATAL(ret, 0);
12051286

12061287
ret = tsk_treeseq_allele_frequency_spectrum(ts, 2, sample_set_sizes, samples, 0,
1207-
NULL, TSK_STAT_BRANCH | TSK_STAT_SPAN_NORMALISE, result);
1288+
NULL, 0, NULL, TSK_STAT_BRANCH | TSK_STAT_SPAN_NORMALISE, result);
1289+
CU_ASSERT_EQUAL_FATAL(ret, 0);
1290+
1291+
ret = tsk_treeseq_allele_frequency_spectrum(ts, 2, sample_set_sizes, samples, 0,
1292+
NULL, 1, time_windows, TSK_STAT_BRANCH | TSK_STAT_SPAN_NORMALISE, result);
12081293
CU_ASSERT_EQUAL_FATAL(ret, 0);
12091294

12101295
free(result);
@@ -2398,21 +2483,26 @@ test_paper_ex_afs_errors(void)
23982483
tsk_size_t sample_set_sizes[] = { 2, 2 };
23992484
tsk_id_t samples[] = { 0, 1, 2, 3 };
24002485
double result[10]; /* not thinking too hard about the actual value needed */
2486+
double time_windows[] = { 0, 1 };
24012487
int ret;
24022488

24032489
tsk_treeseq_from_text(&ts, 10, paper_ex_nodes, paper_ex_edges, NULL, paper_ex_sites,
24042490
paper_ex_mutations, paper_ex_individuals, NULL, 0);
24052491

2406-
verify_one_way_stat_func_errors(&ts, tsk_treeseq_allele_frequency_spectrum);
2492+
verify_one_way_stat_func_errors_tw(&ts, tsk_treeseq_allele_frequency_spectrum);
24072493

24082494
ret = tsk_treeseq_allele_frequency_spectrum(
2409-
&ts, 2, sample_set_sizes, samples, 0, NULL, TSK_STAT_NODE, result);
2495+
&ts, 2, sample_set_sizes, samples, 0, NULL, 0, NULL, TSK_STAT_NODE, result);
24102496
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_UNSUPPORTED_STAT_MODE);
24112497

24122498
ret = tsk_treeseq_allele_frequency_spectrum(&ts, 2, sample_set_sizes, samples, 0,
2413-
NULL, TSK_STAT_BRANCH | TSK_STAT_SITE, result);
2499+
NULL, 0, NULL, TSK_STAT_BRANCH | TSK_STAT_SITE, result);
24142500
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_MULTIPLE_STAT_MODES);
24152501

2502+
ret = tsk_treeseq_allele_frequency_spectrum(&ts, 2, sample_set_sizes, samples, 0,
2503+
NULL, 1, time_windows, TSK_STAT_SITE, result);
2504+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_UNSUPPORTED_STAT_MODE);
2505+
24162506
tsk_treeseq_free(&ts);
24172507
}
24182508

@@ -2430,14 +2520,14 @@ test_paper_ex_afs(void)
24302520
/* we have two singletons and one tripleton */
24312521

24322522
ret = tsk_treeseq_allele_frequency_spectrum(
2433-
&ts, 1, sample_set_sizes, samples, 0, NULL, 0, result);
2523+
&ts, 1, sample_set_sizes, samples, 0, NULL, 0, NULL, 0, result);
24342524
CU_ASSERT_EQUAL_FATAL(ret, 0);
24352525
CU_ASSERT_EQUAL_FATAL(result[0], 0);
24362526
CU_ASSERT_EQUAL_FATAL(result[1], 3.0);
24372527
CU_ASSERT_EQUAL_FATAL(result[2], 0);
24382528

24392529
ret = tsk_treeseq_allele_frequency_spectrum(
2440-
&ts, 1, sample_set_sizes, samples, 0, NULL, TSK_STAT_POLARISED, result);
2530+
&ts, 1, sample_set_sizes, samples, 0, NULL, 0, NULL, TSK_STAT_POLARISED, result);
24412531
CU_ASSERT_EQUAL_FATAL(ret, 0);
24422532
CU_ASSERT_EQUAL_FATAL(result[0], 0);
24432533
CU_ASSERT_EQUAL_FATAL(result[1], 2.0);
@@ -2465,6 +2555,39 @@ test_paper_ex_divergence_matrix(void)
24652555
tsk_treeseq_free(&ts);
24662556
}
24672557

2558+
static void
2559+
test_unary_ex_afs(void)
2560+
{
2561+
tsk_treeseq_t ts;
2562+
tsk_id_t samples[] = { 0, 2, 3 };
2563+
tsk_size_t sample_set_sizes[] = { 3, 0 };
2564+
double result[25];
2565+
int ret;
2566+
2567+
tsk_treeseq_from_text(&ts, 100, unary_ex_nodes, unary_ex_edges, NULL, unary_ex_sites,
2568+
unary_ex_mutations, NULL, NULL, 0);
2569+
/* we have a singleton and a doubleton */
2570+
2571+
ret = tsk_treeseq_allele_frequency_spectrum(
2572+
&ts, 1, sample_set_sizes, samples, 0, NULL, 0, NULL, TSK_STAT_POLARISED, result);
2573+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2574+
CU_ASSERT_EQUAL_FATAL(result[0], 0);
2575+
CU_ASSERT_EQUAL_FATAL(result[1], 1.0);
2576+
CU_ASSERT_EQUAL_FATAL(result[2], 1.0);
2577+
CU_ASSERT_EQUAL_FATAL(result[3], 0.0);
2578+
2579+
ret = tsk_treeseq_allele_frequency_spectrum(&ts, 1, sample_set_sizes, samples, 0,
2580+
NULL, 0, NULL, TSK_STAT_BRANCH | TSK_STAT_POLARISED, result);
2581+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2582+
CU_ASSERT_TRUE_FATAL(result[0] > 0);
2583+
CU_ASSERT_TRUE_FATAL(result[1] > 0);
2584+
CU_ASSERT_TRUE_FATAL(result[2] > 0);
2585+
CU_ASSERT_EQUAL_FATAL(result[3], 0.0);
2586+
2587+
verify_afs(&ts);
2588+
tsk_treeseq_free(&ts);
2589+
}
2590+
24682591
static void
24692592
test_nonbinary_ex_ld(void)
24702593
{
@@ -4000,6 +4123,7 @@ main(int argc, char **argv)
40004123
{ "test_paper_ex_afs", test_paper_ex_afs },
40014124
{ "test_paper_ex_divergence_matrix", test_paper_ex_divergence_matrix },
40024125

4126+
{ "test_unary_ex_afs", test_unary_ex_afs },
40034127
{ "test_nonbinary_ex_ld", test_nonbinary_ex_ld },
40044128
{ "test_nonbinary_ex_mean_descendants", test_nonbinary_ex_mean_descendants },
40054129
{ "test_nonbinary_ex_genealogical_nearest_neighbours",

c/tests/test_trees.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5543,9 +5543,9 @@ test_unary_multi_tree(void)
55435543
{
55445544
// clang-format off
55455545
tsk_id_t parents[] = {
5546-
6, 5, 7, 5, TSK_NULL, 6, 8, 8, TSK_NULL,
5547-
6, 5, 4, 4, 5, 6, 8, TSK_NULL, TSK_NULL,
5548-
7, 5, 4, 4, 5, 7, TSK_NULL, TSK_NULL, TSK_NULL,
5546+
6, 5, 7, 5, TSK_NULL, 6, 8, 8, TSK_NULL, 5,
5547+
6, 5, 4, 4, 5, 6, 8, TSK_NULL, TSK_NULL, 5,
5548+
7, 5, 4, 4, 5, 7, TSK_NULL, TSK_NULL, TSK_NULL, 5,
55495549
};
55505550
// clang-format on
55515551
tsk_treeseq_t ts;
@@ -8026,13 +8026,13 @@ test_time_uncalibrated(void)
80268026
CU_ASSERT_EQUAL_FATAL(ret, 0);
80278027

80288028
ret = tsk_treeseq_allele_frequency_spectrum(
8029-
&ts2, 2, sample_set_sizes, samples, 0, NULL, TSK_STAT_SITE, result);
8029+
&ts2, 2, sample_set_sizes, samples, 0, NULL, 0, NULL, TSK_STAT_SITE, result);
80308030
CU_ASSERT_EQUAL_FATAL(ret, 0);
80318031
ret = tsk_treeseq_allele_frequency_spectrum(
8032-
&ts2, 2, sample_set_sizes, samples, 0, NULL, TSK_STAT_BRANCH, result);
8032+
&ts2, 2, sample_set_sizes, samples, 0, NULL, 0, NULL, TSK_STAT_BRANCH, result);
80338033
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_TIME_UNCALIBRATED);
80348034
ret = tsk_treeseq_allele_frequency_spectrum(&ts2, 2, sample_set_sizes, samples, 0,
8035-
NULL, TSK_STAT_BRANCH | TSK_STAT_ALLOW_TIME_UNCALIBRATED, result);
8035+
NULL, 0, NULL, TSK_STAT_BRANCH | TSK_STAT_ALLOW_TIME_UNCALIBRATED, result);
80368036
CU_ASSERT_EQUAL_FATAL(ret, 0);
80378037

80388038
sigma = tsk_calloc(tsk_treeseq_get_num_nodes(&ts2), sizeof(double));

c/tests/testlib.c

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,19 @@ const char *paper_ex_individuals = "0 0.2,1.5 -1,-1\n"
9797

9898
/*** An example of a nonbinary tree sequence ***/
9999
/*
100-
0.41┊ 12 ┊ 12 ┊
101-
┊ ┃ ┊ ┃ ┊
102-
0.28┊ ┃ ┊ ┃ ┊
103-
┊ ┃ ┊ ┃ ┊
104-
0.13┊ 10 ┊ 10 ┊
105-
┊ ┏━╋━┓ ┊ ┏┻┓ ┊
106-
0.07┊ ┃ ┃ ┃ ┊ ┃ ┃ ┊
107-
┊ ┃ ┃ ┃ ┊ ┃ ┃ ┊
108-
0.01┊ ┃ ┃ ┃ ┊ ┃ ┃ ┊
109-
┊ ┃ ┃ ┃ ┊ ┃ ┃ ┊
110-
0.00┊ 0 1 2 3 4 5 7 6 ┊ 0 1 2 3 4 7 5 6 ┊
100+
0.41┊ 12 ┊ 12 ┊
101+
┊ ┏━━┻━━┓ ┊ ┏━┻━━┓ ┊
102+
0.28┊ ┃ ┃ ┊ 11 ┃ ┊
103+
┊ ┃ ┃ ┊ ┏━┻━┓ ┃ ┊
104+
0.13┊ ┃ 10 ┊ ┃ ┃ 10 ┊
105+
┊ ┃ ┏━╋━┓ ┊ ┃ ┃ ┏┻┓ ┊
106+
0.07┊ 9 ┃ ┃ ┃ ┊ 9 ┃ ┃ ┃ ┊
107+
┊ ┏━━┻━┓ ┃ ┃ ┃ ┊ ┏━━┻━┓ ┃ ┃ ┃ ┊
108+
0.01┊ 8 ┃ ┃ ┃ ┃ ┊ 8 ┃ ┃ ┃ ┃ ┊
109+
┊ ┏━┳┻┳━┓ ┃ ┃ ┃ ┃ ┊ ┏━┳┻┳━┓ ┃ ┃ ┃ ┃ ┊
110+
0.00┊ 0 1 2 3 6 4 5 7 ┊ 0 1 2 3 6 5 4 7 ┊
111+
0 17 100
112+
111113
*/
112114
const char *nonbinary_ex_nodes = "1 0 0 -1\n"
113115
"1 0 0 -1\n"
@@ -136,20 +138,21 @@ const char *nonbinary_ex_sites = "1 0\n"
136138
const char *nonbinary_ex_mutations = "0 2 1\n"
137139
"1 11 1";
138140

139-
/*** An example of a tree sequence with unary nodes. ***/
141+
/*** An example of a tree sequence with unary nodes
142+
* and also a non-sample leaf (node 9). ***/
140143
/*
141-
0.25┊ 8 ┊ 8 ┊ ┊
142-
┊ ┏━┻━┓ ┊ ┃ ┊ ┊
143-
0.20┊ ┃ 7 ┊ ┃ ┊ 7 ┊
144-
┊ ┃ ┃ ┊ ┃ ┊ ┏━┻━
145-
0.17┊ 6 ┃ ┊ 6 ┊ ┃
146-
┊ ┏━┻┓ ┃ ┊ ┏━┻━┓ ┊ ┃
147-
0.09┊ ┃ 5 ┃ ┊ ┃ 5 ┊ ┃ 5
148-
┊ ┃ ┏┓ ┃ ┊ ┃ ┏━┻┓ ┊ ┃ ┏━┻┓
149-
0.07┊ ┃ ┃ ┃ ┃ ┊ ┃ ┃ 4 ┊ ┃ ┃ 4 ┊
150-
┊ ┃ ┃ ┃ ┃ ┊ ┃ ┃ ┏┻┓ ┊ ┃ ┃ ┏┻┓ ┊
151-
0.00┊ 0 1 3 2 ┊ 0 1 2 3 ┊ 0 1 2 3 ┊
152-
0.00 2.00 7.00 10.00
144+
0.25┊ 8 ┊ 8 ┊ ┊
145+
┊ ┏━━┻━━┓ ┊ ┃ ┊ ┊
146+
0.20┊ ┃ 7 ┊ ┃ ┊ 7
147+
┊ ┃ ┃ ┊ ┃ ┊ ┏━┻━━┓ ┊
148+
0.17┊ 6 ┃ ┊ 6 ┊ ┃ ┃ ┊
149+
┊ ┏━┻ ┃ ┊ ┏━┻━ ┊ ┃ ┃ ┊
150+
0.09┊ ┃ 5 ┃ ┊ ┃ 5 ┊ ┃ 5 ┊
151+
┊ ┃ ┏━╋━┓ ┃ ┊ ┃ ┏━━╋━━┓ ┊ ┃ ┏━━╋━━┓ ┊
152+
0.07┊ ┃ ┃ ┃ ┃ ┊ ┃ ┃ 4 ┊ ┃ ┃ 4 ┃ ┊
153+
┊ ┃ ┃ ┃ ┃ ┊ ┃ ┃ ┏┻┓ ┊ ┃ ┃ ┏┻┓ ┃ ┊
154+
0.00┊ 0 1 3 9 2 ┊ 0 1 2 3 9 ┊ 0 1 2 3 9 ┊ 0 1 2 3 ┊
155+
0 2 7 10 100
153156
*/
154157
const char *unary_ex_nodes = "1 0 0 -1\n"
155158
"1 0 0 -1\n"
@@ -159,11 +162,13 @@ const char *unary_ex_nodes = "1 0 0 -1\n"
159162
"0 0.090 0 -1\n"
160163
"0 0.170 0 -1\n"
161164
"0 0.202 0 -1\n"
162-
"0 0.253 0 -1\n";
165+
"0 0.253 0 -1\n"
166+
"0 0 0 -1\n";
163167
const char *unary_ex_edges = "2 10 4 2,3\n"
164168
"0 10 5 1\n"
165169
"0 2 5 3\n"
166170
"2 10 5 4\n"
171+
"0 10 5 9\n"
167172
"0 7 6 0,5\n"
168173
"7 10 7 0\n"
169174
"0 2 7 2\n"
@@ -177,6 +182,7 @@ const char *unary_ex_sites = "1.0 0\n"
177182
"8.5 0\n";
178183
const char *unary_ex_mutations = "0 2 1\n"
179184
"1 6 1\n"
185+
"1 9 0\n"
180186
"2 5 1\n";
181187

182188
/* An example of a simple tree sequence with multiple marginal trees. */

c/tskit/core.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,9 +526,13 @@ tsk_strerror_internal(int err)
526526
"(TSK_ERR_BAD_SAMPLE_PAIR_TIMES)";
527527
break;
528528
case TSK_ERR_BAD_TIME_WINDOWS:
529-
ret = "Time windows must be strictly increasing and end at infinity. "
529+
ret = "Time windows must start at zero and be strictly increasing. "
530530
"(TSK_ERR_BAD_TIME_WINDOWS)";
531531
break;
532+
case TSK_ERR_BAD_TIME_WINDOWS_END:
533+
ret = "Time windows must end at infinity for this method. "
534+
"(TSK_ERR_BAD_TIME_WINDOWS_END)";
535+
break;
532536
case TSK_ERR_BAD_NODE_TIME_WINDOW:
533537
ret = "Node time does not fall within assigned time window. "
534538
"(TSK_ERR_BAD_NODE_TIME_WINDOW)";

c/tskit/core.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -746,13 +746,17 @@ Sample times do not all equal the start of first time window
746746
*/
747747
#define TSK_ERR_BAD_SAMPLE_PAIR_TIMES -923
748748
/**
749-
Time windows are not strictly increasing ending at infinity
749+
Time windows are not strictly increasing
750750
*/
751751
#define TSK_ERR_BAD_TIME_WINDOWS -924
752752
/**
753+
Time windows do not end at infinity
754+
*/
755+
#define TSK_ERR_BAD_TIME_WINDOWS_END -925
756+
/**
753757
Node time does not fall within assigned time window
754758
*/
755-
#define TSK_ERR_BAD_NODE_TIME_WINDOW -925
759+
#define TSK_ERR_BAD_NODE_TIME_WINDOW -926
756760
/** @} */
757761

758762
/**

0 commit comments

Comments
 (0)