pub struct TableCollection { /* private fields */ }
Expand description

A table collection.

This is a thin wrapper around the C type tsk_table_collection_t.

Current limitations

Examples

use tskit::TableAccess;
let mut tables = tskit::TableCollection::new(100.).unwrap();
assert_eq!(tables.sequence_length(), 100.);

// Adding edges:

let rv = tables.add_edge(0., 53., 1, 11).unwrap();

// Add node:

let rv = tables.add_node(0, 3.2, tskit::PopulationId::NULL, tskit::IndividualId::NULL).unwrap();

// Get immutable reference to edge table
let edges = tables.edges();
assert_eq!(edges.num_rows(), 1);

// Get immutable reference to node table
let nodes = tables.nodes();
assert_eq!(nodes.num_rows(), 1);

Metadata round trips and table iteration

use tskit;
use tskit::TableAccess;
use tskit::metadata::MetadataRoundtrip;

// Define a type for metadata
struct F {
    x: i32,
}

// Implement our metadata trait for type F.
// NOTE: this is hard because we are only using the
// rust standard library here.  See the examples/
// directory of the repository for examples using
// other, more convenient, crates.
impl tskit::metadata::MetadataRoundtrip for F {
    fn encode(&self) -> Result<Vec<u8>, tskit::metadata::MetadataError> {
        let mut rv = vec![];
        rv.extend(self.x.to_le_bytes().iter().copied());
        Ok(rv)
    }
    fn decode(md: &[u8]) -> Result<Self, tskit::metadata::MetadataError> {
         
        let (x_int_bytes, rest) = md.split_at(std::mem::size_of::<i32>());
        Ok(Self {
            x: i32::from_le_bytes(x_int_bytes.try_into().unwrap()),
        })
    }
}

impl tskit::metadata::MutationMetadata for F {}

// Crate a table and add a mutation with metadata
let mut tables = tskit::TableCollection::new(100.).unwrap();

// The metadata takes a reference in the event that it could
// be data store in some container somewhere, and you don't want
// it moved.
tables.add_mutation_with_metadata(0, 0, 0, 0., None, &F{x: -33}).unwrap();

// Iterate over each row in the table.
// The "true" means to include (a copy of) the
// encoded metadata, if any exist.
for row in tables.mutations().iter() {
    // Decode the metadata if any exists.
    if !row.metadata.is_none() {
        let md = F::decode(&row.metadata.unwrap()).unwrap();
        assert_eq!(md.x, -33);
    }
}

Future road map

  1. Support all table types. Currently, we only support those needed for current goals in ongoing projects.
  2. Strengthen some of the error handling.

Implementations

Create a new table collection with a sequence length.

Load a table collection from a file.

Length of the sequence/“genome”.

Add a row to the edge table

Add a row with optional metadata to the edge table

Add a row to the individual table

Add a row with metadata to the individual table

Add a row to the migration table

Warnings

Migration tables are not currently supported by tree sequence simplification.

Add a row with optional metadata to the migration table

Warnings

Migration tables are not currently supported by tree sequence simplification.

Add a row to the node table

Add a row with optional metadata to the node table

Add a row to the site table

Add a row with optional metadata to the site table

Add a row to the mutation table.

Add a row with optional metadata to the mutation table.

Add a row to the population_table

Add a row with optional metadata to the population_table

Build the “input” and “output” indexes for the edge table.

Note

The C API call behind this takes a flags argument that is currently unused. A future release may break API here if the C library is updated to use flags.

Return true if tables are indexed.

If self.is_indexed() is true, return a non-owning slice containing the edge insertion order. Otherwise, return None.

If self.is_indexed() is true, return a non-owning slice containing the edge removal order. Otherwise, return None.

Sort the tables.
The bookmark can be used to affect where sorting starts from for each table.

Note

As of 0.7.0, this function does not sort the individual table! See topological_sort_individuals.

Fully sort all tables. Implemented via a call to sort.

Note

As of 0.7.0, this function does not sort the individual table! See topological_sort_individuals.

Sorts the individual table in place, so that parents come before children, and the parent column is remapped as required. Node references to individuals are also updated.

This function is needed because neither sort nor full_sort sorts the individual table!

Examples
// Parent comes AFTER the child
let mut tables = tskit::TableCollection::new(1.0).unwrap();
let i0 = tables.add_individual::<f64, i32>(0,&[],&[1]).unwrap();
assert_eq!(i0, 0);
let i1 = tables.add_individual::<f64, i32>(0,&[],&[]).unwrap();
assert_eq!(i1, 1);
let n0 = tables.add_node(0, 0.0, -1, i1).unwrap();
assert_eq!(n0, 0);
let n1 = tables.add_node(0, 1.0, -1, i0).unwrap();
assert_eq!(n1, 1);

// Testing for valid individual order will Err:
match tables.check_integrity(tskit::TableIntegrityCheckFlags::CHECK_INDIVIDUAL_ORDERING) {
    Ok(_) => panic!("expected Err"),
    Err(_) => (),
};

