def test_pinskers_inequality(dist1, dist2): """ DKL(p||q) >= V(p||q)**2 / (2log(2)) """ dkl = relative_entropy(dist1, dist2) vd = variational_distance(dist1, dist2) assert dkl >= vd**2 / (2 * np.log(2)) - epsilon
def test_hellinger_variational(dist1, dist2): """ H^2(p||q) <= V(p||q) <= sqrt(2)*H(p||q) """ h = hellinger_distance(dist1, dist2) v = variational_distance(dist1, dist2) assert h**2 <= v + epsilon assert v <= np.sqrt(2) * h + epsilon
def test_hellinger_variational(dist1, dist2): """ H^2(p||q) <= V(p||q) <= sqrt(2)*H(p||q) """ h = hellinger_distance(dist1, dist2) v = variational_distance(dist1, dist2) assert h**2 <= v + epsilon assert v <= np.sqrt(2)*h + epsilon
def test_vd2(): """ Test against known value """ d1 = Distribution(['0', '1'], [1 / 2, 1 / 2]) d2 = Distribution(['1', '2'], [1 / 4, 3 / 4]) v = variational_distance(d1, d2) assert v == pytest.approx(0.75)
def test_vd2(): """ Test against known value. """ vd = variational_distance(d1, d3) assert vd == pytest.approx(0.75)