1use crate::{BitVec, EliasFanoVec};
8
9#[derive(Debug, Clone)]
46#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
47pub struct SparseRSVec {
48 vec: EliasFanoVec,
49 len: u64,
50}
51
52impl SparseRSVec {
53 #[must_use]
64 pub fn new(input: &[u64], len: u64) -> Self {
65 debug_assert!(input.is_sorted(), "input must be sorted");
66 debug_assert!(
67 input.windows(2).all(|w| w[0] != w[1]),
68 "input must be free of duplicates"
69 );
70
71 Self {
72 vec: EliasFanoVec::from_slice(input),
73 len,
74 }
75 }
76
77 #[must_use]
82 pub fn from_bitvec(input: &BitVec) -> Self {
83 let len = input.len() as u64;
84 Self::new(
85 input
86 .iter()
87 .enumerate()
88 .filter(|&(_, bit)| bit == 1)
89 .map(|(i, _)| i as u64)
90 .collect::<Vec<_>>()
91 .as_slice(),
92 len,
93 )
94 }
95
96 #[must_use]
129 pub fn from_bitvec_inverted(input: &BitVec) -> Self {
130 let len = input.len() as u64;
131 Self::new(
132 input
133 .iter()
134 .enumerate()
135 .filter(|&(_, bit)| bit == 0)
136 .map(|(i, _)| i as u64)
137 .collect::<Vec<_>>()
138 .as_slice(),
139 len,
140 )
141 }
142
143 #[must_use]
150 pub fn is_set_unchecked(&self, i: u64) -> bool {
151 self.vec.predecessor_unchecked(i) == i
152 }
153
154 #[must_use]
158 pub fn is_set(&self, i: u64) -> Option<bool> {
159 if i >= self.len {
160 None
161 } else {
162 Some(self.vec.predecessor(i).is_some_and(|p| p == i))
164 }
165 }
166
167 #[must_use]
176 pub fn get_unchecked(&self, i: u64) -> u64 {
177 self.is_set_unchecked(i).into()
178 }
179
180 #[must_use]
183 pub fn get(&self, i: u64) -> Option<u64> {
184 self.is_set(i).map(std::convert::Into::into)
185 }
186
187 #[must_use]
193 pub fn select1(&self, i: usize) -> u64 {
194 self.vec.get(i).unwrap_or(self.len)
195 }
196
197 #[must_use]
201 pub fn rank1(&self, i: u64) -> u64 {
202 self.vec.rank(i)
203 }
204
205 #[must_use]
209 pub fn rank0(&self, i: u64) -> u64 {
210 if i >= self.len {
211 self.len - self.vec.rank(self.len)
212 } else {
213 i - self.vec.rank(i)
214 }
215 }
216
217 pub fn iter1(&self) -> impl Iterator<Item = u64> + '_ {
220 self.vec.iter()
221 }
222
223 #[must_use]
225 pub fn len(&self) -> u64 {
226 self.len
227 }
228
229 #[must_use]
231 pub fn is_empty(&self) -> bool {
232 self.len == 0
233 }
234
235 #[must_use]
238 pub fn heap_size(&self) -> usize {
239 self.vec.heap_size()
240 }
241}
242
243impl From<BitVec> for SparseRSVec {
244 fn from(input: BitVec) -> Self {
245 Self::from_bitvec_inverted(&input)
246 }
247}
248
249impl<'a> From<&'a BitVec> for SparseRSVec {
250 fn from(input: &'a BitVec) -> Self {
251 Self::from_bitvec_inverted(input)
252 }
253}
254
255#[cfg(test)]
256mod tests {
257 use super::SparseRSVec;
258 use crate::BitVec;
259 use rand::prelude::StdRng;
260 use rand::{Rng, SeedableRng};
261
262 #[test]
263 fn test_sparse_rank() {
264 let sparse = SparseRSVec::new(&[1, 3, 5, 7, 9], 12);
265 assert_eq!(sparse.rank1(0), 0);
266 assert_eq!(sparse.rank1(1), 0);
267 assert_eq!(sparse.rank1(2), 1);
268 assert_eq!(sparse.rank1(3), 1);
269 assert_eq!(sparse.rank1(4), 2);
270 assert_eq!(sparse.rank1(5), 2);
271 assert_eq!(sparse.rank1(6), 3);
272 assert_eq!(sparse.rank1(7), 3);
273 assert_eq!(sparse.rank1(8), 4);
274 assert_eq!(sparse.rank1(9), 4);
275 assert_eq!(sparse.rank1(10), 5);
276 assert_eq!(sparse.rank1(11), 5);
277 assert_eq!(sparse.rank1(12), 5);
278 assert_eq!(sparse.rank1(999), 5);
279 }
280
281 #[test]
282 fn test_sparse_select() {
283 let sparse = SparseRSVec::new(&[1, 3, 5, 7, 9], 12);
284 assert_eq!(sparse.select1(0), 1);
285 assert_eq!(sparse.select1(1), 3);
286 assert_eq!(sparse.select1(2), 5);
287 assert_eq!(sparse.select1(3), 7);
288 assert_eq!(sparse.select1(4), 9);
289 assert_eq!(sparse.select1(5), 12);
290 assert_eq!(sparse.select1(6), 12);
291 }
292
293 #[test]
294 fn test_sparse_rank0() {
295 let sparse = SparseRSVec::new(&[1, 3, 5, 7, 9], 12);
296 assert_eq!(sparse.rank0(0), 0);
297 assert_eq!(sparse.rank0(1), 1);
298 assert_eq!(sparse.rank0(2), 1);
299 assert_eq!(sparse.rank0(3), 2);
300 assert_eq!(sparse.rank0(4), 2);
301 assert_eq!(sparse.rank0(5), 3);
302 assert_eq!(sparse.rank0(6), 3);
303 assert_eq!(sparse.rank0(7), 4);
304 assert_eq!(sparse.rank0(8), 4);
305 assert_eq!(sparse.rank0(9), 5);
306 assert_eq!(sparse.rank0(10), 5);
307 assert_eq!(sparse.rank0(11), 6);
308 assert_eq!(sparse.rank0(12), 7);
309 assert_eq!(sparse.rank0(999), 7);
310 }
311
312 #[test]
313 fn test_empty_sparse() {
314 let sparse = SparseRSVec::new(&[], 0);
315 assert_eq!(sparse.rank1(0), 0);
316 assert_eq!(sparse.rank1(1), 0);
317 assert_eq!(sparse.rank1(999), 0);
318 assert_eq!(sparse.select1(0), 0);
319 assert_eq!(sparse.select1(1), 0);
320 assert_eq!(sparse.select1(999), 0);
321 assert_eq!(sparse.rank0(0), 0);
322 assert_eq!(sparse.rank0(1), 0);
323 assert_eq!(sparse.rank0(999), 0);
324 assert!(sparse.is_empty());
325 assert_eq!(sparse.len(), 0);
326 }
327
328 #[test]
329 fn test_sparse_get() {
330 let sparse = SparseRSVec::new(&[1, 3, 5, 7, 9], 12);
331 assert_eq!(sparse.get(0), Some(0));
332 assert_eq!(sparse.get(1), Some(1));
333 assert_eq!(sparse.get(2), Some(0));
334 assert_eq!(sparse.get(3), Some(1));
335 assert_eq!(sparse.get(4), Some(0));
336 assert_eq!(sparse.get(5), Some(1));
337 assert_eq!(sparse.get(6), Some(0));
338 assert_eq!(sparse.get(7), Some(1));
339 assert_eq!(sparse.get(8), Some(0));
340 assert_eq!(sparse.get(9), Some(1));
341 assert_eq!(sparse.get(10), Some(0));
342 assert_eq!(sparse.get(11), Some(0));
343 assert_eq!(sparse.get(12), None);
344 assert_eq!(sparse.get(999), None);
345 }
346
347 #[test]
348 fn test_from_bitvector() {
349 let mut bv = BitVec::from_ones(12);
350 bv.flip_bit(6);
351 bv.flip_bit(7);
352
353 let sparse = SparseRSVec::from_bitvec(&bv);
354 assert_eq!(sparse.rank1(0), 0);
355 assert_eq!(sparse.rank1(1), 1);
356 assert_eq!(sparse.rank1(2), 2);
357 assert_eq!(sparse.rank1(7), 6);
358 assert_eq!(sparse.rank1(8), 6);
359 assert_eq!(sparse.rank1(9), 7);
360 assert_eq!(sparse.rank1(12), 10);
361
362 let sparse = SparseRSVec::from_bitvec_inverted(&bv);
363 assert_eq!(sparse.rank1(0), 0);
364 assert_eq!(sparse.rank1(1), 0);
365 assert_eq!(sparse.rank1(2), 0);
366 assert_eq!(sparse.rank1(7), 1);
367 assert_eq!(sparse.rank1(8), 2);
368 assert_eq!(sparse.rank1(9), 2);
369 assert_eq!(sparse.rank1(12), 2);
370 }
371
372 #[test]
373 fn test_large_block() {
374 let sparse = SparseRSVec::new(
376 &[
377 1, 100_000, 100_001, 100_002, 100_003, 100_004, 100_005, 100_006, 100_007, 100_008,
378 100_009, 100_010, 1_000_000,
379 ],
380 2_000_000,
381 );
382 assert_eq!(sparse.rank1(100_008), 9);
383 assert_eq!(sparse.rank1(100_012), 12);
384 }
385
386 #[test]
387 fn test_fuzzy() {
388 const L: usize = 100_000;
389 let mut bv = BitVec::from_zeros(L);
390 let mut rng = StdRng::from_seed([0; 32]);
391
392 for _ in 0..L / 4 {
393 bv.flip_bit(rng.gen_range(0..L));
394 }
395
396 let sparse = SparseRSVec::from_bitvec(&bv);
397
398 let mut ones = 0;
399 for i in 0..L {
400 assert_eq!(bv.get(i), sparse.get(i as u64));
401 assert_eq!(ones, sparse.rank1(i as u64));
402 assert_eq!(i as u64 - ones, sparse.rank0(i as u64));
403 if bv.get(i) == Some(1) {
404 assert_eq!(i, sparse.select1(ones as usize).try_into().unwrap());
405 ones += 1;
406 }
407 }
408 }
409
410 #[test]
411 fn test_from_padded_bitvec() {
412 let mut bv = BitVec::new();
414 bv.append_bit(1);
415 bv.append_bit(0);
416 bv.append_bits(u64::MAX, 10);
417 bv.drop_last(10);
418 bv.append_bit(0);
419 bv.drop_last(1);
420
421 let sparse = SparseRSVec::from_bitvec(&bv);
422 assert_eq!(sparse.len(), 2);
423 assert_eq!(sparse.get(0), Some(1));
424 assert_eq!(sparse.get(1), Some(0));
425 assert_eq!(sparse.iter1().collect::<Vec<_>>(), vec![0]);
426 }
427}