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"))
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"))