compacts-bits 0.2.1

succinct bit vector
#[macro_use]
extern crate log;
extern crate env_logger;
extern crate rand;
extern crate compacts_bits;

use compacts_bits::*;
use self::rand::Rng;

macro_rules! bit_vec {
    ( ) => {&Vec32::new()};

    ( $size:expr, $end:expr, $rng:expr ) => {{
        bit_vec!($size, 0, $end, $rng)
    }};
    ( $size:expr, $start:expr, $end:expr, $rng:expr ) => {{
        let mut vec = Vec32::new();
        for _ in 0..$size {
            let gen = $rng.gen_range($start, $end);
            vec.insert(gen);
        }
        vec.optimize();
        vec
    }};
}

#[test]
#[ignore]
fn similarity() {
    let _ = env_logger::init();
    let mut rng = rand::thread_rng();

    let size = (1 << 15) * 7;
    let maxn = (1 << 16) * 2;

    let p = &(bit_vec!(size, maxn, rng));
    let q = &(bit_vec!(size, maxn, rng));

    debug!("{:#?}", p.stats().sum::<Summary>());

    let jaccard = {
        let r = p.intersection(q);
        r.count_ones() as f64 / (p.count_ones() + q.count_ones() - r.count_ones()) as f64
    };

    let dice = {
        let r = p.intersection(q);
        (2.0 * (r.count_ones() as f64)) / (p.count_ones() + q.count_ones()) as f64
    };

    let simpson = {
        let r = p.intersection(q);
        (r.count_ones() as f64) / (p.count_ones() as f64).min(q.count_ones() as f64)
    };

    info!("Jaccard  = {:.5?}", jaccard);
    info!("Dice     = {:.5?}", dice);
    info!("Simpson  = {:.5?}", simpson);
    info!("Distance = {:.5?}", 1f64 - jaccard);
}

#[test]
fn rank_select() {
    use compacts_bits::{Rank, Select1, Select0};

    let _ = env_logger::init();
    let mut vec = Vec32::new();
    vec.insert(0);
    vec.insert(1000000);

    assert_eq!(vec.select0(0), Some(1));
    assert_eq!(vec.rank0(1), 1);

    assert_eq!(vec.select1(0), Some(0));
    assert_eq!(vec.rank1(0), 1);

    assert_eq!(vec.select0(1), Some(2));
    assert_eq!(vec.rank0(2), 2);

    assert_eq!(vec.select1(1), Some(1000000));
    assert_eq!(vec.rank1(1000000), 2);
}

#[test]
fn iterator() {
    let _ = env_logger::init();

    {
        let mut vec = Vec32::new();
        for i in 0..1000000 {
            vec.insert(i);
        }
        for (i, bit) in vec.iter().enumerate() {
            assert_eq!(i as u32, bit);
        }
    }
    {
        let mut vec = Vec32::new();
        for i in 65533..65537 {
            vec.insert(i);
        }
        let col = vec.iter().collect::<Vec<u32>>();
        assert_eq!(col, vec![65533, 65534, 65535, 65536]);
    }
}

#[test]
fn intersection() {
    let _ = env_logger::init();

    let mut b1 = {
        let mut vec = Vec32::new();
        vec.insert(1 << 16);
        vec.insert(1 << 20);
        vec
    };
    let b2 = {
        let mut vec = Vec32::new();
        vec.insert(1 << 10);
        vec.insert(1 << 11);
        vec.insert(1 << 20);
        vec
    };

    b1.intersection_with(&b2);
    debug!("{:?} {:?}", b1, b2);
    assert_eq!(b1.count_ones(), 1);
}

#[test]
fn union() {
    let _ = env_logger::init();

    let mut b1 = {
        let mut vec = Vec32::new();
        vec.insert(1 << 16);
        vec.insert(1 << 20);
        vec
    };

    let b2 = {
        let mut vec = Vec32::new();
        vec.insert(1 << 10);
        vec.insert(1 << 11);
        vec.insert(1 << 20);
        vec
    };

    b1.union_with(&b2);
    debug!("{:?} {:?}", b1, b2);
    assert_eq!(b1.count_ones(), 4);
}

#[test]
fn difference() {
    let _ = env_logger::init();

    let mut b1 = {
        let mut vec = Vec32::new();
        vec.insert(1 << 10);
        vec.insert(1 << 11);
        vec.insert(1 << 12);
        vec.insert(1 << 16);
        vec.insert(1 << 20);
        vec
    };
    let b2 = {
        let mut vec = Vec32::new();
        vec.insert(1 << 10);
        vec.insert(1 << 11);
        vec.insert(1 << 20);
        vec
    };

    b1.difference_with(&b2);
    debug!("{:?} {:?}", b1, b2);
    assert_eq!(b1.count_ones(), 2);
}

#[test]
fn symmetric_difference() {
    let _ = env_logger::init();

    let mut b1 = {
        let mut vec = Vec32::new();
        vec.insert(1 << 10);
        vec.insert(1 << 11);
        vec.insert(1 << 12);
        vec.insert(1 << 16);
        vec.insert(1 << 20);
        vec
    };
    let b2 = {
        let mut vec = Vec32::new();
        vec.insert(1 << 10);
        vec.insert(1 << 11);
        vec.insert(1 << 20);
        vec.insert(1 << 26);
        vec.insert(1 << 30);
        vec
    };

    b1.symmetric_difference_with(&b2);
    debug!("{:?} {:?}", b1, b2);
    assert_eq!(b1.count_ones(), 4);
}