def test_monty(): guest = DiscreteDistribution({'A': 1. / 3, 'B': 1. / 3, 'C': 1. / 3}) # The actual prize is independent of the other distributions prize = DiscreteDistribution({'A': 1. / 3, 'B': 1. / 3, 'C': 1. / 3}) # Monty is dependent on both the guest and the prize. monty = ConditionalProbabilityTable( [['A', 'A', 'A', 0.0], ['A', 'A', 'B', 0.5], ['A', 'A', 'C', 0.5], ['A', 'B', 'A', 0.0], ['A', 'B', 'B', 0.0], ['A', 'B', 'C', 1.0], ['A', 'C', 'A', 0.0], ['A', 'C', 'B', 1.0], ['A', 'C', 'C', 0.0], ['B', 'A', 'A', 0.0], ['B', 'A', 'B', 0.0], ['B', 'A', 'C', 1.0], ['B', 'B', 'A', 0.5], ['B', 'B', 'B', 0.0], ['B', 'B', 'C', 0.5], ['B', 'C', 'A', 1.0], ['B', 'C', 'B', 0.0], ['B', 'C', 'C', 0.0], ['C', 'A', 'A', 0.0], ['C', 'A', 'B', 1.0], ['C', 'A', 'C', 0.0], ['C', 'B', 'A', 1.0], ['C', 'B', 'B', 0.0], ['C', 'B', 'C', 0.0], ['C', 'C', 'A', 0.5], ['C', 'C', 'B', 0.5], ['C', 'C', 'C', 0.0]], [guest, prize]) assert_equal(monty.log_probability(('A', 'B', 'C')), 0.) assert_equal(monty.log_probability(('C', 'B', 'A')), 0.) assert_equal(monty.log_probability(('C', 'C', 'C')), float("-inf")) assert_equal(monty.log_probability(('A', 'A', 'A')), float("-inf")) assert_equal(monty.log_probability(('B', 'A', 'C')), 0.) assert_equal(monty.log_probability(('C', 'A', 'B')), 0.) data = [['A', 'A', 'C'], ['A', 'A', 'C'], ['A', 'A', 'B'], ['A', 'A', 'A'], ['A', 'A', 'C'], ['B', 'B', 'B'], ['B', 'B', 'C'], ['C', 'C', 'A'], ['C', 'C', 'C'], ['C', 'C', 'C'], ['C', 'C', 'C'], ['C', 'B', 'A']] monty.fit(data, weights=[1, 1, 3, 3, 1, 1, 3, 7, 1, 1, 1, 1]) assert_equal(monty.log_probability(('A', 'A', 'A')), monty.log_probability(('A', 'A', 'C'))) assert_equal(monty.log_probability(('A', 'A', 'A')), monty.log_probability(('A', 'A', 'B'))) assert_equal(monty.log_probability(('B', 'A', 'A')), monty.log_probability(('B', 'A', 'C'))) assert_equal(monty.log_probability(('B', 'B', 'A')), float("-inf")) assert_equal(monty.log_probability(('C', 'C', 'B')), float("-inf"))