Skip to content

Commit 08e2a7e

Browse files
committed
Add benchmarks
1 parent a4aab28 commit 08e2a7e

File tree

3 files changed

+277
-0
lines changed

3 files changed

+277
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import os
2+
import glob
3+
from raffle.generator import raffle_generator
4+
import pytest
5+
from ase.io import read
6+
import time
7+
import numpy as np
8+
9+
10+
def get_xyz_files():
11+
"""Get all .xyz files from the ../../data directory"""
12+
current_dir = os.path.dirname(os.path.abspath(__file__))
13+
data_dir = os.path.join(current_dir, '..', '..', '..', 'example', 'data')
14+
print("Data directory:", data_dir)
15+
return glob.glob(os.path.join(data_dir, '*.xyz'))
16+
17+
18+
@pytest.mark.parametrize("xyz_file", get_xyz_files())
19+
@pytest.mark.parametrize("kBT", [0.2, 0.4, 0.6])
20+
@pytest.mark.parametrize("width", [
21+
[0.025, np.pi/200.0, np.pi/200.0],
22+
[0.05, np.pi/100.0, np.pi/100.0],
23+
[0.1, np.pi/50.0, np.pi/50.0]
24+
])
25+
@pytest.mark.benchmark(
26+
group="distributions",
27+
min_rounds=5,
28+
timer=time.time,
29+
disable_gc=True,
30+
warmup=False
31+
)
32+
def test_distributions_create(benchmark, xyz_file, kBT, width):
33+
atoms = read(xyz_file, index=":")
34+
35+
# Initialize generator
36+
generator = raffle_generator()
37+
38+
# get list of elements in list of atoms
39+
elements = []
40+
for atom in atoms:
41+
elements += atom.get_chemical_symbols()
42+
elements = list(set(elements))
43+
energies = {element: 0.0 for element in elements}
44+
generator.distributions.set_element_energies(energies)
45+
46+
avg_num_atoms = 0
47+
for atom in atoms:
48+
avg_num_atoms += len(atom)
49+
avg_num_atoms = round(avg_num_atoms / len(atoms))
50+
51+
benchmark.extra_info = {
52+
'file': os.path.basename(xyz_file),
53+
'num_structures': len(atoms),
54+
'num_species': len(elements),
55+
"avg_num_atoms": avg_num_atoms,
56+
"kBT": kBT,
57+
"width": width
58+
}
59+
60+
# set energy scale
61+
generator.distributions.set_kBT(kBT)
62+
63+
# set the distribution function widths (2-body, 3-body, 4-body)
64+
generator.distributions.set_width(width)
65+
66+
# Measure time for distributions.create()
67+
result = benchmark(generator.distributions.create, atoms)
68+
69+
70+
return {
71+
'file': os.path.basename(xyz_file),
72+
'time': result,
73+
'num_structures': len(atoms),
74+
'num_species': len(elements),
75+
"avg_num_atoms": avg_num_atoms
76+
}
77+
78+
@pytest.fixture
79+
def make_customer_record():
80+
def _make_customer_record(name):
81+
return {"name": name, "orders": []}
82+
83+
return _make_customer_record
84+
85+
if __name__ == '__main__':
86+
xyz_files = get_xyz_files()
87+
results = []
88+
89+
result = test_distributions_create(lambda x: x)
90+
# for xyz_file in xyz_files:
91+
# # for _ in range(5): # Run the benchmark 5 times for each file
92+
# result = test_distributions_create(lambda x: x, xyz_file)
93+
# results.append(result)
94+
95+
# Print results
96+
print("\nBenchmark Results:")
97+
print("-" * 60)
98+
print(f"{'File':<20} {'Time (s)':<10} {'Num Structures':<10} {'Num Species':<10} {'Avg Num Atoms':<10}")
99+
print("-" * 60)
100+
for result in results:
101+
print(f"{result['file']:<20} {result['time']:<10.4f} {result['num_structures']:<10} {result['num_species']:<10} {result['avg_num_atoms']:<10}")
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import pytest
2+
import time
3+
import numpy as np
4+
from ase import Atoms
5+
from chgnet.model import CHGNetCalculator
6+
from raffle.generator import raffle_generator
7+
8+
9+
@pytest.mark.parametrize("kBT", [0.4])
10+
@pytest.mark.parametrize("width", [
11+
[0.025, np.pi/200.0, np.pi/200.0]
12+
])
13+
@pytest.mark.parametrize("grid_spacing", [0.5, 0.25, 0.1, 0.075, 0.05])
14+
@pytest.mark.benchmark(
15+
group="min_placement",
16+
min_rounds=5,
17+
timer=time.time,
18+
disable_gc=True,
19+
warmup=False
20+
)
21+
def test_min_placement(benchmark, grid_spacing, kBT, width):
22+
23+
calc = CHGNetCalculator()
24+
host = Atoms('C', positions=[(0, 0, 0)], cell=[3.567, 3.567, 3.567], pbc=True, calculator=calc)
25+
26+
# Initialize generator
27+
generator = raffle_generator()
28+
29+
# set energy scale
30+
generator.distributions.set_kBT(kBT)
31+
32+
# set the distribution function widths (2-body, 3-body, 4-body)
33+
generator.distributions.set_width(width)
34+
35+
energies = {element: 0.0 for element in ['C']}
36+
generator.distributions.set_element_energies(energies)
37+
38+
generator.set_grid(grid_spacing=grid_spacing)
39+
generator.set_host(host)
40+
41+
initial_database = [Atoms('C', positions=[(0, 0, 0)], cell=[8, 8, 8], pbc=True, calculator=calc)]
42+
43+
generator.distributions.create(initial_database)
44+
45+
benchmark.extra_info = {
46+
"kBT": kBT,
47+
"width": width,
48+
"grid_spacing": grid_spacing
49+
}
50+
51+
52+
# Measure time for distributions.create()
53+
result = benchmark(generator.generate,
54+
num_structures = 1,
55+
stoichiometry = {'C': 1},
56+
seed = 0,
57+
method_probab = {
58+
'void': 0.0,
59+
'rand': 0.0,
60+
'walk': 0.0,
61+
'grow': 0.0,
62+
'min': 1.0
63+
64+
},
65+
verbose = 0
66+
)
67+
68+
return result
69+
70+
if __name__ == '__main__':
71+
grid_spacings = [0.5, 0.25, 0.1, 0.075, 0.05]
72+
results = []
73+
74+
for grid_spacing in grid_spacings:
75+
for _ in range(5): # Run the benchmark 5 times for each grid size
76+
result = test_min_placement(lambda x: x, grid_spacing, 0.4, [0.025, np.pi/200.0, np.pi/200.0])
77+
results.append({
78+
'grid_spacing': grid_spacing,
79+
'time': result
80+
})
81+
82+
# Print results
83+
print("\nBenchmark Results:")
84+
print("-" * 40)
85+
print(f"{'Grid Size':<10} {'Time (s)':<10}")
86+
print("-" * 40)
87+
for result in results:
88+
print(f"{result['grid_spacing']:<10} {result['time']:<10.4f}")
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import pytest
2+
import time
3+
import numpy as np
4+
from ase import Atoms
5+
from chgnet.model import CHGNetCalculator
6+
from raffle.generator import raffle_generator
7+
8+
9+
@pytest.mark.parametrize("kBT", [0.4])
10+
@pytest.mark.parametrize("width", [
11+
[0.025, np.pi/200.0, np.pi/200.0]
12+
])
13+
@pytest.mark.parametrize("grid_spacing", [0.5, 0.25, 0.1, 0.075, 0.05])
14+
@pytest.mark.benchmark("method_probab", [
15+
{'void': 0.0, 'rand': 0.0, 'walk': 0.0, 'grow': 0.0, 'min': 1.0},
16+
{'void': 0.0, 'rand': 0.0, 'walk': 0.0, 'grow': 1.0, 'min': 0.0},
17+
{'void': 0.0, 'rand': 0.0, 'walk': 1.0, 'grow': 0.0, 'min': 0.0},
18+
{'void': 0.0, 'rand': 1.0, 'walk': 0.0, 'grow': 0.0, 'min': 0.0},
19+
{'void': 1.0, 'rand': 0.0, 'walk': 0.0, 'grow': 0.0, 'min': 0.0}
20+
]
21+
@pytest.mark.benchmark(
22+
group="min_placement",
23+
min_rounds=5,
24+
timer=time.time,
25+
disable_gc=True,
26+
warmup=False
27+
)
28+
def test_min_placement(benchmark, grid_spacing, kBT, width, method_probab):
29+
30+
calc = CHGNetCalculator()
31+
host = Atoms('C', positions=[(0, 0, 0)], cell=[3.567, 3.567, 3.567], pbc=True, calculator=calc)
32+
33+
# Initialize generator
34+
generator = raffle_generator()
35+
36+
# set energy scale
37+
generator.distributions.set_kBT(kBT)
38+
39+
# set the distribution function widths (2-body, 3-body, 4-body)
40+
generator.distributions.set_width(width)
41+
42+
energies = {element: 0.0 for element in ['C']}
43+
generator.distributions.set_element_energies(energies)
44+
45+
generator.set_grid(grid_spacing=grid_spacing)
46+
generator.set_host(host)
47+
48+
initial_database = [Atoms('C', positions=[(0, 0, 0)], cell=[8, 8, 8], pbc=True, calculator=calc)]
49+
50+
generator.distributions.create(initial_database)
51+
52+
benchmark.extra_info = {
53+
"kBT": kBT,
54+
"width": width,
55+
"grid_spacing": grid_spacing,
56+
"method_probab": method_probab
57+
}
58+
59+
# Measure time for distributions.create()
60+
result = benchmark(generator.generate,
61+
num_structures = 1,
62+
stoichiometry = {'C': 1},
63+
seed = 0,
64+
method_probab = method_probab,
65+
verbose = 0
66+
)
67+
68+
return result
69+
70+
if __name__ == '__main__':
71+
grid_spacings = [0.5, 0.25, 0.1, 0.075, 0.05]
72+
results = []
73+
74+
for grid_spacing in grid_spacings:
75+
for _ in range(5): # Run the benchmark 5 times for each grid size
76+
result = test_min_placement(lambda x: x, grid_spacing, 0.4, [0.025, np.pi/200.0, np.pi/200.0])
77+
results.append({
78+
'grid_spacing': grid_spacing,
79+
'time': result
80+
})
81+
82+
# Print results
83+
print("\nBenchmark Results:")
84+
print("-" * 40)
85+
print(f"{'Grid Size':<10} {'Time (s)':<10}")
86+
print("-" * 40)
87+
for result in results:
88+
print(f"{result['grid_spacing']:<10} {result['time']:<10.4f}")

0 commit comments

Comments
 (0)