// The standard sort doesn't fix the Err...:
tables.full_sort(tskit::TableSortOptions::default()).unwrap();
match tables.check_integrity(tskit::TableIntegrityCheckFlags::CHECK_INDIVIDUAL_ORDERING) {
    Ok(_) => panic!("expected Err"),
    Err(_) => (),
};

// ... so we need to intentionally sort the individuals.
let _ = tables.topological_sort_individuals(tskit::IndividualTableSortOptions::default()).unwrap();
tables.check_integrity(tskit::TableIntegrityCheckFlags::CHECK_INDIVIDUAL_ORDERING).unwrap();
Errors

Will return an error code if the underlying C function returns an error.

Dump the table collection to file.

Clear the contents of all tables. Does not release memory. Memory will be released when the object goes out of scope.

Return true if self contains the same data as other, and false otherwise.

Return a “deep” copy of the tables.

Return a crate::TreeSequence based on the tables. This function will raise errors if tables are not sorted, not indexed, or invalid in any way.

Simplify tables in place.

Parameters
  • samples: a slice containing non-null node ids. The tables are simplified with respect to the ancestry of these nodes.
  • options: A SimplificationOptions bit field controlling the behavior of simplification.
  • idmap: if true, the return value contains a vector equal in length to the input node table. For each input node, this vector either contains the node’s new index or NodeId::NULL if the input node is not part of the simplified history.

Validate the contents of the table collection

Parameters

flags is an instance of TableIntegrityCheckFlags

Return value

0 upon success, or an error code. However, if flags contains TableIntegrityCheckFlags::CHECK_TREES, and no error is returned, then the return value is the number of trees.

Note

Creating a crate::TreeSequence from a table collection will automatically run an integrity check. See TableCollection::tree_sequence.

Examples

There are many ways for a table colletion to be invalid. These examples are just the tip of the iceberg.

let mut tables = tskit::TableCollection::new(10.0).unwrap();
// Right position is > sequence_length
tables.add_edge(0.0, 11.0, 0, 0);
tables.check_integrity(tskit::TableIntegrityCheckFlags::default()).unwrap();
let mut tables = tskit::TableCollection::new(10.0).unwrap();
// Left position is < 0.0
tables.add_edge(-1., 10.0, 0, 0);
tables.check_integrity(tskit::TableIntegrityCheckFlags::default()).unwrap();
let mut tables = tskit::TableCollection::new(10.0).unwrap();
// Edges cannot have null node ids
tables.add_edge(0., 10.0, tskit::NodeId::NULL, 0);
tables.check_integrity(tskit::TableIntegrityCheckFlags::default()).unwrap();

Add provenance record with a time stamp.

All implementation of this trait provided by tskit use an ISO 8601 format time stamp written using the RFC 3339 specification. This formatting approach has been the most straightforward method for supporting round trips to/from a crate::provenance::ProvenanceTable. The implementations used here use the humantime crate.

Parameters
  • record: the provenance record
Examples
use tskit::TableAccess;
let mut tables = tskit::TableCollection::new(1000.).unwrap();
tables.add_provenance(&String::from("Some provenance")).unwrap();

// Get reference to the table
let prov_ref = tables.provenances();

// Get the first row
let row_0 = prov_ref.row(0).unwrap();

assert_eq!(row_0.record, "Some provenance");

// Get the first record
let record_0 = prov_ref.record(0).unwrap();
assert_eq!(record_0, row_0.record);

// Get the first time stamp
let timestamp = prov_ref.timestamp(0).unwrap();
assert_eq!(timestamp, row_0.timestamp);

// You can get the `humantime::Timestamp` object back from the `String`:
use core::str::FromStr;
let timestamp_string = humantime::Timestamp::from_str(&timestamp).unwrap();

// Provenance transfers to the tree sequences
let treeseq = tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
assert_eq!(treeseq.provenances().record(0).unwrap(), "Some provenance");
// We can still compare to row_0 because it is a copy of the row data:
assert_eq!(treeseq.provenances().record(0).unwrap(), row_0.record);

Trait Implementations

Executes the destructor for this type. Read more

Obtain a vector containing the indexes (“ids”) of all nodes for which crate::TSK_NODE_IS_SAMPLE is true. Read more

Obtain a vector containing the indexes (“ids”) of all nodes satisfying a certain criterion. Read more

Get reference to the EdgeTable.

Get reference to the IndividualTable.

Get reference to the MigrationTable.

Get reference to the NodeTable.

Get reference to the SiteTable.

Get reference to the MutationTable.

Get reference to the PopulationTable.

Get reference to the ProvenanceTable

Return an iterator over the edges.

Return an iterator over the nodes.

Return an iterator over the mutations.

Return an iterator over the sites.

Return an iterator over the populations.

Return an iterator over the migration events.

Return an iterator over the individuals.

Return an iterator over provenances

Return const pointer

Return mutable pointer

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Drops the content pointed by this pointer and frees it. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.