19 template <forest_order order,
typename T>
22 std::conditional_t<order == forest_order::depth_first, std::stack<T>, std::queue<T>>;
23 void add(T
const& val) { data_.push(val); }
24 void add(T
const& hot, T
const& distant)
37 auto result = data_.top();
41 auto result = data_.front();
54 [[nodiscard]]
auto empty() {
return data_.empty(); }
55 auto size() {
return data_.size(); }
63 template <
typename node_t = traversal_node<std::
size_t>,
typename tree_
id_t = std::
size_t>
73 traversal_forest(std::vector<node_uid_type>&& root_node_uids) : root_node_uids_{root_node_uids} {}
75 template <forest_order order,
typename lambda_t>
88 std::pair<node_uid_type, index_type>>>{};
92 for (
auto const& root_node_uid : root_node_uids_) {
93 to_be_visited.
add(std::make_pair(root_node_uid, std::size_t{}));
94 parent_indices.add(cur_index);
95 while (!to_be_visited.empty()) {
96 auto [node_uid, depth] = to_be_visited.next();
97 auto parent_index = parent_indices.next();
99 lambda(node_uid.first, node, depth, parent_index);
100 if (!node.is_leaf()) {
101 auto hot_uid = std::make_pair(std::make_pair(node_uid.first, node.hot_child()),
103 auto distant_uid = std::make_pair(std::make_pair(node_uid.first, node.distant_child()),
105 to_be_visited.add(hot_uid, distant_uid);
106 parent_indices.add(cur_index, cur_index);
112 for (
auto const& root_node_uid : root_node_uids_) {
113 to_be_visited.add(root_node_uid);
114 parent_indices.add(cur_index++);
118 while (!to_be_visited.empty()) {
119 auto layer_node_uids = std::vector<node_uid_type>{};
120 auto layer_parent_indices = std::vector<index_type>{};
121 while (!to_be_visited.empty()) {
122 layer_node_uids.push_back(to_be_visited.next());
123 layer_parent_indices.push_back(parent_indices.next());
125 for (
auto layer_index =
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
126 auto node_uid = layer_node_uids[layer_index];
127 auto parent_index = layer_parent_indices[layer_index];
129 lambda(node_uid.first, node, depth, parent_index);
130 if (!node.is_leaf()) {
131 auto hot_uid = std::make_pair(node_uid.first, node.hot_child());
132 to_be_visited.add(hot_uid);
133 parent_indices.add(cur_index);
138 cur_index -= layer_node_uids.size();
139 for (
auto layer_index =
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
140 auto node_uid = layer_node_uids[layer_index];
142 if (!node.is_leaf()) {
143 auto distant_uid = std::make_pair(node_uid.first, node.distant_child());
144 to_be_visited.add(distant_uid);
145 parent_indices.add(cur_index);
152 for (
auto const& root_node_uid : root_node_uids_) {
153 to_be_visited.add(root_node_uid);
154 parent_indices.add(cur_index++);
158 while (!to_be_visited.empty()) {
159 auto layer_node_uids = std::vector<node_uid_type>{};
160 auto layer_parent_indices = std::vector<index_type>{};
161 while (!to_be_visited.empty()) {
162 layer_node_uids.push_back(to_be_visited.next());
163 layer_parent_indices.push_back(parent_indices.next());
165 for (
auto layer_index =
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
166 auto node_uid = layer_node_uids[layer_index];
167 auto parent_index = layer_parent_indices[layer_index];
169 lambda(node_uid.first, node, depth, parent_index);
170 if (!node.is_leaf()) {
171 auto hot_uid = std::make_pair(node_uid.first, node.hot_child());
172 auto distant_uid = std::make_pair(node_uid.first, node.distant_child());
173 to_be_visited.add(hot_uid, distant_uid);
174 parent_indices.add(cur_index, cur_index);
186 std::vector<node_uid_type> root_node_uids_{};
@ layered_children_segregated
@ layered_children_together
Definition: dbscan.hpp:18
Definition: traversal_forest.hpp:20
auto peek()
Definition: traversal_forest.hpp:46
auto size()
Definition: traversal_forest.hpp:55
void add(T const &hot, T const &distant)
Definition: traversal_forest.hpp:24
void add(T const &val)
Definition: traversal_forest.hpp:23
auto empty()
Definition: traversal_forest.hpp:54
std::conditional_t< order==forest_order::depth_first, std::stack< T >, std::queue< T > > backing_container_t
Definition: traversal_forest.hpp:22
auto next()
Definition: traversal_forest.hpp:34
Definition: traversal_forest.hpp:64
tree_id_t tree_id_type
Definition: traversal_forest.hpp:67
typename node_type::id_type node_id_type
Definition: traversal_forest.hpp:66
std::pair< tree_id_type, node_id_type > node_uid_type
Definition: traversal_forest.hpp:68
std::size_t index_type
Definition: traversal_forest.hpp:69
traversal_forest(std::vector< node_uid_type > &&root_node_uids)
Definition: traversal_forest.hpp:73
void for_each(lambda_t &&lambda) const
Definition: traversal_forest.hpp:76
node_t node_type
Definition: traversal_forest.hpp:65
virtual node_type get_node(tree_id_type tree_id, node_id_type node_id) const =0