From cfd2c21c13980cd288d7ec34a19c43fbfb0ea243 Mon Sep 17 00:00:00 2001 From: David Mehren <dmehren1@gmail.com> Date: Sun, 8 Jul 2018 19:19:35 +0200 Subject: [PATCH] [LOUDSTree] Implement labeled_child Add tests for nth_child() --- src/trees/louds_tree.rs | 85 +++++++++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 11 deletions(-) diff --git a/src/trees/louds_tree.rs b/src/trees/louds_tree.rs index 9bc0428..2c1d583 100644 --- a/src/trees/louds_tree.rs +++ b/src/trees/louds_tree.rs @@ -178,16 +178,19 @@ impl<L: PartialEq + Clone + Debug> SuccinctTree<LOUDSTree<L>, L> for LOUDSTree<L } fn labeled_child(&self, index: u64, label: L) -> Result<u64, NodeError> { - println!("Foobar"); - let left_bound = self - .rankselect - .rank_0(index) - .ok_or(NodeError::NotANodeError)?; - let right_bound = left_bound + self.degree(index)? - 1; - for i in left_bound..right_bound { - let item = self.labels.get(i as usize).unwrap(); - if label == *item { - return Ok(i); + let child_count = self.degree(index)?; + for i in 1..=child_count { + let child_index = self.child(index, i).unwrap(); + let mut label_index = self + .rankselect + .rank_0(child_index) + .ok_or(NodeError::NotANodeError)?; + if self.is_leaf(child_index).unwrap() { + label_index -= 1; + } + let my_label = self.labels.get(label_index as usize).unwrap().clone(); + if my_label == label { + return Ok(child_index); } } Err(NodeError::NoSuchChildError) @@ -435,7 +438,6 @@ mod tests { id_tree.insert(Node::new(2), UnderNode(&root_id)).unwrap(); id_tree.insert(Node::new(3), UnderNode(&child_id)).unwrap(); let tree: LOUDSTree<i32> = LOUDSTree::from_id_tree(id_tree).unwrap(); - tree.labeled_child(0, 2); let bitvec = bit_vec![true, true, true, false, true, false, false, false]; let other_tree = LOUDSTree::from_bitvec(bitvec).unwrap(); assert_eq!(tree, other_tree) @@ -475,4 +477,65 @@ mod tests { assert_eq!(*bp_tree.child_label(6).unwrap(), "second_root_child"); assert_eq!(*bp_tree.child_label(7).unwrap(), "leaf"); } + + #[test] + fn labeled_child() { + let mut id_tree: Tree<String> = TreeBuilder::new().with_node_capacity(5).build(); + let root_id: NodeId = id_tree + .insert(Node::new(String::from("root")), AsRoot) + .unwrap(); + let child_id = id_tree + .insert( + Node::new(String::from("first_root_child")), + UnderNode(&root_id), + ) + .unwrap(); + id_tree + .insert(Node::new(String::from("leaf")), UnderNode(&child_id)) + .unwrap(); + id_tree + .insert( + Node::new(String::from("second_root_child")), + UnderNode(&root_id), + ) + .unwrap(); + let louds_tree = LOUDSTree::from_id_tree(id_tree).unwrap(); + assert_eq!( + louds_tree + .labeled_child(1, String::from("second_root_child")) + .unwrap(), + 6 + ); + assert_eq!( + louds_tree + .labeled_child(1, String::from("first_root_child")) + .unwrap(), + 4 + ); + assert_eq!( + louds_tree.labeled_child(4, String::from("leaf")).unwrap(), + 7 + ); + } + + #[test] + fn nth_child() { + let bitvec = + bit_vec![true, true, true, true, false, true, false, true, false, false, false, false]; + let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap(); + assert_eq!(tree.child(1, 1).unwrap(), 5); + assert_eq!(tree.child(1, 2).unwrap(), 7); + assert_eq!(tree.child(1, 3).unwrap(), 9); + assert_eq!(tree.child(5, 1).unwrap(), 10); + assert_eq!(tree.child(7, 1).unwrap(), 11); + let bitvec2 = bit_vec![true, true, false, true, false, false]; + let tree2: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec2).unwrap(); + assert_eq!(tree2.child(1, 1).unwrap(), 3); + assert_eq!(tree2.child(3, 1).unwrap(), 5); + let bitvec3 = bit_vec![true, true, true, false, true, false, false, false]; + let tree3: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec3).unwrap(); + assert_eq!(tree3.child(1, 1).unwrap(), 4); + assert_eq!(tree3.child(1, 2).unwrap(), 6); + assert_eq!(tree3.child(4, 1).unwrap(), 7); + } } -- GitLab