@@ -8,6 +8,23 @@ use proptest::prelude::*;
8
8
use rand:: distributions:: Distribution ;
9
9
use rand:: SeedableRng ;
10
10
11
+ fn rotate_edge_table ( rotation_point : usize , tables : & mut tskit:: TableCollection ) {
12
+ let num_edges = tables. edges ( ) . num_rows ( ) . as_usize ( ) ;
13
+ // SAFETY: tables pointer is not null.
14
+ let left =
15
+ unsafe { std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . left , num_edges) } ;
16
+ let right =
17
+ unsafe { std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . right , num_edges) } ;
18
+ let parent =
19
+ unsafe { std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . parent , num_edges) } ;
20
+ let child =
21
+ unsafe { std:: slice:: from_raw_parts_mut ( ( * tables. as_mut_ptr ( ) ) . edges . child , num_edges) } ;
22
+ left. rotate_left ( rotation_point) ;
23
+ right. rotate_left ( rotation_point) ;
24
+ parent. rotate_left ( rotation_point) ;
25
+ child. rotate_left ( rotation_point) ;
26
+ }
27
+
11
28
// ANCHOR: haploid_wright_fisher
12
29
fn simulate (
13
30
seed : u64 ,
@@ -46,6 +63,7 @@ fn simulate(
46
63
let parent_picker = rand:: distributions:: Uniform :: new ( 0 , popsize) ;
47
64
let breakpoint_generator = rand:: distributions:: Uniform :: new ( 0.0 , 1.0 ) ;
48
65
let mut rng = rand:: rngs:: StdRng :: seed_from_u64 ( seed) ;
66
+ let mut bookmark = tskit:: types:: Bookmark :: new ( ) ;
49
67
50
68
for birth_time in ( 0 ..num_generations) . rev ( ) {
51
69
for c in children. iter_mut ( ) {
@@ -64,7 +82,10 @@ fn simulate(
64
82
}
65
83
66
84
if birth_time % simplify_interval == 0 {
67
- tables. full_sort ( tskit:: TableSortOptions :: default ( ) ) ?;
85
+ tables. sort ( & bookmark, 0 ) ?;
86
+ if bookmark. edges ( ) > 0 {
87
+ rotate_edge_table ( bookmark. edges ( ) . as_usize ( ) , & mut tables) ;
88
+ }
68
89
if let Some ( idmap) =
69
90
tables. simplify ( children, tskit:: SimplificationOptions :: default ( ) , true ) ?
70
91
{
@@ -73,6 +94,7 @@ fn simulate(
73
94
* o = idmap[ usize:: try_from ( * o) ?] ;
74
95
}
75
96
}
97
+ bookmark. set_edges ( tables. edges ( ) . num_rows ( ) ) ;
76
98
}
77
99
std:: mem:: swap ( & mut parents, & mut children) ;
78
100
}
0 commit comments