Skip to content

Commit 0ea4987

Browse files
committed
Added tests for k2-treap
Fixed bug in dac_vector: Previously dac_vector only worked if the bit-width of the maximum in the vector was smaller or equal to the bit-width of the length of the vector.
1 parent 104826c commit 0ea4987

File tree

7 files changed

+365
-32
lines changed

7 files changed

+365
-32
lines changed

examples/k2_treap_in_mem.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,16 @@ int main()
3838
cout << point_weight.first <<" weight: "<<point_weight.second << endl;
3939
++range_it;
4040
}
41+
42+
cout<<"---"<<endl;
43+
{
44+
k2_rrr k2t;
45+
construct_im(k2t, {{1,2,3},{2,3,3},{3,1,3}});
46+
auto topk_it = top_k(k2t, {0,0}, {10,10});
47+
while (topk_it) {
48+
auto point_weight = *topk_it;
49+
cout << point_weight.first <<" weight: "<<point_weight.second << endl;
50+
++topk_it;
51+
}
52+
}
4153
}

include/sdsl/dac_vector.hpp

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,11 @@ class dac_vector
7878
int_vector<t_b> m_data; // block data for every level
7979
bit_vector m_overflow; // mark non-end bytes
8080
rank_support_type m_overflow_rank; // rank for m_overflow
81-
int_vector<64> m_level_pointer_and_rank;
81+
int_vector<64> m_level_pointer_and_rank = int_vector<64>(4,0);
8282
uint8_t m_max_level; // maximum level < (log n)/b+1
8383

