Skip to content

Commit 71d535c

Browse files
committed
Replace Vec with VecDeque for proper BFT queue behavior in NodeIter
1 parent 6ab89bf commit 71d535c

File tree

2 files changed

+7
-6
lines changed

2 files changed

+7
-6
lines changed

algorithms/linfa-trees/src/decision_trees/algorithm.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Linear decision trees
22
//!
33
use std::cmp::Ordering;
4-
use std::collections::{HashMap, HashSet};
4+
use std::collections::{HashMap, HashSet, VecDeque};
55
use std::hash::{Hash, Hasher};
66

77
use linfa::dataset::AsSingleTargets;
@@ -553,7 +553,7 @@ impl<F: Float, L: Label> DecisionTree<F, L> {
553553
// queue of nodes yet to explore
554554
let queue = vec![&self.root_node];
555555

556-
NodeIter::new(queue)
556+
NodeIter::new(VecDeque::from(queue))
557557
}
558558

559559
/// Return features_idx of this tree (BFT)

algorithms/linfa-trees/src/decision_trees/iter.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
use std::fmt::Debug;
22
use std::iter::Iterator;
3+
use std::collections::VecDeque;
34

45
use super::TreeNode;
56
use linfa::{Float, Label};
67

78
/// Level-order (BFT) iterator of nodes in a decision tree
89
#[derive(Debug, Clone, PartialEq)]
910
pub struct NodeIter<'a, F, L> {
10-
queue: Vec<&'a TreeNode<F, L>>,
11+
queue: VecDeque<&'a TreeNode<F, L>>,
1112
}
1213

1314
impl<'a, F, L> NodeIter<'a, F, L> {
14-
pub fn new(queue: Vec<&'a TreeNode<F, L>>) -> Self {
15+
pub fn new(queue: VecDeque<&'a TreeNode<F, L>>) -> Self {
1516
NodeIter { queue }
1617
}
1718
}
@@ -21,11 +22,11 @@ impl<'a, F: Float, L: Debug + Label> Iterator for NodeIter<'a, F, L> {
2122

2223
fn next(&mut self) -> Option<Self::Item> {
2324
#[allow(clippy::manual_inspect)]
24-
self.queue.pop().map(|node| {
25+
self.queue.pop_front().map(|node| {
2526
node.children()
2627
.into_iter()
2728
.filter_map(|x| x.as_ref())
28-
.for_each(|child| self.queue.push(child));
29+
.for_each(|child| self.queue.push_back(child));
2930
node
3031
})
3132
}

0 commit comments

Comments
 (0)