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]
174 pub fn get_unchecked(&self, i: u64) -> u64 {
175 self.is_set_unchecked(i).into()
176 }
177
178 #[must_use]
181 pub fn get(&self, i: u64) -> Option<u64> {
182 self.is_set(i).map(std::convert::Into::into)
183 }
184
185 #[must_use]
191 pub fn select1(&self, i: usize) -> u64 {
192 self.vec.get(i).unwrap_or(self.len)
193 }
194
195 #[must_use]
199 pub fn rank1(&self, i: u64) -> u64 {
200 self.vec.rank(i)
201 }
202
203 #[must_use]
207 pub fn rank0(&self, i: u64) -> u64 {
208 if i >= self.len {
209 self.len - self.vec.rank(self.len)
210 } else {
211 i - self.vec.rank(i)
212 }
213 }
214
215 pub fn iter1(&self) -> impl Iterator<Item = u64> + '_ {
218 self.vec.iter()
219 }
220
221 #[must_use]
223 pub fn len(&self) -> u64 {
224 self.len
225 }
226
227 #[must_use]
229 pub fn is_empty(&self) -> bool {
230 self.len == 0
231 }
232
233 #[must_use]
236 pub fn heap_size(&self) -> usize {
237 self.vec.heap_size()
238 }
239}
240
241impl From<BitVec> for SparseRSVec {
242 fn from(input: BitVec) -> Self {
243 Self::from_bitvec_inverted(&input)
244 }
245}
246
247impl<'a> From<&'a BitVec> for SparseRSVec {
248 fn from(input: &'a BitVec) -> Self {
249 Self::from_bitvec_inverted(input)
250 }
251}
252
253#[cfg(test)]
254mod tests {
255 use super::SparseRSVec;
256 use crate::BitVec;
257 use rand::prelude::StdRng;
258 use rand::{Rng, SeedableRng};
259
260 #[test]
261 fn test_sparse_rank() {
262 let sparse = SparseRSVec::new(&[1, 3, 5, 7, 9], 12);
263 assert_eq!(sparse.rank1(0), 0);
264 assert_eq!(sparse.rank1(1), 0);
265 assert_eq!(sparse.rank1(2), 1);
266 assert_eq!(sparse.rank1(3), 1);
267 assert_eq!(sparse.rank1(4), 2);
268 assert_eq!(sparse.rank1(5), 2);
269 assert_eq!(sparse.rank1(6), 3);
270 assert_eq!(sparse.rank1(7), 3);
271 assert_eq!(sparse.rank1(8), 4);
272 assert_eq!(sparse.rank1(9), 4);
273 assert_eq!(sparse.rank1(10), 5);
274 assert_eq!(sparse.rank1(11), 5);
275 assert_eq!(sparse.rank1(12), 5);
276 assert_eq!(sparse.rank1(999), 5);
277 }
278
279 #[test]
280 fn test_sparse_select() {
281 let sparse = SparseRSVec::new(&[1, 3, 5, 7, 9], 12);
282 assert_eq!(sparse.select1(0), 1);
283 assert_eq!(sparse.select1(1), 3);
284 assert_eq!(sparse.select1(2), 5);
285 assert_eq!(sparse.select1(3), 7);
286 assert_eq!(sparse.select1(4), 9);
287 assert_eq!(sparse.select1(5), 12);
288 assert_eq!(sparse.select1(6), 12);
289 }
290
291 #[test]
292 fn test_sparse_rank0() {
293 let sparse = SparseRSVec::new(&[1, 3, 5, 7, 9], 12);
294 assert_eq!(sparse.rank0(0), 0);
295 assert_eq!(sparse.rank0(1), 1);
296 assert_eq!(sparse.rank0(2), 1);
297 assert_eq!(sparse.rank0(3), 2);
298 assert_eq!(sparse.rank0(4), 2);
299 assert_eq!(sparse.rank0(5), 3);
300 assert_eq!(sparse.rank0(6), 3);
301 assert_eq!(sparse.rank0(7), 4);
302 assert_eq!(sparse.rank0(8), 4);
303 assert_eq!(sparse.rank0(9), 5);
304 assert_eq!(sparse.rank0(10), 5);
305 assert_eq!(sparse.rank0(11), 6);
306 assert_eq!(sparse.rank0(12), 7);
307 assert_eq!(sparse.rank0(999), 7);
308 }
309
310 #[test]
311 fn test_empty_sparse() {
312 let sparse = SparseRSVec::new(&[], 0);
313 assert_eq!(sparse.rank1(0), 0);
314 assert_eq!(sparse.rank1(1), 0);
315 assert_eq!(sparse.rank1(999), 0);
316 assert_eq!(sparse.select1(0), 0);
317 assert_eq!(sparse.select1(1), 0);
318 assert_eq!(sparse.select1(999), 0);
319 assert_eq!(sparse.rank0(0), 0);
320 assert_eq!(sparse.rank0(1), 0);
321 assert_eq!(sparse.rank0(999), 0);
322 assert!(sparse.is_empty());
323 assert_eq!(sparse.len(), 0);
324 }
325
326 #[test]
327 fn test_sparse_get() {
328 let sparse = SparseRSVec::new(&[1, 3, 5, 7, 9], 12);
329 assert_eq!(sparse.get(0), Some(0));
330 assert_eq!(sparse.get(1), Some(1));
331 assert_eq!(sparse.get(2), Some(0));
332 assert_eq!(sparse.get(3), Some(1));
333 assert_eq!(sparse.get(4), Some(0));
334 assert_eq!(sparse.get(5), Some(1));
335 assert_eq!(sparse.get(6), Some(0));
336 assert_eq!(sparse.get(7), Some(1));
337 assert_eq!(sparse.get(8), Some(0));
338 assert_eq!(sparse.get(9), Some(1));
339 assert_eq!(sparse.get(10), Some(0));
340 assert_eq!(sparse.get(11), Some(0));
341 assert_eq!(sparse.get(12), None);
342 assert_eq!(sparse.get(999), None);
343 }
344
345 #[test]
346 fn test_from_bitvector() {
347 let mut bv = BitVec::from_ones(12);
348 bv.flip_bit(6);
349 bv.flip_bit(7);
350
351 let sparse = SparseRSVec::from_bitvec(&bv);
352 assert_eq!(sparse.rank1(0), 0);
353 assert_eq!(sparse.rank1(1), 1);
354 assert_eq!(sparse.rank1(2), 2);
355 assert_eq!(sparse.rank1(7), 6);
356 assert_eq!(sparse.rank1(8), 6);
357 assert_eq!(sparse.rank1(9), 7);
358 assert_eq!(sparse.rank1(12), 10);
359
360 let sparse = SparseRSVec::from_bitvec_inverted(&bv);
361 assert_eq!(sparse.rank1(0), 0);
362 assert_eq!(sparse.rank1(1), 0);
363 assert_eq!(sparse.rank1(2), 0);
364 assert_eq!(sparse.rank1(7), 1);
365 assert_eq!(sparse.rank1(8), 2);
366 assert_eq!(sparse.rank1(9), 2);
367 assert_eq!(sparse.rank1(12), 2);
368 }
369
370 #[test]
371 fn test_large_block() {
372 let sparse = SparseRSVec::new(
374 &[
375 1, 100_000, 100_001, 100_002, 100_003, 100_004, 100_005, 100_006, 100_007, 100_008,
376 100_009, 100_010, 1_000_000,
377 ],
378 2_000_000,
379 );
380 assert_eq!(sparse.rank1(100_008), 9);
381 assert_eq!(sparse.rank1(100_012), 12);
382 }
383
384 #[test]
385 fn test_fuzzy() {
386 const L: usize = 100_000;
387 let mut bv = BitVec::from_zeros(L);
388 let mut rng = StdRng::from_seed([0; 32]);
389
390 for _ in 0..L / 4 {
391 bv.flip_bit(rng.gen_range(0..L));
392 }
393
394 let sparse = SparseRSVec::from_bitvec(&bv);
395
396 let mut ones = 0;
397 for i in 0..L {
398 assert_eq!(bv.get(i), sparse.get(i as u64));
399 assert_eq!(ones, sparse.rank1(i as u64));
400 assert_eq!(i as u64 - ones, sparse.rank0(i as u64));
401 if bv.get(i) == Some(1) {
402 assert_eq!(i, sparse.select1(ones as usize).try_into().unwrap());
403 ones += 1;
404 }
405 }
406 }
407
408 #[test]
409 fn test_from_padded_bitvec() {
410 let mut bv = BitVec::new();
412 bv.append_bit(1);
413 bv.append_bit(0);
414 bv.append_bits(u64::MAX, 10);
415 bv.drop_last(10);
416 bv.append_bit(0);
417 bv.drop_last(1);
418
419 let sparse = SparseRSVec::from_bitvec(&bv);
420 assert_eq!(sparse.len(), 2);
421 assert_eq!(sparse.get(0), Some(1));
422 assert_eq!(sparse.get(1), Some(0));
423 assert_eq!(sparse.iter1().collect::<Vec<_>>(), vec![0]);
424 }
425}