From 22f50a27b50ca1b192f2bf490d621d7042731c83 Mon Sep 17 00:00:00 2001 From: njzjz-bot Date: Mon, 24 Aug 2026 03:41:43 +0800 Subject: [PATCH 1/2] fix: reject non-finite model deviations Fail at the LAMMPS artifact boundary before NaN or infinity values can produce invalid exploration trust levels. Coding-Agent: Codex Codex-Version: codex-cli 0.149.1 Model: gpt-5.6-sol Reasoning-Effort: xhigh --- .../exploration/render/traj_render_lammps.py | 22 +++++++++++++++++++ tests/exploration/test_traj_render_lammps.py | 18 +++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/dpgen2/exploration/render/traj_render_lammps.py b/dpgen2/exploration/render/traj_render_lammps.py index 00b6a3de..941ad198 100644 --- a/dpgen2/exploration/render/traj_render_lammps.py +++ b/dpgen2/exploration/render/traj_render_lammps.py @@ -68,6 +68,28 @@ def _load_one_model_devi(self, fname, model_devi): ): # In case model-devi.out is 1-dimensional dd = dd.reshape((1, len(dd))) # type: ignore + # A NaN or infinity would otherwise reach the report and scheduler, where + # comparisons silently produce invalid trust levels. Fail at the artifact + # boundary so users can inspect the corresponding LAMMPS task directly. + deviation_names = ( + DeviManager.MAX_DEVI_V, + DeviManager.MIN_DEVI_V, + DeviManager.AVG_DEVI_V, + DeviManager.MAX_DEVI_F, + DeviManager.MIN_DEVI_F, + DeviManager.AVG_DEVI_F, + ) + invalid = np.argwhere(~np.isfinite(dd[:, 1:7])) + if invalid.size: + locations = ", ".join( + f"row {row + 1} ({deviation_names[column]})" for row, column in invalid + ) + raise ValueError( + f"Non-finite model-deviation value in {fname}: {locations}. " + "Inspect the LAMMPS/DeePMD task output before scheduling the " + "next exploration iteration." + ) + model_devi.add(DeviManager.MAX_DEVI_V, dd[:, 1]) # type: ignore model_devi.add(DeviManager.MIN_DEVI_V, dd[:, 2]) # type: ignore model_devi.add(DeviManager.AVG_DEVI_V, dd[:, 3]) # type: ignore diff --git a/tests/exploration/test_traj_render_lammps.py b/tests/exploration/test_traj_render_lammps.py index 3659ffd8..068677c8 100644 --- a/tests/exploration/test_traj_render_lammps.py +++ b/tests/exploration/test_traj_render_lammps.py @@ -1,6 +1,9 @@ import json import os import unittest +from pathlib import ( + Path, +) import dpdata import numpy as np @@ -15,6 +18,16 @@ class TestTrajRenderLammps(unittest.TestCase): + def test_rejects_non_finite_model_deviation(self): + model_devi = Path("model_devi.out") + model_devi.write_text("0 0.1 0.0 0.0 0.2 0.0 0.0\n1 0.2 0.0 0.0 nan 0.0 0.0\n") + + with self.assertRaisesRegex( + ValueError, + r"Non-finite model-deviation value.*row 2 \(max_devi_f\)", + ): + TrajRenderLammps().get_model_devi([model_devi]) + def test_use_ele_temp_1(self): with open("job.json", "w") as f: json.dump({"ele_temp": 6.6}, f) @@ -58,5 +71,6 @@ def test_use_ele_temp_2(self): np.testing.assert_array_almost_equal(system.data["aparam"], np.array([[[6.6]]])) def tearDown(self): - if os.path.exists("job.json"): - os.remove("job.json") + for filename in ("job.json", "model_devi.out"): + if os.path.exists(filename): + os.remove(filename) From ea782dc33abef271c0ce5c83d65fbbe2c101f26b Mon Sep 17 00:00:00 2001 From: "A bot of @njzjz" Date: Wed, 7 Oct 2026 17:13:28 +0800 Subject: [PATCH 2/2] fix: index invalid coordinates across NumPy typing versions Use explicit two-dimensional indexing instead of scalar/list-sensitive tolist overloads. Full pyright 1.1.318 passes with NumPy 2.2.6; the exploration and SelectConfs regression tests remain green. Agent: dot --- dpgen2/exploration/render/traj_render_lammps.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dpgen2/exploration/render/traj_render_lammps.py b/dpgen2/exploration/render/traj_render_lammps.py index 12de6d36..f9e57025 100644 --- a/dpgen2/exploration/render/traj_render_lammps.py +++ b/dpgen2/exploration/render/traj_render_lammps.py @@ -85,8 +85,9 @@ def _load_one_model_devi(self, fname, model_devi): invalid = np.argwhere(~np.isfinite(dd[:, 1:7])) if invalid.size: locations = ", ".join( - f"row {row + 1} ({deviation_names[column]})" - for row, column in invalid[:10].tolist() + f"row {int(invalid[index, 0]) + 1} " + f"({deviation_names[int(invalid[index, 1])]})" + for index in range(min(len(invalid), 10)) ) if len(invalid) > 10: locations += f", ... ({len(invalid)} non-finite values in total)"