30 template <forest_order order,
typename T>
33 std::conditional_t<order == forest_order::depth_first, std::stack<T>, std::queue<T>>;
34 void add(T
const& val) { data_.push(val); }
35 void add(T
const& hot, T
const& distant)
48 auto result = data_.top();
52 auto result = data_.front();
65 [[nodiscard]]
auto empty() {
return data_.empty(); }
66 auto size() {
return data_.size(); }
74 template <
typename node_t = traversal_node<std::
size_t>,
typename tree_
id_t = std::
size_t>
84 traversal_forest(std::vector<node_uid_type>&& root_node_uids) : root_node_uids_{root_node_uids} {}
86 template <forest_order order,
typename lambda_t>
99 std::pair<node_uid_type, index_type>>>{};
103 for (
auto const& root_node_uid : root_node_uids_) {
104 to_be_visited.
add(std::make_pair(root_node_uid, std::size_t{}));
105 parent_indices.add(cur_index);
106 while (!to_be_visited.empty()) {
107 auto [node_uid, depth] = to_be_visited.next();
108 auto parent_index = parent_indices.next();
110 lambda(node_uid.first, node, depth, parent_index);
111 if (!node.is_leaf()) {
112 auto hot_uid = std::make_pair(std::make_pair(node_uid.first, node.hot_child()),
114 auto distant_uid = std::make_pair(std::make_pair(node_uid.first, node.distant_child()),
116 to_be_visited.add(hot_uid, distant_uid);
117 parent_indices.add(cur_index, cur_index);
123 for (
auto const& root_node_uid : root_node_uids_) {
124 to_be_visited.add(root_node_uid);
125 parent_indices.add(cur_index++);
129 while (!to_be_visited.empty()) {
130 auto layer_node_uids = std::vector<node_uid_type>{};
131 auto layer_parent_indices = std::vector<index_type>{};
132 while (!to_be_visited.empty()) {
133 layer_node_uids.push_back(to_be_visited.next());
134 layer_parent_indices.push_back(parent_indices.next());
136 for (
auto layer_index =
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
137 auto node_uid = layer_node_uids[layer_index];
138 auto parent_index = layer_parent_indices[layer_index];
140 lambda(node_uid.first, node, depth, parent_index);
141 if (!node.is_leaf()) {
142 auto hot_uid = std::make_pair(node_uid.first, node.hot_child());
143 to_be_visited.add(hot_uid);
144 parent_indices.add(cur_index);
149 cur_index -= layer_node_uids.size();
150 for (
auto layer_index =
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
151 auto node_uid = layer_node_uids[layer_index];
153 if (!node.is_leaf()) {
154 auto distant_uid = std::make_pair(node_uid.first, node.distant_child());
155 to_be_visited.add(distant_uid);
156 parent_indices.add(cur_index);
163 for (
auto const& root_node_uid : root_node_uids_) {
164 to_be_visited.add(root_node_uid);
165 parent_indices.add(cur_index++);
169 while (!to_be_visited.empty()) {
170 auto layer_node_uids = std::vector<node_uid_type>{};
171 auto layer_parent_indices = std::vector<index_type>{};
172 while (!to_be_visited.empty()) {
173 layer_node_uids.push_back(to_be_visited.next());
174 layer_parent_indices.push_back(parent_indices.next());
176 for (
auto layer_index =
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
177 auto node_uid = layer_node_uids[layer_index];
178 auto parent_index = layer_parent_indices[layer_index];
180 lambda(node_uid.first, node, depth, parent_index);
181 if (!node.is_leaf()) {
182 auto hot_uid = std::make_pair(node_uid.first, node.hot_child());
183 auto distant_uid = std::make_pair(node_uid.first, node.distant_child());
184 to_be_visited.add(hot_uid, distant_uid);
185 parent_indices.add(cur_index, cur_index);
197 std::vector<node_uid_type> root_node_uids_{};
@ layered_children_segregated
@ layered_children_together
Definition: dbscan.hpp:29
Definition: traversal_forest.hpp:31
auto peek()
Definition: traversal_forest.hpp:57
auto size()
Definition: traversal_forest.hpp:66
void add(T const &hot, T const &distant)
Definition: traversal_forest.hpp:35
void add(T const &val)
Definition: traversal_forest.hpp:34
auto empty()
Definition: traversal_forest.hpp:65
std::conditional_t< order==forest_order::depth_first, std::stack< T >, std::queue< T > > backing_container_t
Definition: traversal_forest.hpp:33
auto next()
Definition: traversal_forest.hpp:45
Definition: traversal_forest.hpp:75
tree_id_t tree_id_type
Definition: traversal_forest.hpp:78
typename node_type::id_type node_id_type
Definition: traversal_forest.hpp:77
std::pair< tree_id_type, node_id_type > node_uid_type
Definition: traversal_forest.hpp:79
std::size_t index_type
Definition: traversal_forest.hpp:80
traversal_forest(std::vector< node_uid_type > &&root_node_uids)
Definition: traversal_forest.hpp:84
void for_each(lambda_t &&lambda) const
Definition: traversal_forest.hpp:87
node_t node_type
Definition: traversal_forest.hpp:76
virtual node_type get_node(tree_id_type tree_id, node_id_type node_id) const =0