fpzip-rs 0.1.0

Lossless and lossy floating-point compression for multi-dimensional arrays
Documentation
#[allow(dead_code)]
mod test_helpers;

use test_helpers::{generate_double_field, generate_float_field};

#[test]
fn lcg_first_iteration_produces_expected_seed() {
    let expected = (1103515245u32.wrapping_mul(1).wrapping_add(12345)) & 0x7FFFFFFF;
    assert_eq!(expected, 1103527590);
}

#[test]
fn float_field_deterministic() {
    let field1 = generate_float_field(10, 10, 10, 0.0, 1);
    let field2 = generate_float_field(10, 10, 10, 0.0, 1);
    assert_eq!(field1, field2);
}

#[test]
fn double_field_deterministic() {
    let field1 = generate_double_field(10, 10, 10, 0.0, 1);
    let field2 = generate_double_field(10, 10, 10, 0.0, 1);
    assert_eq!(field1, field2);
}

#[test]
fn float_field_different_seeds_different_output() {
    let field1 = generate_float_field(10, 10, 10, 0.0, 1);
    let field2 = generate_float_field(10, 10, 10, 0.0, 42);
    assert_ne!(field1, field2);
}

#[test]
fn float_field_trivial_first_element_is_offset() {
    let trivial = generate_float_field(1, 1, 1, 123.456, 1);
    assert_eq!(trivial[0], 123.456f32);
}

#[test]
fn double_field_trivial_first_element_is_offset() {
    let trivial = generate_double_field(1, 1, 1, 123.456, 1);
    assert_eq!(trivial[0], 123.456f64);
}

#[test]
fn float_field_standard_dimensions() {
    let field = generate_float_field(65, 64, 63, 0.0, 1);
    assert_eq!(field.len(), 65 * 64 * 63);
    assert_eq!(field.len(), 262080);
}

#[test]
fn double_field_standard_dimensions() {
    let field = generate_double_field(65, 64, 63, 0.0, 1);
    assert_eq!(field.len(), 65 * 64 * 63);
    assert_eq!(field.len(), 262080);
}

#[test]
fn float_field_has_reasonable_range() {
    let field = generate_float_field(10, 10, 10, 0.0, 1);
    assert!(field.iter().all(|v| v.is_finite()));
    let min = field.iter().cloned().reduce(f32::min).unwrap();
    let max = field.iter().cloned().reduce(f32::max).unwrap();
    assert!(max > min, "Field should have variation");
}