sbf 0.1.6

Spatial Bloom Filter, a probabilistic data structure that maps elements of a space to indexed disjoint subsets of that space.
Documentation
use std::error::Error;

use rayon::prelude::*;

use crate::data_structure::SBF;
use crate::types::HashFunction;

#[test]
fn test_sbf() -> Result<(), Box<dyn Error>> {
    let mut sbf = SBF::new(10u8, 2, 5,
                           HashFunction::MD5, 3)?;
    #[cfg(feature = "serde_support")] {
        println!("{}", serde_json::to_string(&sbf)?);
    }
    assert!(sbf.filter.par_iter().all(|v| *v == 0));

    sbf.insert(b"test".to_vec(), 1).expect("Correct insertion of an area");
    #[cfg(feature = "serde_support")] {
        println!("{}", serde_json::to_string(&sbf)?);
    }
    let count = sbf.filter.par_iter().cloned().filter(|v| *v == 1).count();
    assert!(2 >= count && count > 0);
    let filter = sbf.filter.clone();

    sbf.insert(b"test".to_vec(), 1).expect("Correct insertion of an area");
    #[cfg(feature = "serde_support")] {
        println!("{}", serde_json::to_string(&sbf)?);
    }
    assert_eq!(filter, sbf.filter);

    sbf.insert(b"test1".to_vec(), 2).expect("Correct insertion of an area");
    #[cfg(feature = "serde_support")] {
        println!("{}", serde_json::to_string(&sbf)?);
    }
    let filter = sbf.filter.clone();

    sbf.insert(b"test1".to_vec(), 2).expect("Correct insertion of an area");
    #[cfg(feature = "serde_support")] {
        println!("{}", serde_json::to_string(&sbf)?);
    }
    assert_eq!(filter, sbf.filter);

    #[cfg(feature = "metrics")] {
        sbf.metrics.set_area_fpp();
        sbf.metrics.set_prior_area_fpp();
        sbf.metrics.set_area_isep();
        sbf.metrics.set_prior_area_isep();
        #[cfg(feature = "serde_support")] {
            println!("{}", serde_json::to_string(&sbf)?);
        }
        println!("AREA MEMBERS: {:?}", sbf.metrics.get_area_members(1));
        assert_eq!(2, sbf.metrics.get_area_members(1).unwrap());

        println!("FILTER SPARSITY: {}", sbf.metrics.get_filter_sparsity());
        println!("FILTER FPP: {}", sbf.metrics.get_filter_fpp());
        println!("EXPECTED AREA EMERSION 1: {}", sbf.metrics.get_expected_area_emersion(1));
        println!("AREA EMERSION 1: {}", sbf.metrics.get_area_emersion(1).unwrap_or(-1.0));
        println!("FILTER PRIOR FPP: {}", sbf.metrics.get_filter_prior_fpp());
    }

    Ok(())
}