def test_stop_simulation(): """ Checks that if observe returns False, iteration stops. """ from mock import Mock mc = MonteCarlo(temperature=100.0, itermax=8) # Make a fake observer mc.observe = Mock(side_effect=[True, False, True]) # Fake energy method energies = [0.1, -0.1, -0.2, -0.15, -0.25] energy = Mock(side_effect=energies) # Call simulation mc(energy, [0, 1, 2, 3]) assert_equal(len(mc.observe.mock_calls), 2) assert_equal(len(energy.mock_calls), 3) # one extra call to get first energy
def test_main_algorithm(): """ Check set path through main algorithm """ from mock import Mock, call mc = MonteCarlo(temperature=100.0, itermax=4) # Patch mc so that it takes a pre-determined path through acceptance = [True, True, False, True] mc.accept_change = Mock(side_effect=acceptance) densities = ( [0, 0, 1, 0], [0, 1, 1, 0], [2, 2, 2, 2], [2, 3, 3, 2], [5, 3, 3, 5], ) mc.change_density = Mock(side_effect=densities[1:]) mc.observe = Mock(return_value=True) # Fake energy method energies = [0.1, -0.1, -0.2, -0.15, -0.25] energy = Mock(side_effect=energies) # Call simulation mc(energy, densities[0]) # Now, analyze path. First check length. assert_equal(len(mc.accept_change.mock_calls), 4) assert_equal(len(mc.change_density.mock_calls), 4) assert_equal(len(mc.observe.mock_calls), 4) assert_equal(len(energy.mock_calls), 5) # one extra call to get first energy # Easiest to look at observe, since it should have all the info about the step observe_path = [ call(0, acceptance[0], densities[1], energies[1]), call(1, acceptance[1], densities[2], energies[2]), call(2, acceptance[2], densities[2], energies[2]), call(3, acceptance[3], densities[4], energies[4]), ] assert_equal(observe_path, mc.observe.call_args_list)
def test_main_algorithm(): """ Check set path through main algorithm """ from mock import Mock, call mc = MonteCarlo(temperature=100.0, itermax=4) # Patch mc so that it takes a pre-determined path through acceptance = [True, True, False, True] mc.accept_change = Mock(side_effect=acceptance) densities = ( [0, 0, 1, 0], [0, 1, 1, 0], [2, 2, 2, 2], [2, 3, 3, 2], [5, 3, 3, 5], ) mc.change_density = Mock(side_effect=densities[1:]) mc.observe = Mock(return_value=True) # Fake energy method energies = [0.1, -0.1, -0.2, -0.15, -0.25] energy = Mock(side_effect=energies) # Call simulation mc(energy, densities[0]) # Now, analyze path. First check length. assert_equal(len(mc.accept_change.mock_calls), 4) assert_equal(len(mc.change_density.mock_calls), 4) assert_equal(len(mc.observe.mock_calls), 4) assert_equal(len(energy.mock_calls), 5) # one extra call to get first energy # Easiest to look at observe, since it should have all the info about the step observe_path = [ call(0, acceptance[0], densities[1], energies[1]), call(1, acceptance[1], densities[2], energies[2]), call(2, acceptance[2], densities[2], energies[2]), call(3, acceptance[3], densities[4], energies[4]) ] assert_equal(observe_path, mc.observe.call_args_list)