Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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)