Skip to content

Commit c82a7f0

Browse files
committed
Update to latest tskit (rust). Closes #82 (#84)
* Pin to precise tskit version. Closes #79. * Update to new tskit_rust API. * Remove use of unsafe code in tests.
1 parent 7702c39 commit c82a7f0

File tree

5 files changed

+71
-106
lines changed

5 files changed

+71
-106
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ keywords = ["simulation", "tree_sequences", "tskit", "population_genetics"]
1515
bitflags = "1.2.1"
1616
thiserror = "1.0"
1717
GSL = "4.0.0"
18-
tskit = "0.1.1"
18+
tskit = "=0.2.0"

forrustts_examples/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ edition = "2018"
1010
path = "../"
1111

1212
[dependencies]
13-
tskit = "0.1.1"
13+
tskit = "=0.2.0"
1414
clap = "~2.27.0"
1515

1616
[[bin]]

forrustts_examples/neutral_wf.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,14 @@ fn main() {
125125
&mut tables,
126126
);
127127

128-
if simplify.is_some() {
129-
tskit_tables.dump(&outfile, 0).unwrap();
130-
} else {
131-
tskit_tables
132-
.dump(&outfile, tskit::TSK_NO_BUILD_INDEXES)
133-
.unwrap();
134-
}
128+
match simplify.is_some() {
129+
true => (),
130+
false => {
131+
let _ = tskit_tables.build_index().unwrap();
132+
}
133+
};
134+
135+
tskit_tables
136+
.dump(&outfile, tskit::TableOutputOptions::default())
137+
.unwrap();
135138
}

src/test_simplify_tables.rs

