def test_lammps_cython_algorithms(algorithm):
    base_directory = 'test_files/dftfit_calculators/'
    training_schema = load_filename(base_directory + 'training.yaml')
    potential_schema = load_filename(base_directory + 'potential.yaml')
    configuration_schema = load_filename(base_directory + 'configuration.yaml')
    configuration_schema['spec']['problem'].update({
        'calculator': 'lammps_cython',
    })

    # do bare minimum calculations
    configuration_schema['spec']['algorithm'].update({
        'name': algorithm,
        'steps': 1,
        # Local optimization methods only opperate on one value
        'population': 1 if 'nlopt' in algorithm else 8,
    })

    if algorithm in {'pygmo.xnes', 'pygmo.cmaes'}:
        configuration_schema['spec']['algorithm']['force_bounds'] = True

    num_features = len(configuration_schema['spec']['problem']['weights'])

    with mock.patch('dftfit.io.lammps_cython.lammps.Lammps'):
        with mock.patch('dftfit.problem.DFTFITProblemBase._fitness') as mock_fitness:
            mock_fitness.return_value = tuple(np.random.random(num_features).tolist()), random.random()
            run_id = dftfit(training_schema=training_schema,
                            potential_schema=potential_schema,
                            configuration_schema=configuration_schema)
def test_lammps_cython_algorithms(algorithm):
    base_directory = 'test_files/dftfit_calculators/'
    training_schema = load_filename(base_directory + 'training.yaml')
    potential_schema = load_filename(base_directory + 'potential.yaml')
    configuration_schema = load_filename(base_directory + 'configuration.yaml')
    configuration_schema['spec']['problem'].update({
        'calculator':
        'lammps_cython',
    })

    # do bare minimum calculations
    configuration_schema['spec']['algorithm'].update({
        'name':
        algorithm,
        'steps':
        1,
        # Local optimization methods only opperate on one value
        'population':
        1 if 'nlopt' in algorithm else 8,
    })

    if algorithm in {'pygmo.xnes', 'pygmo.cmaes'}:
        configuration_schema['spec']['algorithm']['force_bounds'] = True

    num_features = len(configuration_schema['spec']['problem']['weights'])

    with mock.patch('dftfit.io.lammps_cython.lammps.Lammps'):
        with mock.patch(
                'dftfit.problem.DFTFITProblemBase._fitness') as mock_fitness:
            mock_fitness.return_value = tuple(
                np.random.random(num_features).tolist()), random.random()
            run_id = dftfit(training_schema=training_schema,
                            potential_schema=potential_schema,
                            configuration_schema=configuration_schema)
def test_lammps_cython_calculator_with_experimental():
    # Read in configuration information
    base_directory = 'test_files/dftfit_calculators/'
    training_schema = load_filename('test_files/training/training-mattoolkit-mgo-properties.yaml')
    potential_schema = load_filename(base_directory + 'potential.yaml')
    configuration_schema = load_filename(base_directory + 'configuration.yaml')
    configuration_schema['spec']['problem'].update({
        'calculator': 'lammps_cython',
    })
    configuration_schema['spec']['problem']['weights'] = {
        'forces': 0.7,
        'stress': 0.1,
        'lattice_constants': 0.1,
        'elastic_constants': 0.1
    }

    # Run optimization
    run_id = dftfit(training_schema=training_schema,
                    potential_schema=potential_schema,
                    configuration_schema=configuration_schema)

    # Ensure that the calculation ran check database
    configuration = Configuration(configuration_schema)
    with configuration.dbm.connection:
        query = configuration.dbm.connection.execute('''
        SELECT count(*) FROM evaluation WHERE run_id = ?
        ''', (run_id,)).fetchone()
        # because one initial run is done before calculation
        assert query[0] == configuration.population * (configuration.steps + 1)
Exemplo n.º 4
0
def test_pymatgen_lammps_calculator():
    # Read in configuration information
    base_directory = 'test_files/dftfit_calculators/'
    training_schema = load_filename(base_directory + 'training.yaml')
    potential_schema = load_filename(base_directory + 'potential.yaml')
    configuration_schema = load_filename(base_directory + 'configuration.yaml')
    configuration_schema['spec']['problem'].update({
        'calculator': 'lammps',
        'command': 'lammps',
        'num_workers': 1
    })

    # Run optimization
    run_id = dftfit(training_schema=training_schema,
                    potential_schema=potential_schema,
                    configuration_schema=configuration_schema)

    # Ensure that the calculation ran check database
    configuration = Configuration(configuration_schema)
    with configuration.dbm.connection:
        query = configuration.dbm.connection.execute(
            '''
        SELECT count(*) FROM evaluation WHERE run_id = ?
        ''', (run_id, )).fetchone()
        # because one initial run is done before calculation
        assert query[0] == configuration.population * (configuration.steps + 1)
