diff --git a/src/trees/louds_tree.rs b/src/trees/louds_tree.rs index ec73119cb42f6125fccb2803c2f88c728106c52a..9bc0428f66c7cf8bea8910cbee463110bb41911d 100644 --- a/src/trees/louds_tree.rs +++ b/src/trees/louds_tree.rs @@ -43,19 +43,19 @@ pub struct LOUDSTree<L> { labels: Vec<L>, } -impl<L: PartialEq + Clone> PartialEq for LOUDSTree<L> { +impl<L: PartialEq + Clone + Debug> PartialEq for LOUDSTree<L> { fn eq(&self, other: &Self) -> bool { self.rankselect.bits() == other.rankselect.bits() } } -impl<L: PartialEq + Clone> Debug for LOUDSTree<L> { +impl<L: PartialEq + Clone + Debug> Debug for LOUDSTree<L> { fn fmt(&self, f: &mut Formatter) -> fmt::Result { write!(f, "LOUDSTree\n {{ bits: {:?} }}", self.rankselect.bits()) } } -impl<L: PartialEq + Clone> SuccinctTree<LOUDSTree<L>, L> for LOUDSTree<L> { +impl<L: PartialEq + Clone + Debug> SuccinctTree<LOUDSTree<L>, L> for LOUDSTree<L> { /// Checks if a node is a leaf. /// # Arguments /// * `index` The index of the node to check @@ -147,7 +147,7 @@ impl<L: PartialEq + Clone> SuccinctTree<LOUDSTree<L>, L> for LOUDSTree<L> { } let mut l_tree = Self::from_bitvec(bitvec).unwrap(); - for node in tree.traverse_pre_order(root).unwrap() { + for node in tree.traverse_level_order(root).unwrap() { l_tree.labels.push((*node.data()).clone()); } Ok(l_tree) @@ -161,20 +161,40 @@ impl<L: PartialEq + Clone> SuccinctTree<LOUDSTree<L>, L> for LOUDSTree<L> { fn child_label(&self, index: u64) -> Result<&L, NodeError> { // child label(x) = //L[rank ( (parent(x)) + child rank(x) − 1] - let parent = self.parent(index)?; - let child_rank = self.child_rank(index).ok_or(NodeError::NotANodeError)?; + let parent = + if index != 1 { self.parent(index)? } else { 0 }; + let child_rank = if index == 1 || self.degree(parent)? == 1 { + 0 + } else { + self.child_rank(index) + .ok_or(NodeError::NotANodeError) + .unwrap() + }; + let parent_rank = self.rankselect.rank_1(parent).unwrap(); Ok(self .labels - .get((parent + child_rank - 1) as usize) + .get((parent_rank + child_rank - 1) as usize) .ok_or(NodeError::NoLabelError)?) } fn labeled_child(&self, index: u64, label: L) -> Result<u64, NodeError> { - unimplemented!(); + 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); + } + } + Err(NodeError::NoSuchChildError) } } -impl<L: PartialEq + Clone> LOUDSTree<L> { +impl<L: PartialEq + Clone + Debug> LOUDSTree<L> { fn prev_0(&self, index: u64) -> Option<u64> { self.rankselect.select_0(self.rankselect.rank_0(index)?) } @@ -198,16 +218,21 @@ impl<L: PartialEq + Clone> LOUDSTree<L> { } } pub fn child_rank(&self, index: u64) -> Option<u64> { + if index <= 1 { + return Some(0); + } let y = self .rankselect .select_1(self.rankselect.rank_0(index - 1)?)?; Some(y - self.prev_0(y)?) } + pub fn from_bitvec(bitvec: BitVec<u8>) -> Result<Self, InvalidBitvecError> { if !Self::is_valid(&bitvec as &BitVec<u8>) { return Err(InvalidBitvecError); } let superblock_size = Self::calc_superblock_size(bitvec.len()); + Ok(Self { labels: Vec::with_capacity(bitvec.len() as usize), rankselect: RankSelect::new(bitvec, superblock_size as usize), @@ -378,6 +403,7 @@ mod tests { assert_eq!(tree.child_rank(9).unwrap(), 2); assert_eq!(tree.child_rank(7).unwrap(), 1); assert_eq!(tree.child_rank(5).unwrap(), 0); + assert_eq!(tree.child_rank(1).unwrap(), 0); } #[test] @@ -409,6 +435,7 @@ 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) @@ -420,4 +447,32 @@ mod tests { let tree: Result<LOUDSTree<String>, EmptyTreeError> = LOUDSTree::from_id_tree(id_tree); assert_eq!(tree.unwrap_err(), EmptyTreeError); } + + #[test] + fn child_label() { + 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 bp_tree = LOUDSTree::from_id_tree(id_tree).unwrap(); + assert_eq!(*bp_tree.child_label(1).unwrap(), "root"); + assert_eq!(*bp_tree.child_label(4).unwrap(), "first_root_child"); + assert_eq!(*bp_tree.child_label(6).unwrap(), "second_root_child"); + assert_eq!(*bp_tree.child_label(7).unwrap(), "leaf"); + } }