Lines changed: 54 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
#[cfg(test)]
22
mod test {
3-
// NOTE: Currently, these tests are both testing
4-
// stuff from tskit and forrusts, which isn't great.
5-
// We'll clean this up later when we get better abstractions
6-
// into tskit.
73
use crate::simplify_tables_without_state;
84
use crate::tsdef::{IdType, Position, Time};
95
use crate::wright_fisher::*;
@@ -12,25 +8,7 @@ mod test {
128
use crate::SimplificationFlags;
139
use crate::SimplificationOutput;
1410
use crate::TableCollection;
15-
use std::mem::MaybeUninit;
16-
use tskit::bindings as tskr;
17-
use tskit::ffi::TskitType;
18-
19-
fn tables_to_treeseq(tables: &mut tskit::TableCollection) -> MaybeUninit<tskr::tsk_treeseq_t> {
20-
let mut tsk_ts: MaybeUninit<tskr::tsk_treeseq_t> = MaybeUninit::uninit();
21-
unsafe {
22-
let rv = tskr::tsk_table_collection_build_index(tables.as_mut_ptr(), 0);
23-
assert_eq!(rv, 0);
24-
let rv = tskr::tsk_treeseq_init(
25-
tsk_ts.as_mut_ptr(),
26-
tables.as_ptr(),
27-
tskr::TSK_SAMPLE_LISTS,
28-
);
29-
assert_eq!(rv, 0);
30-
}
31-
32-
tsk_ts
33-
}
11+
use tskit::TableAccess;
3412

3513
fn simulate_data(
3614
num_generations: Time,
@@ -111,52 +89,44 @@ mod test {
11189
*i = 1;
11290
}
11391

114-
let mut simplified_rust_tables = crate::tskit_tools::convert_to_tskit_minimal(
92+
let simplified_rust_tables = crate::tskit_tools::convert_to_tskit_minimal(
11593
&tables,
11694
&is_sample,
11795
crate::tskit_tools::simple_time_reverser(num_generations),
11896
true,
11997
);
12098

121-
unsafe {
122-
let rv = tskr::tsk_table_collection_sort(tsk_tables.as_mut_ptr(), std::ptr::null(), 0);
123-
assert!(rv == 0);
124-
let rv = tskr::tsk_table_collection_simplify(
125-
tsk_tables.as_mut_ptr(),
126-
samples.samples.as_ptr(),
127-
samples.samples.len() as u32,
128-
0,
129-
std::ptr::null_mut(),
130-
);
131-
assert!(rv == 0);
132-
}
99+
tsk_tables
100+
.full_sort(tskit::TableSortOptions::default())
101+
.unwrap();
102+
tsk_tables
103+
.simplify(
104+
&samples.samples,
105+
tskit::SimplificationOptions::default(),
106+
false,
107+
)
108+
.unwrap();
133109

134110
// Get tree sequences now
135-
let mut tsk_ts = tables_to_treeseq(&mut tsk_tables);
136-
let mut rust_ts = tables_to_treeseq(&mut simplified_rust_tables);
137-
138-
unsafe {
139-
assert_eq!(500, tskr::tsk_treeseq_get_num_samples(tsk_ts.as_ptr()));
140-
assert_eq!(500, tskr::tsk_treeseq_get_num_samples(rust_ts.as_ptr()));
141-
let ne = tskr::tsk_treeseq_get_num_edges(tsk_ts.as_ptr());
142-
let ne2 = tskr::tsk_treeseq_get_num_edges(rust_ts.as_ptr());
143-
assert_eq!(ne, ne2);
144-
let nn = tskr::tsk_treeseq_get_num_nodes(tsk_ts.as_ptr());
145-
let nn2 = tskr::tsk_treeseq_get_num_nodes(rust_ts.as_ptr());
146-
assert_eq!(nn, nn2);
147-
148-
// We expect the rv to be 0,
149-
// so let's init it to something else
150-
let mut kc: f64 = -1.;
151-
let kcp: *mut f64 = &mut kc;
152-
let rv =
153-
tskr::tsk_treeseq_kc_distance(tsk_ts.as_mut_ptr(), rust_ts.as_mut_ptr(), 0., kcp);
154-
assert_eq!(rv, 0);
155-
assert!((kc - 0.).abs() < f64::EPSILON);
156-
157-
tskr::tsk_treeseq_free(tsk_ts.as_mut_ptr());
158-
tskr::tsk_treeseq_free(rust_ts.as_mut_ptr());
159-
}
111+
let tsk_ts = tsk_tables
112+
.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES)
113+
.unwrap();
114+
115+
let rust_ts = simplified_rust_tables
116+
.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES)
117+
.unwrap();
118+
119+
assert_eq!(500, tsk_ts.num_samples());
120+
assert_eq!(500, rust_ts.num_samples());
121+
let ne = tsk_ts.edges().num_rows();
122+
let ne2 = rust_ts.edges().num_rows();
123+
assert_eq!(ne, ne2);
124+
let nn = tsk_ts.nodes().num_rows();
125+
let nn2 = rust_ts.nodes().num_rows();
126+
assert_eq!(nn, nn2);
127+
128+
let kc = tsk_ts.kc_distance(&&rust_ts, 0.).unwrap();
129+
assert!((kc - 0.).abs() < f64::EPSILON);
160130
}
161131

162132
#[test]
@@ -192,38 +162,30 @@ mod test {
192162
let sum_times_buffered: Time = tables_buffered.nodes_.iter().map(|x| x.time).sum();
193163
assert_eq!(sum_times_sorted, sum_times_buffered);
194164

195-
let mut tables_sorted_tskit = crate::tskit_tools::convert_to_tskit_minimal(
165+
let tables_sorted_tskit = crate::tskit_tools::convert_to_tskit_minimal(
196166
&tables_sorted,
197167
&is_sample_sorted,
198168
crate::tskit_tools::simple_time_reverser(num_generations),
199169
true,
200170
);
201171

202-
let mut tables_buffered_tskit = crate::tskit_tools::convert_to_tskit_minimal(
172+
let tables_buffered_tskit = crate::tskit_tools::convert_to_tskit_minimal(
203173
&tables_buffered,
204174
&is_sample_buffered,
205175
crate::tskit_tools::simple_time_reverser(num_generations),
206176
true,
207177
);
208178

209-
let mut sorted_ts = tables_to_treeseq(&mut tables_sorted_tskit);
210-
let mut buffered_ts = tables_to_treeseq(&mut tables_buffered_tskit);
211-
unsafe {
212-
assert_eq!(500, tskr::tsk_treeseq_get_num_samples(sorted_ts.as_ptr()));
213-
assert_eq!(500, tskr::tsk_treeseq_get_num_samples(buffered_ts.as_ptr()));
214-
let mut kc: f64 = -1.;
215-
let kcp: *mut f64 = &mut kc;
216-
let rv = tskr::tsk_treeseq_kc_distance(
217-
sorted_ts.as_mut_ptr(),
218-
buffered_ts.as_mut_ptr(),
219-
0.,
220-
kcp,
221-
);
222-
assert_eq!(rv, 0);
223-
assert!((kc - 0.).abs() < f64::EPSILON);
224-
tskr::tsk_treeseq_free(sorted_ts.as_mut_ptr());
225-
tskr::tsk_treeseq_free(buffered_ts.as_mut_ptr());
226-
}
179+
let sorted_ts = tables_sorted_tskit
180+
.tree_sequence(tskit::TreeSequenceFlags::default())
181+
.unwrap();
182+
let buffered_ts = tables_buffered_tskit
183+
.tree_sequence(tskit::TreeSequenceFlags::default())
184+
.unwrap();
185+
assert_eq!(500, sorted_ts.num_samples());
186+
assert_eq!(500, buffered_ts.num_samples());
187+
let kc = sorted_ts.kc_distance(&&buffered_ts, 0.).unwrap();
188+
assert!((kc - 0.).abs() < f64::EPSILON);
227189
}
228190

229191
// The KC distance code will barf on trees where samples
@@ -264,31 +226,28 @@ mod test {
264226
let sum_times_buffered: Time = tables_buffered.nodes_.iter().map(|x| x.time).sum();
265227
assert_eq!(sum_times_sorted, sum_times_buffered);
266228

267-
let mut tables_sorted_tskit = crate::tskit_tools::convert_to_tskit_minimal(
229+
let tables_sorted_tskit = crate::tskit_tools::convert_to_tskit_minimal(
268230
&tables_sorted,
269231
&is_sample_sorted,
270232
crate::tskit_tools::simple_time_reverser(num_generations),
271233
true,
272234
);
273235

274-
let mut tables_buffered_tskit = crate::tskit_tools::convert_to_tskit_minimal(
236+
let tables_buffered_tskit = crate::tskit_tools::convert_to_tskit_minimal(
275237
&tables_buffered,
276238
&is_sample_buffered,
277239
crate::tskit_tools::simple_time_reverser(num_generations),
278240
true,
279241
);
280242

281-
let mut sorted_ts = tables_to_treeseq(&mut tables_sorted_tskit);
282-
let mut buffered_ts = tables_to_treeseq(&mut tables_buffered_tskit);
283-
unsafe {
284-
assert_eq!(500, tskr::tsk_treeseq_get_num_samples(sorted_ts.as_ptr()));
285-
assert_eq!(500, tskr::tsk_treeseq_get_num_samples(buffered_ts.as_ptr()));
286-
assert_eq!(
287-
tskr::tsk_treeseq_get_num_trees(sorted_ts.as_ptr()),
288-
tskr::tsk_treeseq_get_num_trees(buffered_ts.as_ptr())
289-
);
290-
tskr::tsk_treeseq_free(sorted_ts.as_mut_ptr());
291-
tskr::tsk_treeseq_free(buffered_ts.as_mut_ptr());
292-
}
243+
let sorted_ts = tables_sorted_tskit
244+
.tree_sequence(tskit::TreeSequenceFlags::default())
245+
.unwrap();
246+
let buffered_ts = tables_buffered_tskit
247+
.tree_sequence(tskit::TreeSequenceFlags::default())
248+
.unwrap();
249+
assert_eq!(500, sorted_ts.num_samples());
250+
assert_eq!(500, buffered_ts.num_samples());
251+
assert_eq!(sorted_ts.num_trees(), buffered_ts.num_trees());
293252
}
294253
}

src/tskit_tools.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ pub fn simple_time_reverser(x: Time) -> Box<dyn Fn(Time) -> f64> {
4949
/// # Example
5050
///
5151
/// ```
52+
/// use tskit::TableAccess;
5253
/// let mut tables = forrustts::TableCollection::new(100).unwrap();
5354
/// tables.add_node(0, 0).unwrap(); // Add a parent node at time 0
5455
/// tables.add_node(1, 0).unwrap(); // Add a child node at time 1
@@ -96,7 +97,7 @@ pub fn convert_to_tskit_minimal(
9697
}
9798

9899
if build_indexes {
99-
tsk_tables.build_index(0).unwrap();
100+
tsk_tables.build_index().unwrap();
100101
}
101102

102103
tsk_tables
@@ -138,6 +139,7 @@ fn swap_with_empty<T>(v: &mut Vec<T>) {
138139
/// # Example
139140
///
140141
/// ```
142+
/// use tskit::TableAccess;
141143
/// let mut tables = forrustts::TableCollection::new(100).unwrap();
142144
/// tables.add_node(0, 0).unwrap(); // Add a parent node at time 0
143145
/// tables.add_node(1, 0).unwrap(); // Add a child node at time 1
@@ -197,7 +199,7 @@ pub fn convert_to_tskit_and_drain_minimal(
197199
}
198200

199201
if build_indexes {
200-
tsk_tables.build_index(0).unwrap();
202+
tsk_tables.build_index().unwrap();
201203
}
202204

203205
tsk_tables
@@ -207,6 +209,7 @@ pub fn convert_to_tskit_and_drain_minimal(
207209
mod tests {
208210

209211
use super::*;
212+
use tskit::TableAccess;
210213

211214
#[test]
212215
fn test_convert_to_tskit() {

0 commit comments

Comments
 (0)