redux 0.2.0

Adaptive arithmetic compression library written in Rust
Documentation
#![cfg(test)]

extern crate rand;

use super::*;

macro_rules! debug_println {
    ($($arg:tt)*) => (
        if cfg!(debug_assertions) {
            println!( $($arg)* )
        }
    )
}

fn get_invalid_symbol(bits: usize) -> usize {
    (1usize << bits) + 1usize
}

fn get_valid_symbol(bits: usize) -> usize {
    rand::random::<usize>() % get_invalid_symbol(bits)
}

fn get_invalid_value(m: &Model) -> u64 {
    m.total_frequency()
}

fn get_valid_value(m: &Model) -> u64 {
    rand::random::<u64>() % get_invalid_value(m)
}

fn compare_freq_total(linear: &Model, tree: &Model) {
    let lt = linear.total_frequency();
    let tt = tree.total_frequency();
    assert_eq!(lt, tt);
}

#[cfg(debug_assertions)]
fn compare_freq_tables(linear: &Model, tree: &Model) {
    compare_freq_total(linear, tree);
    let lf = linear.get_freq_table();
    let tf = tree.get_freq_table();
    assert_eq!(lf, tf);
}

#[cfg(not(debug_assertions))]
fn compare_freq_tables(linear: &Model, tree: &Model) {
    compare_freq_total(linear, tree);
}

fn compare_models_encode_single(bits: usize, freq: usize, code: usize, iter: usize) {
    let mut linear = AdaptiveLinearModel::new(Parameters::new(bits, freq, code).unwrap());
    let mut tree = AdaptiveTreeModel::new(Parameters::new(bits, freq, code).unwrap());

    println!("  Operation: Encode, Symbol: {} bits, Freq: {} bits, Code: {} bits, Iterations: {}", bits, freq, code, iter);
    for count in 0..iter {
        compare_freq_tables(&*linear, &*tree);
        let symbol = get_valid_symbol(bits);
        let (ll, lh) = linear.get_frequency(symbol).unwrap();
        let (tl, th) = tree.get_frequency(symbol).unwrap();
        debug_println!("    Iteration: {}, Symbol: {}, Linear: {}-{}, Tree: {}-{}", count, symbol, ll, lh, tl, th);
        assert_eq!(ll, tl);
        assert_eq!(lh, th);
    }

    let symbol = get_invalid_symbol(bits);
    assert!(!linear.get_frequency(symbol).is_ok());
    assert!(!linear.get_frequency(symbol + 1).is_ok());
    assert!(!tree.get_frequency(symbol).is_ok());
    assert!(!tree.get_frequency(symbol).is_ok());
}

fn compare_models_decode_single(bits: usize, freq: usize, code: usize, iter: usize) {
    let mut linear = AdaptiveLinearModel::new(Parameters::new(bits, freq, code).unwrap());
    let mut tree = AdaptiveTreeModel::new(Parameters::new(bits, freq, code).unwrap());

    println!("  Operation: Decode, Symbol: {} bits, Freq: {} bits, Code: {} bits, Iterations: {}", bits, freq, code, iter);
    for count in 0..iter {
        compare_freq_tables(&*linear, &*tree);
        let value = get_valid_value(&*linear);
        let (ls, ll, lh) = linear.get_symbol(value).unwrap();
        let (ts, tl, th) = tree.get_symbol(value).unwrap();
        debug_println!("    Iteration: {}, Value: {}, Linear: {}, {}-{}, Tree: {}, {}-{}", count, value, ls, ll, lh, ts, tl, th);
        assert_eq!(ls, ts);
        assert_eq!(ll, tl);
        assert_eq!(lh, th);
    }

    let value = get_invalid_value(&*linear);
    assert!(!linear.get_symbol(value).is_ok());
    assert!(!linear.get_symbol(value + 1).is_ok());
    assert!(!tree.get_symbol(value).is_ok());
    assert!(!tree.get_symbol(value + 1).is_ok());
}

#[test]
fn compare_models_encode_4_10_16() {
    compare_models_encode_single(4, 10, 16, 10000);
}

#[test]
fn compare_models_encode_4_14_16() {
    compare_models_encode_single(4, 14, 16, 10000);
}

#[test]
fn compare_models_encode_4_22_24() {
    compare_models_encode_single(4, 22, 24, 100000);
}

#[test]
fn compare_models_encode_4_24_30() {
    compare_models_encode_single(4, 24, 30, 100000);
}

#[test]
fn compare_models_encode_4_30_32() {
    compare_models_encode_single(4, 30, 32, 200000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_encode_8_10_16() {
    compare_models_encode_single(8, 10, 16, 10000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_encode_8_14_16() {
    compare_models_encode_single(8, 14, 16, 10000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_encode_8_22_24() {
    compare_models_encode_single(8, 22, 24, 100000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_encode_8_24_30() {
    compare_models_encode_single(8, 24, 30, 100000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_encode_8_30_32() {
    compare_models_encode_single(8, 30, 32, 200000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_encode_12_14_16() {
    compare_models_encode_single(12, 14, 16, 10000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_encode_12_22_24() {
    compare_models_encode_single(12, 22, 24, 100000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_encode_12_24_30() {
    compare_models_encode_single(12, 24, 30, 100000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_encode_12_30_32() {
    compare_models_encode_single(12, 30, 32, 200000);
}

#[test]
fn compare_models_decode_4_10_16() {
    compare_models_decode_single(4, 10, 16, 10000);
}

#[test]
fn compare_models_decode_4_14_16() {
    compare_models_decode_single(4, 14, 16, 10000);
}

#[test]
fn compare_models_decode_4_22_24() {
    compare_models_decode_single(4, 22, 24, 100000);
}

#[test]
fn compare_models_decode_4_24_30() {
    compare_models_decode_single(4, 24, 30, 100000);
}

#[test]
fn compare_models_decode_4_30_32() {
    compare_models_decode_single(4, 30, 32, 200000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_decode_8_10_16() {
    compare_models_decode_single(8, 10, 16, 10000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_decode_8_14_16() {
    compare_models_decode_single(8, 14, 16, 10000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_decode_8_22_24() {
    compare_models_decode_single(8, 22, 24, 100000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_decode_8_24_30() {
    compare_models_decode_single(8, 24, 30, 100000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_decode_8_30_32() {
    compare_models_decode_single(8, 30, 32, 200000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_decode_12_14_16() {
    compare_models_decode_single(12, 14, 16, 10000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_decode_12_22_24() {
    compare_models_decode_single(12, 22, 24, 100000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_decode_12_24_30() {
    compare_models_decode_single(12, 24, 30, 100000);
}

#[test]
#[cfg_attr(debug_assertions, ignore)]
fn compare_models_decode_12_30_32() {
    compare_models_decode_single(12, 30, 32, 200000);
}