def test_accept_change(): """ Check that move is accepted if second energy is lower """ from numpy import sqrt, count_nonzero, exp energy = MagicMock mc = MonteCarlo(energy, [1, 1, 1], temperature=100.0) # Should always be true. # But do more than one draw, # in case randomness incorrectly crept into # implementation for i in range(10): assert mc.accept_change(0.5, 0.4) assert mc.accept_change(0.5, 0.5) # This should be accepted only part of the time, # depending on exponential distribution prior, successor = 0.4, 0.5 accepted = [mc.accept_change(prior, successor) for i in range(10000)] assert count_nonzero(accepted) / float(len(accepted)) == approx( exp(-(successor - prior) / mc.temperature), 3e0 / sqrt(len(accepted)))
def test_main_algorithm(): import numpy as np from numpy import testing from unittest.mock import Mock density = [1, 1, 1, 1, 1] energy = MagicMock() mc = MonteCarlo(energy, density, itermax=5) acceptance = [True, True, True, True, True] mc.accept_change = Mock(side_effect=acceptance) mc.random_agent = Mock(side_effect=[0, 1, 2, 3, 4]) mc.random_direction = Mock(side_effect=[1, 1, 1, 1, -1]) np.testing.assert_equal(mc.step()[1], [0, 1, 1, 2, 1])