use crate::{
core::{Domain, Measurement, Metric, MetricSpace, PrivacyMap},
error::Fallible,
measures::{MaxDivergence, ZeroConcentratedDivergence},
traits::{InfDiv, InfPowI},
};
#[cfg(feature = "ffi")]
mod ffi;
pub fn make_pureDP_to_zCDP<DI, MI, TO>(
m: Measurement<DI, MI, MaxDivergence, TO>,
) -> Fallible<Measurement<DI, MI, ZeroConcentratedDivergence, TO>>
where
DI: Domain,
MI: 'static + Metric,
(DI, MI): MetricSpace,
{
let privacy_map = m.privacy_map.clone();
m.with_map(
m.input_metric.clone(),
ZeroConcentratedDivergence::default(),
PrivacyMap::new_fallible(move |d_in: &MI::Distance| {
privacy_map
.eval(d_in)
.and_then(|eps| eps.inf_powi(2.into())?.inf_div(&2.0))
}),
)
}