pub fn verify_identity<F>(metric: F, x: &[u8], tolerance: f64) -> bool
where
F: Fn(&[u8], &[u8]) -> f64,
{
let d = metric(x, x);
d.abs() <= tolerance
}
pub fn verify_symmetry<F>(metric: F, x: &[u8], y: &[u8], tolerance: f64) -> bool
where
F: Fn(&[u8], &[u8]) -> f64,
{
let d_xy = metric(x, y);
let d_yx = metric(y, x);
(d_xy - d_yx).abs() <= tolerance
}
pub fn verify_triangle_inequality<F>(
metric: F,
x: &[u8],
y: &[u8],
z: &[u8],
tolerance: f64,
) -> bool
where
F: Fn(&[u8], &[u8]) -> f64,
{
let d_xy = metric(x, y);
let d_yz = metric(y, z);
let d_xz = metric(x, z);
d_xz <= (d_xy + d_yz + tolerance)
}
pub fn verify_non_negativity<F>(metric: F, x: &[u8], y: &[u8]) -> bool
where
F: Fn(&[u8], &[u8]) -> f64,
{
metric(x, y) >= -1e-12
}
pub fn verify_mi_nonnegative<F>(mi: F, x: &[u8], y: &[u8]) -> bool
where
F: Fn(&[u8], &[u8]) -> f64,
{
mi(x, y) >= -1e-12
}
pub fn verify_subadditivity<FJoint, FMarg>(
joint_entropy: FJoint,
marginal_entropy: FMarg,
x: &[u8],
y: &[u8],
tolerance: f64,
) -> bool
where
FJoint: Fn(&[u8], &[u8]) -> f64,
FMarg: Fn(&[u8]) -> f64,
{
let h_xy = joint_entropy(x, y);
let h_x = marginal_entropy(x);
let h_y = marginal_entropy(y);
h_xy <= (h_x + h_y + tolerance)
}
pub fn verify_conditioning_reduces_entropy<FCond, FMarg>(
conditional_entropy: FCond,
marginal_entropy: FMarg,
x: &[u8],
y: &[u8],
tolerance: f64,
) -> bool
where
FCond: Fn(&[u8], &[u8]) -> f64,
FMarg: Fn(&[u8]) -> f64,
{
let h_x_given_y = conditional_entropy(x, y);
let h_x = marginal_entropy(x);
h_x_given_y <= (h_x + tolerance)
}
pub fn verify_chain_rule<FJoint, FMarg, FCond>(
joint: FJoint,
marginal: FMarg,
conditional: FCond,
x: &[u8],
y: &[u8],
tolerance: f64,
) -> bool
where
FJoint: Fn(&[u8], &[u8]) -> f64,
FMarg: Fn(&[u8]) -> f64,
FCond: Fn(&[u8], &[u8]) -> f64, {
let h_xy = joint(x, y);
let h_x = marginal(x);
let h_y_given_x = conditional(y, x);
(h_xy - (h_x + h_y_given_x)).abs() <= tolerance
}
pub fn verify_ncd_bounds<F>(ncd: F, x: &[u8], y: &[u8]) -> bool
where
F: Fn(&[u8], &[u8]) -> f64,
{
let val = ncd(x, y);
(-1e-12..=1.1).contains(&val)
}
pub fn verify_entropy_bounds<F>(entropy: F, data: &[u8]) -> bool
where
F: Fn(&[u8]) -> f64,
{
let h = entropy(data);
(-1e-12..=8.0 + 1e-12).contains(&h)
}