From a385523047401f62bb3703f5723012fcc832e155 Mon Sep 17 00:00:00 2001 From: Joel Hellewell Date: Wed, 1 May 2024 16:55:19 +0100 Subject: [PATCH] Removed linear phylo2vec function. Streamlined tests and gave better names --- src/build_tree.rs | 35 ----------------- src/tests.rs | 95 +++++++++++------------------------------------ 2 files changed, 22 insertions(+), 108 deletions(-) diff --git a/src/build_tree.rs b/src/build_tree.rs index 31dd991..8a631e0 100644 --- a/src/build_tree.rs +++ b/src/build_tree.rs @@ -213,38 +213,3 @@ pub fn random_vector(k: usize) -> Vec { .map(|(i, _el)| if i > 0 { rng.gen_range(0..((2 * i) - 1)) } else { 0 }) .collect() } - -pub fn phylo2vec_lin(v: Vec, permute: bool) -> Tree { - let mut tree = Tree::new(&v); - let mut sub_vec = tree.tree_vec.clone(); - sub_vec.remove(0); - let k = sub_vec.len(); - let mut M = Array2::::zeros((k, 3)); - let mut labels_rowk: Vec = (0..=k).collect(); - let mut rmk = k; - - for i in 0..k { - let n = k - i - 1; - let m = sub_vec[n]; - - M[[i, 0]] = labels_rowk[m]; - M[[i, 1]] = labels_rowk[n + 1]; - - rmk += 1; - labels_rowk[m] = rmk; - M[[i, 2]] = labels_rowk[m]; - } - - // Build tree - tree.add(M[[k - 1, 2]], None); - - for i in (0..k).rev() { - tree.add(M[[i, 0]], Some(M[[i, 2]])); - tree.add(M[[i, 1]], Some(M[[i, 2]])); - } - - // Does this still need to happen? - tree.max_depth = tree.max_treedepth(); - - tree -} diff --git a/src/tests.rs b/src/tests.rs index ef76806..ed04398 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1,14 +1,13 @@ #[cfg(test)] mod tests { use crate::mutation::Mutation; - use crate::build_tree::phylo2vec_lin; use crate::build_tree::vector_to_tree; - use crate::tree::Tree; use crate::build_tree::newick_to_vector; use crate::random_vector; #[test] - fn treemake_quad() { + fn check_tree_build_manual() { + // I check that built trees have the correct parent by comparing to known parent values let mut tree = vector_to_tree(&vec![0, 0, 0, 0]); assert_eq!(tree.get_node(0).unwrap().parent, Some(4)); @@ -81,74 +80,22 @@ mod tests { } #[test] - fn phylo2vec_lin_same_as_vector_to_tree() { + fn update_tree() { + let mut tree_1 = vector_to_tree(&vec![0, 0, 1, 0]); let vecs: Vec> = vec![vec![0, 0, 0, 0], vec![0, 0, 1, 0], vec![0, 0, 1, 2], vec![0, 0, 1, 1]]; - let mut tree_q: Tree; - let mut tree_l: Tree; for vec in vecs { - let v = vec.clone(); - tree_q = vector_to_tree(&v); - tree_l = phylo2vec_lin(vec, false); + let tree_2 = vector_to_tree(&vec); + tree_1.update(&vec); - for i in 0..=6 { + for i in 0..=tree_1.tree_vec.len() { assert_eq!( - tree_l.get_node(i).unwrap().parent, - tree_q.get_node(i).unwrap().parent); + tree_1.get_node(i).unwrap().parent, + tree_2.get_node(i).unwrap().parent); assert_eq!( - tree_l.get_node(i).unwrap().index, - tree_q.get_node(i).unwrap().index - ); - } - } - - } - - // #[test] - // fn update_tree_check() { - // let mut tree_q = vector_to_tree(vec![0, 1, 0]); - // let mut tree_l = phylo2vec_lin(vec![0, 0, 0], false); - - // let vecs: Vec> = vec![vec![0, 0, 0], vec![0, 1, 0], vec![0, 1, 2], vec![0, 1, 1]]; - - // for vec in vecs { - // let v = vec.clone(); - // tree_q = vector_to_tree(v); - // tree_l.update_quad(vec); - - // for i in 0..=6 { - // assert_eq!( - // tree_l.get_node(i).unwrap().parent, - // tree_q.get_node(i).unwrap().parent); - // assert_eq!( - // tree_l.get_node(i).unwrap().index, - // tree_q.get_node(i).unwrap().index - // ); - // } - // } - - // } - - #[test] - fn update_tree_quad_check() { - let mut tree_q = vector_to_tree(&vec![0, 0, 1, 0]); - let mut tree_l = phylo2vec_lin(vec![0, 0, 0, 0], false); - - let vecs: Vec> = vec![vec![0, 0, 0, 0], vec![0, 0, 1, 0], vec![0, 0, 1, 2], vec![0, 0, 1, 1]]; - - for vec in vecs { - let v = vec.clone(); - tree_q = vector_to_tree(&v); - tree_l.update(&vec); - - for i in 0..=6 { - assert_eq!( - tree_l.get_node(i).unwrap().parent, - tree_q.get_node(i).unwrap().parent); - assert_eq!( - tree_l.get_node(i).unwrap().index, - tree_q.get_node(i).unwrap().index + tree_1.get_node(i).unwrap().index, + tree_2.get_node(i).unwrap().index ); } } @@ -156,12 +103,12 @@ mod tests { } #[test] - fn likelihood_internal_consistency() { + fn likelihood_internal_consistency_check() { let q: na::Matrix4 = na::Matrix4::new( -3.0, 1.0, 1.0, 1.0, 1.0, -3.0, 1.0, 1.0, 1.0, 1.0, -3.0, 1.0, 1.0, 1.0, 1.0, -3.0, ); - let mut tr = phylo2vec_lin(vec![0, 0, 0, 0], false); + let mut tr = vector_to_tree(&vec![0, 0, 0, 0]); let genetic_data = vec![ vec![ @@ -212,8 +159,8 @@ mod tests { } #[test] - fn newick_test () { - let mut tr = vector_to_tree(&vec![0, 0, 0, 0]); + fn manual_parent_check () { + let tr = vector_to_tree(&vec![0, 0, 0, 0]); // Newick string for this tree is (1,(2,(3,0)4)5)6; // This should be the tree topology according to the ape package in R @@ -221,7 +168,7 @@ mod tests { assert_eq!(tr.get_node(5).unwrap().children, (Some(4), Some(2))); assert_eq!(tr.get_node(6).unwrap().children, (Some(5), Some(1))); - let mut tr = vector_to_tree(&vec![0, 0, 0, 1]); + let tr = vector_to_tree(&vec![0, 0, 0, 1]); // Newick string for this tree is ((3,1)4,(2,0)5)6; // This should be the tree topology according to the ape package in R @@ -229,7 +176,7 @@ mod tests { assert_eq!(tr.get_node(5).unwrap().children, (Some(0), Some(2))); assert_eq!(tr.get_node(6).unwrap().children, (Some(5), Some(4))); - let mut tr = vector_to_tree(&vec![0, 0, 1, 1]); + let tr = vector_to_tree(&vec![0, 0, 1, 1]); // Newick string for this tree is ((2,(3,1)4)5,0)6; // This should be the tree topology according to the ape package in R @@ -237,7 +184,7 @@ mod tests { assert_eq!(tr.get_node(5).unwrap().children, (Some(4), Some(2))); assert_eq!(tr.get_node(6).unwrap().children, (Some(0), Some(5))); - let mut tr = vector_to_tree(&vec![0, 0, 1, 1, 3]); + let tr = vector_to_tree(&vec![0, 0, 1, 1, 3]); // Newick string for this tree is ((2,((4,3)5,1)6)7,0)8; // This should be the tree topology according to the ape package in R @@ -252,11 +199,13 @@ mod tests { } #[test] - fn newick_conversion () { - let mut tr = vector_to_tree(&random_vector(27)); + fn newick_vector_conversion_check () { + let v = random_vector(27); + let tr = vector_to_tree(&v); let nw = tr.newick(); let n_leaves = tr.count_leaves(); let y = newick_to_vector(&nw, n_leaves); + assert_eq!(v, y); let trstr = vector_to_tree(&y).newick(); assert_eq!(trstr, nw); }