From 3a037c0a76d316a819a7d0b61fe1d3d7130ff185 Mon Sep 17 00:00:00 2001 From: njzjz-bot Date: Mon, 24 Aug 2026 03:24:34 +0800 Subject: [PATCH] fix: infer optional CALYPSO inputs Infer atomic numbers and a covalent-radius distance matrix when optional CALYPSO fields are omitted. Closes #357 Coding-Agent: Codex Codex-Version: codex-cli 0.149.1 Model: gpt-5.6-sol Reasoning-Effort: xhigh --- dpgen2/exploration/task/caly_task_group.py | 17 ++++++++++++----- .../test_make_task_group_from_config.py | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/dpgen2/exploration/task/caly_task_group.py b/dpgen2/exploration/task/caly_task_group.py index 14594f38..6cbbc45d 100644 --- a/dpgen2/exploration/task/caly_task_group.py +++ b/dpgen2/exploration/task/caly_task_group.py @@ -144,12 +144,19 @@ def set_params( self.atomic_number = [atomic_symbols.index(i) for i in self.name_of_atoms] else: self.name_of_atoms = name_of_atoms - self.atomic_number = atomic_number - - if isinstance(distance_of_ions, dict): + self.atomic_number = ( + [atomic_number_map[name] for name in self.name_of_atoms] + if atomic_number is None + else atomic_number + ) + + if distance_of_ions is None or isinstance(distance_of_ions, dict): + # Generate a complete distance matrix from the maintained + # covalent-radius table when the optional matrix is omitted. updated_table = copy.deepcopy(covalent_radii) - for key, value in distance_of_ions.items(): - updated_table[atomic_number_map[key]] = value + if isinstance(distance_of_ions, dict): + for key, value in distance_of_ions.items(): + updated_table[atomic_number_map[key]] = value temp_distance_mtx = np.zeros((numb_of_species, numb_of_species)) for i in range(numb_of_species): diff --git a/tests/exploration/test_make_task_group_from_config.py b/tests/exploration/test_make_task_group_from_config.py index f9fe93be..de92b47f 100644 --- a/tests/exploration/test_make_task_group_from_config.py +++ b/tests/exploration/test_make_task_group_from_config.py @@ -126,3 +126,18 @@ def test_make_caly_input(self): def test_caly_task_group(self): tgroup = make_calypso_task_group_from_config(self.config) self.assertTrue(isinstance(tgroup, CalyTaskGroup)) + + def test_infers_optional_atomic_numbers_and_distances(self): + """Generate CALYPSO-required values when optional fields are absent.""" + config = { + "name_of_atoms": ["Li", "La"], + "numb_of_atoms": [10, 10], + "numb_of_species": 2, + } + + task_group = make_calypso_task_group_from_config(config) + + self.assertEqual(task_group.atomic_number, [3, 57]) + self.assertEqual(task_group.distance_of_ions.shape, (2, 2)) + self.assertTrue(np.all(task_group.distance_of_ions > 0)) + self.assertEqual(len(task_group.make_task()), 1)