@@ -331,7 +331,7 @@ verify_trees(tsk_treeseq_t *ts, tsk_size_t num_trees, tsk_id_t *parents)
331
331
uint32_t mutation_index , site_index ;
332
332
tsk_size_t k , l , tree_sites_length ;
333
333
const tsk_site_t * sites = NULL ;
334
- tsk_tree_t tree ;
334
+ tsk_tree_t tree , skip_tree ;
335
335
tsk_size_t num_edges ;
336
336
tsk_size_t num_nodes = tsk_treeseq_get_num_nodes (ts );
337
337
tsk_size_t num_sites = tsk_treeseq_get_num_sites (ts );
@@ -340,6 +340,7 @@ verify_trees(tsk_treeseq_t *ts, tsk_size_t num_trees, tsk_id_t *parents)
340
340
341
341
ret = tsk_tree_init (& tree , ts , 0 );
342
342
CU_ASSERT_EQUAL (ret , 0 );
343
+ ret = tsk_tree_init (& skip_tree , ts , 0 );
343
344
CU_ASSERT_EQUAL (tsk_treeseq_get_num_trees (ts ), num_trees );
344
345
345
346
CU_ASSERT_EQUAL (tree .index , -1 );
@@ -372,6 +373,21 @@ verify_trees(tsk_treeseq_t *ts, tsk_size_t num_trees, tsk_id_t *parents)
372
373
}
373
374
site_index ++ ;
374
375
}
376
+ /* Check the skip tree */
377
+ ret = tsk_tree_first (& skip_tree );
378
+ CU_ASSERT_EQUAL (ret , TSK_TREE_OK );
379
+ ret = tsk_tree_seek (& skip_tree , breakpoints [j ], TSK_SEEK_SKIP );
380
+ CU_ASSERT_EQUAL (ret , 0 );
381
+ /* Calling print_state here also verifies the integrity of the tree */
382
+ tsk_tree_print_state (& skip_tree , _devnull );
383
+ check_trees_equal (& tree , & skip_tree );
384
+ ret = tsk_tree_last (& skip_tree );
385
+ CU_ASSERT_EQUAL (ret , TSK_TREE_OK );
386
+ ret = tsk_tree_seek (& skip_tree , breakpoints [j ], TSK_SEEK_SKIP );
387
+ CU_ASSERT_EQUAL (ret , 0 );
388
+ tsk_tree_print_state (& skip_tree , _devnull );
389
+ check_trees_equal (& tree , & skip_tree );
390
+
375
391
j ++ ;
376
392
}
377
393
CU_ASSERT_EQUAL (ret , 0 );
@@ -381,6 +397,7 @@ verify_trees(tsk_treeseq_t *ts, tsk_size_t num_trees, tsk_id_t *parents)
381
397
CU_ASSERT_EQUAL (tsk_treeseq_get_sequence_length (ts ), breakpoints [j ]);
382
398
383
399
tsk_tree_free (& tree );
400
+ tsk_tree_free (& skip_tree );
384
401
385
402
verify_tree_pos (ts , num_trees , parents );
386
403
}
@@ -811,7 +828,8 @@ typedef struct {
811
828
} sample_count_test_t ;
812
829
813
830
static void
814
- verify_sample_counts (tsk_treeseq_t * ts , tsk_size_t num_tests , sample_count_test_t * tests )
831
+ verify_sample_counts (tsk_treeseq_t * ts , tsk_size_t num_tests , sample_count_test_t * tests ,
832
+ tsk_flags_t seek_options )
815
833
{
816
834
int ret ;
817
835
tsk_size_t j , num_samples , n , k ;
@@ -826,13 +844,9 @@ verify_sample_counts(tsk_treeseq_t *ts, tsk_size_t num_tests, sample_count_test_
826
844
827
845
ret = tsk_tree_init (& tree , ts , TSK_NO_SAMPLE_COUNTS );
828
846
CU_ASSERT_EQUAL (ret , 0 );
829
- ret = tsk_tree_first (& tree );
830
- CU_ASSERT_EQUAL_FATAL (ret , TSK_TREE_OK );
831
847
for (j = 0 ; j < num_tests ; j ++ ) {
832
- while (tree .index < tests [j ].tree_index ) {
833
- ret = tsk_tree_next (& tree );
834
- CU_ASSERT_EQUAL_FATAL (ret , TSK_TREE_OK );
835
- }
848
+ ret = tsk_tree_seek_index (& tree , tests [j ].tree_index , seek_options );
849
+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
836
850
ret = tsk_tree_get_num_samples (& tree , tests [j ].node , & num_samples );
837
851
CU_ASSERT_EQUAL_FATAL (ret , 0 );
838
852
CU_ASSERT_EQUAL (tests [j ].count , num_samples );
@@ -850,10 +864,8 @@ verify_sample_counts(tsk_treeseq_t *ts, tsk_size_t num_tests, sample_count_test_
850
864
ret = tsk_tree_first (& tree );
851
865
CU_ASSERT_EQUAL_FATAL (ret , TSK_TREE_OK );
852
866
for (j = 0 ; j < num_tests ; j ++ ) {
853
- while (tree .index < tests [j ].tree_index ) {
854
- ret = tsk_tree_next (& tree );
855
- CU_ASSERT_EQUAL_FATAL (ret , TSK_TREE_OK );
856
- }
867
+ ret = tsk_tree_seek_index (& tree , tests [j ].tree_index , seek_options );
868
+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
857
869
ret = tsk_tree_get_num_samples (& tree , tests [j ].node , & num_samples );
858
870
CU_ASSERT_EQUAL_FATAL (ret , 0 );
859
871
CU_ASSERT_EQUAL (tests [j ].count , num_samples );
@@ -872,10 +884,8 @@ verify_sample_counts(tsk_treeseq_t *ts, tsk_size_t num_tests, sample_count_test_
872
884
ret = tsk_tree_first (& tree );
873
885
CU_ASSERT_EQUAL_FATAL (ret , TSK_TREE_OK );
874
886
for (j = 0 ; j < num_tests ; j ++ ) {
875
- while (tree .index < tests [j ].tree_index ) {
876
- ret = tsk_tree_next (& tree );
877
- CU_ASSERT_EQUAL_FATAL (ret , TSK_TREE_OK );
878
- }
887
+ ret = tsk_tree_seek_index (& tree , tests [j ].tree_index , seek_options );
888
+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
879
889
ret = tsk_tree_get_num_samples (& tree , tests [j ].node , & num_samples );
880
890
CU_ASSERT_EQUAL_FATAL (ret , 0 );
881
891
CU_ASSERT_EQUAL (tests [j ].count , num_samples );
@@ -908,10 +918,8 @@ verify_sample_counts(tsk_treeseq_t *ts, tsk_size_t num_tests, sample_count_test_
908
918
ret = tsk_tree_first (& tree );
909
919
CU_ASSERT_EQUAL_FATAL (ret , TSK_TREE_OK );
910
920
for (j = 0 ; j < num_tests ; j ++ ) {
911
- while (tree .index < tests [j ].tree_index ) {
912
- ret = tsk_tree_next (& tree );
913
- CU_ASSERT_EQUAL_FATAL (ret , TSK_TREE_OK );
914
- }
921
+ ret = tsk_tree_seek_index (& tree , tests [j ].tree_index , seek_options );
922
+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
915
923
ret = tsk_tree_get_num_samples (& tree , tests [j ].node , & num_samples );
916
924
CU_ASSERT_EQUAL_FATAL (ret , 0 );
917
925
CU_ASSERT_EQUAL (tests [j ].count , num_samples );
@@ -1008,6 +1016,7 @@ verify_sample_sets(tsk_treeseq_t *ts)
1008
1016
{
1009
1017
int ret ;
1010
1018
tsk_tree_t t ;
1019
+ tsk_id_t j ;
1011
1020
1012
1021
ret = tsk_tree_init (& t , ts , TSK_SAMPLE_LISTS );
1013
1022
CU_ASSERT_EQUAL (ret , 0 );
@@ -1021,6 +1030,20 @@ verify_sample_sets(tsk_treeseq_t *ts)
1021
1030
}
1022
1031
CU_ASSERT_EQUAL_FATAL (ret , 0 );
1023
1032
1033
+ for (j = 0 ; j < (tsk_id_t ) tsk_treeseq_get_num_trees (ts ); j ++ ) {
1034
+ ret = tsk_tree_first (& t );
1035
+ CU_ASSERT_EQUAL_FATAL (ret , TSK_TREE_OK );
1036
+ ret = tsk_tree_seek_index (& t , j , TSK_SEEK_SKIP );
1037
+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
1038
+ verify_sample_sets_for_tree (& t );
1039
+
1040
+ ret = tsk_tree_last (& t );
1041
+ CU_ASSERT_EQUAL_FATAL (ret , TSK_TREE_OK );
1042
+ ret = tsk_tree_seek_index (& t , j , TSK_SEEK_SKIP );
1043
+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
1044
+ verify_sample_sets_for_tree (& t );
1045
+ }
1046
+
1024
1047
tsk_tree_free (& t );
1025
1048
}
1026
1049
@@ -5870,7 +5893,8 @@ test_simple_sample_sets(void)
5870
5893
5871
5894
tsk_treeseq_from_text (& ts , 10 , paper_ex_nodes , paper_ex_edges , NULL , NULL , NULL ,
5872
5895
paper_ex_individuals , NULL , 0 );
5873
- verify_sample_counts (& ts , num_tests , tests );
5896
+ verify_sample_counts (& ts , num_tests , tests , 0 );
5897
+ verify_sample_counts (& ts , num_tests , tests , TSK_SEEK_SKIP );
5874
5898
verify_sample_sets (& ts );
5875
5899
5876
5900
tsk_treeseq_free (& ts );
@@ -5889,7 +5913,8 @@ test_nonbinary_sample_sets(void)
5889
5913
5890
5914
tsk_treeseq_from_text (& ts , 100 , nonbinary_ex_nodes , nonbinary_ex_edges , NULL , NULL ,
5891
5915
NULL , NULL , NULL , 0 );
5892
- verify_sample_counts (& ts , num_tests , tests );
5916
+ verify_sample_counts (& ts , num_tests , tests , 0 );
5917
+ verify_sample_counts (& ts , num_tests , tests , TSK_SEEK_SKIP );
5893
5918
verify_sample_sets (& ts );
5894
5919
5895
5920
tsk_treeseq_free (& ts );
@@ -5909,7 +5934,8 @@ test_internal_sample_sample_sets(void)
5909
5934
5910
5935
tsk_treeseq_from_text (& ts , 10 , internal_sample_ex_nodes , internal_sample_ex_edges ,
5911
5936
NULL , NULL , NULL , NULL , NULL , 0 );
5912
- verify_sample_counts (& ts , num_tests , tests );
5937
+ verify_sample_counts (& ts , num_tests , tests , 0 );
5938
+ verify_sample_counts (& ts , num_tests , tests , TSK_SEEK_SKIP );
5913
5939
verify_sample_sets (& ts );
5914
5940
5915
5941
tsk_treeseq_free (& ts );
@@ -6283,7 +6309,7 @@ test_multiroot_tree_traversal(void)
6283
6309
}
6284
6310
6285
6311
static void
6286
- test_seek_multi_tree ( void )
6312
+ verify_seek_multi_tree ( tsk_flags_t seek_options )
6287
6313
{
6288
6314
int ret ;
6289
6315
tsk_treeseq_t ts ;
@@ -6299,29 +6325,29 @@ test_seek_multi_tree(void)
6299
6325
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6300
6326
6301
6327
for (j = 0 ; j < num_trees ; j ++ ) {
6302
- ret = tsk_tree_seek (& t , breakpoints [j ], 0 );
6328
+ ret = tsk_tree_seek (& t , breakpoints [j ], seek_options );
6303
6329
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6304
6330
CU_ASSERT_EQUAL_FATAL (t .index , j );
6305
- ret = tsk_tree_seek_index (& t , j , 0 );
6331
+ ret = tsk_tree_seek_index (& t , j , seek_options );
6306
6332
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6307
6333
CU_ASSERT_EQUAL_FATAL (t .index , j );
6308
6334
for (k = 0 ; k < num_trees ; k ++ ) {
6309
- ret = tsk_tree_seek (& t , breakpoints [k ], 0 );
6335
+ ret = tsk_tree_seek (& t , breakpoints [k ], seek_options );
6310
6336
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6311
6337
CU_ASSERT_EQUAL_FATAL (t .index , k );
6312
- ret = tsk_tree_seek_index (& t , k , 0 );
6338
+ ret = tsk_tree_seek_index (& t , k , seek_options );
6313
6339
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6314
6340
CU_ASSERT_EQUAL_FATAL (t .index , k );
6315
6341
}
6316
6342
}
6317
6343
6318
- ret = tsk_tree_seek (& t , 1.99999 , 0 );
6344
+ ret = tsk_tree_seek (& t , 1.99999 , seek_options );
6319
6345
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6320
6346
CU_ASSERT_EQUAL_FATAL (t .index , 0 );
6321
- ret = tsk_tree_seek (& t , 6.99999 , 0 );
6347
+ ret = tsk_tree_seek (& t , 6.99999 , seek_options );
6322
6348
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6323
6349
CU_ASSERT_EQUAL_FATAL (t .index , 1 );
6324
- ret = tsk_tree_seek (& t , 9.99999 , 0 );
6350
+ ret = tsk_tree_seek (& t , 9.99999 , seek_options );
6325
6351
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6326
6352
CU_ASSERT_EQUAL_FATAL (t .index , 2 );
6327
6353
@@ -6331,7 +6357,7 @@ test_seek_multi_tree(void)
6331
6357
for (j = 0 ; j < num_trees ; j ++ ) {
6332
6358
ret = tsk_tree_init (& t , & ts , 0 );
6333
6359
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6334
- ret = tsk_tree_seek (& t , breakpoints [j ], 0 );
6360
+ ret = tsk_tree_seek (& t , breakpoints [j ], seek_options );
6335
6361
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6336
6362
CU_ASSERT_EQUAL_FATAL (t .index , j );
6337
6363
tsk_tree_free (& t );
@@ -6341,12 +6367,12 @@ test_seek_multi_tree(void)
6341
6367
ret = tsk_tree_init (& t , & ts , 0 );
6342
6368
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6343
6369
for (j = 0 ; j < num_trees ; j ++ ) {
6344
- ret = tsk_tree_seek (& t , 0 , 0 );
6370
+ ret = tsk_tree_seek (& t , 0 , seek_options );
6345
6371
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6346
6372
ret = tsk_tree_prev (& t );
6347
6373
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6348
6374
CU_ASSERT_EQUAL_FATAL (t .index , -1 );
6349
- ret = tsk_tree_seek (& t , breakpoints [j ], 0 );
6375
+ ret = tsk_tree_seek (& t , breakpoints [j ], seek_options );
6350
6376
CU_ASSERT_EQUAL_FATAL (ret , 0 );
6351
6377
CU_ASSERT_EQUAL_FATAL (t .index , j );
6352
6378
}
@@ -6355,6 +6381,13 @@ test_seek_multi_tree(void)
6355
6381
tsk_treeseq_free (& ts );
6356
6382
}
6357
6383
6384
+ static void
6385
+ test_seek_multi_tree (void )
6386
+ {
6387
+ verify_seek_multi_tree (0 );
6388
+ verify_seek_multi_tree (TSK_SEEK_SKIP );
6389
+ }
6390
+
6358
6391
static void
6359
6392
test_seek_errors (void )
6360
6393
{
0 commit comments