25 namespace experimental {
31 template <forest_order order,
typename T>
34 std::conditional_t<order == forest_order::depth_first, std::stack<T>, std::queue<T>>;
35 void add(T
const& val) { data_.push(val); }
36 void add(T
const& hot, T
const& distant)
49 auto result = data_.top();
53 auto result = data_.front();
66 [[nodiscard]]
auto empty() {
return data_.empty(); }
67 auto size() {
return data_.size(); }
75 template <
typename node_t = traversal_node<std::
size_t>,
typename tree_
id_t = std::
size_t>
85 traversal_forest(std::vector<node_uid_type>&& root_node_uids) : root_node_uids_{root_node_uids} {}
87 template <forest_order order,
typename lambda_t>
100 std::pair<node_uid_type, index_type>>>{};
104 for (
auto const& root_node_uid : root_node_uids_) {
105 to_be_visited.
add(std::make_pair(root_node_uid, std::size_t{}));
106 parent_indices.add(cur_index);
107 while (!to_be_visited.empty()) {
108 auto [node_uid, depth] = to_be_visited.next();
109 auto parent_index = parent_indices.next();
111 lambda(node_uid.first, node, depth, parent_index);
112 if (!node.is_leaf()) {
113 auto hot_uid = std::make_pair(std::make_pair(node_uid.first, node.hot_child()),
115 auto distant_uid = std::make_pair(std::make_pair(node_uid.first, node.distant_child()),
117 to_be_visited.add(hot_uid, distant_uid);
118 parent_indices.add(cur_index, cur_index);
124 for (
auto const& root_node_uid : root_node_uids_) {
125 to_be_visited.add(root_node_uid);
126 parent_indices.add(cur_index++);
130 while (!to_be_visited.empty()) {
131 auto layer_node_uids = std::vector<node_uid_type>{};
132 auto layer_parent_indices = std::vector<index_type>{};
133 while (!to_be_visited.empty()) {
134 layer_node_uids.push_back(to_be_visited.next());
135 layer_parent_indices.push_back(parent_indices.next());
137 for (
auto layer_index =
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
138 auto node_uid = layer_node_uids[layer_index];
139 auto parent_index = layer_parent_indices[layer_index];
141 lambda(node_uid.first, node, depth, parent_index);
142 if (!node.is_leaf()) {
143 auto hot_uid = std::make_pair(node_uid.first, node.hot_child());
144 to_be_visited.add(hot_uid);
145 parent_indices.add(cur_index);
150 cur_index -= layer_node_uids.size();
151 for (
auto layer_index =
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
152 auto node_uid = layer_node_uids[layer_index];
154 if (!node.is_leaf()) {
155 auto distant_uid = std::make_pair(node_uid.first, node.distant_child());
156 to_be_visited.add(distant_uid);
157 parent_indices.add(cur_index);
164 for (
auto const& root_node_uid : root_node_uids_) {
165 to_be_visited.add(root_node_uid);
166 parent_indices.add(cur_index++);
170 while (!to_be_visited.empty()) {
171 auto layer_node_uids = std::vector<node_uid_type>{};
172 auto layer_parent_indices = std::vector<index_type>{};
173 while (!to_be_visited.empty()) {
174 layer_node_uids.push_back(to_be_visited.next());
175 layer_parent_indices.push_back(parent_indices.next());
177 for (
auto layer_index =
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
178 auto node_uid = layer_node_uids[layer_index];
179 auto parent_index = layer_parent_indices[layer_index];
181 lambda(node_uid.first, node, depth, parent_index);
182 if (!node.is_leaf()) {
183 auto hot_uid = std::make_pair(node_uid.first, node.hot_child());
184 auto distant_uid = std::make_pair(node_uid.first, node.distant_child());
185 to_be_visited.add(hot_uid, distant_uid);
186 parent_indices.add(cur_index, cur_index);
198 std::vector<node_uid_type> root_node_uids_{};
@ layered_children_segregated
@ layered_children_together
Definition: dbscan.hpp:30
Definition: traversal_forest.hpp:32
auto size()
Definition: traversal_forest.hpp:67
void add(T const &val)
Definition: traversal_forest.hpp:35
auto empty()
Definition: traversal_forest.hpp:66
void add(T const &hot, T const &distant)
Definition: traversal_forest.hpp:36
auto next()
Definition: traversal_forest.hpp:46
auto peek()
Definition: traversal_forest.hpp:58
std::conditional_t< order==forest_order::depth_first, std::stack< T >, std::queue< T > > backing_container_t
Definition: traversal_forest.hpp:34
Definition: traversal_forest.hpp:76
node_t node_type
Definition: traversal_forest.hpp:77
typename node_type::id_type node_id_type
Definition: traversal_forest.hpp:78
void for_each(lambda_t &&lambda) const
Definition: traversal_forest.hpp:88
std::pair< tree_id_type, node_id_type > node_uid_type
Definition: traversal_forest.hpp:80
tree_id_t tree_id_type
Definition: traversal_forest.hpp:79
std::size_t index_type
Definition: traversal_forest.hpp:81
traversal_forest(std::vector< node_uid_type > &&root_node_uids)
Definition: traversal_forest.hpp:85
virtual node_type get_node(tree_id_type tree_id, node_id_type node_id) const =0