84-
void copy(const dac_vector& v) {
84+
void copy(const dac_vector& v)
85+
{
8586
m_data = v.m_data;
8687
m_overflow = v.m_overflow;
8788
m_overflow_rank = v.m_overflow_rank;
@@ -91,25 +92,27 @@ class dac_vector
9192
}
9293

9394
public:
94-
dac_vector() {
95-
m_level_pointer_and_rank = int_vector<64>(4,0);
96-
}
95+
dac_vector() = default;
9796

98-
dac_vector(const dac_vector& v) {
97+
dac_vector(const dac_vector& v)
98+
{
9999
copy(v);
100100
}
101101

102-
dac_vector(dac_vector&& v) {
102+
dac_vector(dac_vector&& v)
103+
{
103104
*this = std::move(v);
104105
}
105-
dac_vector& operator=(const dac_vector& v) {
106+
dac_vector& operator=(const dac_vector& v)
107+
{
106108
if (this != &v) {
107109
copy(v);
108110
}
109111
return *this;
110112
}
111113

112-
dac_vector& operator=(dac_vector&& v) {
114+
dac_vector& operator=(dac_vector&& v)
115+
{
113116
if (this != &v) {
114117
m_data = std::move(v.m_data);
115118
m_overflow = std::move(v.m_overflow);
@@ -133,21 +136,25 @@ class dac_vector
133136
dac_vector(int_vector_buffer<int_width>& v_buf);
134137

135138
//! The number of elements in the dac_vector.
136-
size_type size()const {
139+
size_type size()const
140+
{
137141
return m_level_pointer_and_rank[2];
138142
}
139143
//! Return the largest size that this container can ever have.
140-
static size_type max_size() {
144+
static size_type max_size()
145+
{
141146
return int_vector<>::max_size()/2;
142147
}
143148

144149
//! Returns if the dac_vector is empty.
145-
bool empty() const {
150+
bool empty() const
151+
{
146152
return 0 == m_level_pointer_and_rank[2];
147153
}
148154

149155
//! Swap method for dac_vector
150-
void swap(dac_vector& v) {
156+
void swap(dac_vector& v)
157+
{
151158
m_data.swap(v.m_data);
152159
m_overflow.swap(v.m_overflow);
153160
util::swap_support(m_overflow_rank, v.m_overflow_rank,
@@ -158,18 +165,21 @@ class dac_vector
158165
}
159166

160167
//! Iterator that points to the first element of the dac_vector.
161-
const const_iterator begin()const {
168+
const const_iterator begin()const
169+
{
162170
return const_iterator(this, 0);
163171
}
164172

165173

166174
//! Iterator that points to the position after the last element of the dac_vector.
167-
const const_iterator end()const {
175+
const const_iterator end()const
176+
{
168177
return const_iterator(this, size());
169178
}
170179

171180
//! []-operator
172-
value_type operator[](size_type i)const {
181+
value_type operator[](size_type i)const
182+
{
173183
uint8_t level = 1;
174184
uint8_t offset = t_b;
175185
size_type result = m_data[i];
@@ -189,7 +199,8 @@ class dac_vector
189199
size_type serialize(std::ostream& out, structure_tree_node* v=nullptr, std::string name="")const;
190200

191201
//! Load from a stream.
192-
void load(std::istream& in) {
202+
void load(std::istream& in)
203+
{
193204
m_data.load(in);
194205
m_overflow.load(in);
195206
m_overflow_rank.load(in, &m_overflow);
@@ -209,13 +220,11 @@ dac_vector<t_b, t_rank>::dac_vector(const Container& c)
209220
if (n == 0)
210221
return;
211222
// initialize counter
212-
auto _size = std::max(4*bits::hi(2), 2*(((bits::hi(n)+1)+t_b-1) / t_b));
213-
m_level_pointer_and_rank.resize(_size);
214-
for (size_type i=0; i < m_level_pointer_and_rank.size(); ++i)
215-
m_level_pointer_and_rank[i] = 0;
223+
m_level_pointer_and_rank = int_vector<64>(128, 0);
216224
m_level_pointer_and_rank[0] = n; // level 0 has n entries
217225

218226
uint8_t level_x_2 = 0;
227+
uint8_t max_level_x_2 = 0;
219228
for (size_type i=0; i < n; ++i) {
220229
val=c[i];
221230
val >>= t_b; // shift value b bits to the right
@@ -225,8 +234,10 @@ dac_vector<t_b, t_rank>::dac_vector(const Container& c)
225234
++m_level_pointer_and_rank[level_x_2];
226235
val >>= t_b; // shift value b bits to the right
227236
level_x_2 += 2; // increase level by 1
237+
max_level_x_2 = std::max(max_level_x_2, level_x_2);
228238
}
229239
}
240+
m_level_pointer_and_rank.resize(max_level_x_2);
230241
// (2) Determine maximum level and prefix sums of level counters
231242
m_max_level = 0;
232243
size_type sum_blocks = 0, last_block_size=0;
@@ -286,13 +297,11 @@ dac_vector<t_b, t_rank>::dac_vector(int_vector_buffer<int_width>& v_buf)
286297
if (n == 0)
287298
return;
288299
// initialize counter
289-
auto _size = std::max(4*bits::hi(2), 2*(((bits::hi(n)+1)+t_b-1) / t_b));
290-
m_level_pointer_and_rank.resize(_size);
291-
for (size_type i=0; i < m_level_pointer_and_rank.size(); ++i)
292-
m_level_pointer_and_rank[i] = 0;
300+
m_level_pointer_and_rank = int_vector<64>(128, 0);
293301
m_level_pointer_and_rank[0] = n; // level 0 has n entries
294302

295303
uint8_t level_x_2 = 0;
304+
uint8_t max_level_x_2 = 0;
296305
for (size_type i=0; i < n; ++i) {
297306
val=v_buf[i];
298307
val >>= t_b; // shift value b bits to the right
@@ -302,8 +311,10 @@ dac_vector<t_b, t_rank>::dac_vector(int_vector_buffer<int_width>& v_buf)
302311
++m_level_pointer_and_rank[level_x_2];
303312
val >>= t_b; // shift value b bits to the right
304313
level_x_2 += 2; // increase level by 1
314+
max_level_x_2 = std::max(max_level_x_2, level_x_2);
305315
}
306316
}
317+
m_level_pointer_and_rank.resize(max_level_x_2);
307318
// (2) Determine maximum level and prefix sums of level counters
308319
m_max_level = 0;
309320
size_type sum_blocks = 0, last_block_size=0;

include/sdsl/k2_treap.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,9 @@ class k2_treap
228228
template<typename t_x, typename t_y, typename t_w>
229229
k2_treap(std::vector<std::tuple<t_x, t_y, t_w>>& v, std::string temp_file_prefix="")
230230
{
231-
construct(v, temp_file_prefix);
231+
if (v.size() > 0) {
232+
construct(v, temp_file_prefix);
233+
}
232234
}
233235

234236
template<typename t_x, typename t_y, typename t_w>

include/sdsl/k2_treap_algorithm.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ class top_k_iterator
100100
top_k_iterator& operator=(const top_k_iterator&) = default;
101101
top_k_iterator& operator=(top_k_iterator&&) = default;
102102
top_k_iterator(const t_k2_treap& treap, point_type p1, point_type p2) :
103-
m_treap(&treap), m_p1(p1), m_p2(p2), m_valid(true)
103+
m_treap(&treap), m_p1(p1), m_p2(p2), m_valid(treap.size()>0)
104104
{
105105
if (m_treap->size() > 0) {
106106
m_pq.emplace(m_treap->root(),false);
@@ -198,7 +198,7 @@ class range_iterator
198198
range_iterator& operator=(const range_iterator&) = default;
199199
range_iterator& operator=(range_iterator&&) = default;
200200
range_iterator(const t_k2_treap& treap, point_type p1, point_type p2, range_type range) :
201-
m_treap(&treap), m_p1(p1), m_p2(p2), m_r(range), m_valid(true)
201+
m_treap(&treap), m_p1(p1), m_p2(p2), m_r(range), m_valid(treap.size()>0)
202202
{
203203
if (m_treap->size() >0) {
204204
pq_emplace(m_treap->root(), false);

test/K2TreapTest.config

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Inputs which should be used
2+
EMPTY-TEST;test_cases/int-vec-k2t.0.1.0.0.x;test_cases/int-vec-k2t.0.1.0.0.y;test_cases/int-vec-k2t.0.1.0.0.w
3+
SML-TEST;test_cases/int-vec-k2t.100.16.r.42.x;test_cases/int-vec-k2t.100.16.r.23.y;test_cases/int-vec-k2t.100.8.r.81.w
4+
MED-TEST;test_cases/int-vec-k2t.10000.16.r.42.x;test_cases/int-vec-k2t.10000.16.r.23.y;test_cases/int-vec-k2t.10000.8.r.81.w
5+
BIG-TEST;test_cases/int-vec-k2t.100000.39.r.42.x;test_cases/int-vec-k2t.100000.47.r.23.y;test_cases/int-vec-k2t.100000.35.r.81.w
6+
LRG-TEST;test_cases/int-vec-k2t.1000000.52.r.42.x;test_cases/int-vec-k2t.1000000.57.r.23.y;test_cases/int-vec-k2t.1000000.45.r.81.w

0 commit comments

Comments
 (0)