Pixie
Loading...
Searching...
No Matches
utils.h
1#pragma once
2
3#include <pixie/tree/louds.h>
4
5#include <queue>
6#include <random>
7#include <vector>
8
9using pixie::LoudsNode;
10
11std::vector<std::vector<size_t>> generate_random_tree(size_t tree_size,
12 std::mt19937_64& rng) {
13 if (tree_size == 0) {
14 return {};
15 }
16 std::vector<std::vector<size_t>> adj(tree_size);
17 adj[0].push_back(0);
18 for (size_t i = 1; i < tree_size; i++) {
19 size_t parent = rng() % i;
20 adj[i].push_back(parent);
21 adj[parent].push_back(i);
22 }
23 return adj;
24}
25
26std::vector<std::vector<size_t>> bfs_order(
27 size_t tree_size,
28 const std::vector<std::vector<size_t>>& adj) {
29 std::vector<std::vector<size_t>> bfs_adj(tree_size);
30 std::queue<std::pair<size_t, size_t>> q;
31 bfs_adj[0].push_back(0);
32 q.push({0, 0});
33 size_t cnt = 1;
34 while (!q.empty()) {
35 size_t old_v = q.front().first;
36 size_t cur_v = q.front().second;
37 q.pop();
38 for (size_t i = 1; i < adj[old_v].size(); i++) {
39 size_t old_u = adj[old_v][i];
40 size_t cur_u = cnt++;
41 q.push({old_u, cur_u});
42 bfs_adj[cur_u].push_back(cur_v);
43 bfs_adj[cur_v].push_back(cur_u);
44 }
45 }
46 return bfs_adj;
47}
48
49std::vector<std::vector<size_t>> dfs_order(
50 size_t tree_size,
51 const std::vector<std::vector<size_t>>& adj) {
52 std::vector<std::vector<size_t>> dfs_adj(tree_size);
53 std::vector<std::pair<size_t, size_t>> stack;
54 dfs_adj[0].push_back(0);
55 stack.push_back({0, 0});
56 std::vector<size_t> renumbering(tree_size, 0);
57 size_t next_number = 1;
58 while (!stack.empty()) {
59 auto& [v, i] = stack.back();
60 i++;
61 if (i == adj[v].size()) {
62 stack.pop_back();
63 continue;
64 }
65 size_t u = adj[v][i];
66 renumbering[u] = next_number++;
67 dfs_adj[renumbering[v]].push_back(renumbering[u]);
68 dfs_adj[renumbering[u]].push_back(renumbering[v]);
69
70 stack.push_back(std::pair{u, 0});
71 }
72 return dfs_adj;
73}
74
75std::vector<uint64_t> adj_to_louds(
76 size_t tree_size,
77 const std::vector<std::vector<size_t>>& adj) {
78 size_t louds_size = tree_size * 2 - 1;
79 std::vector<uint64_t> louds((louds_size + 63) / 64, 0);
80 size_t pos = 0;
81 for (size_t i = 0; i < tree_size; i++) {
82 louds[pos >> 6] = louds[pos >> 6] | (1ULL << (pos & 63));
83 pos += adj[i].size();
84 }
85 return louds;
86}
87
88std::vector<uint64_t> generate_random_data(size_t data_size,
89 size_t alphabet_size,
90 std::mt19937_64& rng) {
91 std::vector<uint64_t> data(data_size);
92 std::uniform_int_distribution<uint64_t> alphabet(0, alphabet_size - 1);
93 for (size_t i = 0; i < data_size; i++) {
94 data[i] = alphabet(rng);
95 }
96 return data;
97}
98
100 size_t number;
101};
102
103bool operator==(const AdjListNode& a, const LoudsNode& b) {
104 return a.number == b.number;
105}
106
107bool operator==(const LoudsNode& b, const AdjListNode& a) {
108 return a.number == b.number;
109}
110
112 private:
113 std::vector<std::vector<size_t>> adj;
114
115 public:
119 explicit AdjListTree(const std::vector<std::vector<size_t>>& adjacency_list)
120 : adj(adjacency_list) {}
121
125 AdjListNode root() const { return AdjListNode(0); }
126
130 bool is_leaf(const AdjListNode& node) const {
131 return adj[node.number].size() <= 1;
132 }
133
137 bool is_root(const AdjListNode& node) const { return node.number == 0; }
138
142 size_t degree(const AdjListNode& node) const {
143 return adj[node.number].size() - 1;
144 }
145
150 AdjListNode child(const AdjListNode& node, size_t i) const {
151 return AdjListNode(adj[node.number][i + 1]);
152 }
153
158 return AdjListNode(adj[node.number][1]);
159 }
160
165 AdjListNode parent(const AdjListNode& node) const {
166 return AdjListNode(adj[node.number][0]);
167 }
168
172 bool is_last_child(const AdjListNode& node) const {
173 size_t p = parent(node).number;
174 return adj[p].back() == node.number;
175 }
176
181 const size_t parent_number = parent(node).number;
182 const auto& siblings = adj[parent_number];
183 for (size_t i = 1; i + 1 < siblings.size(); ++i) {
184 if (siblings[i] == node.number) {
185 return AdjListNode(siblings[i + 1]);
186 }
187 }
188 return node;
189 }
190};
size_t degree(const AdjListNode &node) const
Returns the number of children of node.
Definition utils.h:142
AdjListTree(const std::vector< std::vector< size_t > > &adjacency_list)
Constructor from adjacency list (root is 0)
Definition utils.h:119
AdjListNode next_sibling(const AdjListNode &node) const
Returns next sibling of a node.
Definition utils.h:180
AdjListNode first_child(const AdjListNode &node) const
Returns the first child of node.
Definition utils.h:157
AdjListNode parent(const AdjListNode &node) const
Returns the parent of a node if node is not root, else returns root.
Definition utils.h:165
AdjListNode root() const
Returns the root node.
Definition utils.h:125
AdjListNode child(const AdjListNode &node, size_t i) const
Returns the i-th child of node Indexing starts at 0.
Definition utils.h:150
bool is_root(const AdjListNode &node) const
Checks if node is a root.
Definition utils.h:137
bool is_leaf(const AdjListNode &node) const
Checks if node is a leaf.
Definition utils.h:130
bool is_last_child(const AdjListNode &node) const
Indicates if node is last child.
Definition utils.h:172
Definition utils.h:99
std::size_t number
Logical node number in the encoding's traversal order.
Definition tree.h:20