Skip to content

Commit cdff944

Browse files
committed
fix: handle filtered interstitial tasks
Coding-Agent: Codex Codex-Version: codex-cli 0.149.0 Model: gpt-5.6-sol Reasoning-Effort: xhigh
1 parent d5ce577 commit cdff944

2 files changed

Lines changed: 31 additions & 3 deletions

File tree

dpgen/auto_test/Interstitial.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,10 @@ def make_confs(self, path_to_work, path_to_equi, refine=False):
183183
insert_element_task = os.path.join(path_to_work, "element.out")
184184
if os.path.isfile(insert_element_task):
185185
os.remove(insert_element_task)
186+
# Keep the task metadata present even when every generated
187+
# interstitial is rejected by a configuration filter.
188+
with open(insert_element_task, "w"):
189+
pass
186190

187191
for ii in self.insert_ele:
188192
pre_vds = InterstitialGenerator()
@@ -467,8 +471,11 @@ def make_confs(self, path_to_work, path_to_equi, refine=False):
467471
return task_list
468472

469473
def post_process(self, task_list):
470-
if True:
471-
fin1 = open(os.path.join(task_list[0], "..", "element.out"))
474+
"""Adjust generated LAMMPS atom types for interstitial tasks."""
475+
if not task_list:
476+
return
477+
478+
with open(os.path.join(task_list[0], "..", "element.out")) as fin1:
472479
for ii in task_list:
473480
conf = os.path.join(ii, "conf.lmp")
474481
inter = os.path.join(ii, "inter.json")
@@ -492,7 +499,6 @@ def post_process(self, task_list):
492499
with open(conf, "w+") as fout:
493500
for jj in conf_line:
494501
print(jj, file=fout)
495-
fin1.close()
496502

497503
def task_type(self):
498504
return self.parameter["type"]

tests/auto_test/test_interstitial.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,25 @@ def test_make_confs_bcc(self):
105105
center = (inter_site1.coords + inter_site2.coords) / 2
106106
self.assertTrue((center[0] - center[1]) < 1e-4)
107107
self.assertTrue((center[1] - center[2]) < 1e-4)
108+
109+
def test_make_confs_when_all_interstitials_are_filtered(self):
110+
"""An empty filtered result should remain a valid property setup."""
111+
shutil.copy(
112+
os.path.join(self.source_path, "CONTCAR_V_bcc"),
113+
os.path.join(self.equi_path, "CONTCAR"),
114+
)
115+
parameter = {
116+
"type": "interstitial",
117+
"supercell": [1, 1, 1],
118+
"insert_ele": ["V"],
119+
"conf_filters": {"min_dist": 100.0},
120+
}
121+
interstitial = Interstitial(parameter)
122+
123+
task_list = interstitial.make_confs(self.target_path, self.equi_path)
124+
125+
self.assertEqual([], task_list)
126+
element_out = os.path.join(self.target_path, "element.out")
127+
self.assertTrue(os.path.isfile(element_out))
128+
self.assertEqual(0, os.path.getsize(element_out))
129+
interstitial.post_process(task_list)

0 commit comments

Comments
 (0)