opendp 0.16.0

A library of differential privacy algorithms for the statistical analysis of sensitive private data.
Documentation
use polars::prelude::*;

use crate::{
    error::Fallible,
    measurements::make_private_expr::expr_dp_frame_len::make_expr_dp_frame_len,
    measures::MaxDivergence,
    metrics::{L0PInfDistance, SymmetricDistance},
    polars::dp_len,
    transformations::test_helper::get_test_data,
};

#[test]
fn test_dp_frame_len_types() -> Fallible<()> {
    _test_dp_frame_len_default_dtype(true, DataType::Int64)?;
    _test_dp_frame_len_default_dtype(false, DataType::UInt32)?;
    Ok(())
}
fn _test_dp_frame_len_default_dtype(signed: bool, output_type: DataType) -> Fallible<()> {
    let (lf_domain, lf) = get_test_data()?;
    let measurement = make_expr_dp_frame_len(
        lf_domain.select(),
        L0PInfDistance(SymmetricDistance),
        MaxDivergence,
        dp_len(Some(0.0), signed),
        None,
    )?;

    let dp_expr = measurement.invoke(&lf.logical_plan)?.expr;
    let df = lf.select([dp_expr]).collect()?;

    assert_eq!(df.column("len")?.dtype(), &output_type);
    Ok(())
}

#[test]
fn test_dp_frame_len_shim_schema() -> Fallible<()> {
    let (_, lf) = get_test_data()?;

    // the raw, non-evaluable shim still infers a correct schema
    let schema_unsigned = lf
        .clone()
        .select([dp_len(Some(0.0), false).alias("len")])
        .collect_schema()?;
    assert_eq!(schema_unsigned.get("len").unwrap(), &DataType::UInt32);

    // execution is still an error
    assert!(lf.select([dp_len(Some(0.0), false)]).collect().is_err());
    Ok(())
}