def test_lammps_cython_calculator_with_experimental():
    # Read in configuration information
    base_directory = 'test_files/dftfit_calculators/'
    training_schema = load_filename(
        'test_files/training/training-mattoolkit-mgo-properties.yaml')
    potential_schema = load_filename(base_directory + 'potential.yaml')
    configuration_schema = load_filename(base_directory + 'configuration.yaml')
    configuration_schema['spec']['problem'].update({
        'calculator':
        'lammps_cython',
    })
    configuration_schema['spec']['problem']['weights'] = {
        'forces': 0.7,
        'stress': 0.1,
        'lattice_constants': 0.1,
        'elastic_constants': 0.1
    }

    # Run optimization
    run_id = dftfit(training_schema=training_schema,
                    potential_schema=potential_schema,
                    configuration_schema=configuration_schema)

    # Ensure that the calculation ran check database
    configuration = Configuration(configuration_schema)
    with configuration.dbm.connection:
        query = configuration.dbm.connection.execute(
            '''
        SELECT count(*) FROM evaluation WHERE run_id = ?
        ''', (run_id, )).fetchone()
        # because one initial run is done before calculation
        assert query[0] == configuration.population * (configuration.steps + 1)
def test_lammps_cython_calculator_benchmark(benchmark, num_workers):
    # Read in configuration information
    base_directory = 'test_files/dftfit_calculators/'
    training_schema = load_filename(base_directory + 'training.yaml')
    potential_schema = load_filename(base_directory + 'potential.yaml')
    configuration_schema = load_filename(base_directory + 'configuration.yaml')
    configuration_schema['spec']['problem'].update({
        'calculator': 'lammps_cython',
        'num_workers': num_workers
    })
    configuration_schema['spec']['steps'] = 3

    @benchmark
    def test_speed():
        dftfit(training_schema=training_schema,
               potential_schema=potential_schema,
               configuration_schema=configuration_schema)
def test_lammps_cython_calculator_benchmark(benchmark, num_workers):
    # Read in configuration information
    base_directory = 'test_files/dftfit_calculators/'
    training_schema = load_filename(base_directory + 'training.yaml')
    potential_schema = load_filename(base_directory + 'potential.yaml')
    configuration_schema = load_filename(base_directory + 'configuration.yaml')
    configuration_schema['spec']['problem'].update({
        'calculator': 'lammps_cython',
        'num_workers': num_workers
    })
    configuration_schema['spec']['steps'] = 3

    @benchmark
    def test_speed():
        dftfit(training_schema=training_schema,
               potential_schema=potential_schema,
               configuration_schema=configuration_schema)
def test_lammps_cython_algorithms():
    base_directory = 'test_files/dftfit_calculators/'
    training_schema = load_filename(base_directory + 'training.yaml')
    potential_schema = load_filename(base_directory + 'potential.yaml')
    configuration_schema = load_filename(base_directory + 'configuration.yaml')
    batch_schema = load_filename('test_files/batch/example.yaml')
    configuration_schema['spec']['problem'].update({
        'calculator': 'lammps_cython',
    })

    num_features = len(configuration_schema['spec']['problem']['weights'])

    with mock.patch('dftfit.io.lammps_cython.lammps.Lammps'):
        with mock.patch('dftfit.problem.DFTFITProblemBase._fitness') as mock_fitness:
            mock_fitness.return_value = tuple(np.random.random(num_features).tolist()), random.random()
            num_jobs = dftfit_batch(training_schema=training_schema,
                                    potential_schema=potential_schema,
                                    configuration_schema=configuration_schema,
                                    batch_schema=batch_schema)
            assert len(num_jobs) == 4
Exemplo n.º 9
0
def test_lammps_cython_algorithms():
    base_directory = 'test_files/dftfit_calculators/'
    training_schema = load_filename(base_directory + 'training.yaml')
    potential_schema = load_filename(base_directory + 'potential.yaml')
    configuration_schema = load_filename(base_directory + 'configuration.yaml')
    batch_schema = load_filename('test_files/batch/example.yaml')
    configuration_schema['spec']['problem'].update({
        'calculator':
        'lammps_cython',
    })

    num_features = len(configuration_schema['spec']['problem']['weights'])

    with mock.patch('dftfit.io.lammps_cython.lammps.Lammps'):
        with mock.patch(
                'dftfit.problem.DFTFITProblemBase._fitness') as mock_fitness:
            mock_fitness.return_value = tuple(
                np.random.random(num_features).tolist()), random.random()
            num_jobs = dftfit_batch(training_schema=training_schema,
                                    potential_schema=potential_schema,
                                    configuration_schema=configuration_schema,
                                    batch_schema=batch_schema)
            assert len(num_jobs) == 4
