def test_mixture(self, p1, p2): mix1 = Prob.mixture([1, 0], [p1, p2]) mix2 = Prob.mixture([0, 1], [p1, p2]) mix3 = Prob.mixture([1, 1], [p1, p2]) assert mix1 == p1 assert mix2 == p2 assert mix3 == Prob({'a': 0.75, 'b': 0.25})
def test_mixture_with_bad_coeffs(self, p1, p2): with pytest.raises(ValueError): Prob.mixture([1, 1, 1], [p1, p2])
def p1(self): return Prob({'a': 0.5, 'b': 0.5})
def test_encode(self, p3): assert list(p3.encode('abc')) == [0.75, 0.25, 0.0] assert list(p3.encode()) == [0.75, 0.25] assert list(Prob([3, 1]).encode()) == [0.75, 0.25]
def test_mode(self): prob = Prob({'a': 0.2, 'b': 0.3, 'c': 0.5}) assert prob.max() == 0.5 assert prob.mode() == 'c'
def test_kl_divergence(self, p1, p2): assert p1.kl_divergence(p1) == 0 assert p1.kl_divergence(p2) == float('inf') assert p2.kl_divergence(p2) == 0 assert abs(p2.kl_divergence(p1) - 0.69) < 5e-2 assert p1.kl_divergence(Prob([1])) == float('inf')
def test_probability_with_support(self, p1): p = Prob(p1, support='abc') assert p['c'] == 0.0
def test_probability_can_be_non_normalized(self): p = Prob([1, 1], normalize=False) assert sum(p.values()) == 2
def test_prob_from_list(self): p = Prob([0.5, 0.25, 0.25]) assert p[0] == 0.5 assert p[1] == 0.25 assert p[2] == 0.25
def p3(self): return Prob({'a': 0.75, 'b': 0.25})
def p2(self): return Prob({'a': 1, 'b': 0})