Struct tskit::OwnedNodeTable
source · pub struct OwnedNodeTable { /* private fields */ }
Expand description
A standalone node table that owns its data.
Examples
use tskit::OwnedNodeTable;
let mut nodes = OwnedNodeTable::default();
let rowid = nodes.add_row(0, 1.1, -1, -1).unwrap();
assert_eq!(rowid, 0);
assert_eq!(nodes.num_rows(), 1);
An example with metadata.
This requires the cargo feature "derive"
for tskit
.
use tskit::OwnedNodeTable;
#[derive(serde::Serialize,
serde::Deserialize,
tskit::metadata::NodeMetadata)]
#[serializer("serde_json")]
struct NodeMetadata {
value: i32,
}
let metadata = NodeMetadata{value: 42};
let mut nodes = OwnedNodeTable::default();
let rowid = nodes.add_row_with_metadata(0, 1., -1, -1, &metadata).unwrap();
assert_eq!(rowid, 0);
match nodes.metadata::<NodeMetadata>(rowid) {
// rowid is in range, decoding succeeded
Some(Ok(decoded)) => assert_eq!(decoded.value, 42),
// rowid is in range, decoding failed
Some(Err(e)) => panic!("error decoding metadata: {:?}", e),
None => panic!("row id out of range")
}
Implementations
sourceimpl OwnedNodeTable
impl OwnedNodeTable
sourcepub fn clear(&mut self) -> TskReturnValue
pub fn clear(&mut self) -> TskReturnValue
Clear the table.
sourceimpl OwnedNodeTable
impl OwnedNodeTable
pub fn as_ptr(&self) -> *const tsk_node_table_t
pub fn as_mut_ptr(&mut self) -> *mut tsk_node_table_t
sourceimpl OwnedNodeTable
impl OwnedNodeTable
pub fn add_row<F, T, P, I>(
&mut self,
flags: F,
time: T,
population: P,
individual: I
) -> Result<NodeId, TskitError>where
F: Into<NodeFlags>,
T: Into<Time>,
P: Into<PopulationId>,
I: Into<IndividualId>,
pub fn add_row_with_metadata<F, T, P, I, M>(
&mut self,
flags: F,
time: T,
population: P,
individual: I,
metadata: &M
) -> Result<NodeId, TskitError>where
F: Into<NodeFlags>,
T: Into<Time>,
P: Into<PopulationId>,
I: Into<IndividualId>,
M: NodeMetadata,
Methods from Deref<Target = NodeTable>
sourcepub fn flags_array_mut(&mut self) -> &mut [NodeFlags]
pub fn flags_array_mut(&mut self) -> &mut [NodeFlags]
Mutable access to node flags.
Examples
let flags = tables.nodes_mut().flags_array_mut();
for flag in flags {
// Can do something...
}
for flag in tables.nodes_mut().flags_array_mut() {
}
The returned slice is mutable, allowing one to do things like clear the sample status of all nodes:
A copy of the flags can be obtained by collecting results into Vec
:
for flag in tables.nodes_mut().flags_array_mut() {
flag.remove(tskit::NodeFlags::IS_SAMPLE);
}
assert!(!tables.nodes_mut().flags_array_mut().iter().any(|f| f.is_sample()));
assert!(tables.nodes().samples_as_vector().is_empty());
let flags = tables.nodes_mut().flags_array_mut().to_vec();
Standalone tables
The ownership semantics differ when tables are not part of a table collection:
let mut nodes = tskit::OwnedNodeTable::default();
assert!(nodes.add_row(tskit::NodeFlags::IS_SAMPLE, 10., -1, -1).is_ok());
let flags = nodes.flags_array_mut();
assert!(flags.iter().all(|f| f.is_sample()));
// while we are at it, let's use our node
// table to populate a table collection.
let mut tables = tskit::TableCollection::new(10.0).unwrap();
tables.set_nodes(&nodes);
assert_eq!(tables.nodes().num_rows(), 1);
assert_eq!(tables.nodes_mut().flags_array_mut().iter().filter(|f| f.is_sample()).count(), 1);
Note
Internally, we rely on a conversion of u64 to usize. This conversion is fallible on some platforms. If the conversion fails, an empty slice is returned.
sourcepub fn time_array_mut(&mut self) -> &mut [Time]
pub fn time_array_mut(&mut self) -> &mut [Time]
Mutable access to node times.
Examples
For a crate::TableCollection
, accessing the table creates a temporary
that will be dropped, causing this code to not compile:
let time = tables.nodes().time_array_mut();
println!("{}", time.len()); // ERROR: the temporary node table is dropped by now
Treating the returned slice as an iterable succeeds:
for time in tables.nodes_mut().time_array_mut() {
*time = 55.0.into(); // change each node's time value
}
assert!(tables.nodes_mut().time_array_mut().iter().all(|t| t == &55.0));
Note
Internally, we rely on a conversion of u64 to usize. This conversion is fallible on some platforms. If the conversion fails, an empty slice is returned.
sourcepub fn population<N: Into<NodeId> + Copy>(&self, row: N) -> Option<PopulationId>
pub fn population<N: Into<NodeId> + Copy>(&self, row: N) -> Option<PopulationId>
sourcepub fn deme<N: Into<NodeId> + Copy>(&self, row: N) -> Option<PopulationId>
pub fn deme<N: Into<NodeId> + Copy>(&self, row: N) -> Option<PopulationId>
Return the population
value from row row
of the table.
Examples
See NodeTable::population
for examples.
Returns
Some(population)
ifrow
is valid.None
otherwise.
sourcepub fn individual<N: Into<NodeId> + Copy>(&self, row: N) -> Option<IndividualId>
pub fn individual<N: Into<NodeId> + Copy>(&self, row: N) -> Option<IndividualId>
sourcepub fn metadata<T: NodeMetadata>(
&self,
row: NodeId
) -> Option<Result<T, TskitError>>
pub fn metadata<T: NodeMetadata>(
&self,
row: NodeId
) -> Option<Result<T, TskitError>>
Retrieve decoded metadata for a row
.
Returns
Some(Ok(T))
ifrow
is valid and decoding succeeded.Some(Err(_))
ifrow
is not valid and decoding failed.None
ifrow
is not valid.
Errors
TskitError::MetadataError
if decoding fails.
Examples.
The big-picture semantics are the same for all table types.
See crate::IndividualTable::metadata
for examples.
sourcepub fn iter(&self) -> impl Iterator<Item = NodeTableRow> + '_
pub fn iter(&self) -> impl Iterator<Item = NodeTableRow> + '_
Return an iterator over rows of the table.
The value of the iterator is NodeTableRow
.
sourcepub fn samples_as_vector(&self) -> Vec<NodeId>
pub fn samples_as_vector(&self) -> Vec<NodeId>
Obtain a vector containing the indexes (“ids”)
of all nodes for which crate::TSK_NODE_IS_SAMPLE
is true
.
sourcepub fn create_node_id_vector(
&self,
f: impl FnMut(&NodeTableRow) -> bool
) -> Vec<NodeId>
pub fn create_node_id_vector(
&self,
f: impl FnMut(&NodeTableRow) -> bool
) -> Vec<NodeId>
Obtain a vector containing the indexes (“ids”) of all nodes satisfying a certain criterion.