def test_lammps_cython_calculator():
    # Read in configuration information
    base_directory = 'test_files/dftfit_calculators/'
    training_schema = load_filename(base_directory + 'training.yaml')
    potential_schema = load_filename(base_directory + 'potential.yaml')
    configuration_schema = load_filename(base_directory + 'configuration.yaml')
    configuration_schema['spec']['problem'].update({
        'calculator': 'lammps_cython',
    })

    # Run optimization
    run_id = dftfit(training_schema=training_schema,
                    potential_schema=potential_schema,
                    configuration_schema=configuration_schema)

    # Ensure that the calculation ran check database
    configuration = Configuration(configuration_schema)
    with configuration.dbm.connection:
        query = configuration.dbm.connection.execute('''
        SELECT count(*) FROM evaluation WHERE run_id = ?
        ''', (run_id,)).fetchone()
        # because one initial run is done before calculation
        assert query[0] == configuration.population * (configuration.steps + 1)
Exemplo n.º 11
0
def test_calculator_equivalency(structure):
    target_a = 4.1990858
    s = structure('test_files/structure/MgO.cif')
    lattice = pmg.Lattice.from_parameters(target_a, target_a, target_a, 90, 90,
                                          90)
    s.modify_lattice(lattice)
    assert np.all(np.isclose(s.lattice.abc, (target_a, target_a, target_a)))
    s = s * (2, 2, 2)
    assert len(s) == 64

    base_directory = 'test_files/dftfit_calculators/'
    potential_schema = load_filename(base_directory + 'potential.yaml')
    potential_schema['spec']['charge']['Mg']['initial'] = 1.4
    potential_schema['spec']['charge']['O']['initial'] = -1.4
    potential = Potential(potential_schema)

    command = None
    if shutil.which('lammps'): command = 'lammps'
    elif shutil.which('lmp_serial'): command = 'lmp_serial'

    calculators = [
        LammpsLocalDFTFITCalculator(structures=[s],
                                    potential=potential,
                                    command=command,
                                    num_workers=1),
        LammpsCythonDFTFITCalculator(structures=[s], potential=potential)
    ]

    loop = asyncio.get_event_loop()
    results = []

    async def run(calc, potential):
        await calc.create()
        return await calc.submit(potential)

    for calc in calculators:
        results.append(loop.run_until_complete(run(calc, potential)))

    assert len(results) == 2
    assert len(results[0]) == 1
    assert len(results[1]) == 1

    for r1, r2 in zip(*results):
        assert r1.structure == r2.structure
        assert abs(r1.energy - r2.energy) < 1e-4
        assert np.all(np.isclose(r1.forces, r2.forces, atol=1e-8))
        assert np.all(np.isclose(r1.stress, r2.stress, atol=1e-8))
Exemplo n.º 12
0
def test_calculator_equivalency(structure):
    target_a = 4.1990858
    s = structure('test_files/structure/MgO.cif')
    lattice = pmg.Lattice.from_parameters(target_a, target_a, target_a, 90, 90, 90)
    s.modify_lattice(lattice)
    assert np.all(np.isclose(s.lattice.abc, (target_a, target_a, target_a)))
    s = s * (2, 2, 2)
    assert len(s) == 64

    base_directory = 'test_files/dftfit_calculators/'
    potential_schema = load_filename(base_directory + 'potential.yaml')
    potential_schema['spec']['charge']['Mg']['initial'] = 1.4
    potential_schema['spec']['charge']['O']['initial'] = -1.4
    potential = Potential(potential_schema)

    command = None
    if shutil.which('lammps'): command = 'lammps'
    elif shutil.which('lmp_serial'): command = 'lmp_serial'

    calculators = [
        LammpsLocalDFTFITCalculator(structures=[s], potential=potential, command=command, num_workers=1),
        LammpsCythonDFTFITCalculator(structures=[s], potential=potential)
    ]

    loop = asyncio.get_event_loop()
    results = []

    async def run(calc, potential):
        await calc.create()
        return await calc.submit(potential)

    for calc in calculators:
        results.append(loop.run_until_complete(run(calc, potential)))

    assert len(results) == 2
    assert len(results[0]) == 1
    assert len(results[1]) == 1

    for r1, r2 in zip(*results):
        assert r1.structure == r2.structure
        assert abs(r1.energy - r2.energy) < 1e-4
        assert np.all(np.isclose(r1.forces, r2.forces, atol=1e-8))
        assert np.all(np.isclose(r1.stress, r2.stress, atol=1e-8))
Exemplo n.º 13
0
from dftfit.cli.utils import load_filename
from dftfit.dftfit import dftfit

base_directory = 'test_files/dftfit_calculators/'
training_schema = load_filename(base_directory + 'training.yaml')
potential_schema = load_filename(base_directory + 'potential.yaml')
configuration_schema = load_filename(base_directory + 'configuration.yaml')
configuration_schema['spec']['problem'].update({
    'calculator': 'lammps',
    'command': 'lammps',
    'num_workers': 2
})
configuration_schema['spec']['steps'] = 10

run_id = dftfit(training_schema=training_schema,
                potential_schema=potential_schema,
                configuration_schema=configuration_schema)