#[test]
fn initialize_from_table_collection() {
use tskit::prelude::*;
use tskit::TableCollection;
use tskit::TableSortOptions;
use tskit::TreeFlags;
use tskit::TreeSequenceFlags;
let mut tables = TableCollection::new(1000.).unwrap();
tables
.add_node(0, 2.0, PopulationId::NULL, IndividualId::NULL)
.unwrap();
tables
.add_node(0, 1.0, PopulationId::NULL, IndividualId::NULL)
.unwrap();
tables
.add_node(
TSK_NODE_IS_SAMPLE,
0.0,
PopulationId::NULL,
IndividualId::NULL,
)
.unwrap();
tables
.add_node(
TSK_NODE_IS_SAMPLE,
0.0,
PopulationId::NULL,
IndividualId::NULL,
)
.unwrap();
tables
.add_node(
TSK_NODE_IS_SAMPLE,
0.0,
PopulationId::NULL,
IndividualId::NULL,
)
.unwrap();
tables
.add_node(
TSK_NODE_IS_SAMPLE,
0.0,
PopulationId::NULL,
IndividualId::NULL,
)
.unwrap();
tables.add_edge(500., 1000., 0, 1).unwrap();
tables.add_edge(0., 500., 0, 2).unwrap();
tables.add_edge(0., 1000., 0, 3).unwrap();
tables.add_edge(500., 1000., 1, 2).unwrap();
tables.add_edge(0., 1000., 1, 4).unwrap();
tables.add_edge(0., 1000., 1, 5).unwrap();
tables.full_sort(TableSortOptions::default()).unwrap();
tables.build_index().unwrap();
let treeseq = tables.tree_sequence(TreeSequenceFlags::default()).unwrap();
let mut tree_iterator = treeseq.tree_iterator(TreeFlags::default()).unwrap();
while let Some(_tree) = tree_iterator.next() {
}
let mut tree_iterator = treeseq.tree_iterator(TreeFlags::default()).unwrap();
use tskit::NodeTraversalOrder;
while let Some(tree) = tree_iterator.next() {
for node in tree.traverse_nodes(NodeTraversalOrder::Preorder) {
if let Some(parent) = tree.parent(node) {
let _siblings = tree
.children(parent)
.filter(|child| child != &node)
.collect::<Vec<_>>();
}
}
}
let mut tree_iterator = treeseq.tree_iterator(TreeFlags::default()).unwrap();
while let Some(tree) = tree_iterator.next() {
let parents = tree.parent_array();
let rsibs = tree.right_sib_array();
let lchildren = tree.left_child_array();
for node in tree.traverse_nodes(NodeTraversalOrder::Preorder) {
let mut siblings = vec![];
assert!(!node.is_null());
if let Some(parent) = parents.get(usize::try_from(node).unwrap()) {
if !parent.is_null() {
if let Some(child) = lchildren.get(usize::try_from(*parent).unwrap()) {
let mut u = *child;
while !u.is_null() {
if u != node {
siblings.push(u);
}
if let Some(sib) = rsibs.get(usize::try_from(u).unwrap()) {
u = *sib;
}
}
}
}
}
}
}
let mut tree_iterator = treeseq.tree_iterator(TreeFlags::default()).unwrap();
while let Some(tree) = tree_iterator.next() {
for node in tree.traverse_nodes(NodeTraversalOrder::Preorder) {
let mut siblings = vec![];
if let Some(parent) = tree.parent(node) {
if let Some(child) = tree.left_child(parent) {
let mut u = child;
while !u.is_null() {
if u != node {
siblings.push(u);
}
if let Some(sib) = tree.right_sib(u) {
u = sib;
}
}
}
}
}
}
let mut tree_iterator = treeseq.tree_iterator(TreeFlags::default()).unwrap();
let mut total_branch_lengths = vec![];
while let Some(tree) = tree_iterator.next() {
total_branch_lengths.push(tree.total_branch_length(false).unwrap());
}
let mut tree_iterator = treeseq.tree_iterator(TreeFlags::default()).unwrap();
let mut total_branch_lengths_ll = vec![];
let mut x = 0.0;
while let Some(tree) = tree_iterator.next() {
let l =
unsafe { tskit::bindings::tsk_tree_get_total_branch_length(tree.as_ptr(), -1, &mut x) };
assert!(l >= 0);
total_branch_lengths_ll.push(x);
}
for (i, j) in total_branch_lengths
.iter()
.zip(total_branch_lengths_ll.iter())
{
assert_eq!(i, j, "{} {}", i, j);
}
if let Ok(mut edge_diff_iterator) = treeseq.edge_differences_iter() {
while let Some(diffs) = edge_diff_iterator.next() {
for edge_removal in diffs.edge_removals() {
println!("{}", edge_removal);
}
for edge_insertion in diffs.edge_insertions() {
println!("{}", edge_insertion);
}
}
} else {
panic!("creating edge diffs iterator failed");
}
let num_nodes = treeseq.nodes().num_rows().as_usize();
let mut parents = vec![NodeId::NULL; num_nodes + 1];
match treeseq.edge_differences_iter() {
Ok(mut ediff_iter) => match treeseq.tree_iterator(0) {
Ok(mut tree_iter) => {
while let Some(diffs) = ediff_iter.next() {
let tree = tree_iter.next().unwrap();
for edge_out in diffs.edge_removals() {
let c = edge_out.child();
parents[c.as_usize()] = NodeId::NULL;
}
for edge_in in diffs.edge_insertions() {
let c = edge_in.child();
parents[c.as_usize()] = edge_in.parent();
}
assert_eq!(tree.parent_array(), &parents);
}
}
Err(e) => panic!("error creating tree iter: {:?}", e),
},
Err(e) => panic!("error creating edge diff iter: {:?}", e),
}
}