1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
//! A rust interface to [tskit](https://github.com/tskit-dev/tskit).
//!
//! This crate provides a mapping of the `tskit` C API to rust.
//! The result is an interface similar to the `tskit` Python interface,
//! but with all operations implemented using compiled code.
//!
//! # Features
//!
//! ## Interface to the C library
//!
//! * [`TableCollection`] wraps `tsk_table_collection_t`.
//! * [`TreeSequence`] wraps `tsk_treeseq_t`.
//! * [`Tree`] wraps `tsk_tree_t`.
//! * Tree iteration occurs via traits from [streaming_iterator](https://docs.rs/streaming-iterator/).
//! * Errors returned from C map to [`TskitError::ErrorCode`].
//! Their string messages can be obtained by printing the error type.
//!
//! ## Safety
//!
//! * The types listed above handle all the memory management!
//! * All array accesses are range-checked.
//! * Object lifetimes are clear:
//! * Creating a tree sequence moves/consumes a table collection.
//! * Tree lifetimes are tied to that of the parent tree sequence.
//! * Table objects ([`NodeTable`], etc..) are only represented by non-owning, immutable types.
//!
//! ## Prelude
//!
//! The [`prelude`] module contains definitions that are difficult/annoying to live without.
//! In particuar, this module exports various traits that make it so that client code does
//! not have to `use` them a la carte.
//!
//! We recomment that client code import all symbols from this module:
//!
//! ```
//! use tskit::prelude::*;
//! ```
//!
//! The various documentation examples manually `use` each trait both in order
//! to illustrate which traits are needed and to serve as doc tests.
//!
//! # Optional features
//!
//! Some features are optional, and are activated by requesting them in your `Cargo.toml` file.
//!
//! * `provenance`
//! * Enables `provenance`
//! * `derive` enables the following derive macros:
//! * [`crate::metadata::MutationMetadata`]
//! * [`crate::metadata::IndividualMetadata`]
//! * [`crate::metadata::SiteMetadata`]
//! * [`crate::metadata::EdgeMetadata`]
//! * [`crate::metadata::NodeMetadata`]
//! * [`crate::metadata::MigrationMetadata`]
//! * [`crate::metadata::PopulationMetadata`]
//!
//! To see these derive macros in action, take a look
//! [`here`](metadata).
//! * `unsafe_init` enables [`crate::TableCollection::new_from_raw`]
//!
//! To add features to your `Cargo.toml` file:
//!
//! ```toml
//! [dependencies]
//! tskit = {version = "0.2.0", features=["feature0", "feature1"]}
//! ```
//!
//! # Table rows and iterators over rows
//!
//! ## Background: what is going on at the `C` level
//!
//! The `C` API represents a row as a `struct` containing
//! various fields.
//! For example, a "mutation" (row of a mutation table) is
//! represented by [`crate::bindings::tsk_mutation_t`].
//!
//! These low-level types contain pointers into ragged arrays
//! such as metadata.
//! These pointers do *not* point to new allocations.
//! Rather, they point to subsets of the ragged arrays
//! found in the parent objects (tables).
//!
//! The API to populate the row types is to first allocate one
//! (either on the stack or on the heap) and then call a function.
//! For example, [`crate::bindings::tsk_mutation_table_get_row`]
//! will fill in the fields of a [`crate::bindings::tsk_mutation_t`].
//!
//! The challenge on the rust side is how to specify the lifetime
//! relationship between a row object and its parent object.
//!
//! ### Differences between table collections and tree sequences
//!
//! The row types mentioned above can be accessed from table collections
//! and from tree sequences.
//!
//! However, tree sequence initialization pre-computes site and mutation
//! objects as well as the nodes associated with individuals.
//! Therefore, we can obtain constant-time access to references to site
//! and mutation objects from a tree sequence.
//!
//! The situation for objects directly from table collections poses
//! a challenge.
//! We could re-use an instance of a row object for, say,
//! a "mutation table row iterator" type, but doing so
//! would result in incorrect data if the output values were stored.
//! (Re-use would mean that the pointers to metadata, etc., would get
//! re-written at each "turn" of the iterator.)
//! Therefore, when accessing from *tables*, we return new instances
//! of the low level types.
//!
//! ## The relevant rust types
//!
//! For tables:
//!
//! * [`Node`] is returned by [`NodeTable::row`] and is the iterator value of [`NodeTable::iter`]
//! and [`TableCollection::node_iter`].
//! * [`Edge`] is returned by [`EdgeTable::row`] and is the iterator value of [`EdgeTable::iter`]
//! and [`TableCollection::edge_iter`].
//! * [`Individual`] is returned by [`IndividualTable::row`] and is the iterator value of [`IndividualTable::iter`]
//! and [`TableCollection::individual_iter`].
//! * [`Site`] is returned by [`SiteTable::row`] and is the iterator value of [`SiteTable::iter`]
//! and [`TableCollection::site_iter`].
//! * [`Mutation`] is returned by [`MutationTable::row`] and is the iterator value of [`MutationTable::iter`]
//! and [`TableCollection::mutation_iter`].
//! * [`Population`] is returned by [`PopulationTable::row`] and is the iterator value of [`PopulationTable::iter`]
//! and [`TableCollection::population_iter`].
//! * [`Migration`] is returned by [`MigrationTable::row`] and is the iterator value of [`MigrationTable::iter`]
//! and [`TableCollection::migration_iter`].
//! * [`Provenance`] is returned by [`provenance::ProvenanceTable::row`] and is the iterator value of [`provenance::ProvenanceTable::iter`]
//! and [`TableCollection::provenance_iter`].
//!
//! These types are thin wrappers around the `C` types and have the same `sizeof` and alignment.
//!
//! For table collections and trees:
//!
//! * [`SiteRef`] and [`MutationRef`] replace [`Site`] and [`Mutation`], respectively.
//! * [`SiteRef`] is the output of [`TreeSequence::site_iter`] and [`Tree::site_iter`].
//! * [`MutationRef`] is the output of [`SiteRef::mutation_iter`].
//!
//! These "`Ref`" types are thin wrappers around shared references to the underlying `C` types.
//!
//! Further,
//!
//! * [`TreeSequence::individual_iter`] outputs [`Individual`] objects whose `nodes` field is
//! populated (if the individual is associated w/any nodes).
//!
//! # What is missing?
//!
//! * A lot of wrappers to the C functions.
//! * Tree sequence statistics!
//!
//! # Manual
//!
//! A manual is [here](https://tskit-dev.github.io/tskit-rust).
use c_char;
pub use bindings;
// We have to cast between raw pointers involving these types when handling metadata.
// These compile-time assertions help prevent undefined behavior in case we run into
// something unexpected on a specific platform.
const _: = const ;
const _: =
const ;
pub use DoubleEndedStreamingIterator;
pub use StreamingIterator;
// Starts w/_ to be sorted at front by rustfmt!
pub use *;
pub use EdgeTable;
pub use TskitError;
pub use IndividualTable;
pub use MigrationTable;
pub use MutationTable;
pub use *;
pub use ;
pub use PopulationTable;
pub use SiteTable;
pub use *;
pub use NodeTraversalOrder;
pub use TableCollection;
pub use IndividualLocation;
pub use IndividualParents;
pub use TableColumn;
pub use ;
pub use Edge;
pub use Individual;
pub use Migration;
pub use Mutation;
pub use MutationRef;
pub use Node;
pub use Population;
pub use Provenance;
pub use Site;
pub use SiteRef;
// Optional features
/// Handles return codes from low-level tskit functions.
///
/// When an error from the tskit C API is detected,
/// the error message is stored for diplay.
pub type TskReturnValue = ;
/// Alias for tsk_flags_t
pub type RawFlags = cratetsk_flags_t;
/// Version of the rust crate.
///
/// To get the C API version, see:
/// * [`c_api_major_version`]
/// * [`c_api_minor_version`]
/// * [`c_api_patch_version`]
/// C API major version
/// C API minor version
/// C API patch version
/// The C API version in MAJOR.MINOR.PATCH format
// Testing modules