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