From 3229515c884901f7cc142d148580365805d0698a Mon Sep 17 00:00:00 2001 From: Han Wang Date: Fri, 3 Apr 2026 19:23:03 +0800 Subject: [PATCH 01/13] feat(pt_expt): add DeepSpin support for .pt2 backend Add end-to-end spin model support for the pt_expt (.pt2/AOTInductor) backend, enabling C++ inference of spin energy models. - Python serialization: handle 7-arg spin models (coord, atype, spin, nlist, mapping, fparam, aparam) in _trace_and_export, strip shape assertions for NoPBC compatibility - Python inference: add _eval_model_spin() in DeepEval, extend communicate_extended_output for magnetic derivatives (force_mag, virial_mag, mask_mag) - C++ backend: create DeepSpinPTExpt class with spin extension for ghost atoms, factory dispatch in DeepSpin.cc - Shared utilities: extract read_zip_entry, JsonParser, buildTypeSortedNlist to commonPTExpt.h - Tests: C++ gtest (PBC/NoPBC, double/float, standalone/LAMMPS nlist), Python pytest (DeepPot API with .pt2/.pte spin models) - Model generator: gen_spin.py for reproducible test model creation --- deepmd/dpmodel/model/spin_model.py | 7 + deepmd/dpmodel/model/transform_output.py | 35 + deepmd/pt_expt/infer/deep_eval.py | 203 ++++- deepmd/pt_expt/utils/serialization.py | 173 +++- source/api_cc/include/DeepSpinPTExpt.h | 203 +++++ source/api_cc/src/DeepPotPTExpt.cc | 591 +------------ source/api_cc/src/DeepSpin.cc | 9 + source/api_cc/src/DeepSpinPTExpt.cc | 793 ++++++++++++++++++ source/api_cc/src/commonPTExpt.h | 532 ++++++++++++ .../tests/test_deeppot_dpa_ptexpt_spin.cc | 499 +++++++++++ source/install/test_cc_local.sh | 1 + source/tests/infer/gen_common.py | 39 + source/tests/infer/gen_spin.py | 185 ++++ .../pt_expt/infer/test_deep_eval_spin.py | 312 +++++++ 14 files changed, 2974 insertions(+), 608 deletions(-) create mode 100644 source/api_cc/include/DeepSpinPTExpt.h create mode 100644 source/api_cc/src/DeepSpinPTExpt.cc create mode 100644 source/api_cc/src/commonPTExpt.h create mode 100644 source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc create mode 100644 source/tests/infer/gen_spin.py create mode 100644 source/tests/pt_expt/infer/test_deep_eval_spin.py diff --git a/deepmd/dpmodel/model/spin_model.py b/deepmd/dpmodel/model/spin_model.py index d9f185a60d..e54a1e6d9b 100644 --- a/deepmd/dpmodel/model/spin_model.py +++ b/deepmd/dpmodel/model/spin_model.py @@ -815,6 +815,13 @@ def call_common_lower( and do_atomic_virial and model_ret.get(f"{var_name}_derv_c") is not None ): + # Compute reduced virial from BOTH real and virtual atoms BEFORE + # splitting. process_spin_output_lower discards the virtual-atom + # contribution, so we must reduce first to get the correct total. + xp = array_api_compat.array_namespace(model_ret[f"{var_name}_derv_c"]) + model_ret[f"{var_name}_derv_c_redu"] = xp.sum( + model_ret[f"{var_name}_derv_c"], axis=1 + ) ( model_ret[f"{var_name}_derv_c"], model_ret[f"{var_name}_derv_c_mag"], diff --git a/deepmd/dpmodel/model/transform_output.py b/deepmd/dpmodel/model/transform_output.py index b697898896..b8ca99469f 100644 --- a/deepmd/dpmodel/model/transform_output.py +++ b/deepmd/dpmodel/model/transform_output.py @@ -16,6 +16,7 @@ ModelOutputDef, OutputVariableDef, get_deriv_name, + get_deriv_name_mag, get_hessian_name, get_reduce_name, ) @@ -128,6 +129,21 @@ def communicate_extended_output( model_ret[kk_derv_r], ) new_ret[kk_derv_r] = force + if vdef.magnetic: + kk_derv_r_mag = get_deriv_name_mag(kk)[0] + if model_ret.get(kk_derv_r_mag) is not None: + force_mag = xp.zeros( + vldims + derv_r_ext_dims, + dtype=vv.dtype, + device=device, + ) + force_mag = xp_scatter_sum( + force_mag, + 1, + mapping, + model_ret[kk_derv_r_mag], + ) + new_ret[kk_derv_r_mag] = force_mag else: # name holders new_ret[kk_derv_r] = None @@ -235,10 +251,29 @@ def communicate_extended_output( ) new_ret[kk_derv_c] = virial new_ret[kk_derv_c + "_redu"] = xp.sum(new_ret[kk_derv_c], axis=1) + if vdef.magnetic: + kk_derv_c_mag = get_deriv_name_mag(kk)[1] + if model_ret.get(kk_derv_c_mag) is not None: + virial_mag = xp.zeros( + vldims + derv_c_ext_dims, + dtype=vv.dtype, + device=device, + ) + virial_mag = xp_scatter_sum( + virial_mag, + 1, + mapping, + model_ret[kk_derv_c_mag], + ) + new_ret[kk_derv_c_mag] = virial_mag else: new_ret[kk_derv_c] = None new_ret[kk_derv_c + "_redu"] = None if not do_atomic_virial: # pop atomic virial, because it is not correctly calculated. new_ret.pop(kk_derv_c) + # Slice mask_mag from extended to local atoms + if "mask_mag" in model_ret: + nloc = new_ret[next(iter(model_output_def.keys_outp()))].shape[1] + new_ret["mask_mag"] = model_ret["mask_mag"][:, :nloc] return new_ret diff --git a/deepmd/pt_expt/infer/deep_eval.py b/deepmd/pt_expt/infer/deep_eval.py index 4eedb723d0..02b68ffb6c 100644 --- a/deepmd/pt_expt/infer/deep_eval.py +++ b/deepmd/pt_expt/infer/deep_eval.py @@ -16,6 +16,7 @@ communicate_extended_output, ) from deepmd.dpmodel.output_def import ( + FittingOutputDef, ModelOutputDef, OutputVariableCategory, OutputVariableDef, @@ -124,19 +125,54 @@ def _init_from_model_json(self, model_json_str: str) -> None: model_dict = json.loads(model_json_str) model_dict = _json_to_numpy(model_dict) - self._dpmodel = BaseModel.deserialize(model_dict["model"]) + model_data = model_dict["model"] + + if "spin" in model_data and "backbone_model" in model_data: + from deepmd.pt_expt.model.spin_model import ( + SpinModel, + ) + + self._dpmodel = SpinModel.deserialize(model_data) + self._is_spin = True + else: + self._dpmodel = BaseModel.deserialize(model_data) + self._is_spin = False + self.rcut = self._dpmodel.get_rcut() self.type_map = self._dpmodel.get_type_map() - self._model_output_def = ModelOutputDef(self._dpmodel.atomic_output_def()) + if self._is_spin: + self._model_output_def = ModelOutputDef( + FittingOutputDef( + [ + OutputVariableDef( + "energy", + shape=[1], + reducible=True, + r_differentiable=True, + c_differentiable=True, + atomic=True, + magnetic=True, + ) + ] + ) + ) + else: + self._model_output_def = ModelOutputDef(self._dpmodel.atomic_output_def()) def _load_pte(self, model_file: str) -> None: """Load a .pte (torch.export) model file.""" - extra_files = {"model.json": "", "model_def_script.json": ""} + extra_files = { + "model.json": "", + "model_def_script.json": "", + "metadata.json": "", + } exported = torch.export.load(model_file, extra_files=extra_files) self.exported_module = exported.module() self._init_from_model_json(extra_files["model.json"]) mds = extra_files["model_def_script.json"] self._model_def_script = json.loads(mds) if mds else {} + md = extra_files.get("metadata.json", "") + self.metadata = json.loads(md) if md else {} def _load_pt2(self, model_file: str) -> None: """Load a .pt2 (AOTInductor) model file.""" @@ -157,9 +193,13 @@ def _load_pt2(self, model_file: str) -> None: mds = "" if "extra/model_def_script.json" in names: mds = zf.read("extra/model_def_script.json").decode("utf-8") + md = "" + if "extra/metadata.json" in names: + md = zf.read("extra/metadata.json").decode("utf-8") self._init_from_model_json(model_json_str) self._model_def_script = json.loads(mds) if mds else {} + self.metadata = json.loads(md) if md else {} # Load the AOTInductor model package (.pt2 ZIP archive). # Uses torch._inductor.aoti_load_package (private API, stable since PyTorch 2.6). @@ -220,8 +260,12 @@ def get_has_efield(self) -> bool: """Check if the model has efield.""" return False + def get_has_spin(self) -> bool: + """Check if the model has spin atom types.""" + return getattr(self, "_is_spin", False) + def get_ntypes_spin(self) -> int: - """Get the number of spin atom types of this model.""" + """Get the number of spin atom types of this model. Only used in old implement.""" return 0 def eval( @@ -273,9 +317,16 @@ def eval( coords, atom_types, len(atom_types.shape) > 1 ) request_defs = self._get_request_defs(atomic) - out = self._eval_func(self._eval_model, numb_test, natoms)( - coords, cells, atom_types, fparam, aparam, request_defs - ) + spins = kwargs.get("spin") + if spins is not None: + spins = np.array(spins) + out = self._eval_func(self._eval_model_spin, numb_test, natoms)( + coords, cells, atom_types, spins, fparam, aparam, request_defs + ) + else: + out = self._eval_func(self._eval_model, numb_test, natoms)( + coords, cells, atom_types, fparam, aparam, request_defs + ) return dict( zip( [x.name for x in request_defs], @@ -294,6 +345,7 @@ def _get_request_defs(self, atomic: bool) -> list[OutputVariableDef]: for x in self.output_def.var_defs.values() if x.category in ( + OutputVariableCategory.OUT, OutputVariableCategory.REDU, OutputVariableCategory.DERV_R, OutputVariableCategory.DERV_C_REDU, @@ -669,6 +721,143 @@ def _eval_model( ) return tuple(results) + def _eval_model_spin( + self, + coords: np.ndarray, + cells: np.ndarray | None, + atom_types: np.ndarray, + spins: np.ndarray, + fparam: np.ndarray | None, + aparam: np.ndarray | None, + request_defs: list[OutputVariableDef], + ) -> tuple[np.ndarray, ...]: + nframes = coords.shape[0] + if len(atom_types.shape) == 1: + natoms = len(atom_types) + atom_types = np.tile(atom_types, nframes).reshape(nframes, -1) + else: + natoms = len(atom_types[0]) + + from deepmd.pt_expt.utils.env import ( + DEVICE, + ) + + coord_input = coords.reshape(nframes, natoms, 3) + if self.neighbor_list is not None: + extended_coord, extended_atype, nlist, mapping = self._build_nlist_ase( + coord_input, + cells, + atom_types, + ) + ext_coord_t = torch.tensor( + extended_coord, dtype=torch.float64, device=DEVICE + ) + ext_atype_t = torch.tensor(extended_atype, dtype=torch.int64, device=DEVICE) + nlist_t = torch.tensor(nlist, dtype=torch.int64, device=DEVICE) + mapping_t = torch.tensor(mapping, dtype=torch.int64, device=DEVICE) + else: + coord_t = torch.tensor(coord_input, dtype=torch.float64, device=DEVICE) + atype_t = torch.tensor(atom_types, dtype=torch.int64, device=DEVICE) + cells_t = ( + torch.tensor(cells, dtype=torch.float64, device=DEVICE) + if cells is not None + else None + ) + ext_coord_t, ext_atype_t, nlist_t, mapping_t = self._build_nlist_native( + coord_t, + cells_t, + atype_t, + ) + + # Extend spin to ghost atoms using mapping + spin_t = torch.tensor( + spins.reshape(nframes, natoms, 3), dtype=torch.float64, device=DEVICE + ) + batch_idx = ( + torch.arange(nframes, dtype=torch.long, device=DEVICE) + .unsqueeze(1) + .expand_as(mapping_t) + ) + ext_spin_t = spin_t[batch_idx, mapping_t] + + if fparam is not None: + fparam_t = torch.tensor( + fparam.reshape(nframes, self.get_dim_fparam()), + dtype=torch.float64, + device=DEVICE, + ) + else: + fparam_t = None + + if aparam is not None: + aparam_t = torch.tensor( + aparam.reshape(nframes, natoms, self.get_dim_aparam()), + dtype=torch.float64, + device=DEVICE, + ) + else: + aparam_t = None + + # Call the model with spin (7 args) + if self._is_pt2: + model_ret = self._pt2_runner( + ext_coord_t, + ext_atype_t, + ext_spin_t, + nlist_t, + mapping_t, + fparam_t, + aparam_t, + ) + else: + model_ret = self.exported_module( + ext_coord_t, + ext_atype_t, + ext_spin_t, + nlist_t, + mapping_t, + fparam_t, + aparam_t, + ) + + # Apply communicate_extended_output to map extended atoms → local atoms + do_atomic_virial = any( + x.category == OutputVariableCategory.DERV_C for x in request_defs + ) + + # Save pre-computed reduced virial: it includes both real and virtual + # atom contributions. communicate_extended_output would recompute it + # from only the real-atom per-atom virial, losing the virtual part. + saved_virial_redu = model_ret.get("energy_derv_c_redu") + + model_predict = communicate_extended_output( + model_ret, + self._model_output_def, + mapping_t, + do_atomic_virial=do_atomic_virial, + ) + + # Restore the correct reduced virial (includes virtual atom contribution) + if saved_virial_redu is not None: + model_predict["energy_derv_c_redu"] = saved_virial_redu + + # Translate internal keys to backend names and collect results + results = [] + for odef in request_defs: + if odef.name in model_predict: + shape = self._get_output_shape(odef, nframes, natoms) + if model_predict[odef.name] is not None: + out = model_predict[odef.name].detach().cpu().numpy().reshape(shape) + else: + out = np.full(shape, np.nan, dtype=GLOBAL_NP_FLOAT_PRECISION) + results.append(out) + else: + shape = self._get_output_shape(odef, nframes, natoms) + results.append( + np.full(np.abs(shape), np.nan, dtype=GLOBAL_NP_FLOAT_PRECISION) + ) + return tuple(results) + def _get_output_shape( self, odef: OutputVariableDef, nframes: int, natoms: int ) -> list[int]: diff --git a/deepmd/pt_expt/utils/serialization.py b/deepmd/pt_expt/utils/serialization.py index c8678b4d8d..1974c3e8c8 100644 --- a/deepmd/pt_expt/utils/serialization.py +++ b/deepmd/pt_expt/utils/serialization.py @@ -16,6 +16,26 @@ ) +def _strip_shape_assertions(graph_module: torch.nn.Module) -> None: + """Remove shape-guard assertion nodes from an exported graph. + + ``torch.export`` inserts ``aten._assert_scalar`` nodes for symbolic shape + relationships discovered during tracing (e.g. ``Ne(nall, nloc)``). For the + spin model, these are overly conservative — the model computes correct + results even when ``nall == nloc`` (NoPBC, no ghost atoms). Stripping + them allows the model to accept any valid shape combination. + """ + graph = graph_module.graph + for node in list(graph.nodes): + if ( + node.op == "call_function" + and node.target is torch.ops.aten._assert_scalar.default + ): + graph.erase_node(node) + graph.eliminate_dead_code() + graph_module.recompile() + + def _numpy_to_json_serializable(model_obj: dict) -> dict: """Convert numpy arrays in a model dict to JSON-serializable lists.""" return traverse_model_dict( @@ -49,6 +69,7 @@ def _make_sample_inputs( model: torch.nn.Module, nframes: int = 1, nloc: int = 7, + has_spin: bool = False, ) -> tuple[torch.Tensor, ...]: """Create sample inputs for tracing forward_lower. @@ -60,11 +81,14 @@ def _make_sample_inputs( Number of frames. nloc : int Number of local atoms. + has_spin : bool + If True, create an extended spin tensor and return 7 tensors. Returns ------- tuple - (ext_coord, ext_atype, nlist, mapping, fparam, aparam) + (ext_coord, ext_atype, nlist, mapping, fparam, aparam) or + (ext_coord, ext_atype, ext_spin, nlist, mapping, fparam, aparam) when has_spin. """ rcut = model.get_rcut() sel = model.get_sel() @@ -131,22 +155,31 @@ def _make_sample_inputs( else: aparam = None + if has_spin: + nall = extended_coord.shape[1] + ext_spin = torch.zeros( + nframes, nall, 3, dtype=torch.float64, device=_env.DEVICE + ) + return ext_coord, ext_atype, ext_spin, nlist_t, mapping_t, fparam, aparam + return ext_coord, ext_atype, nlist_t, mapping_t, fparam, aparam def _build_dynamic_shapes( - _ext_coord: torch.Tensor, - _ext_atype: torch.Tensor, - _nlist: torch.Tensor, - _mapping: torch.Tensor, - fparam: torch.Tensor | None, - aparam: torch.Tensor | None, + *sample_inputs: torch.Tensor | None, + has_spin: bool = False, ) -> tuple: """Build dynamic shape specifications for torch.export. Marks nframes, nloc and nall as dynamic dimensions so the exported program handles arbitrary frame and atom counts. + Parameters + ---------- + *sample_inputs : torch.Tensor | None + Sample inputs: either 6 tensors (non-spin) or 7 tensors (spin). + has_spin : bool + Whether the inputs include an extended_spin tensor. Returns a tuple (not dict) to match positional args of the make_fx traced module, whose arg names may have suffixes like ``_1``. """ @@ -154,17 +187,34 @@ def _build_dynamic_shapes( nall_dim = torch.export.Dim("nall", min=1) nloc_dim = torch.export.Dim("nloc", min=1) - return ( - {0: nframes_dim, 1: nall_dim}, # extended_coord: (nframes, nall, 3) - {0: nframes_dim, 1: nall_dim}, # extended_atype: (nframes, nall) - {0: nframes_dim, 1: nloc_dim}, # nlist: (nframes, nloc, nnei) - {0: nframes_dim, 1: nall_dim}, # mapping: (nframes, nall) - {0: nframes_dim} if fparam is not None else None, # fparam - {0: nframes_dim, 1: nloc_dim} if aparam is not None else None, # aparam - ) + if has_spin: + # (ext_coord, ext_atype, ext_spin, nlist, mapping, fparam, aparam) + fparam = sample_inputs[5] + aparam = sample_inputs[6] + return ( + {0: nframes_dim, 1: nall_dim}, # extended_coord: (nframes, nall, 3) + {0: nframes_dim, 1: nall_dim}, # extended_atype: (nframes, nall) + {0: nframes_dim, 1: nall_dim}, # extended_spin: (nframes, nall, 3) + {0: nframes_dim, 1: nloc_dim}, # nlist: (nframes, nloc, nnei) + {0: nframes_dim, 1: nall_dim}, # mapping: (nframes, nall) + {0: nframes_dim} if fparam is not None else None, # fparam + {0: nframes_dim, 1: nloc_dim} if aparam is not None else None, # aparam + ) + else: + # (ext_coord, ext_atype, nlist, mapping, fparam, aparam) + fparam = sample_inputs[4] + aparam = sample_inputs[5] + return ( + {0: nframes_dim, 1: nall_dim}, # extended_coord: (nframes, nall, 3) + {0: nframes_dim, 1: nall_dim}, # extended_atype: (nframes, nall) + {0: nframes_dim, 1: nloc_dim}, # nlist: (nframes, nloc, nnei) + {0: nframes_dim, 1: nall_dim}, # mapping: (nframes, nall) + {0: nframes_dim} if fparam is not None else None, # fparam + {0: nframes_dim, 1: nloc_dim} if aparam is not None else None, # aparam + ) -def _collect_metadata(model: torch.nn.Module) -> dict: +def _collect_metadata(model: torch.nn.Module, is_spin: bool = False) -> dict: """Collect metadata from the model for C++ inference. This metadata is stored as ``metadata.json`` in both .pt2 and .pte archives. @@ -193,7 +243,7 @@ def _collect_metadata(model: torch.nn.Module) -> dict: "intensive": vdef.intensive, } ) - return { + meta = { "type_map": model.get_type_map(), "rcut": model.get_rcut(), "sel": model.get_sel(), @@ -203,7 +253,11 @@ def _collect_metadata(model: torch.nn.Module) -> dict: "has_default_fparam": model.has_default_fparam(), "default_fparam": model.get_default_fparam(), "fitting_output_defs": fitting_output_defs, + "is_spin": is_spin, } + if is_spin: + meta["ntypes_spin"] = model.spin.get_ntypes_spin() + return meta def serialize_from_file(model_file: str) -> dict: @@ -317,46 +371,79 @@ def _trace_and_export( target_device = _env.DEVICE + # Detect spin model + is_spin = "spin" in data["model"] and "backbone_model" in data["model"] + # 1. Deserialize model on CPU for make_fx tracing. # make_fx with _allow_non_fake_inputs=True keeps real model parameters; # on CUDA the autograd engine requires CUDA streams for those real # tensors during torch.autograd.grad, but proxy-tensor dispatch doesn't # set streams up → assertion failure. Tracing on CPU avoids this. - model = BaseModel.deserialize(data["model"]) + if is_spin: + from deepmd.pt_expt.model.spin_model import ( + SpinModel, + ) + + model = SpinModel.deserialize(data["model"]) + else: + model = BaseModel.deserialize(data["model"]) model.to("cpu") model.eval() # 2. Collect metadata - metadata = _collect_metadata(model) + metadata = _collect_metadata(model, is_spin=is_spin) # 3. Create sample inputs on CPU for tracing # Use nframes=2 so make_fx doesn't specialize on nframes=1 _orig_device = _env.DEVICE _env.DEVICE = torch.device("cpu") try: - ext_coord, ext_atype, nlist_t, mapping_t, fparam, aparam = _make_sample_inputs( - model, nframes=2 - ) + sample_inputs = _make_sample_inputs(model, nframes=2, has_spin=is_spin) finally: _env.DEVICE = _orig_device + if is_spin: + ext_coord, ext_atype, ext_spin, nlist_t, mapping_t, fparam, aparam = ( + sample_inputs + ) + else: + ext_coord, ext_atype, nlist_t, mapping_t, fparam, aparam = sample_inputs + # 4. Trace via make_fx on CPU. # This decomposes torch.autograd.grad into aten ops so the resulting # GraphModule no longer contains autograd calls. - traced = model.forward_common_lower_exportable( - ext_coord, - ext_atype, - nlist_t, - mapping_t, - fparam=fparam, - aparam=aparam, - do_atomic_virial=True, - tracing_mode="symbolic", - _allow_non_fake_inputs=True, - ) + if is_spin: + traced = model.forward_common_lower_exportable( + ext_coord, + ext_atype, + ext_spin, + nlist_t, + mapping_t, + fparam=fparam, + aparam=aparam, + do_atomic_virial=True, + tracing_mode="symbolic", + _allow_non_fake_inputs=True, + ) + # 5. Extract output keys from the CPU-traced module. + sample_out = traced( + ext_coord, ext_atype, ext_spin, nlist_t, mapping_t, fparam, aparam + ) + else: + traced = model.forward_common_lower_exportable( + ext_coord, + ext_atype, + nlist_t, + mapping_t, + fparam=fparam, + aparam=aparam, + do_atomic_virial=True, + tracing_mode="symbolic", + _allow_non_fake_inputs=True, + ) + # 5. Extract output keys from the CPU-traced module. + sample_out = traced(ext_coord, ext_atype, nlist_t, mapping_t, fparam, aparam) - # 5. Extract output keys from the CPU-traced module. - sample_out = traced(ext_coord, ext_atype, nlist_t, mapping_t, fparam, aparam) output_keys = list(sample_out.keys()) # 6. Export on CPU. @@ -364,17 +451,25 @@ def _trace_and_export( # graph. Exporting on CPU keeps devices consistent; we move the # ExportedProgram to the target device afterwards via the official # move_to_device_pass (avoids FakeTensor device-propagation errors). - dynamic_shapes = _build_dynamic_shapes( - ext_coord, ext_atype, nlist_t, mapping_t, fparam, aparam - ) + dynamic_shapes = _build_dynamic_shapes(*sample_inputs, has_spin=is_spin) exported = torch.export.export( traced, - (ext_coord, ext_atype, nlist_t, mapping_t, fparam, aparam), + sample_inputs, dynamic_shapes=dynamic_shapes, strict=False, prefer_deferred_runtime_asserts_over_guards=True, ) + if is_spin: + # torch.export re-introduces shape-guard assertions even when + # the make_fx graph has none. The spin model's atom-doubling + # logic creates slice patterns that depend on (nall - nloc), + # producing guards like Ne(nall, nloc). These guards are + # spurious: the model is correct when nall == nloc (NoPBC). + # Strip them from the exported graph so the model can be + # used with any valid nall >= nloc. + _strip_shape_assertions(exported.graph_module) + # 7. Move the exported program to the target device if needed. if target_device.type != "cpu": from torch.export.passes import ( diff --git a/source/api_cc/include/DeepSpinPTExpt.h b/source/api_cc/include/DeepSpinPTExpt.h new file mode 100644 index 0000000000..71e8c33470 --- /dev/null +++ b/source/api_cc/include/DeepSpinPTExpt.h @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +#pragma once + +#ifdef BUILD_PYTORCH +#if __has_include() +#define BUILD_PT_EXPT_SPIN 1 +#else +#define BUILD_PT_EXPT_SPIN 0 +#endif + +#if BUILD_PT_EXPT_SPIN + +#include + +#include "DeepSpin.h" + +namespace torch::inductor { +class AOTIModelPackageLoader; +} + +namespace deepmd { +/** + * @brief PyTorch Exportable (AOTInductor .pt2) implementation for Deep + *Potential with spin. + **/ +class DeepSpinPTExpt : public DeepSpinBackend { + public: + DeepSpinPTExpt(); + virtual ~DeepSpinPTExpt(); + DeepSpinPTExpt(const std::string& model, + const int& gpu_rank = 0, + const std::string& file_content = ""); + void init(const std::string& model, + const int& gpu_rank = 0, + const std::string& file_content = ""); + + private: + /** + * @brief Evaluate with nlist (LAMMPS path — extended forces). + **/ + template + void compute(ENERGYVTYPE& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + /** + * @brief Evaluate without nlist (standalone — builds nlist, folds back). + **/ + template + void compute(ENERGYVTYPE& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + + public: + double cutoff() const { + assert(inited); + return rcut; + }; + int numb_types() const { + assert(inited); + return ntypes; + }; + int numb_types_spin() const { + assert(inited); + return ntypes_spin; + }; + int dim_fparam() const { + assert(inited); + return dfparam; + }; + int dim_aparam() const { + assert(inited); + return daparam; + }; + void get_type_map(std::string& type_map); + bool is_aparam_nall() const { + assert(inited); + return aparam_nall; + }; + bool has_default_fparam() const { + assert(inited); + return has_default_fparam_; + }; + + // forward to template class + void computew(std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + void computew(std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + void computew(std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + void computew(std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + + private: + bool inited; + int ntypes; + int ntypes_spin; + int dfparam; + int daparam; + bool aparam_nall; + bool has_default_fparam_; + std::vector default_fparam_; + double rcut; + int gpu_id; + bool gpu_enabled; + std::vector type_map; + std::vector output_keys; + bool mixed_types; + std::vector sel; + NeighborListData nlist_data; + std::unique_ptr loader; + + std::vector run_model(const torch::Tensor& coord, + const torch::Tensor& atype, + const torch::Tensor& spin, + const torch::Tensor& nlist, + const torch::Tensor& mapping, + const torch::Tensor& fparam, + const torch::Tensor& aparam); + + void extract_outputs(std::map& output_map, + const std::vector& flat_outputs); + + void translate_error(std::function f); +}; + +} // namespace deepmd + +#endif // BUILD_PT_EXPT_SPIN +#endif // BUILD_PYTORCH diff --git a/source/api_cc/src/DeepPotPTExpt.cc b/source/api_cc/src/DeepPotPTExpt.cc index 31f8b41453..86175cfc45 100644 --- a/source/api_cc/src/DeepPotPTExpt.cc +++ b/source/api_cc/src/DeepPotPTExpt.cc @@ -12,550 +12,17 @@ #include "SimulationRegion.h" #include "common.h" +#include "commonPTExpt.h" #include "device.h" #include "errors.h" #include "neighbor_list.h" -// Minimal JSON value parser for reading metadata from .pt2 archives. -// Supports: strings, numbers, booleans, arrays, objects. -// This avoids adding a dependency on nlohmann/json for the api_cc library. -namespace { - -struct JsonValue; -using JsonObject = std::map; -using JsonArray = std::vector; - -struct JsonValue { - enum Type { Null, Bool, Number, String, Array, Object }; - Type type = Null; - bool bool_val = false; - double num_val = 0.0; - std::string str_val; - JsonArray arr_val; - JsonObject obj_val; - - std::string as_string() const { return str_val; } - double as_double() const { return num_val; } - int as_int() const { return static_cast(num_val); } - bool as_bool() const { return bool_val; } - const JsonArray& as_array() const { return arr_val; } - const JsonObject& as_object() const { return obj_val; } - const JsonValue& operator[](const std::string& key) const { - return obj_val.at(key); - } - const JsonValue& operator[](size_t idx) const { return arr_val.at(idx); } - bool has(const std::string& key) const { - return obj_val.find(key) != obj_val.end(); - } -}; - -class JsonParser { - public: - explicit JsonParser(const std::string& s) : s_(s), pos_(0) {} - JsonValue parse() { - skip_ws(); - auto val = parse_value(); - return val; - } - - private: - const std::string& s_; - size_t pos_; - - char peek() const { return pos_ < s_.size() ? s_[pos_] : '\0'; } - char get() { - if (pos_ >= s_.size()) { - throw std::runtime_error("JSON parse error: unexpected end of input"); - } - return s_[pos_++]; - } - void skip_ws() { - while (pos_ < s_.size() && (s_[pos_] == ' ' || s_[pos_] == '\t' || - s_[pos_] == '\n' || s_[pos_] == '\r')) { - ++pos_; - } - } - - JsonValue parse_value() { - skip_ws(); - char c = peek(); - if (c == '"') { - return parse_string_val(); - } else if (c == '{') { - return parse_object(); - } else if (c == '[') { - return parse_array(); - } else if (c == 't' || c == 'f') { - return parse_bool(); - } else if (c == 'n') { - return parse_null(); - } else { - return parse_number(); - } - } - - std::string parse_string_raw() { - get(); // consume '"' - std::string result; - while (pos_ < s_.size() && peek() != '"') { - if (peek() == '\\') { - get(); - char esc = get(); - switch (esc) { - case '"': - result += '"'; - break; - case '\\': - result += '\\'; - break; - case '/': - result += '/'; - break; - case 'n': - result += '\n'; - break; - case 't': - result += '\t'; - break; - case 'r': - result += '\r'; - break; - default: - result += esc; - break; - } - } else { - result += get(); - } - } - get(); // consume closing '"' - return result; - } - - JsonValue parse_string_val() { - JsonValue v; - v.type = JsonValue::String; - v.str_val = parse_string_raw(); - return v; - } - - JsonValue parse_number() { - size_t start = pos_; - if (peek() == '-') { - get(); - } - while (pos_ < s_.size() && - (std::isdigit(s_[pos_]) || s_[pos_] == '.' || s_[pos_] == 'e' || - s_[pos_] == 'E' || s_[pos_] == '+' || s_[pos_] == '-')) { - // handle sign only if after e/E - if ((s_[pos_] == '+' || s_[pos_] == '-') && pos_ > start && - s_[pos_ - 1] != 'e' && s_[pos_ - 1] != 'E') { - break; - } - ++pos_; - } - JsonValue v; - v.type = JsonValue::Number; - try { - v.num_val = std::stod(s_.substr(start, pos_ - start)); - } catch (const std::exception& e) { - throw std::runtime_error("JSON parse error: invalid number at position " + - std::to_string(start)); - } - return v; - } - - JsonValue parse_bool() { - JsonValue v; - v.type = JsonValue::Bool; - if (s_.substr(pos_, 4) == "true") { - v.bool_val = true; - pos_ += 4; - } else if (s_.substr(pos_, 5) == "false") { - v.bool_val = false; - pos_ += 5; - } else { - throw std::runtime_error( - "JSON parse error: expected 'true' or 'false' at position " + - std::to_string(pos_)); - } - return v; - } - - JsonValue parse_null() { - if (s_.substr(pos_, 4) != "null") { - throw std::runtime_error( - "JSON parse error: expected 'null' at position " + - std::to_string(pos_)); - } - pos_ += 4; - return JsonValue(); - } - - JsonValue parse_array() { - get(); // consume '[' - JsonValue v; - v.type = JsonValue::Array; - skip_ws(); - if (peek() == ']') { - get(); - return v; - } - while (true) { - v.arr_val.push_back(parse_value()); - skip_ws(); - if (peek() == ',') { - get(); - } else { - break; - } - } - skip_ws(); - get(); // consume ']' - return v; - } - - JsonValue parse_object() { - get(); // consume '{' - JsonValue v; - v.type = JsonValue::Object; - skip_ws(); - if (peek() == '}') { - get(); - return v; - } - while (true) { - skip_ws(); - std::string key = parse_string_raw(); - skip_ws(); - get(); // consume ':' - v.obj_val[key] = parse_value(); - skip_ws(); - if (peek() == ',') { - get(); - } else { - break; - } - } - skip_ws(); - get(); // consume '}' - return v; - } -}; - -JsonValue parse_json(const std::string& s) { - JsonParser parser(s); - return parser.parse(); -} - -// Read a file from a ZIP archive using caffe2::serialize::PyTorchStreamReader. -// We avoid depending on caffe2 headers by using a simpler approach: -// just read the file directly as a ZIP file. -std::string read_zip_entry(const std::string& zip_path, - const std::string& entry_name) { - // Use a simple approach: scan all possible prefixed names. - // .pt2 files from AOTInductor store extra files at "extra/" - // within the ZIP archive. - std::ifstream ifs(zip_path, std::ios::binary); - if (!ifs.is_open()) { - throw deepmd::deepmd_exception("Cannot open file: " + zip_path); - } - - // Read entire file - std::string content((std::istreambuf_iterator(ifs)), - std::istreambuf_iterator()); - ifs.close(); - - // Simple ZIP central directory parser - // Find End of Central Directory Record (EOCD) - // EOCD signature: 0x06054b50 - // Minimum EOCD size is 22 bytes - if (content.size() < 22) { - throw deepmd::deepmd_exception( - "File too small to be a valid ZIP archive: " + zip_path); - } - size_t eocd_pos = std::string::npos; - for (int64_t i = static_cast(content.size()) - 22; - i >= 0 && static_cast(i) + 3 < content.size(); --i) { - if (content[i] == 0x50 && content[i + 1] == 0x4b && - content[i + 2] == 0x05 && content[i + 3] == 0x06) { - eocd_pos = static_cast(i); - break; - } - } - if (eocd_pos == std::string::npos) { - throw deepmd::deepmd_exception("Invalid ZIP file: " + zip_path); - } - - // Parse EOCD to get central directory offset and size - auto read_u16 = [&](size_t offset) -> uint16_t { - return static_cast(static_cast(content[offset])) | - (static_cast( - static_cast(content[offset + 1])) - << 8); - }; - auto read_u32 = [&](size_t offset) -> uint32_t { - return static_cast(static_cast(content[offset])) | - (static_cast( - static_cast(content[offset + 1])) - << 8) | - (static_cast( - static_cast(content[offset + 2])) - << 16) | - (static_cast( - static_cast(content[offset + 3])) - << 24); - }; - - uint64_t num_entries = read_u16(eocd_pos + 10); - uint64_t cd_offset = read_u32(eocd_pos + 16); - - // If this is a ZIP64 file, look for the ZIP64 EOCD locator - if (cd_offset == 0xFFFFFFFF || num_entries == 0xFFFF) { - // ZIP64 EOCD locator signature: 0x07064b50 - // It should be right before the EOCD (20 bytes) - if (eocd_pos < 20) { - throw deepmd::deepmd_exception( - "Invalid ZIP64 file (truncated EOCD locator): " + zip_path); - } - size_t zip64_locator_pos = eocd_pos - 20; - if (content[zip64_locator_pos] == 0x50 && - content[zip64_locator_pos + 1] == 0x4b && - content[zip64_locator_pos + 2] == 0x06 && - content[zip64_locator_pos + 3] == 0x07) { - // Read ZIP64 EOCD offset from locator - uint64_t zip64_eocd_offset = 0; - for (int b = 0; b < 8; ++b) { - zip64_eocd_offset |= static_cast(static_cast( - content[zip64_locator_pos + 8 + b])) - << (8 * b); - } - // Parse ZIP64 EOCD - // ZIP64 EOCD signature: 0x06064b50 - size_t z64_pos = static_cast(zip64_eocd_offset); - if (z64_pos + 56 > content.size()) { - throw deepmd::deepmd_exception( - "Invalid ZIP64 file (truncated EOCD record): " + zip_path); - } - // num entries at offset 32 (8 bytes in ZIP64) - num_entries = 0; - for (int b = 0; b < 8; ++b) { - num_entries |= static_cast(static_cast( - content[z64_pos + 32 + b])) - << (8 * b); - } - // cd offset at offset 48 (8 bytes in ZIP64) - cd_offset = 0; - for (int b = 0; b < 8; ++b) { - cd_offset |= static_cast( - static_cast(content[z64_pos + 48 + b])) - << (8 * b); - } - } - } - - // Iterate central directory entries - size_t pos = cd_offset; - for (uint64_t i = 0; i < num_entries; ++i) { - // Central directory entry signature: 0x02014b50 - if (pos + 46 > content.size()) { - break; - } - uint16_t name_len = read_u16(pos + 28); - uint16_t extra_len = read_u16(pos + 30); - uint16_t comment_len = read_u16(pos + 32); - uint32_t compressed_size_u32 = read_u32(pos + 20); - uint32_t uncompressed_size_u32 = read_u32(pos + 24); - uint32_t local_header_offset_u32 = read_u32(pos + 42); - - // Use 64-bit types so ZIP64 values are not truncated - uint64_t compressed_size = compressed_size_u32; - uint64_t uncompressed_size = uncompressed_size_u32; - uint64_t local_header_offset = local_header_offset_u32; - - std::string name = content.substr(pos + 46, name_len); - - // Handle ZIP64 extra field for large files - if (uncompressed_size_u32 == 0xFFFFFFFF || - local_header_offset_u32 == 0xFFFFFFFF) { - // Parse ZIP64 extended information extra field - size_t extra_pos = pos + 46 + name_len; - size_t extra_end = extra_pos + extra_len; - while (extra_pos + 4 <= extra_end) { - uint16_t field_id = read_u16(extra_pos); - uint16_t field_size = read_u16(extra_pos + 2); - if (field_id == 0x0001) { // ZIP64 extra field - size_t field_data = extra_pos + 4; - int offset_in_field = 0; - if (uncompressed_size_u32 == 0xFFFFFFFF) { - uncompressed_size = 0; - for (int b = 0; b < 8; ++b) { - uncompressed_size |= - static_cast(static_cast( - content[field_data + offset_in_field + b])) - << (8 * b); - } - offset_in_field += 8; - } - if (compressed_size_u32 == 0xFFFFFFFF) { - compressed_size = 0; - for (int b = 0; b < 8; ++b) { - compressed_size |= - static_cast(static_cast( - content[field_data + offset_in_field + b])) - << (8 * b); - } - offset_in_field += 8; - } - if (local_header_offset_u32 == 0xFFFFFFFF) { - local_header_offset = 0; - for (int b = 0; b < 8; ++b) { - local_header_offset |= - static_cast(static_cast( - content[field_data + offset_in_field + b])) - << (8 * b); - } - } - break; - } - extra_pos += 4 + field_size; - } - } - - // Match exact name or suffix (handles archives with directory prefixes, - // e.g. "model/extra/metadata.json" matches "extra/metadata.json") - bool match = (name == entry_name); - if (!match && name.size() > entry_name.size()) { - size_t suffix_start = name.size() - entry_name.size(); - if (name[suffix_start - 1] == '/' && - name.substr(suffix_start) == entry_name) { - match = true; - } - } - if (match) { - // Read from local file header - uint16_t local_name_len = read_u16(local_header_offset + 26); - uint16_t local_extra_len = read_u16(local_header_offset + 28); - size_t data_offset = - local_header_offset + 30 + local_name_len + local_extra_len; - return content.substr(data_offset, uncompressed_size); - } - - pos += 46 + name_len + extra_len + comment_len; - } - - throw deepmd::deepmd_exception("Entry not found in ZIP: " + entry_name + - " in " + zip_path); -} - -} // namespace +using deepmd::ptexpt::buildTypeSortedNlist; +using deepmd::ptexpt::parse_json; +using deepmd::ptexpt::read_zip_entry; using namespace deepmd; -/** - * @brief Convert a raw neighbor list to the sel-limited format expected by the - * pt_expt model. - * - * For non-mixed-type models (distinguish_types=true): the nlist has shape - * (nframes, nloc, sum(sel)), where the first sel[0] entries are neighbors of - * type 0, the next sel[1] are type 1, etc. Within each type group neighbors - * are sorted by distance (ascending). - * - * For mixed-type models (distinguish_types=false): all neighbors go into a - * single group sorted by distance, truncated to sum(sel). - * - * Missing slots are filled with -1. - * - * @param[in] raw_nlist Raw neighbor list (nloc x variable-nnei). - * @param[in] coord_ext Extended coordinates (nall x 3), flat. - * @param[in] atype_ext Extended atom types (nall). - * @param[in] sel Per-type neighbor selection counts. - * @param[in] nloc Number of local atoms. - * @param[in] mixed_types Whether the model uses mixed types - * (distinguish_types=false). - * @return Tensor of shape (1, nloc, sum(sel)), dtype int64. - */ -template -torch::Tensor buildTypeSortedNlist( - const std::vector>& raw_nlist, - const std::vector& coord_ext, - const std::vector& atype_ext, - const std::vector& sel, - int nloc, - bool mixed_types) { - int nsel = 0; - for (auto s : sel) { - nsel += s; - } - int ntypes = sel.size(); - std::vector result(static_cast(nloc) * nsel, -1); - - for (int ii = 0; ii < nloc; ++ii) { - const auto& neighbors = raw_nlist[ii]; - VALUETYPE xi = coord_ext[ii * 3 + 0]; - VALUETYPE yi = coord_ext[ii * 3 + 1]; - VALUETYPE zi = coord_ext[ii * 3 + 2]; - int offset = ii * nsel; - - if (mixed_types) { - // Mixed-type: all neighbors in one group, sort by distance - std::vector> all_neighbors; - for (int jj : neighbors) { - if (jj < 0) { - continue; - } - int jtype = atype_ext[jj]; - if (jtype < 0) { - continue; // skip invalid atoms - } - VALUETYPE dx = coord_ext[jj * 3 + 0] - xi; - VALUETYPE dy = coord_ext[jj * 3 + 1] - yi; - VALUETYPE dz = coord_ext[jj * 3 + 2] - zi; - VALUETYPE rr = dx * dx + dy * dy + dz * dz; - all_neighbors.emplace_back(rr, jj); - } - std::sort(all_neighbors.begin(), all_neighbors.end()); - int count = std::min(static_cast(all_neighbors.size()), nsel); - for (int kk = 0; kk < count; ++kk) { - result[offset + kk] = all_neighbors[kk].second; - } - } else { - // Non-mixed-type: group by type, sort each group - std::vector>> by_type(ntypes); - for (int jj : neighbors) { - if (jj < 0) { - continue; - } - int jtype = atype_ext[jj]; - if (jtype < 0 || jtype >= ntypes) { - continue; // skip virtual/unknown type atoms - } - VALUETYPE dx = coord_ext[jj * 3 + 0] - xi; - VALUETYPE dy = coord_ext[jj * 3 + 1] - yi; - VALUETYPE dz = coord_ext[jj * 3 + 2] - zi; - VALUETYPE rr = dx * dx + dy * dy + dz * dz; - by_type[jtype].emplace_back(rr, jj); - } - int col = 0; - for (int tt = 0; tt < ntypes; ++tt) { - auto& group = by_type[tt]; - std::sort(group.begin(), group.end()); - int count = std::min(static_cast(group.size()), sel[tt]); - for (int kk = 0; kk < count; ++kk) { - result[offset + col + kk] = group[kk].second; - } - col += sel[tt]; - } - } - } - - torch::Tensor tensor = - torch::from_blob(result.data(), {1, nloc, nsel}, - torch::TensorOptions().dtype(torch::kInt64)) - .clone(); - return tensor; -} - void DeepPotPTExpt::translate_error(std::function f) { try { f(); @@ -1160,31 +627,6 @@ void DeepPotPTExpt::compute(ENERGYVTYPE& ener, } } -template void DeepPotPTExpt::compute>( - std::vector& ener, - std::vector& force, - std::vector& virial, - std::vector& atom_energy, - std::vector& atom_virial, - const std::vector& coord, - const std::vector& atype, - const std::vector& box, - const std::vector& fparam, - const std::vector& aparam, - const bool atomic); -template void DeepPotPTExpt::compute>( - std::vector& ener, - std::vector& force, - std::vector& virial, - std::vector& atom_energy, - std::vector& atom_virial, - const std::vector& coord, - const std::vector& atype, - const std::vector& box, - const std::vector& fparam, - const std::vector& aparam, - const bool atomic); - template void DeepPotPTExpt::compute_nframes(ENERGYVTYPE& ener, std::vector& force, @@ -1244,6 +686,31 @@ void DeepPotPTExpt::compute_nframes(ENERGYVTYPE& ener, } } +template void DeepPotPTExpt::compute>( + std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); +template void DeepPotPTExpt::compute>( + std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + void DeepPotPTExpt::get_type_map(std::string& type_map_str) { for (const auto& t : type_map) { type_map_str += t; diff --git a/source/api_cc/src/DeepSpin.cc b/source/api_cc/src/DeepSpin.cc index eb37828410..b5a57acd35 100644 --- a/source/api_cc/src/DeepSpin.cc +++ b/source/api_cc/src/DeepSpin.cc @@ -11,6 +11,7 @@ #endif #ifdef BUILD_PYTORCH #include "DeepSpinPT.h" +#include "DeepSpinPTExpt.h" #endif #include "device.h" @@ -48,6 +49,14 @@ void DeepSpin::init(const std::string& model, dp = std::make_shared(model, gpu_rank, file_content); #else throw deepmd::deepmd_exception("PyTorch backend is not built"); +#endif + } else if (deepmd::DPBackend::PyTorchExportable == backend) { +#if defined(BUILD_PYTORCH) && BUILD_PT_EXPT_SPIN + dp = + std::make_shared(model, gpu_rank, file_content); +#else + throw deepmd::deepmd_exception( + "PyTorch Exportable backend is not available"); #endif } else if (deepmd::DPBackend::Paddle == backend) { throw deepmd::deepmd_exception("PaddlePaddle backend is not supported yet"); diff --git a/source/api_cc/src/DeepSpinPTExpt.cc b/source/api_cc/src/DeepSpinPTExpt.cc new file mode 100644 index 0000000000..9484b5e34f --- /dev/null +++ b/source/api_cc/src/DeepSpinPTExpt.cc @@ -0,0 +1,793 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +#include "DeepSpinPTExpt.h" + +#if defined(BUILD_PYTORCH) && BUILD_PT_EXPT_SPIN +#include + +#include +#include +#include +#include +#include + +#include "SimulationRegion.h" +#include "common.h" +#include "commonPTExpt.h" +#include "device.h" +#include "errors.h" +#include "neighbor_list.h" + +using deepmd::ptexpt::buildTypeSortedNlist; +using deepmd::ptexpt::parse_json; +using deepmd::ptexpt::read_zip_entry; + +using namespace deepmd; + +void DeepSpinPTExpt::translate_error(std::function f) { + try { + f(); + } catch (const c10::Error& e) { + throw deepmd::deepmd_exception( + "DeePMD-kit PyTorch Exportable backend error: " + + std::string(e.what())); + } catch (const deepmd::deepmd_exception&) { + throw; + } catch (const std::exception& e) { + throw deepmd::deepmd_exception( + "DeePMD-kit PyTorch Exportable backend error: " + + std::string(e.what())); + } +} + +DeepSpinPTExpt::DeepSpinPTExpt() : inited(false) {} + +DeepSpinPTExpt::DeepSpinPTExpt(const std::string& model, + const int& gpu_rank, + const std::string& file_content) + : inited(false) { + try { + translate_error([&] { init(model, gpu_rank, file_content); }); + } catch (...) { + throw; + } +} + +void DeepSpinPTExpt::init(const std::string& model, + const int& gpu_rank, + const std::string& file_content) { + if (inited) { + std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " + "nothing at the second call of initializer" + << std::endl; + return; + } + + if (!file_content.empty()) { + throw deepmd::deepmd_exception( + "In-memory file_content loading is not supported for .pt2 models. " + "Please provide a file path instead."); + } + + int gpu_num = torch::cuda::device_count(); + gpu_id = (gpu_num > 0) ? (gpu_rank % gpu_num) : 0; + gpu_enabled = torch::cuda::is_available(); + + std::string device_str; + if (!gpu_enabled) { + device_str = "cpu"; + std::cout << "load model from: " << model << " to cpu" << std::endl; + } else { +#if GOOGLE_CUDA || TENSORFLOW_USE_ROCM + DPErrcheck(DPSetDevice(gpu_id)); +#endif + device_str = "cuda:" + std::to_string(gpu_id); + std::cout << "load model from: " << model << " to gpu " << gpu_id + << std::endl; + } + + // Read metadata from the .pt2 ZIP archive + std::string metadata_json = read_zip_entry(model, "extra/metadata.json"); + + auto metadata = parse_json(metadata_json); + rcut = metadata["rcut"].as_double(); + ntypes = static_cast(metadata["type_map"].as_array().size()); + dfparam = metadata["dim_fparam"].as_int(); + daparam = metadata["dim_aparam"].as_int(); + mixed_types = metadata["mixed_types"].as_bool(); + aparam_nall = false; + + // Spin-specific metadata + if (metadata.obj_val.count("ntypes_spin")) { + ntypes_spin = metadata["ntypes_spin"].as_int(); + } else { + ntypes_spin = 0; + } + + if (metadata.obj_val.count("has_default_fparam")) { + has_default_fparam_ = metadata["has_default_fparam"].as_bool(); + } else { + has_default_fparam_ = false; + } + if (has_default_fparam_) { + if (metadata.obj_val.count("default_fparam")) { + default_fparam_.clear(); + for (const auto& v : metadata["default_fparam"].as_array()) { + default_fparam_.push_back(v.as_double()); + } + if (static_cast(default_fparam_.size()) != dfparam) { + throw deepmd::deepmd_exception( + "default_fparam length (" + std::to_string(default_fparam_.size()) + + ") does not match dim_fparam (" + std::to_string(dfparam) + ")."); + } + } else { + std::cerr << "WARNING: Model has has_default_fparam=true but " + "default_fparam values are missing from metadata." + << std::endl; + } + } + + type_map.clear(); + for (const auto& v : metadata["type_map"].as_array()) { + type_map.push_back(v.as_string()); + } + + sel.clear(); + for (const auto& v : metadata["sel"].as_array()) { + sel.push_back(v.as_int()); + } + + output_keys.clear(); + for (const auto& v : metadata["output_keys"].as_array()) { + output_keys.push_back(v.as_string()); + } + + // Load the AOTInductor model package + loader = std::make_unique( + model, "model", false, 1, + gpu_enabled ? static_cast(gpu_id) + : static_cast(-1)); + + int num_intra_nthreads, num_inter_nthreads; + get_env_nthreads(num_intra_nthreads, num_inter_nthreads); + if (num_inter_nthreads) { + try { + at::set_num_interop_threads(num_inter_nthreads); + } catch (...) { + } + } + if (num_intra_nthreads) { + try { + at::set_num_threads(num_intra_nthreads); + } catch (...) { + } + } + + inited = true; +} + +DeepSpinPTExpt::~DeepSpinPTExpt() {} + +std::vector DeepSpinPTExpt::run_model( + const torch::Tensor& coord, + const torch::Tensor& atype, + const torch::Tensor& spin, + const torch::Tensor& nlist, + const torch::Tensor& mapping, + const torch::Tensor& fparam, + const torch::Tensor& aparam) { + // Spin model has 7 positional args: coord, atype, spin, nlist, mapping, + // fparam, aparam Only include fparam/aparam if the model was exported with + // them. + std::vector inputs = {coord, atype, spin, nlist, mapping}; + if (dfparam > 0) { + inputs.push_back(fparam); + } + if (daparam > 0) { + inputs.push_back(aparam); + } + return loader->run(inputs); +} + +void DeepSpinPTExpt::extract_outputs( + std::map& output_map, + const std::vector& flat_outputs) { + if (flat_outputs.size() != output_keys.size()) { + throw deepmd::deepmd_exception( + "Model returned " + std::to_string(flat_outputs.size()) + + " outputs but expected " + std::to_string(output_keys.size()) + + " (from metadata.json)"); + } + for (size_t i = 0; i < output_keys.size(); ++i) { + output_map[output_keys[i]] = flat_outputs[i]; + } +} + +// ============================================================================ +// LAMMPS path: compute with pre-built neighbor list +// ============================================================================ + +template +void DeepSpinPTExpt::compute(ENERGYVTYPE& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + torch::Device device(torch::kCUDA, gpu_id); + if (!gpu_enabled) { + device = torch::Device(torch::kCPU); + } + int natoms = atype.size(); + auto options = torch::TensorOptions().dtype(torch::kFloat64); + torch::ScalarType floatType = torch::kFloat64; + if (std::is_same::value) { + floatType = torch::kFloat32; + } + auto int_option = + torch::TensorOptions().device(torch::kCPU).dtype(torch::kInt64); + + // Select real atoms (filter NULL-type atoms) + std::vector dcoord, dforce, dforce_mag, aparam_, datom_energy, + datom_virial; + std::vector datype, fwd_map, bkw_map; + int nghost_real, nall_real, nloc_real; + int nall = natoms; + select_real_atoms_coord(dcoord, datype, aparam_, nghost_real, fwd_map, + bkw_map, nall_real, nloc_real, coord, atype, aparam, + nghost, ntypes, 1, daparam, nall, aparam_nall); + int nloc = nall_real - nghost_real; + int nframes = 1; + + // Build spin tensor for real atoms using bkw_map + std::vector dspin(static_cast(nall_real) * 3); + for (int ii = 0; ii < nall_real; ++ii) { + for (int dd = 0; dd < 3; ++dd) { + dspin[static_cast(ii) * 3 + dd] = + spin[static_cast(bkw_map[ii]) * 3 + dd]; + } + } + + // Convert coord and spin to float64 + std::vector coord_d(dcoord.begin(), dcoord.end()); + std::vector spin_d(dspin.begin(), dspin.end()); + at::Tensor coord_Tensor = + torch::from_blob(coord_d.data(), {1, nall_real, 3}, options) + .clone() + .to(device); + at::Tensor spin_Tensor = + torch::from_blob(spin_d.data(), {1, nall_real, 3}, options) + .clone() + .to(device); + std::vector atype_64(datype.begin(), datype.end()); + at::Tensor atype_Tensor = + torch::from_blob(atype_64.data(), {1, nall_real}, int_option) + .clone() + .to(device); + + if (ago == 0) { + nlist_data.copy_from_nlist(lmp_list, nall - nghost); + nlist_data.shuffle_exclude_empty(fwd_map); + nlist_data.padding(); + } + at::Tensor firstneigh_tensor = + buildTypeSortedNlist(nlist_data.jlist, coord_d, datype, sel, nloc, + mixed_types) + .to(device); + + // Build mapping tensor + at::Tensor mapping_tensor; + if (lmp_list.mapping) { + std::vector mapping(nall_real); + for (int ii = 0; ii < nall_real; ii++) { + mapping[ii] = fwd_map[lmp_list.mapping[bkw_map[ii]]]; + } + mapping_tensor = + torch::from_blob(mapping.data(), {1, nall_real}, int_option) + .clone() + .to(device); + } else { + std::vector mapping(nall_real); + for (int ii = 0; ii < nall_real; ii++) { + mapping[ii] = ii; + } + mapping_tensor = + torch::from_blob(mapping.data(), {1, nall_real}, int_option) + .clone() + .to(device); + } + + // Build fparam/aparam tensors + auto valuetype_options = std::is_same::value + ? torch::TensorOptions().dtype(torch::kFloat32) + : torch::TensorOptions().dtype(torch::kFloat64); + at::Tensor fparam_tensor; + if (!fparam.empty()) { + fparam_tensor = + torch::from_blob(const_cast(fparam.data()), + {1, static_cast(fparam.size())}, + valuetype_options) + .to(torch::kFloat64) + .to(device); + } else if (has_default_fparam_ && !default_fparam_.empty()) { + fparam_tensor = + torch::from_blob(const_cast(default_fparam_.data()), + {1, static_cast(default_fparam_.size())}, + options) + .clone() + .to(device); + } else if (has_default_fparam_) { + throw deepmd::deepmd_exception( + "fparam is empty and default_fparam values are missing from the .pt2 " + "metadata. Please regenerate the model or provide fparam explicitly."); + } else { + fparam_tensor = torch::zeros({0}, options).to(device); + } + + at::Tensor aparam_tensor; + if (!aparam_.empty()) { + aparam_tensor = + torch::from_blob( + const_cast(aparam_.data()), + {1, nloc, static_cast(aparam_.size()) / nloc}, + valuetype_options) + .to(torch::kFloat64) + .to(device); + } else { + aparam_tensor = torch::zeros({0}, options).to(device); + } + + // Run the .pt2 model (7 args for spin) + auto flat_outputs = + run_model(coord_Tensor, atype_Tensor, spin_Tensor, firstneigh_tensor, + mapping_tensor, fparam_tensor, aparam_tensor); + + std::map output_map; + extract_outputs(output_map, flat_outputs); + + // Extract energy + torch::Tensor flat_energy_ = + output_map["energy_redu"].view({-1}).to(torch::kCPU); + ener.assign(flat_energy_.data_ptr(), + flat_energy_.data_ptr() + flat_energy_.numel()); + + // Extract force: energy_derv_r (nf, nall, 1, 3) -> (nf, nall, 3) + torch::Tensor force_tensor = + output_map["energy_derv_r"].squeeze(-2).view({-1}).to(floatType); + torch::Tensor cpu_force_ = force_tensor.to(torch::kCPU); + dforce.assign(cpu_force_.data_ptr(), + cpu_force_.data_ptr() + cpu_force_.numel()); + + // Extract force_mag: energy_derv_r_mag (nf, nall, 1, 3) -> (nf, nall, 3) + torch::Tensor force_mag_tensor = + output_map["energy_derv_r_mag"].squeeze(-2).view({-1}).to(floatType); + torch::Tensor cpu_force_mag_ = force_mag_tensor.to(torch::kCPU); + dforce_mag.assign( + cpu_force_mag_.data_ptr(), + cpu_force_mag_.data_ptr() + cpu_force_mag_.numel()); + + // Extract virial + torch::Tensor virial_tensor = + output_map["energy_derv_c_redu"].squeeze(-2).view({-1}).to(floatType); + torch::Tensor cpu_virial_ = virial_tensor.to(torch::kCPU); + virial.assign(cpu_virial_.data_ptr(), + cpu_virial_.data_ptr() + cpu_virial_.numel()); + + // bkw map: map force from real atoms back to full atom list + force.resize(static_cast(nframes) * fwd_map.size() * 3); + force_mag.resize(static_cast(nframes) * fwd_map.size() * 3); + select_map(force, dforce, bkw_map, 3, nframes, fwd_map.size(), + nall_real); + select_map(force_mag, dforce_mag, bkw_map, 3, nframes, + fwd_map.size(), nall_real); + + if (atomic) { + torch::Tensor atom_energy_tensor = + output_map["energy"].view({-1}).to(floatType); + torch::Tensor cpu_atom_energy_ = atom_energy_tensor.to(torch::kCPU); + datom_energy.resize(nall_real, 0.0); + datom_energy.assign( + cpu_atom_energy_.data_ptr(), + cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); + + torch::Tensor atom_virial_tensor = + output_map["energy_derv_c"].squeeze(-2).view({-1}).to(floatType); + torch::Tensor cpu_atom_virial_ = atom_virial_tensor.to(torch::kCPU); + datom_virial.assign( + cpu_atom_virial_.data_ptr(), + cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); + + atom_energy.resize(static_cast(nframes) * fwd_map.size()); + atom_virial.resize(static_cast(nframes) * fwd_map.size() * 9); + select_map(atom_energy, datom_energy, bkw_map, 1, nframes, + fwd_map.size(), nall_real); + select_map(atom_virial, datom_virial, bkw_map, 9, nframes, + fwd_map.size(), nall_real); + } +} + +template void DeepSpinPTExpt::compute>( + std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); +template void DeepSpinPTExpt::compute>( + std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + +// ============================================================================ +// Standalone path: compute without pre-built neighbor list +// ============================================================================ + +template +void DeepSpinPTExpt::compute(ENERGYVTYPE& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + int natoms = atype.size(); + + torch::Device device(torch::kCUDA, gpu_id); + if (!gpu_enabled) { + device = torch::Device(torch::kCPU); + } + + auto options = torch::TensorOptions().dtype(torch::kFloat64); + torch::ScalarType floatType = torch::kFloat64; + if (std::is_same::value) { + floatType = torch::kFloat32; + } + auto int_options = torch::TensorOptions().dtype(torch::kInt64); + int nframes = 1; + + // 1. Handle box: if empty (NoPbc), create a fake box large enough + std::vector coord_d(coord.begin(), coord.end()); + std::vector spin_d(spin.begin(), spin.end()); + std::vector box_d(box.begin(), box.end()); + if (box_d.empty()) { + double min_x = coord_d[0], max_x = coord_d[0]; + double min_y = coord_d[1], max_y = coord_d[1]; + double min_z = coord_d[2], max_z = coord_d[2]; + for (int ii = 1; ii < natoms; ++ii) { + min_x = std::min(min_x, coord_d[ii * 3 + 0]); + max_x = std::max(max_x, coord_d[ii * 3 + 0]); + min_y = std::min(min_y, coord_d[ii * 3 + 1]); + max_y = std::max(max_y, coord_d[ii * 3 + 1]); + min_z = std::min(min_z, coord_d[ii * 3 + 2]); + max_z = std::max(max_z, coord_d[ii * 3 + 2]); + } + box_d.resize(9, 0.0); + box_d[0] = (max_x - min_x) + 2.0 * rcut; + box_d[4] = (max_y - min_y) + 2.0 * rcut; + box_d[8] = (max_z - min_z) + 2.0 * rcut; + } + + // 2. Extend coords with ghosts + std::vector coord_cpy_d; + std::vector atype_cpy, mapping_vec; + std::vector ncell, ngcell; + { + SimulationRegion region; + region.reinitBox(&box_d[0]); + copy_coord(coord_cpy_d, atype_cpy, mapping_vec, ncell, ngcell, coord_d, + atype, static_cast(rcut), region); + } + + int nloc = natoms; + int nall = coord_cpy_d.size() / 3; + + // 2b. Extend spin to ghost atoms using mapping + std::vector spin_cpy_d(static_cast(nall) * 3, 0.0); + for (int ii = 0; ii < nloc; ++ii) { + for (int dd = 0; dd < 3; ++dd) { + spin_cpy_d[static_cast(ii) * 3 + dd] = + spin_d[static_cast(ii) * 3 + dd]; + } + } + for (int ii = nloc; ii < nall; ++ii) { + int li = mapping_vec[ii]; + for (int dd = 0; dd < 3; ++dd) { + spin_cpy_d[static_cast(ii) * 3 + dd] = + spin_d[static_cast(li) * 3 + dd]; + } + } + + // 3. Build neighbor list on extended coords + std::vector> nlist_raw, nlist_r_cpy; + { + SimulationRegion region; + region.reinitBox(&box_d[0]); + std::vector nat_stt(3, 0), ext_stt(3), ext_end(3); + for (int dd = 0; dd < 3; ++dd) { + ext_stt[dd] = -ngcell[dd]; + ext_end[dd] = ncell[dd] + ngcell[dd]; + } + build_nlist(nlist_raw, nlist_r_cpy, coord_cpy_d, nloc, rcut, rcut, nat_stt, + ncell, ext_stt, ext_end, region, ncell); + } + + // 4. Convert to tensors + at::Tensor coord_Tensor = + torch::from_blob(coord_cpy_d.data(), {1, nall, 3}, options) + .clone() + .to(device); + at::Tensor spin_Tensor = + torch::from_blob(spin_cpy_d.data(), {1, nall, 3}, options) + .clone() + .to(device); + std::vector atype_64(atype_cpy.begin(), atype_cpy.end()); + at::Tensor atype_Tensor = + torch::from_blob(atype_64.data(), {1, nall}, int_options) + .clone() + .to(device); + at::Tensor nlist_tensor = + buildTypeSortedNlist(nlist_raw, coord_cpy_d, atype_cpy, sel, nloc, + mixed_types) + .to(device); + std::vector mapping_64(mapping_vec.begin(), mapping_vec.end()); + at::Tensor mapping_tensor = + torch::from_blob(mapping_64.data(), {1, nall}, int_options) + .clone() + .to(device); + + // Build fparam/aparam tensors + auto valuetype_options = std::is_same::value + ? torch::TensorOptions().dtype(torch::kFloat32) + : torch::TensorOptions().dtype(torch::kFloat64); + at::Tensor fparam_tensor; + if (!fparam.empty()) { + fparam_tensor = + torch::from_blob(const_cast(fparam.data()), + {1, static_cast(fparam.size())}, + valuetype_options) + .to(torch::kFloat64) + .to(device); + } else if (has_default_fparam_ && !default_fparam_.empty()) { + fparam_tensor = + torch::from_blob(const_cast(default_fparam_.data()), + {1, static_cast(default_fparam_.size())}, + options) + .clone() + .to(device); + } else if (has_default_fparam_) { + throw deepmd::deepmd_exception( + "fparam is empty and default_fparam values are missing from the .pt2 " + "metadata. Please regenerate the model or provide fparam explicitly."); + } else { + fparam_tensor = torch::zeros({0}, options).to(device); + } + + at::Tensor aparam_tensor; + if (!aparam.empty()) { + aparam_tensor = + torch::from_blob( + const_cast(aparam.data()), + {1, natoms, static_cast(aparam.size()) / natoms}, + valuetype_options) + .to(torch::kFloat64) + .to(device); + } else { + aparam_tensor = torch::zeros({0}, options).to(device); + } + + // 5. Run the .pt2 model (7 args for spin) + auto flat_outputs = + run_model(coord_Tensor, atype_Tensor, spin_Tensor, nlist_tensor, + mapping_tensor, fparam_tensor, aparam_tensor); + + // 6. Extract outputs + std::map output_map; + extract_outputs(output_map, flat_outputs); + + // 7. Extract energy + torch::Tensor flat_energy_ = + output_map["energy_redu"].view({-1}).to(torch::kCPU); + ener.assign(flat_energy_.data_ptr(), + flat_energy_.data_ptr() + flat_energy_.numel()); + + // 8. Extract virial + torch::Tensor virial_tensor = + output_map["energy_derv_c_redu"].squeeze(-2).view({-1}).to(floatType); + torch::Tensor cpu_virial_ = virial_tensor.to(torch::kCPU); + virial.assign(cpu_virial_.data_ptr(), + cpu_virial_.data_ptr() + cpu_virial_.numel()); + + // 9. Extract force and fold back: energy_derv_r (nf, nall, 1, 3) + torch::Tensor force_ext = + output_map["energy_derv_r"].squeeze(-2).view({-1}).to(floatType); + torch::Tensor cpu_force_ext = force_ext.to(torch::kCPU); + std::vector extended_force( + cpu_force_ext.data_ptr(), + cpu_force_ext.data_ptr() + cpu_force_ext.numel()); + fold_back(force, extended_force, mapping_vec, nloc, nall, 3, nframes); + + // 10. Extract force_mag and fold back: energy_derv_r_mag (nf, nall, 1, 3) + torch::Tensor force_mag_ext = + output_map["energy_derv_r_mag"].squeeze(-2).view({-1}).to(floatType); + torch::Tensor cpu_force_mag_ext = force_mag_ext.to(torch::kCPU); + std::vector extended_force_mag( + cpu_force_mag_ext.data_ptr(), + cpu_force_mag_ext.data_ptr() + cpu_force_mag_ext.numel()); + fold_back(force_mag, extended_force_mag, mapping_vec, nloc, nall, 3, nframes); + + if (atomic) { + // atom_energy: energy (nf, nloc, 1) + torch::Tensor atom_energy_tensor = + output_map["energy"].view({-1}).to(floatType); + torch::Tensor cpu_atom_energy_ = atom_energy_tensor.to(torch::kCPU); + atom_energy.assign( + cpu_atom_energy_.data_ptr(), + cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); + + // atom_virial: energy_derv_c (nf, nall, 1, 9) -> fold back + torch::Tensor atom_virial_ext = + output_map["energy_derv_c"].squeeze(-2).view({-1}).to(floatType); + torch::Tensor cpu_atom_virial_ext = atom_virial_ext.to(torch::kCPU); + std::vector extended_atom_virial( + cpu_atom_virial_ext.data_ptr(), + cpu_atom_virial_ext.data_ptr() + + cpu_atom_virial_ext.numel()); + fold_back(atom_virial, extended_atom_virial, mapping_vec, nloc, nall, 9, + nframes); + } +} + +template void DeepSpinPTExpt::compute>( + std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); +template void DeepSpinPTExpt::compute>( + std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + +void DeepSpinPTExpt::get_type_map(std::string& type_map_str) { + for (const auto& t : type_map) { + type_map_str += t; + type_map_str += " "; + } +} + +// forward to template method +void DeepSpinPTExpt::computew(std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + translate_error([&] { + compute(ener, force, force_mag, virial, atom_energy, atom_virial, coord, + spin, atype, box, fparam, aparam, atomic); + }); +} +void DeepSpinPTExpt::computew(std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + translate_error([&] { + compute(ener, force, force_mag, virial, atom_energy, atom_virial, coord, + spin, atype, box, fparam, aparam, atomic); + }); +} +void DeepSpinPTExpt::computew(std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + translate_error([&] { + compute(ener, force, force_mag, virial, atom_energy, atom_virial, coord, + spin, atype, box, nghost, inlist, ago, fparam, aparam, atomic); + }); +} +void DeepSpinPTExpt::computew(std::vector& ener, + std::vector& force, + std::vector& force_mag, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& spin, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + translate_error([&] { + compute(ener, force, force_mag, virial, atom_energy, atom_virial, coord, + spin, atype, box, nghost, inlist, ago, fparam, aparam, atomic); + }); +} +#endif diff --git a/source/api_cc/src/commonPTExpt.h b/source/api_cc/src/commonPTExpt.h new file mode 100644 index 0000000000..7aded4f37a --- /dev/null +++ b/source/api_cc/src/commonPTExpt.h @@ -0,0 +1,532 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Shared utilities for pt_expt (.pt2 / AOTInductor) backend classes. +// Provides: JSON parser, ZIP archive reader, and type-sorted nlist builder. +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "errors.h" + +namespace deepmd { +namespace ptexpt { + +// ============================================================================ +// Minimal JSON value parser for reading metadata from .pt2 archives. +// Supports: strings, numbers, booleans, arrays, objects. +// ============================================================================ + +struct JsonValue; +using JsonObject = std::map; +using JsonArray = std::vector; + +struct JsonValue { + enum Type { Null, Bool, Number, String, Array, Object }; + Type type = Null; + bool bool_val = false; + double num_val = 0.0; + std::string str_val; + JsonArray arr_val; + JsonObject obj_val; + + std::string as_string() const { return str_val; } + double as_double() const { return num_val; } + int as_int() const { return static_cast(num_val); } + bool as_bool() const { return bool_val; } + const JsonArray& as_array() const { return arr_val; } + const JsonObject& as_object() const { return obj_val; } + const JsonValue& operator[](const std::string& key) const { + return obj_val.at(key); + } + const JsonValue& operator[](size_t idx) const { return arr_val.at(idx); } + bool has(const std::string& key) const { + return obj_val.find(key) != obj_val.end(); + } +}; + +class JsonParser { + public: + explicit JsonParser(const std::string& s) : s_(s), pos_(0) {} + JsonValue parse() { + skip_ws(); + auto val = parse_value(); + return val; + } + + private: + const std::string& s_; + size_t pos_; + + char peek() const { return pos_ < s_.size() ? s_[pos_] : '\0'; } + char get() { + if (pos_ >= s_.size()) { + throw std::runtime_error("JSON parse error: unexpected end of input"); + } + return s_[pos_++]; + } + void skip_ws() { + while (pos_ < s_.size() && (s_[pos_] == ' ' || s_[pos_] == '\t' || + s_[pos_] == '\n' || s_[pos_] == '\r')) { + ++pos_; + } + } + + JsonValue parse_value() { + skip_ws(); + char c = peek(); + if (c == '"') { + return parse_string_val(); + } else if (c == '{') { + return parse_object(); + } else if (c == '[') { + return parse_array(); + } else if (c == 't' || c == 'f') { + return parse_bool(); + } else if (c == 'n') { + return parse_null(); + } else { + return parse_number(); + } + } + + std::string parse_string_raw() { + get(); // consume '"' + std::string result; + while (pos_ < s_.size() && peek() != '"') { + if (peek() == '\\') { + get(); + char esc = get(); + switch (esc) { + case '"': + result += '"'; + break; + case '\\': + result += '\\'; + break; + case '/': + result += '/'; + break; + case 'n': + result += '\n'; + break; + case 't': + result += '\t'; + break; + case 'r': + result += '\r'; + break; + default: + result += esc; + break; + } + } else { + result += get(); + } + } + get(); // consume closing '"' + return result; + } + + JsonValue parse_string_val() { + JsonValue v; + v.type = JsonValue::String; + v.str_val = parse_string_raw(); + return v; + } + + JsonValue parse_number() { + size_t start = pos_; + if (peek() == '-') { + get(); + } + while (pos_ < s_.size() && + (std::isdigit(s_[pos_]) || s_[pos_] == '.' || s_[pos_] == 'e' || + s_[pos_] == 'E' || s_[pos_] == '+' || s_[pos_] == '-')) { + // handle sign only if after e/E + if ((s_[pos_] == '+' || s_[pos_] == '-') && pos_ > start && + s_[pos_ - 1] != 'e' && s_[pos_ - 1] != 'E') { + break; + } + ++pos_; + } + JsonValue v; + v.type = JsonValue::Number; + try { + v.num_val = std::stod(s_.substr(start, pos_ - start)); + } catch (const std::exception& e) { + throw std::runtime_error("JSON parse error: invalid number at position " + + std::to_string(start)); + } + return v; + } + + JsonValue parse_bool() { + JsonValue v; + v.type = JsonValue::Bool; + if (s_.substr(pos_, 4) == "true") { + v.bool_val = true; + pos_ += 4; + } else if (s_.substr(pos_, 5) == "false") { + v.bool_val = false; + pos_ += 5; + } else { + throw std::runtime_error( + "JSON parse error: expected 'true' or 'false' at position " + + std::to_string(pos_)); + } + return v; + } + + JsonValue parse_null() { + if (s_.substr(pos_, 4) != "null") { + throw std::runtime_error( + "JSON parse error: expected 'null' at position " + + std::to_string(pos_)); + } + pos_ += 4; + return JsonValue(); + } + + JsonValue parse_array() { + get(); // consume '[' + JsonValue v; + v.type = JsonValue::Array; + skip_ws(); + if (peek() == ']') { + get(); + return v; + } + while (true) { + v.arr_val.push_back(parse_value()); + skip_ws(); + if (peek() == ',') { + get(); + } else { + break; + } + } + skip_ws(); + get(); // consume ']' + return v; + } + + JsonValue parse_object() { + get(); // consume '{' + JsonValue v; + v.type = JsonValue::Object; + skip_ws(); + if (peek() == '}') { + get(); + return v; + } + while (true) { + skip_ws(); + std::string key = parse_string_raw(); + skip_ws(); + get(); // consume ':' + v.obj_val[key] = parse_value(); + skip_ws(); + if (peek() == ',') { + get(); + } else { + break; + } + } + skip_ws(); + get(); // consume '}' + return v; + } +}; + +inline JsonValue parse_json(const std::string& s) { + JsonParser parser(s); + return parser.parse(); +} + +// ============================================================================ +// ZIP archive reader — reads a file from a ZIP archive. +// ============================================================================ + +inline std::string read_zip_entry(const std::string& zip_path, + const std::string& entry_name) { + std::ifstream ifs(zip_path, std::ios::binary); + if (!ifs.is_open()) { + throw deepmd::deepmd_exception("Cannot open file: " + zip_path); + } + + // Read entire file + std::string content((std::istreambuf_iterator(ifs)), + std::istreambuf_iterator()); + ifs.close(); + + // Simple ZIP central directory parser + // Find End of Central Directory Record (EOCD) + if (content.size() < 22) { + throw deepmd::deepmd_exception( + "File too small to be a valid ZIP archive: " + zip_path); + } + size_t eocd_pos = std::string::npos; + for (int64_t i = static_cast(content.size()) - 22; + i >= 0 && static_cast(i) + 3 < content.size(); --i) { + if (content[i] == 0x50 && content[i + 1] == 0x4b && + content[i + 2] == 0x05 && content[i + 3] == 0x06) { + eocd_pos = static_cast(i); + break; + } + } + if (eocd_pos == std::string::npos) { + throw deepmd::deepmd_exception("Invalid ZIP file: " + zip_path); + } + + auto read_u16 = [&](size_t offset) -> uint16_t { + return static_cast(static_cast(content[offset])) | + (static_cast( + static_cast(content[offset + 1])) + << 8); + }; + auto read_u32 = [&](size_t offset) -> uint32_t { + return static_cast(static_cast(content[offset])) | + (static_cast( + static_cast(content[offset + 1])) + << 8) | + (static_cast( + static_cast(content[offset + 2])) + << 16) | + (static_cast( + static_cast(content[offset + 3])) + << 24); + }; + + uint64_t num_entries = read_u16(eocd_pos + 10); + uint64_t cd_offset = read_u32(eocd_pos + 16); + + // Handle ZIP64 + if (cd_offset == 0xFFFFFFFF || num_entries == 0xFFFF) { + if (eocd_pos < 20) { + throw deepmd::deepmd_exception( + "Invalid ZIP64 file (truncated EOCD locator): " + zip_path); + } + size_t zip64_locator_pos = eocd_pos - 20; + if (content[zip64_locator_pos] == 0x50 && + content[zip64_locator_pos + 1] == 0x4b && + content[zip64_locator_pos + 2] == 0x06 && + content[zip64_locator_pos + 3] == 0x07) { + uint64_t zip64_eocd_offset = 0; + for (int b = 0; b < 8; ++b) { + zip64_eocd_offset |= static_cast(static_cast( + content[zip64_locator_pos + 8 + b])) + << (8 * b); + } + size_t z64_pos = static_cast(zip64_eocd_offset); + if (z64_pos + 56 > content.size()) { + throw deepmd::deepmd_exception( + "Invalid ZIP64 file (truncated EOCD record): " + zip_path); + } + num_entries = 0; + for (int b = 0; b < 8; ++b) { + num_entries |= static_cast(static_cast( + content[z64_pos + 32 + b])) + << (8 * b); + } + cd_offset = 0; + for (int b = 0; b < 8; ++b) { + cd_offset |= static_cast( + static_cast(content[z64_pos + 48 + b])) + << (8 * b); + } + } + } + + // Iterate central directory entries + size_t pos = cd_offset; + for (uint64_t i = 0; i < num_entries; ++i) { + if (pos + 46 > content.size()) { + break; + } + uint16_t name_len = read_u16(pos + 28); + uint16_t extra_len = read_u16(pos + 30); + uint16_t comment_len = read_u16(pos + 32); + uint32_t compressed_size_u32 = read_u32(pos + 20); + uint32_t uncompressed_size_u32 = read_u32(pos + 24); + uint32_t local_header_offset_u32 = read_u32(pos + 42); + + uint64_t compressed_size = compressed_size_u32; + uint64_t uncompressed_size = uncompressed_size_u32; + uint64_t local_header_offset = local_header_offset_u32; + + std::string name = content.substr(pos + 46, name_len); + + // Handle ZIP64 extra field + if (uncompressed_size_u32 == 0xFFFFFFFF || + local_header_offset_u32 == 0xFFFFFFFF) { + size_t extra_pos = pos + 46 + name_len; + size_t extra_end = extra_pos + extra_len; + while (extra_pos + 4 <= extra_end) { + uint16_t field_id = read_u16(extra_pos); + uint16_t field_size = read_u16(extra_pos + 2); + if (field_id == 0x0001) { + size_t field_data = extra_pos + 4; + int offset_in_field = 0; + if (uncompressed_size_u32 == 0xFFFFFFFF) { + uncompressed_size = 0; + for (int b = 0; b < 8; ++b) { + uncompressed_size |= + static_cast(static_cast( + content[field_data + offset_in_field + b])) + << (8 * b); + } + offset_in_field += 8; + } + if (compressed_size_u32 == 0xFFFFFFFF) { + compressed_size = 0; + for (int b = 0; b < 8; ++b) { + compressed_size |= + static_cast(static_cast( + content[field_data + offset_in_field + b])) + << (8 * b); + } + offset_in_field += 8; + } + if (local_header_offset_u32 == 0xFFFFFFFF) { + local_header_offset = 0; + for (int b = 0; b < 8; ++b) { + local_header_offset |= + static_cast(static_cast( + content[field_data + offset_in_field + b])) + << (8 * b); + } + } + break; + } + extra_pos += 4 + field_size; + } + } + + // Match exact name or suffix + bool match = (name == entry_name); + if (!match && name.size() > entry_name.size()) { + size_t suffix_start = name.size() - entry_name.size(); + if (name[suffix_start - 1] == '/' && + name.substr(suffix_start) == entry_name) { + match = true; + } + } + if (match) { + uint16_t local_name_len = read_u16(local_header_offset + 26); + uint16_t local_extra_len = read_u16(local_header_offset + 28); + size_t data_offset = + local_header_offset + 30 + local_name_len + local_extra_len; + return content.substr(data_offset, uncompressed_size); + } + + pos += 46 + name_len + extra_len + comment_len; + } + + throw deepmd::deepmd_exception("Entry not found in ZIP: " + entry_name + + " in " + zip_path); +} + +// ============================================================================ +// Build type-sorted, sel-limited neighbor list tensor. +// ============================================================================ + +/** + * @brief Convert a raw neighbor list to the sel-limited format expected by the + * pt_expt model. + * + * For non-mixed-type models (distinguish_types=true): the nlist has shape + * (nframes, nloc, sum(sel)), where the first sel[0] entries are neighbors of + * type 0, the next sel[1] are type 1, etc. Within each type group neighbors + * are sorted by distance (ascending). + * + * For mixed-type models (distinguish_types=false): all neighbors go into a + * single group sorted by distance, truncated to sum(sel). + * + * Missing slots are filled with -1. + */ +template +inline torch::Tensor buildTypeSortedNlist( + const std::vector>& raw_nlist, + const std::vector& coord_ext, + const std::vector& atype_ext, + const std::vector& sel, + int nloc, + bool mixed_types) { + int nsel = 0; + for (auto s : sel) { + nsel += s; + } + int ntypes = sel.size(); + std::vector result(static_cast(nloc) * nsel, -1); + + for (int ii = 0; ii < nloc; ++ii) { + const auto& neighbors = raw_nlist[ii]; + VALUETYPE xi = coord_ext[ii * 3 + 0]; + VALUETYPE yi = coord_ext[ii * 3 + 1]; + VALUETYPE zi = coord_ext[ii * 3 + 2]; + int offset = ii * nsel; + + if (mixed_types) { + std::vector> all_neighbors; + for (int jj : neighbors) { + if (jj < 0) { + continue; + } + int jtype = atype_ext[jj]; + if (jtype < 0) { + continue; + } + VALUETYPE dx = coord_ext[jj * 3 + 0] - xi; + VALUETYPE dy = coord_ext[jj * 3 + 1] - yi; + VALUETYPE dz = coord_ext[jj * 3 + 2] - zi; + VALUETYPE rr = dx * dx + dy * dy + dz * dz; + all_neighbors.emplace_back(rr, jj); + } + std::sort(all_neighbors.begin(), all_neighbors.end()); + int count = std::min(static_cast(all_neighbors.size()), nsel); + for (int kk = 0; kk < count; ++kk) { + result[offset + kk] = all_neighbors[kk].second; + } + } else { + std::vector>> by_type(ntypes); + for (int jj : neighbors) { + if (jj < 0) { + continue; + } + int jtype = atype_ext[jj]; + if (jtype < 0 || jtype >= ntypes) { + continue; + } + VALUETYPE dx = coord_ext[jj * 3 + 0] - xi; + VALUETYPE dy = coord_ext[jj * 3 + 1] - yi; + VALUETYPE dz = coord_ext[jj * 3 + 2] - zi; + VALUETYPE rr = dx * dx + dy * dy + dz * dz; + by_type[jtype].emplace_back(rr, jj); + } + int col = 0; + for (int tt = 0; tt < ntypes; ++tt) { + auto& group = by_type[tt]; + std::sort(group.begin(), group.end()); + int count = std::min(static_cast(group.size()), sel[tt]); + for (int kk = 0; kk < count; ++kk) { + result[offset + col + kk] = group[kk].second; + } + col += sel[tt]; + } + } + } + + torch::Tensor tensor = + torch::from_blob(result.data(), {1, nloc, nsel}, + torch::TensorOptions().dtype(torch::kInt64)) + .clone(); + return tensor; +} + +} // namespace ptexpt +} // namespace deepmd diff --git a/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc b/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc new file mode 100644 index 0000000000..dab5e7aade --- /dev/null +++ b/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc @@ -0,0 +1,499 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Test C++ inference for pt_expt (.pt2) backend with DPA1 spin model. +#include + +#include +#include +#include +#include + +#include "DeepSpin.h" +#include "neighbor_list.h" +#include "test_utils.h" + +// Spin models need relaxed epsilon +#undef EPSILON +#define EPSILON (std::is_same::value ? 1e-6 : 1e-1) + +// ============================================================================ +// PBC test fixture +// ============================================================================ + +template +class TestInferDeepSpinDpaPtExpt : public ::testing::Test { + protected: + std::vector coord = {12.83, 2.56, 2.18, 12.09, 2.87, 2.74, + 00.25, 3.32, 1.68, 3.36, 3.00, 1.81, + 3.51, 2.51, 2.60, 4.27, 3.22, 1.56}; + std::vector spin = {0.13, 0.02, 0.03, 0., 0., 0., 0., 0., 0., + 0.14, 0.10, 0.12, 0., 0., 0., 0., 0., 0.}; + std::vector atype = {0, 1, 1, 0, 1, 1}; + std::vector box = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; + + // Reference values generated by source/tests/infer/gen_spin.py + std::vector expected_e; + std::vector expected_f; + std::vector expected_fm; + std::vector expected_tot_v; + std::vector expected_atom_v; + + int natoms; + double expected_tot_e; + + deepmd::DeepSpin dp; + + void SetUp() override { + // The .pt2 spin model requires the BUILD_PT_EXPT guard from the header. + // If AOTInductor headers are missing, skip. + std::string model_path = "../../tests/infer/deeppot_dpa_spin.pt2"; + { + std::ifstream f(model_path); + if (!f.good()) { + GTEST_SKIP() << "Skipping: " << model_path << " not found."; + } + } +#ifndef BUILD_PYTORCH + GTEST_SKIP() << "Skip because PyTorch support is not enabled."; +#endif + dp.init(model_path); + + // PBC reference values from gen_spin.py + expected_e = { + -4.736511666341149118e-02, 2.663324583045018068e-01, + 2.662707880956619588e-01, -4.025182706753409334e-02, + 2.661383816099721633e-01, 2.663717506235512844e-01, + }; + expected_f = { + 1.309983290673980352e-02, 6.799786488006153221e-03, + 6.649738725468718609e-03, -1.144456277614634265e-03, + -3.728471118137270928e-03, -6.491178701583714961e-03, + -5.361730092721230315e-03, -2.772299524882485336e-03, + -4.492382686597841141e-04, 6.983026947998328959e-03, + 5.505263649468144886e-03, 1.166735707547454995e-02, + -5.356940629013495075e-03, -1.082410608691008200e-03, + -8.305081927004348899e-03, -8.219732855388919845e-03, + -4.721868885763546436e-03, -3.071596903695449424e-03, + }; + expected_fm = { + -2.702014342752852571e-01, -1.027058879186482226e-01, + -7.359539608958531876e-02, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 4.837763296762351284e-02, + 7.279460222389372293e-02, 5.692337419156127953e-02, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + }; + expected_tot_v = { + -3.296409925977442784e-02, -6.514341112515736193e-03, + 2.302568866291881608e-03, -3.920085383179669654e-03, + -3.902770613936823105e-03, -2.657953604957638679e-04, + 1.599970898976528456e-03, 1.167950771447608766e-03, + -9.311107385533376815e-03, + }; + expected_atom_v = { + -3.317500147651446761e-03, -5.453620106200618781e-04, + 1.253012128253723576e-03, -4.341313022555767223e-04, + -8.474261758929188017e-04, 3.158911084565297830e-04, + 1.428597590986904363e-03, 3.418340644092453598e-04, + -1.048232718033599879e-03, 2.743654218857313667e-03, + -7.881895490872514818e-04, -2.104426693877021765e-03, + 1.962048943234902601e-03, -1.049310174771551311e-03, + -1.494575973896533887e-03, 3.408026024086528976e-03, + -1.712970751848944505e-03, -2.576173589596463843e-03, + -1.201918779945609916e-02, -4.491798568020247129e-03, + 3.096386035183865820e-03, 9.950813669892615530e-04, + -7.365361184918026161e-04, 9.845327634837373713e-05, + -1.426610186908689078e-03, -1.277523649606296732e-03, + 1.099298580748801768e-03, -4.322845112754755692e-03, + -5.390493138998655141e-04, 8.445031349176490218e-04, + -9.915231731252361659e-04, -6.214579519519495155e-04, + 9.500409608549969988e-04, 8.491271635631678690e-04, + 9.275347724790529869e-04, -1.452342638958830420e-03, + -1.981095983149218712e-03, 2.124416489228214862e-03, + -3.803001677309152204e-03, 7.469960084091023956e-06, + 1.440128580078422951e-03, -2.264550990055120075e-03, + -1.502942461627763959e-03, 2.647480428239051657e-03, + -4.361425384715853296e-03, -5.960350980804883167e-03, + -1.029717381562808348e-03, 8.970464384536506412e-04, + -3.828067017971811641e-03, -8.614074432427376669e-04, + 9.393899863778386750e-04, -3.397832689085407594e-03, + -8.981477278037544023e-04, 1.067175759602119771e-03, + }; + + natoms = expected_e.size(); + EXPECT_EQ(natoms * 3, expected_f.size()); + EXPECT_EQ(natoms * 3, expected_fm.size()); + EXPECT_EQ(9, expected_tot_v.size()); + EXPECT_EQ(natoms * 9, expected_atom_v.size()); + expected_tot_e = 0.; + for (int ii = 0; ii < natoms; ++ii) { + expected_tot_e += expected_e[ii]; + } + }; + + void TearDown() override {}; +}; + +TYPED_TEST_SUITE(TestInferDeepSpinDpaPtExpt, ValueTypes); + +TYPED_TEST(TestInferDeepSpinDpaPtExpt, cpu_build_nlist) { + using VALUETYPE = TypeParam; + const std::vector& coord = this->coord; + const std::vector& spin = this->spin; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_fm = this->expected_fm; + std::vector& expected_tot_v = this->expected_tot_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + deepmd::DeepSpin& dp = this->dp; + double ener; + std::vector force, force_mag, virial; + dp.compute(ener, force, force_mag, virial, coord, spin, atype, box); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(force_mag.size(), natoms * 3); + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + EXPECT_LT(fabs(force_mag[ii] - expected_fm[ii]), EPSILON); + } + EXPECT_FALSE(virial.empty()) << "Virial should not be empty"; + EXPECT_EQ(virial.size(), 9); + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepSpinDpaPtExpt, cpu_build_nlist_atomic) { + using VALUETYPE = TypeParam; + const std::vector& coord = this->coord; + const std::vector& spin = this->spin; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_fm = this->expected_fm; + std::vector& expected_tot_v = this->expected_tot_v; + std::vector& expected_atom_v = this->expected_atom_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + deepmd::DeepSpin& dp = this->dp; + double ener; + std::vector force, force_mag, virial, atom_ener, atom_vir; + dp.compute(ener, force, force_mag, virial, atom_ener, atom_vir, coord, spin, + atype, box); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(force_mag.size(), natoms * 3); + EXPECT_EQ(atom_ener.size(), natoms); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + EXPECT_LT(fabs(force_mag[ii] - expected_fm[ii]), EPSILON); + } + EXPECT_FALSE(virial.empty()) << "Virial should not be empty"; + EXPECT_EQ(virial.size(), 9); + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + for (int ii = 0; ii < natoms; ++ii) { + EXPECT_LT(fabs(atom_ener[ii] - expected_e[ii]), EPSILON); + } + EXPECT_FALSE(atom_vir.empty()) << "Atomic virial should not be empty"; + EXPECT_EQ(atom_vir.size(), natoms * 9); + for (int ii = 0; ii < natoms * 9; ++ii) { + EXPECT_LT(fabs(atom_vir[ii] - expected_atom_v[ii]), EPSILON); + } +} + +// ============================================================================ +// NoPBC test fixture +// ============================================================================ + +template +class TestInferDeepSpinDpaPtExptNopbc : public ::testing::Test { + protected: + std::vector coord = {12.83, 2.56, 2.18, 12.09, 2.87, 2.74, + 00.25, 3.32, 1.68, 3.36, 3.00, 1.81, + 3.51, 2.51, 2.60, 4.27, 3.22, 1.56}; + std::vector spin = {0.13, 0.02, 0.03, 0., 0., 0., 0., 0., 0., + 0.14, 0.10, 0.12, 0., 0., 0., 0., 0., 0.}; + std::vector atype = {0, 1, 1, 0, 1, 1}; + std::vector box = {}; + + // Reference values for NoPBC from gen_spin.py + std::vector expected_e; + std::vector expected_f; + std::vector expected_fm; + std::vector expected_tot_v; + std::vector expected_atom_v; + + int natoms; + double expected_tot_e; + + deepmd::DeepSpin dp; + + void SetUp() override { + std::string model_path = "../../tests/infer/deeppot_dpa_spin.pt2"; + { + std::ifstream f(model_path); + if (!f.good()) { + GTEST_SKIP() << "Skipping: " << model_path << " not found."; + } + } +#ifndef BUILD_PYTORCH + GTEST_SKIP() << "Skip because PyTorch support is not enabled."; +#endif + dp.init(model_path); + + // NoPBC reference values from gen_spin.py + expected_e = { + -4.263824715539775434e-02, 2.659531961465150807e-01, + 2.679077652998275716e-01, -4.042215423551187570e-02, + 2.666009600722629158e-01, 2.666060991401024149e-01, + }; + expected_f = { + 9.664606789041574331e-04, 4.875258490407333167e-03, + 8.372291856602237514e-03, -9.664606789041574331e-04, + -4.875258490407331433e-03, -8.372291856602209759e-03, + 3.462063530624336170e-03, -3.516414654756409722e-04, + 1.540231672543395411e-04, 9.145994016724501297e-03, + 6.127039584892107760e-03, 1.114133934233926815e-02, + -5.161415144547300271e-03, -1.229667699599260294e-03, + -8.053323256964733598e-03, -7.446642402801547170e-03, + -4.545730419817223950e-03, -3.242039252628891276e-03, + }; + expected_fm = { + 2.426746573908480920e-02, -2.632265214292328626e-02, + -4.622069216845703377e-02, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 5.019524717501219757e-02, + 7.318340727755086317e-02, 5.710550212233043987e-02, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + }; + expected_tot_v = { + -1.760249353608427103e-02, 1.699089611551340799e-03, + -3.207143602659518616e-03, 3.802314035573836626e-04, + -2.021378920534677454e-03, -2.519436241845334455e-03, + 1.558229715287920425e-03, 6.867566983090854244e-04, + -1.026012201128513081e-02, + }; + expected_atom_v = { + -9.010484131816154374e-04, 3.774662271365247790e-04, + 6.818744748307292713e-04, 3.700909920694162025e-04, + -1.550381183003379792e-04, -2.800688588649180577e-04, + 6.691585522995424640e-04, -2.803231773155778761e-04, + -5.063902557961297290e-04, 2.068893745514948854e-03, + -8.666987312292658875e-04, -1.565649320930233464e-03, + 3.054535161074109495e-03, -1.279602567476957262e-03, + -2.311540121893843058e-03, 5.195098769247979975e-03, + -2.176325160090315791e-03, -3.931426095646995550e-03, + -9.856122919086314146e-03, 9.936684925752666681e-04, + -3.439719552552561802e-04, 1.052798535866198608e-03, + -9.900711767116699563e-05, 2.762122318620294312e-05, + -5.083128431155595943e-04, 4.192561625213921898e-05, + -5.371277558265975804e-06, -1.703601525016029683e-03, + -2.250342243479974691e-04, 2.948710405297760850e-04, + -2.741660339186102746e-04, -5.140178418111540637e-04, + 7.694906072377993844e-04, 3.213894451938870134e-04, + 7.860699694575146168e-04, -1.201682807120130203e-03, + -5.723947614714765264e-04, 2.340653893581970402e-03, + -3.822101811639220734e-03, -1.559120189565561809e-04, + 1.375865762882331946e-03, -2.173696052105959873e-03, + -1.277932982926627964e-03, 2.762213706055685614e-03, + -4.518197398377981483e-03, -4.806069982039730404e-03, + -8.457891679641386939e-04, 8.142858536873513742e-04, + -3.629730539376156001e-03, -8.154749344004806610e-04, + 8.996120390360722724e-04, -3.613530537932585843e-03, + -9.502343452691061620e-04, 1.113518176527171326e-03, + }; + + natoms = expected_e.size(); + EXPECT_EQ(natoms * 3, expected_f.size()); + EXPECT_EQ(natoms * 3, expected_fm.size()); + EXPECT_EQ(9, expected_tot_v.size()); + EXPECT_EQ(natoms * 9, expected_atom_v.size()); + expected_tot_e = 0.; + for (int ii = 0; ii < natoms; ++ii) { + expected_tot_e += expected_e[ii]; + } + }; + + void TearDown() override {}; +}; + +TYPED_TEST_SUITE(TestInferDeepSpinDpaPtExptNopbc, ValueTypes); + +TYPED_TEST(TestInferDeepSpinDpaPtExptNopbc, cpu_build_nlist) { + using VALUETYPE = TypeParam; + const std::vector& coord = this->coord; + const std::vector& spin = this->spin; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_fm = this->expected_fm; + std::vector& expected_tot_v = this->expected_tot_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + deepmd::DeepSpin& dp = this->dp; + double ener; + std::vector force, force_mag, virial; + dp.compute(ener, force, force_mag, virial, coord, spin, atype, box); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(force_mag.size(), natoms * 3); + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + EXPECT_LT(fabs(force_mag[ii] - expected_fm[ii]), EPSILON); + } + EXPECT_FALSE(virial.empty()) << "Virial should not be empty"; + EXPECT_EQ(virial.size(), 9); + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepSpinDpaPtExptNopbc, cpu_build_nlist_atomic) { + using VALUETYPE = TypeParam; + const std::vector& coord = this->coord; + const std::vector& spin = this->spin; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_fm = this->expected_fm; + std::vector& expected_tot_v = this->expected_tot_v; + std::vector& expected_atom_v = this->expected_atom_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + deepmd::DeepSpin& dp = this->dp; + double ener; + std::vector force, force_mag, virial, atom_ener, atom_vir; + dp.compute(ener, force, force_mag, virial, atom_ener, atom_vir, coord, spin, + atype, box); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(force_mag.size(), natoms * 3); + EXPECT_EQ(atom_ener.size(), natoms); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + EXPECT_LT(fabs(force_mag[ii] - expected_fm[ii]), EPSILON); + } + EXPECT_FALSE(virial.empty()) << "Virial should not be empty"; + EXPECT_EQ(virial.size(), 9); + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + for (int ii = 0; ii < natoms; ++ii) { + EXPECT_LT(fabs(atom_ener[ii] - expected_e[ii]), EPSILON); + } + EXPECT_FALSE(atom_vir.empty()) << "Atomic virial should not be empty"; + EXPECT_EQ(atom_vir.size(), natoms * 9); + for (int ii = 0; ii < natoms * 9; ++ii) { + EXPECT_LT(fabs(atom_vir[ii] - expected_atom_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepSpinDpaPtExptNopbc, cpu_lmp_nlist) { + using VALUETYPE = TypeParam; + const std::vector& coord = this->coord; + const std::vector& spin = this->spin; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_fm = this->expected_fm; + std::vector& expected_tot_v = this->expected_tot_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + deepmd::DeepSpin& dp = this->dp; + double ener; + std::vector force, force_mag, virial; + + std::vector > nlist_data = { + {1, 2, 3, 4, 5}, {0, 2, 3, 4, 5}, {0, 1, 3, 4, 5}, + {0, 1, 2, 4, 5}, {0, 1, 2, 3, 5}, {0, 1, 2, 3, 4}}; + std::vector ilist(natoms), numneigh(natoms); + std::vector firstneigh(natoms); + deepmd::InputNlist inlist(natoms, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + dp.compute(ener, force, force_mag, virial, coord, spin, atype, box, 0, inlist, + 0); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(force_mag.size(), natoms * 3); + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + EXPECT_LT(fabs(force_mag[ii] - expected_fm[ii]), EPSILON); + } + EXPECT_FALSE(virial.empty()) << "Virial should not be empty"; + EXPECT_EQ(virial.size(), 9); + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepSpinDpaPtExptNopbc, cpu_lmp_nlist_atomic) { + using VALUETYPE = TypeParam; + const std::vector& coord = this->coord; + const std::vector& spin = this->spin; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_fm = this->expected_fm; + std::vector& expected_tot_v = this->expected_tot_v; + std::vector& expected_atom_v = this->expected_atom_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + deepmd::DeepSpin& dp = this->dp; + double ener; + std::vector force, force_mag, virial, atom_ener, atom_vir; + + std::vector > nlist_data = { + {1, 2, 3, 4, 5}, {0, 2, 3, 4, 5}, {0, 1, 3, 4, 5}, + {0, 1, 2, 4, 5}, {0, 1, 2, 3, 5}, {0, 1, 2, 3, 4}}; + std::vector ilist(natoms), numneigh(natoms); + std::vector firstneigh(natoms); + deepmd::InputNlist inlist(natoms, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + dp.compute(ener, force, force_mag, virial, atom_ener, atom_vir, coord, spin, + atype, box, 0, inlist, 0); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(force_mag.size(), natoms * 3); + EXPECT_EQ(atom_ener.size(), natoms); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + EXPECT_LT(fabs(force_mag[ii] - expected_fm[ii]), EPSILON); + } + EXPECT_FALSE(virial.empty()) << "Virial should not be empty"; + EXPECT_EQ(virial.size(), 9); + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + for (int ii = 0; ii < natoms; ++ii) { + EXPECT_LT(fabs(atom_ener[ii] - expected_e[ii]), EPSILON); + } + EXPECT_FALSE(atom_vir.empty()) << "Atomic virial should not be empty"; + EXPECT_EQ(atom_vir.size(), natoms * 9); + for (int ii = 0; ii < natoms * 9; ++ii) { + EXPECT_LT(fabs(atom_vir[ii] - expected_atom_v[ii]), EPSILON); + } +} diff --git a/source/install/test_cc_local.sh b/source/install/test_cc_local.sh index 0866eb45b8..8bc048f1a1 100755 --- a/source/install/test_cc_local.sh +++ b/source/install/test_cc_local.sh @@ -72,6 +72,7 @@ else: env ${_GEN_ENV} python ${INFER_SCRIPT_PATH}/gen_dpa3.py env ${_GEN_ENV} python ${INFER_SCRIPT_PATH}/gen_fparam_aparam.py env ${_GEN_ENV} python ${INFER_SCRIPT_PATH}/gen_model_devi.py + env ${_GEN_ENV} python ${INFER_SCRIPT_PATH}/gen_spin.py fi if [ "${ENABLE_PADDLE:-TRUE}" == "TRUE" ]; then PADDLE_INFERENCE_DIR=${BUILD_TMP_DIR}/paddle_inference_install_dir diff --git a/source/tests/infer/gen_common.py b/source/tests/infer/gen_common.py index 11b732c513..4b542e43f6 100644 --- a/source/tests/infer/gen_common.py +++ b/source/tests/infer/gen_common.py @@ -79,3 +79,42 @@ def print_cpp_values(label, ae, f, av): comma = "," if ii < len(virial_flat) - 1 else "" print(f" {v:.18e}{comma}") # noqa: T201 print(" };") # noqa: T201 + + +def print_cpp_spin_values(label, ae, f, fm, tot_v, av): + """Print C++ reference arrays for spin models (energy, force, force_mag, virial).""" + print(f"\n// ---- {label} ----") # noqa: T201 + atom_energy = ae[0, :, 0] + print(" std::vector expected_e = {") # noqa: T201 + for ii, e in enumerate(atom_energy): + comma = "," if ii < len(atom_energy) - 1 else "" + print(f" {e:.18e}{comma}") # noqa: T201 + print(" };") # noqa: T201 + + print(" std::vector expected_f = {") # noqa: T201 + force_flat = f[0].flatten() + for ii, fv in enumerate(force_flat): + comma = "," if ii < len(force_flat) - 1 else "" + print(f" {fv:.18e}{comma}") # noqa: T201 + print(" };") # noqa: T201 + + print(" std::vector expected_fm = {") # noqa: T201 + fm_flat = fm[0].flatten() + for ii, fv in enumerate(fm_flat): + comma = "," if ii < len(fm_flat) - 1 else "" + print(f" {fv:.18e}{comma}") # noqa: T201 + print(" };") # noqa: T201 + + print(" std::vector expected_tot_v = {") # noqa: T201 + tot_v_flat = tot_v[0].flatten() + for ii, v in enumerate(tot_v_flat): + comma = "," if ii < len(tot_v_flat) - 1 else "" + print(f" {v:.18e}{comma}") # noqa: T201 + print(" };") # noqa: T201 + + print(" std::vector expected_atom_v = {") # noqa: T201 + av_flat = av[0].flatten() + for ii, v in enumerate(av_flat): + comma = "," if ii < len(av_flat) - 1 else "" + print(f" {v:.18e}{comma}") # noqa: T201 + print(" };") # noqa: T201 diff --git a/source/tests/infer/gen_spin.py b/source/tests/infer/gen_spin.py new file mode 100644 index 0000000000..49d48d55b0 --- /dev/null +++ b/source/tests/infer/gen_spin.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-3.0-or-later +"""Generate deeppot_dpa_spin.pth and deeppot_dpa_spin.pt2 test models. + +Creates a DPA1 spin model from dpmodel config, serializes, and exports to both +.pth (torch.jit) and .pt2 (torch.export) from the same weights. +Also prints reference values for C++ tests (PBC and NoPbc). +""" + +import copy +import os +import sys + +import numpy as np + +# Ensure the source tree is on the path +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "..")) + +from gen_common import ( + ensure_inductor_compiler, + load_custom_ops, + print_cpp_spin_values, +) + + +def main(): + from deepmd.dpmodel.model.model import ( + get_model, + ) + + ensure_inductor_compiler() + + # ---- 1. DPA1 spin model config ---- + config = { + "type_map": ["Ni", "O"], + "descriptor": { + "type": "se_atten", + "sel": 30, + "rcut_smth": 2.0, + "rcut": 6.0, + "neuron": [2, 4, 8], + "axis_neuron": 4, + "attn": 5, + "attn_layer": 2, + "attn_dotr": True, + "attn_mask": False, + "activation_function": "tanh", + "scaling_factor": 1.0, + "normalize": True, + "temperature": 1.0, + "type_one_side": True, + "seed": 1, + }, + "fitting_net": { + "neuron": [5, 5, 5], + "resnet_dt": True, + "seed": 1, + }, + "spin": { + "use_spin": [True, False], + "virtual_scale": [0.3140, 0.0], + }, + } + + # ---- 2. Build dpmodel and serialize ---- + model = get_model(copy.deepcopy(config)) + model_dict = model.serialize() + + data = { + "model": model_dict, + "model_def_script": config, + "backend": "dpmodel", + "software": "deepmd-kit", + "version": "3.0.0", + } + + # ---- 3. Export to .pt2 and .pth ---- + from deepmd.pt.utils.serialization import ( + deserialize_to_file as pt_deserialize_to_file, + ) + from deepmd.pt_expt.utils.serialization import ( + deserialize_to_file as pt_expt_deserialize_to_file, + ) + + # Load custom ops after deepmd.pt import to avoid double registration + load_custom_ops() + + base_dir = os.path.dirname(__file__) + + pt2_path = os.path.join(base_dir, "deeppot_dpa_spin.pt2") + print(f"Exporting to {pt2_path} ...") # noqa: T201 + pt_expt_deserialize_to_file(pt2_path, copy.deepcopy(data)) + + pth_path = os.path.join(base_dir, "deeppot_dpa_spin.pth") + print(f"Exporting to {pth_path} ...") # noqa: T201 + try: + pt_deserialize_to_file(pth_path, copy.deepcopy(data)) + except Exception as e: + print(f"WARNING: .pth export failed ({type(e).__name__}: {e}), skipping.") # noqa: T201 + + print("Export done.") # noqa: T201 + + # ---- 4. Run inference for PBC test ---- + from deepmd.infer import ( + DeepPot, + ) + + dp = DeepPot(pt2_path) + + coord = np.array( + [ + 12.83, + 2.56, + 2.18, + 12.09, + 2.87, + 2.74, + 0.25, + 3.32, + 1.68, + 3.36, + 3.00, + 1.81, + 3.51, + 2.51, + 2.60, + 4.27, + 3.22, + 1.56, + ], + dtype=np.float64, + ) + spin = np.array( + [ + 0.13, + 0.02, + 0.03, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.14, + 0.10, + 0.12, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + ], + dtype=np.float64, + ) + atype = [0, 1, 1, 0, 1, 1] + box = np.array([13.0, 0.0, 0.0, 0.0, 13.0, 0.0, 0.0, 0.0, 13.0], dtype=np.float64) + + e1, f1, v1, ae1, av1, fm1, _ = dp.eval(coord, box, atype, atomic=True, spin=spin) + print(f"\n// PBC total energy: {e1[0, 0]:.18e}") # noqa: T201 + print_cpp_spin_values("PBC reference values", ae1, f1, fm1, v1, av1) + + # ---- 5. Run inference for NoPbc test ---- + e_np, f_np, v_np, ae_np, av_np, fm_np, _ = dp.eval( + coord, None, atype, atomic=True, spin=spin + ) + print(f"\n// NoPbc total energy: {e_np[0, 0]:.18e}") # noqa: T201 + print_cpp_spin_values("NoPbc reference values", ae_np, f_np, fm_np, v_np, av_np) + + # ---- 6. Verify .pth gives same results ---- + if os.path.exists(pth_path): + dp_pth = DeepPot(pth_path) + e_pth, f_pth, v_pth, ae_pth, av_pth, fm_pth, _ = dp_pth.eval( + coord, box, atype, atomic=True, spin=spin + ) + print(f"\n// .pth PBC total energy: {e_pth[0, 0]:.18e}") # noqa: T201 + print(f"// .pth vs .pt2 energy diff: {abs(e1[0, 0] - e_pth[0, 0]):.2e}") # noqa: T201 + print(f"// .pth vs .pt2 force max diff: {np.max(np.abs(f1 - f_pth)):.2e}") # noqa: T201 + print(f"// .pth vs .pt2 force_mag max diff: {np.max(np.abs(fm1 - fm_pth)):.2e}") # noqa: T201 + + print("\nDone!") # noqa: T201 + + +if __name__ == "__main__": + main() diff --git a/source/tests/pt_expt/infer/test_deep_eval_spin.py b/source/tests/pt_expt/infer/test_deep_eval_spin.py new file mode 100644 index 0000000000..083157894b --- /dev/null +++ b/source/tests/pt_expt/infer/test_deep_eval_spin.py @@ -0,0 +1,312 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +"""Tests for spin model inference via the DeepPot high-level API. + +Verifies that .pt2 and .pte spin models produce correct results when loaded +through the pt_expt inference backend (DeepEval → DeepPot). +""" + +import copy +import os +import tempfile + +import numpy as np +import pytest +import torch + +from deepmd.dpmodel.model.model import get_model as get_model_dp +from deepmd.pt_expt.model.spin_ener_model import ( + SpinEnergyModel, +) +from deepmd.pt_expt.utils import ( + env, +) +from deepmd.pt_expt.utils.serialization import ( + deserialize_to_file, +) + +SPIN_CONFIG = { + "type_map": ["Ni", "O"], + "descriptor": { + "type": "se_atten", + "sel": 30, + "rcut_smth": 2.0, + "rcut": 6.0, + "neuron": [2, 4, 8], + "axis_neuron": 4, + "attn": 5, + "attn_layer": 2, + "attn_dotr": True, + "attn_mask": False, + "activation_function": "tanh", + "scaling_factor": 1.0, + "normalize": True, + "temperature": 1.0, + "type_one_side": True, + "seed": 1, + }, + "fitting_net": { + "neuron": [5, 5, 5], + "resnet_dt": True, + "seed": 1, + }, + "spin": { + "use_spin": [True, False], + "virtual_scale": [0.3140, 0.0], + }, +} + +COORD = np.array( + [ + 12.83, + 2.56, + 2.18, + 12.09, + 2.87, + 2.74, + 0.25, + 3.32, + 1.68, + 3.36, + 3.00, + 1.81, + 3.51, + 2.51, + 2.60, + 4.27, + 3.22, + 1.56, + ], + dtype=np.float64, +) +SPIN = np.array( + [ + 0.13, + 0.02, + 0.03, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.14, + 0.10, + 0.12, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + ], + dtype=np.float64, +) +ATYPE = [0, 1, 1, 0, 1, 1] +BOX = np.array([13.0, 0.0, 0.0, 0.0, 13.0, 0.0, 0.0, 0.0, 13.0], dtype=np.float64) + + +def _build_reference(): + """Build pt_expt model and run eager reference inference. + + Returns data dict, and reference dicts for PBC and NoPBC. + """ + dp_model = get_model_dp(copy.deepcopy(SPIN_CONFIG)) + model_dict = dp_model.serialize() + data = { + "model": model_dict, + "model_def_script": SPIN_CONFIG, + "backend": "dpmodel", + "software": "deepmd-kit", + "version": "3.0.0", + } + + # Build pt_expt model for eager reference + pt_model = SpinEnergyModel.deserialize(dp_model.serialize()).to(env.DEVICE) + pt_model.eval() + + natoms = len(ATYPE) + coord_t = torch.tensor( + COORD.reshape(1, natoms, 3), dtype=torch.float64, device=env.DEVICE + ) + coord_t.requires_grad_(True) + atype_t = torch.tensor([ATYPE], dtype=torch.int64, device=env.DEVICE) + spin_t = torch.tensor( + SPIN.reshape(1, natoms, 3), dtype=torch.float64, device=env.DEVICE + ) + box_t = torch.tensor(BOX.reshape(1, 9), dtype=torch.float64, device=env.DEVICE) + + # PBC reference + ref_pbc = pt_model(coord_t, atype_t, spin_t, box_t) + ref_pbc = {k: v.detach().cpu().numpy() for k, v in ref_pbc.items()} + + # NoPBC reference + ref_nopbc = pt_model(coord_t, atype_t, spin_t, None) + ref_nopbc = {k: v.detach().cpu().numpy() for k, v in ref_nopbc.items()} + + return data, ref_pbc, ref_nopbc + + +@pytest.fixture(scope="module") +def spin_model_files(): + """Create .pt2 and .pte spin model files and compute reference values.""" + data, ref_pbc, ref_nopbc = _build_reference() + files = {} + tmpdir = tempfile.mkdtemp() + for ext in (".pt2", ".pte"): + path = os.path.join(tmpdir, f"spin_test{ext}") + deserialize_to_file(path, copy.deepcopy(data)) + files[ext] = path + yield files, ref_pbc, ref_nopbc + for path in files.values(): + if os.path.exists(path): + os.unlink(path) + os.rmdir(tmpdir) + + +@pytest.mark.parametrize("ext", [".pt2", ".pte"]) # model format +class TestSpinInference: + """Test spin model inference through DeepPot high-level API.""" + + def test_get_has_spin(self, spin_model_files, ext) -> None: + """Test that get_has_spin returns True for spin models.""" + from deepmd.infer import ( + DeepPot, + ) + + files, _, _ = spin_model_files + dp = DeepPot(files[ext]) + assert dp.has_spin + + def test_get_ntypes_spin(self, spin_model_files, ext) -> None: + """Test that get_ntypes_spin returns 0 (new spin implementation).""" + from deepmd.infer import ( + DeepPot, + ) + + files, _, _ = spin_model_files + dp = DeepPot(files[ext]) + assert dp.get_ntypes_spin() == 0 + + def test_eval_pbc_atomic(self, spin_model_files, ext) -> None: + """Test PBC evaluation with atomic=True.""" + from deepmd.infer import ( + DeepPot, + ) + + files, ref, _ = spin_model_files + dp = DeepPot(files[ext]) + natoms = len(ATYPE) + + e, f, v, ae, av, fm, mm = dp.eval(COORD, BOX, ATYPE, atomic=True, spin=SPIN) + + np.testing.assert_allclose( + e.reshape(-1), ref["energy"].reshape(-1), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + ae.reshape(-1), + ref["atom_energy"].reshape(-1), + rtol=1e-10, + atol=1e-10, + ) + np.testing.assert_allclose( + f.reshape(-1), ref["force"].reshape(-1), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + fm.reshape(-1), + ref["force_mag"].reshape(-1), + rtol=1e-10, + atol=1e-10, + ) + np.testing.assert_allclose( + v.reshape(-1), ref["virial"].reshape(-1), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose(mm.reshape(-1), ref["mask_mag"].reshape(-1)) + # Shape checks + assert e.shape == (1, 1) + assert f.shape == (1, natoms, 3) + assert v.shape == (1, 9) + assert ae.shape == (1, natoms, 1) + assert av.shape == (1, natoms, 9) + assert fm.shape == (1, natoms, 3) + assert mm.shape == (1, natoms, 1) + + def test_eval_pbc_nonatomic(self, spin_model_files, ext) -> None: + """Test PBC evaluation with atomic=False.""" + from deepmd.infer import ( + DeepPot, + ) + + files, ref, _ = spin_model_files + dp = DeepPot(files[ext]) + + e, f, v, fm, mm = dp.eval(COORD, BOX, ATYPE, atomic=False, spin=SPIN) + + np.testing.assert_allclose( + e.reshape(-1), ref["energy"].reshape(-1), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + f.reshape(-1), ref["force"].reshape(-1), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + fm.reshape(-1), + ref["force_mag"].reshape(-1), + rtol=1e-10, + atol=1e-10, + ) + np.testing.assert_allclose( + v.reshape(-1), ref["virial"].reshape(-1), rtol=1e-10, atol=1e-10 + ) + + def test_eval_nopbc_atomic(self, spin_model_files, ext) -> None: + """Test NoPBC evaluation with atomic=True.""" + from deepmd.infer import ( + DeepPot, + ) + + files, _, ref = spin_model_files + dp = DeepPot(files[ext]) + + e, f, v, ae, av, fm, mm = dp.eval(COORD, None, ATYPE, atomic=True, spin=SPIN) + + np.testing.assert_allclose( + e.reshape(-1), ref["energy"].reshape(-1), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + ae.reshape(-1), + ref["atom_energy"].reshape(-1), + rtol=1e-10, + atol=1e-10, + ) + np.testing.assert_allclose( + f.reshape(-1), ref["force"].reshape(-1), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + fm.reshape(-1), + ref["force_mag"].reshape(-1), + rtol=1e-10, + atol=1e-10, + ) + + def test_eval_nopbc_nonatomic(self, spin_model_files, ext) -> None: + """Test NoPBC evaluation with atomic=False.""" + from deepmd.infer import ( + DeepPot, + ) + + files, _, ref = spin_model_files + dp = DeepPot(files[ext]) + + e, f, v, fm, mm = dp.eval(COORD, None, ATYPE, atomic=False, spin=SPIN) + + np.testing.assert_allclose( + e.reshape(-1), ref["energy"].reshape(-1), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + f.reshape(-1), ref["force"].reshape(-1), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + fm.reshape(-1), + ref["force_mag"].reshape(-1), + rtol=1e-10, + atol=1e-10, + ) From a51de70a1989aa8a8162c31a9c9b918efb4e6f95 Mon Sep 17 00:00:00 2001 From: Han Wang Date: Sat, 4 Apr 2026 00:13:55 +0800 Subject: [PATCH 02/13] feat(pt_expt): add get_use_spin API, model devi tests, and LAMMPS spin tests Add per-type use_spin query to both C++ and Python inference APIs so that consumers can determine which atom types have spin enabled. Also add C++ model-deviation tests for .pt2 spin models and LAMMPS-level spin tests for the .pt2 backend. - Store use_spin in .pt2 metadata and expose via get_use_spin() in C++ (DeepSpin, DeepSpinModelDevi, DeepSpinPTExpt, DeepSpinPT stub) - Add get_use_spin() to Python DeepEvalBackend/DeepEval across all backends (pt_expt, pt, dpmodel, pd) - Create gen_spin_model_devi.py for two-seed spin .pt2 model generation - Add test_deepspin_model_devi_ptexpt.cc C++ model deviation tests - Add test_lammps_spin_pt2.py (PBC) and test_lammps_spin_nopbc_pt2.py - Add use_spin tests for both spin and non-spin models in Python --- deepmd/dpmodel/infer/deep_eval.py | 10 + deepmd/infer/deep_eval.py | 23 ++ deepmd/pd/infer/deep_eval.py | 7 + deepmd/pt/infer/deep_eval.py | 7 + deepmd/pt_expt/infer/deep_eval.py | 6 + deepmd/pt_expt/utils/serialization.py | 1 + source/api_cc/include/DeepSpin.h | 20 ++ source/api_cc/include/DeepSpinPT.h | 5 + source/api_cc/include/DeepSpinPTExpt.h | 5 + source/api_cc/src/DeepSpin.cc | 14 + source/api_cc/src/DeepSpinPTExpt.cc | 7 + .../tests/test_deeppot_dpa_ptexpt_spin.cc | 8 + .../tests/test_deepspin_model_devi_ptexpt.cc | 173 ++++++++++ source/install/test_cc_local.sh | 1 + .../lmp/tests/test_lammps_spin_nopbc_pt2.py | 242 +++++++++++++ source/lmp/tests/test_lammps_spin_pt2.py | 325 ++++++++++++++++++ source/tests/infer/gen_spin_model_devi.py | 235 +++++++++++++ source/tests/pt_expt/infer/test_deep_eval.py | 8 + .../pt_expt/infer/test_deep_eval_spin.py | 11 + 19 files changed, 1108 insertions(+) create mode 100644 source/api_cc/tests/test_deepspin_model_devi_ptexpt.cc create mode 100644 source/lmp/tests/test_lammps_spin_nopbc_pt2.py create mode 100644 source/lmp/tests/test_lammps_spin_pt2.py create mode 100644 source/tests/infer/gen_spin_model_devi.py diff --git a/deepmd/dpmodel/infer/deep_eval.py b/deepmd/dpmodel/infer/deep_eval.py index ac6963b435..d735443383 100644 --- a/deepmd/dpmodel/infer/deep_eval.py +++ b/deepmd/dpmodel/infer/deep_eval.py @@ -166,6 +166,16 @@ def get_has_efield(self) -> bool: """Check if the model has efield.""" return False + def get_has_spin(self) -> bool: + """Check if the model has spin atom types.""" + return hasattr(self.dp, "spin") + + def get_use_spin(self) -> list[bool]: + """Get the per-type spin usage of this model.""" + if hasattr(self.dp, "spin"): + return self.dp.spin.use_spin.tolist() + return [] + def get_ntypes_spin(self) -> int: """Get the number of spin atom types of this model.""" return 0 diff --git a/deepmd/infer/deep_eval.py b/deepmd/infer/deep_eval.py index d375a2ecd7..807414fa5d 100644 --- a/deepmd/infer/deep_eval.py +++ b/deepmd/infer/deep_eval.py @@ -323,6 +323,17 @@ def get_has_spin(self) -> bool: """Check if the model has spin atom types.""" return False + def get_use_spin(self) -> list[bool]: + """Get the per-type spin usage of this model. + + Returns + ------- + list[bool] + A list of bool indicating whether each atom type uses spin. + Empty list if the model does not have spin. + """ + return [] + def get_has_hessian(self) -> bool: """Check if the model has hessian.""" return False @@ -705,6 +716,18 @@ def has_spin(self) -> bool: """Check if the model has spin.""" return self.deep_eval.get_has_spin() + @property + def use_spin(self) -> list[bool]: + """Get the per-type spin usage of this model. + + Returns + ------- + list[bool] + A list of bool indicating whether each atom type uses spin. + Empty list if the model does not have spin. + """ + return self.deep_eval.get_use_spin() + @property def has_hessian(self) -> bool: """Check if the model has hessian.""" diff --git a/deepmd/pd/infer/deep_eval.py b/deepmd/pd/infer/deep_eval.py index 6c0ffed7ec..8f4dda7199 100644 --- a/deepmd/pd/infer/deep_eval.py +++ b/deepmd/pd/infer/deep_eval.py @@ -297,6 +297,13 @@ def get_has_spin(self) -> bool: """Check if the model has spin atom types.""" return self._has_spin + def get_use_spin(self) -> list[bool]: + """Get the per-type spin usage of this model.""" + if self._has_spin: + model = self.dp.model["Default"] + return model.spin.use_spin.tolist() + return [] + def get_has_hessian(self) -> bool: """Check if the model has hessian.""" return self._has_hessian diff --git a/deepmd/pt/infer/deep_eval.py b/deepmd/pt/infer/deep_eval.py index 97908c873a..2e30b8574a 100644 --- a/deepmd/pt/infer/deep_eval.py +++ b/deepmd/pt/infer/deep_eval.py @@ -314,6 +314,13 @@ def get_has_spin(self) -> bool: """Check if the model has spin atom types.""" return self._has_spin + def get_use_spin(self) -> list[bool]: + """Get the per-type spin usage of this model.""" + if self._has_spin: + model = self.dp.model["Default"] + return model.spin.use_spin.tolist() + return [] + def get_has_hessian(self) -> bool: """Check if the model has hessian.""" return self._has_hessian diff --git a/deepmd/pt_expt/infer/deep_eval.py b/deepmd/pt_expt/infer/deep_eval.py index 02b68ffb6c..e424a026cf 100644 --- a/deepmd/pt_expt/infer/deep_eval.py +++ b/deepmd/pt_expt/infer/deep_eval.py @@ -264,6 +264,12 @@ def get_has_spin(self) -> bool: """Check if the model has spin atom types.""" return getattr(self, "_is_spin", False) + def get_use_spin(self) -> list[bool]: + """Get the per-type spin usage of this model.""" + if getattr(self, "_is_spin", False): + return self._dpmodel.spin.use_spin.tolist() + return [] + def get_ntypes_spin(self) -> int: """Get the number of spin atom types of this model. Only used in old implement.""" return 0 diff --git a/deepmd/pt_expt/utils/serialization.py b/deepmd/pt_expt/utils/serialization.py index 1974c3e8c8..b041827e3c 100644 --- a/deepmd/pt_expt/utils/serialization.py +++ b/deepmd/pt_expt/utils/serialization.py @@ -257,6 +257,7 @@ def _collect_metadata(model: torch.nn.Module, is_spin: bool = False) -> dict: } if is_spin: meta["ntypes_spin"] = model.spin.get_ntypes_spin() + meta["use_spin"] = [bool(v) for v in model.spin.use_spin] return meta diff --git a/source/api_cc/include/DeepSpin.h b/source/api_cc/include/DeepSpin.h index 4fc9972378..1c2aee1d7b 100644 --- a/source/api_cc/include/DeepSpin.h +++ b/source/api_cc/include/DeepSpin.h @@ -160,6 +160,13 @@ class DeepSpinBackend : public DeepBaseModelBackend { const std::vector& aparam, const bool atomic) = 0; /** @} */ + + /** + * @brief Get the per-type use_spin flags. + * @return A vector of booleans indicating which atom types have spin enabled. + * Empty if the backend does not provide this information. + **/ + virtual std::vector get_use_spin() const { return {}; }; }; /** @@ -414,6 +421,13 @@ class DeepSpin : public DeepBaseModel { const std::vector& fparam = std::vector(), const std::vector& aparam = std::vector()); /** @} */ + + /** + * @brief Get the per-type use_spin flags. + * @return A vector of booleans indicating which atom types have spin enabled. + **/ + std::vector get_use_spin() const; + protected: std::shared_ptr dp; }; @@ -610,6 +624,12 @@ class DeepSpinModelDevi : public DeepBaseModelDevi { const std::vector& fparam = std::vector(), const std::vector& aparam = std::vector()); + /** + * @brief Get the per-type use_spin flags from the first model. + * @return A vector of booleans indicating which atom types have spin enabled. + **/ + std::vector get_use_spin() const; + protected: std::vector> dps; }; diff --git a/source/api_cc/include/DeepSpinPT.h b/source/api_cc/include/DeepSpinPT.h index 1cc35997e9..6570887d88 100644 --- a/source/api_cc/include/DeepSpinPT.h +++ b/source/api_cc/include/DeepSpinPT.h @@ -183,6 +183,11 @@ class DeepSpinPT : public DeepSpinBackend { assert(inited); return aparam_nall; }; + /** + * @brief Get the per-type use_spin flags. + * @return Empty vector — .pth backend does not store use_spin in metadata. + **/ + std::vector get_use_spin() const override { return {}; }; /** * @brief Check if the model has default frame parameters. * @return true if the model has default frame parameters. diff --git a/source/api_cc/include/DeepSpinPTExpt.h b/source/api_cc/include/DeepSpinPTExpt.h index 71e8c33470..af108c7690 100644 --- a/source/api_cc/include/DeepSpinPTExpt.h +++ b/source/api_cc/include/DeepSpinPTExpt.h @@ -99,6 +99,10 @@ class DeepSpinPTExpt : public DeepSpinBackend { assert(inited); return aparam_nall; }; + std::vector get_use_spin() const override { + assert(inited); + return use_spin_; + }; bool has_default_fparam() const { assert(inited); return has_default_fparam_; @@ -173,6 +177,7 @@ class DeepSpinPTExpt : public DeepSpinBackend { bool aparam_nall; bool has_default_fparam_; std::vector default_fparam_; + std::vector use_spin_; double rcut; int gpu_id; bool gpu_enabled; diff --git a/source/api_cc/src/DeepSpin.cc b/source/api_cc/src/DeepSpin.cc index b5a57acd35..0ed694f280 100644 --- a/source/api_cc/src/DeepSpin.cc +++ b/source/api_cc/src/DeepSpin.cc @@ -451,6 +451,13 @@ template void DeepSpin::compute(std::vector& dener, const std::vector& fparam, const std::vector& aparam_); +std::vector DeepSpin::get_use_spin() const { + if (dp) { + return dp->get_use_spin(); + } + return {}; +} + DeepSpinModelDevi::DeepSpinModelDevi() { inited = false; numb_models = 0; @@ -732,3 +739,10 @@ template void DeepSpinModelDevi::compute( const int& ago, const std::vector& fparam, const std::vector& aparam); + +std::vector DeepSpinModelDevi::get_use_spin() const { + if (!dps.empty()) { + return dps[0]->get_use_spin(); + } + return {}; +} diff --git a/source/api_cc/src/DeepSpinPTExpt.cc b/source/api_cc/src/DeepSpinPTExpt.cc index 9484b5e34f..8a0169d7f8 100644 --- a/source/api_cc/src/DeepSpinPTExpt.cc +++ b/source/api_cc/src/DeepSpinPTExpt.cc @@ -103,6 +103,13 @@ void DeepSpinPTExpt::init(const std::string& model, ntypes_spin = 0; } + use_spin_.clear(); + if (metadata.obj_val.count("use_spin")) { + for (const auto& v : metadata["use_spin"].as_array()) { + use_spin_.push_back(v.as_bool()); + } + } + if (metadata.obj_val.count("has_default_fparam")) { has_default_fparam_ = metadata["has_default_fparam"].as_bool(); } else { diff --git a/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc b/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc index dab5e7aade..14b5ba88fe 100644 --- a/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc +++ b/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc @@ -138,6 +138,14 @@ class TestInferDeepSpinDpaPtExpt : public ::testing::Test { TYPED_TEST_SUITE(TestInferDeepSpinDpaPtExpt, ValueTypes); +TYPED_TEST(TestInferDeepSpinDpaPtExpt, test_get_use_spin) { + deepmd::DeepSpin& dp = this->dp; + std::vector use_spin = dp.get_use_spin(); + EXPECT_EQ(use_spin.size(), 2); + EXPECT_TRUE(use_spin[0]); // Ni has spin + EXPECT_FALSE(use_spin[1]); // O has no spin +} + TYPED_TEST(TestInferDeepSpinDpaPtExpt, cpu_build_nlist) { using VALUETYPE = TypeParam; const std::vector& coord = this->coord; diff --git a/source/api_cc/tests/test_deepspin_model_devi_ptexpt.cc b/source/api_cc/tests/test_deepspin_model_devi_ptexpt.cc new file mode 100644 index 0000000000..e58d9c0f78 --- /dev/null +++ b/source/api_cc/tests/test_deepspin_model_devi_ptexpt.cc @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Test C++ model deviation for pt_expt (.pt2) backend with DPA1 spin model. +#include + +#include +#include +#include +#include + +#include "DeepSpin.h" +#include "neighbor_list.h" +#include "test_utils.h" + +// Spin models need relaxed epsilon +#undef EPSILON +#define EPSILON (std::is_same::value ? 1e-6 : 1e-1) + +template +class TestInferDeepSpinModeDeviPtExpt : public ::testing::Test { + protected: + std::vector coord = {12.83, 2.56, 2.18, 12.09, 2.87, 2.74, + 00.25, 3.32, 1.68, 3.36, 3.00, 1.81, + 3.51, 2.51, 2.60, 4.27, 3.22, 1.56}; + std::vector spin = {0.13, 0.02, 0.03, 0., 0., 0., 0., 0., 0., + 0.14, 0.10, 0.12, 0., 0., 0., 0., 0., 0.}; + std::vector atype = {0, 1, 1, 0, 1, 1}; + std::vector box = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; + int natoms; + + deepmd::DeepSpin dp0; + deepmd::DeepSpin dp1; + deepmd::DeepSpinModelDevi dp_md; + + void SetUp() override { + std::string model0_path = "../../tests/infer/deeppot_dpa_spin_md0.pt2"; + std::string model1_path = "../../tests/infer/deeppot_dpa_spin_md1.pt2"; + { + std::ifstream f(model0_path); + if (!f.good()) { + GTEST_SKIP() << "Skipping: " << model0_path << " not found."; + } + } + { + std::ifstream f(model1_path); + if (!f.good()) { + GTEST_SKIP() << "Skipping: " << model1_path << " not found."; + } + } +#ifndef BUILD_PYTORCH + GTEST_SKIP() << "Skip because PyTorch support is not enabled."; +#endif + dp0.init(model0_path); + dp1.init(model1_path); + dp_md.init({model0_path, model1_path}); + natoms = atype.size(); + }; + + void TearDown() override {}; +}; + +TYPED_TEST_SUITE(TestInferDeepSpinModeDeviPtExpt, ValueTypes); + +TYPED_TEST(TestInferDeepSpinModeDeviPtExpt, attrs) { + using VALUETYPE = TypeParam; + deepmd::DeepSpin& dp0 = this->dp0; + deepmd::DeepSpin& dp1 = this->dp1; + deepmd::DeepSpinModelDevi& dp_md = this->dp_md; + EXPECT_EQ(dp0.cutoff(), dp_md.cutoff()); + EXPECT_EQ(dp0.numb_types(), dp_md.numb_types()); + EXPECT_EQ(dp0.dim_fparam(), dp_md.dim_fparam()); + EXPECT_EQ(dp0.dim_aparam(), dp_md.dim_aparam()); + EXPECT_EQ(dp1.cutoff(), dp_md.cutoff()); + EXPECT_EQ(dp1.numb_types(), dp_md.numb_types()); + EXPECT_EQ(dp1.dim_fparam(), dp_md.dim_fparam()); + EXPECT_EQ(dp1.dim_aparam(), dp_md.dim_aparam()); +} + +TYPED_TEST(TestInferDeepSpinModeDeviPtExpt, cpu_build_nlist) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& spin = this->spin; + std::vector& atype = this->atype; + std::vector& box = this->box; + int& natoms = this->natoms; + deepmd::DeepSpin& dp0 = this->dp0; + deepmd::DeepSpin& dp1 = this->dp1; + deepmd::DeepSpinModelDevi& dp_md = this->dp_md; + + int nmodel = 2; + std::vector edir(nmodel), emd; + std::vector > fdir(nmodel), fmagdir(nmodel), + vdir(nmodel), fmd(nmodel), fmmagd(nmodel), vmd; + dp0.compute(edir[0], fdir[0], fmagdir[0], vdir[0], coord, spin, atype, box); + dp1.compute(edir[1], fdir[1], fmagdir[1], vdir[1], coord, spin, atype, box); + dp_md.compute(emd, fmd, fmmagd, vmd, coord, spin, atype, box); + + EXPECT_EQ(edir.size(), emd.size()); + EXPECT_EQ(fdir.size(), fmd.size()); + EXPECT_EQ(fmagdir.size(), fmmagd.size()); + EXPECT_EQ(vdir.size(), vmd.size()); + for (int kk = 0; kk < nmodel; ++kk) { + EXPECT_EQ(fdir[kk].size(), fmd[kk].size()); + EXPECT_EQ(fmagdir[kk].size(), fmmagd[kk].size()); + EXPECT_EQ(vdir[kk].size(), vmd[kk].size()); + } + for (int kk = 0; kk < nmodel; ++kk) { + EXPECT_LT(fabs(edir[kk] - emd[kk]), EPSILON); + for (size_t ii = 0; ii < fdir[0].size(); ++ii) { + EXPECT_LT(fabs(fdir[kk][ii] - fmd[kk][ii]), EPSILON); + } + for (size_t ii = 0; ii < fmagdir[0].size(); ++ii) { + EXPECT_LT(fabs(fmagdir[kk][ii] - fmmagd[kk][ii]), EPSILON); + } + for (size_t ii = 0; ii < vdir[0].size(); ++ii) { + EXPECT_LT(fabs(vdir[kk][ii] - vmd[kk][ii]), EPSILON); + } + } +} + +TYPED_TEST(TestInferDeepSpinModeDeviPtExpt, cpu_build_nlist_atomic) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& spin = this->spin; + std::vector& atype = this->atype; + std::vector& box = this->box; + int& natoms = this->natoms; + deepmd::DeepSpin& dp0 = this->dp0; + deepmd::DeepSpin& dp1 = this->dp1; + deepmd::DeepSpinModelDevi& dp_md = this->dp_md; + + int nmodel = 2; + std::vector edir(nmodel), emd; + std::vector > fdir(nmodel), fmagdir(nmodel), + vdir(nmodel), fmd(nmodel), fmmagd(nmodel), vmd, aedir(nmodel), aemd, + avdir(nmodel), avmd(nmodel); + dp0.compute(edir[0], fdir[0], fmagdir[0], vdir[0], aedir[0], avdir[0], coord, + spin, atype, box); + dp1.compute(edir[1], fdir[1], fmagdir[1], vdir[1], aedir[1], avdir[1], coord, + spin, atype, box); + dp_md.compute(emd, fmd, fmmagd, vmd, aemd, avmd, coord, spin, atype, box); + + EXPECT_EQ(edir.size(), emd.size()); + EXPECT_EQ(fdir.size(), fmd.size()); + EXPECT_EQ(fmagdir.size(), fmmagd.size()); + EXPECT_EQ(vdir.size(), vmd.size()); + EXPECT_EQ(aedir.size(), aemd.size()); + EXPECT_EQ(avdir.size(), avmd.size()); + for (int kk = 0; kk < nmodel; ++kk) { + EXPECT_EQ(fdir[kk].size(), fmd[kk].size()); + EXPECT_EQ(fmagdir[kk].size(), fmmagd[kk].size()); + EXPECT_EQ(vdir[kk].size(), vmd[kk].size()); + EXPECT_EQ(aedir[kk].size(), aemd[kk].size()); + EXPECT_EQ(avdir[kk].size(), avmd[kk].size()); + } + for (int kk = 0; kk < nmodel; ++kk) { + EXPECT_LT(fabs(edir[kk] - emd[kk]), EPSILON); + for (size_t ii = 0; ii < fdir[0].size(); ++ii) { + EXPECT_LT(fabs(fdir[kk][ii] - fmd[kk][ii]), EPSILON); + } + for (size_t ii = 0; ii < fmagdir[0].size(); ++ii) { + EXPECT_LT(fabs(fmagdir[kk][ii] - fmmagd[kk][ii]), EPSILON); + } + for (size_t ii = 0; ii < vdir[0].size(); ++ii) { + EXPECT_LT(fabs(vdir[kk][ii] - vmd[kk][ii]), EPSILON); + } + for (size_t ii = 0; ii < aedir[0].size(); ++ii) { + EXPECT_LT(fabs(aedir[kk][ii] - aemd[kk][ii]), EPSILON); + } + for (size_t ii = 0; ii < avdir[0].size(); ++ii) { + EXPECT_LT(fabs(avdir[kk][ii] - avmd[kk][ii]), EPSILON); + } + } +} diff --git a/source/install/test_cc_local.sh b/source/install/test_cc_local.sh index 8bc048f1a1..4d198d52ea 100755 --- a/source/install/test_cc_local.sh +++ b/source/install/test_cc_local.sh @@ -73,6 +73,7 @@ else: env ${_GEN_ENV} python ${INFER_SCRIPT_PATH}/gen_fparam_aparam.py env ${_GEN_ENV} python ${INFER_SCRIPT_PATH}/gen_model_devi.py env ${_GEN_ENV} python ${INFER_SCRIPT_PATH}/gen_spin.py + env ${_GEN_ENV} python ${INFER_SCRIPT_PATH}/gen_spin_model_devi.py fi if [ "${ENABLE_PADDLE:-TRUE}" == "TRUE" ]; then PADDLE_INFERENCE_DIR=${BUILD_TMP_DIR}/paddle_inference_install_dir diff --git a/source/lmp/tests/test_lammps_spin_nopbc_pt2.py b/source/lmp/tests/test_lammps_spin_nopbc_pt2.py new file mode 100644 index 0000000000..04226dee85 --- /dev/null +++ b/source/lmp/tests/test_lammps_spin_nopbc_pt2.py @@ -0,0 +1,242 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +import importlib +import os +import shutil +import subprocess as sp +import sys +import tempfile +from pathlib import ( + Path, +) + +import numpy as np +import pytest +from lammps import ( + PyLammps, +) +from write_lmp_data import ( + write_lmp_data_spin, +) + +pb_file = ( + Path(__file__).parent.parent.parent / "tests" / "infer" / "deeppot_dpa_spin.pt2" +) +pb_file2 = ( + Path(__file__).parent.parent.parent / "tests" / "infer" / "deeppot_dpa_spin_md1.pt2" +) +data_file = Path(__file__).parent / "data.lmp" +md_file = Path(__file__).parent / "md.out" + +# Reference values from the seed=1 .pt2 model (same weights as .pth, NoPBC) +expected_ae = np.array( + [-2.337313880002, -2.339828637443377, -2.358478126000974, -2.358478126000974] +) +expected_e = np.sum(expected_ae) +expected_f = np.array( + [ + [0.036908169450058, -0.0154615304452946, -0.0277072310206975], + [-0.036908169450058, 0.0154615304452946, 0.0277072310206975], + [-0.001114392839443, -0.0010410775210586, 0.0015249586223957], + [0.001114392839443, 0.0010410775210586, -0.0015249586223957], + ] +) +expected_fm = np.array( + [ + [0.0075469514215227, -0.0031615607306379, 0.0204654183352036], + [-0.0074172317569893, 0.003107218709009, 0.020927678503653], + [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], + [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], + ] +) + +# Reference values from the seed=2 .pt2 model (deeppot_dpa_spin_md1.pt2, NoPBC) +expected_f2 = np.array( + [ + [-5.0313948956892344e-03, 2.1077465103562995e-03, 3.3650618879773678e-03], + [5.0313948956892335e-03, -2.1077465103562999e-03, -3.3650618879773678e-03], + [7.8146213901410743e-04, 7.3005015618423231e-04, -1.0693692428614104e-03], + [-7.8146213901410743e-04, -7.3005015618423231e-04, 1.0693692428614104e-03], + ] +) + +expected_fm2 = np.array( + [ + [1.4597145672945039e-03, -6.1150204846121062e-04, -1.3469050004718076e-02], + [-1.7167887170022188e-03, 7.1919527333876780e-04, -1.3100088729734645e-02], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], + ] +) + +box = np.array([0, 100, 0, 100, 0, 100, 0, 0, 0]) +coord = np.array( + [ + [12.83, 2.56, 2.18], + [12.09, 2.87, 2.74], + [3.51, 2.51, 2.60], + [4.27, 3.22, 1.56], + ] +) +spin = np.array( + [ + [0, 0, 1.2737], + [0, 0, 1.2737], + [0, 0, 0], + [0, 0, 0], + ] +) +type_NiO = np.array([1, 1, 2, 2]) + + +def setup_module() -> None: + if os.environ.get("ENABLE_PYTORCH", "1") != "1": + pytest.skip( + "Skip test because PyTorch support is not enabled.", + ) + write_lmp_data_spin(box, coord, spin, type_NiO, data_file) + + +def teardown_module() -> None: + os.remove(data_file) + + +def _lammps(data_file, units="metal") -> PyLammps: + lammps = PyLammps() + lammps.units(units) + lammps.boundary("f f f") + lammps.atom_style("spin") + if units == "metal": + lammps.neighbor("2.0 bin") + else: + raise ValueError("units for spin should be metal") + lammps.neigh_modify("every 10 delay 0 check no") + lammps.read_data(data_file.resolve()) + if units == "metal": + lammps.mass("1 58") + lammps.mass("2 16") + else: + raise ValueError("units for spin should be metal") + if units == "metal": + lammps.timestep(0.0005) + else: + raise ValueError("units for spin should be metal") + lammps.fix("1 all nve") + return lammps + + +@pytest.fixture +def lammps(): + lmp = _lammps(data_file=data_file) + yield lmp + lmp.close() + + +def test_pair_deepmd(lammps) -> None: + lammps.pair_style(f"deepspin {pb_file.resolve()}") + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(4): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + lammps.run(1) + + +def test_pair_deepmd_model_devi(lammps) -> None: + lammps.pair_style( + f"deepspin {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1" + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(4): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + assert md[7] == pytest.approx(np.max(expected_md_fm)) + assert md[8] == pytest.approx(np.min(expected_md_fm)) + assert md[9] == pytest.approx(np.mean(expected_md_fm)) + + +def test_pair_deepmd_model_devi_atomic_relative(lammps) -> None: + relative = 1.0 + lammps.pair_style( + f"deepspin {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic relative {relative}" + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(4): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + norm_spin = np.linalg.norm(np.mean([expected_fm, expected_fm2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) + expected_md_fm /= norm_spin + relative + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + assert md[7] == pytest.approx(np.max(expected_md_fm)) + assert md[8] == pytest.approx(np.min(expected_md_fm)) + assert md[9] == pytest.approx(np.mean(expected_md_fm)) + + +@pytest.mark.skipif( + shutil.which("mpirun") is None, reason="MPI is not installed on this system" +) +@pytest.mark.skipif( + importlib.util.find_spec("mpi4py") is None, reason="mpi4py is not installed" +) +@pytest.mark.parametrize( + ("balance_args",), + [(["--balance"],), ([],)], +) +def test_pair_deepmd_mpi(balance_args: list) -> None: + with tempfile.NamedTemporaryFile() as f: + sp.check_call( + [ + "mpirun", + "-n", + "2", + sys.executable, + Path(__file__).parent / "run_mpi_pair_deepmd_spin.py", + data_file, + pb_file, + pb_file2, + md_file, + f.name, + *balance_args, + ] + ) + arr = np.loadtxt(f.name, ndmin=1) + pe = arr[0] + + relative = 1.0 + assert pe == pytest.approx(expected_e) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + norm_spin = np.linalg.norm(np.mean([expected_fm, expected_fm2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) + expected_md_fm /= norm_spin + relative + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + assert md[7] == pytest.approx(np.max(expected_md_fm)) + assert md[8] == pytest.approx(np.min(expected_md_fm)) + assert md[9] == pytest.approx(np.mean(expected_md_fm)) diff --git a/source/lmp/tests/test_lammps_spin_pt2.py b/source/lmp/tests/test_lammps_spin_pt2.py new file mode 100644 index 0000000000..520f29d7cb --- /dev/null +++ b/source/lmp/tests/test_lammps_spin_pt2.py @@ -0,0 +1,325 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +import importlib +import os +import shutil +import subprocess as sp +import sys +import tempfile +from pathlib import ( + Path, +) + +import constants +import numpy as np +import pytest +from lammps import ( + PyLammps, +) +from write_lmp_data import ( + write_lmp_data_spin, +) + +pb_file = ( + Path(__file__).parent.parent.parent / "tests" / "infer" / "deeppot_dpa_spin.pt2" +) +pb_file2 = ( + Path(__file__).parent.parent.parent / "tests" / "infer" / "deeppot_dpa_spin_md1.pt2" +) +data_file = Path(__file__).parent / "data.lmp" +md_file = Path(__file__).parent / "md.out" + +# Reference values from the seed=1 .pt2 model (same weights as .pth) +expected_ae = np.array( + [-2.33730603846356, -2.339828637443377, -2.3584765990764933, -2.358478126000974] +) +expected_e = np.sum(expected_ae) +expected_f = np.array( + [ + [0.036819000183374, -0.0154603124989284, -0.0277136918031471], + [-0.0369115932121166, 0.0154614940830129, 0.0277067438704936], + [-0.0010240778189108, -0.0010425850123752, 0.0015323196618039], + [0.0011166708476534, 0.0010414034282908, -0.0015253717291505], + ] +) +expected_fm = np.array( + [ + [0.007540380021158, -0.0031615447712641, 0.0204706018052022], + [-0.0074177167392878, 0.0031072528813168, 0.0209277147341756], + [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], + [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], + ] +) + +# Reference values from the seed=2 .pt2 model (deeppot_dpa_spin_md1.pt2, PBC) +expected_f2 = np.array( + [ + [-5.0903657013833805e-03, 2.2714596279667276e-03, 3.5699195164111686e-03], + [4.9335267498655496e-03, -2.2027414621596151e-03, -3.6334615119367475e-03], + [1.1774037584944407e-03, 6.9469696563881659e-04, -1.0467746979479903e-03], + [-1.0205648069766093e-03, -7.6341513144592970e-04, 1.1103166934735694e-03], + ] +) + +expected_fm2 = np.array( + [ + [1.6161523921420901e-03, -6.1507586761937660e-04, -1.4084754563287318e-02], + [-1.7131909329371128e-03, 7.1495794003373391e-04, -1.3238736630706918e-02], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], + ] +) + +expected_v = -np.array( + [ + 0.0138536891649799, + -0.0057815832940349, + -0.0104366273910430, + -0.0057802135977019, + 0.0024216972469495, + 0.0043747666241247, + -0.0120159787305366, + 0.0050342035124280, + 0.0090942101965059, + 0.0135151396517160, + -0.0056617476919350, + -0.0102276732499471, + -0.0056606594176084, + 0.0023713573235927, + 0.0042837422619739, + -0.0084858208754591, + 0.0035548709072868, + 0.0064217022841311, + 0.0007099617850315, + 0.0003917168967788, + -0.0005467867622337, + 0.0003906286224523, + 0.0003696501943719, + -0.0005419287758774, + -0.0005551067425154, + -0.0005416915274450, + 0.0007957607021995, + 0.0004252005652282, + 0.0003972268438316, + -0.0005818534050492, + 0.0003958571474987, + 0.0003698139141107, + -0.0005416992544720, + -0.0005797982376440, + -0.0005416536167464, + 0.0007934081146707, + ] +).reshape(4, 9) + +box = np.array([0, 13, 0, 13, 0, 13, 0, 0, 0]) +coord = np.array( + [ + [12.83, 2.56, 2.18], + [12.09, 2.87, 2.74], + [3.51, 2.51, 2.60], + [4.27, 3.22, 1.56], + ] +) +spin = np.array( + [ + [0, 0, 1.2737], + [0, 0, 1.2737], + [0, 0, 0], + [0, 0, 0], + ] +) +type_NiO = np.array([1, 1, 2, 2]) + + +def setup_module() -> None: + if os.environ.get("ENABLE_PYTORCH", "1") != "1": + pytest.skip( + "Skip test because PyTorch support is not enabled.", + ) + write_lmp_data_spin(box, coord, spin, type_NiO, data_file) + + +def teardown_module() -> None: + os.remove(data_file) + + +def _lammps(data_file, units="metal") -> PyLammps: + lammps = PyLammps() + lammps.units(units) + lammps.boundary("p p p") + lammps.atom_style("spin") + if units == "metal": + lammps.neighbor("2.0 bin") + else: + raise ValueError("units for spin should be metal") + lammps.neigh_modify("every 10 delay 0 check no") + lammps.read_data(data_file.resolve()) + if units == "metal": + lammps.mass("1 58") + lammps.mass("2 16") + else: + raise ValueError("units for spin should be metal") + if units == "metal": + lammps.timestep(0.0005) + else: + raise ValueError("units for spin should be metal") + lammps.fix("1 all nve") + return lammps + + +@pytest.fixture +def lammps(): + lmp = _lammps(data_file=data_file) + yield lmp + lmp.close() + + +def test_pair_deepmd(lammps) -> None: + lammps.pair_style(f"deepspin {pb_file.resolve()}") + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(4): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + lammps.run(1) + + +def test_pair_deepmd_virial(lammps) -> None: + lammps.pair_style(f"deepspin {pb_file.resolve()}") + lammps.pair_coeff("* *") + lammps.compute("peatom all pe/atom pair") + lammps.compute("pressure all pressure NULL pair") + lammps.compute("virial all centroid/stress/atom NULL pair") + lammps.variable("eatom atom c_peatom") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps.variable(f"pressure{jj} equal c_pressure[{ii + 1}]") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps.variable(f"virial{jj} atom c_virial[{ii + 1}]") + lammps.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(4): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + idx_map = lammps.lmp.numpy.extract_atom("id")[: coord.shape[0]] - 1 + assert np.array(lammps.variables["eatom"].value) == pytest.approx( + expected_ae[idx_map] + ) + vol = box[1] * box[3] * box[5] + for ii in range(6): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + assert np.array( + lammps.variables[f"pressure{jj}"].value + ) / constants.nktv2p == pytest.approx( + -expected_v[idx_map, jj].sum(axis=0) / vol + ) + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + assert np.array( + lammps.variables[f"virial{jj}"].value + ) / constants.nktv2p == pytest.approx(expected_v[idx_map, jj]) + + +def test_pair_deepmd_model_devi(lammps) -> None: + lammps.pair_style( + f"deepspin {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1" + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(4): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + assert md[7] == pytest.approx(np.max(expected_md_fm)) + assert md[8] == pytest.approx(np.min(expected_md_fm)) + assert md[9] == pytest.approx(np.mean(expected_md_fm)) + + +def test_pair_deepmd_model_devi_atomic_relative(lammps) -> None: + relative = 1.0 + lammps.pair_style( + f"deepspin {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic relative {relative}" + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(4): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + norm_spin = np.linalg.norm(np.mean([expected_fm, expected_fm2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) + expected_md_fm /= norm_spin + relative + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + assert md[7] == pytest.approx(np.max(expected_md_fm)) + assert md[8] == pytest.approx(np.min(expected_md_fm)) + assert md[9] == pytest.approx(np.mean(expected_md_fm)) + + +@pytest.mark.skipif( + shutil.which("mpirun") is None, reason="MPI is not installed on this system" +) +@pytest.mark.skipif( + importlib.util.find_spec("mpi4py") is None, reason="mpi4py is not installed" +) +@pytest.mark.parametrize( + ("balance_args",), + [(["--balance"],), ([],)], +) +def test_pair_deepmd_mpi(balance_args: list) -> None: + with tempfile.NamedTemporaryFile() as f: + sp.check_call( + [ + "mpirun", + "-n", + "2", + sys.executable, + Path(__file__).parent / "run_mpi_pair_deepmd_spin.py", + data_file, + pb_file, + pb_file2, + md_file, + f.name, + *balance_args, + ] + ) + arr = np.loadtxt(f.name, ndmin=1) + pe = arr[0] + + relative = 1.0 + assert pe == pytest.approx(expected_e) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + norm_spin = np.linalg.norm(np.mean([expected_fm, expected_fm2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) + expected_md_fm /= norm_spin + relative + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + assert md[7] == pytest.approx(np.max(expected_md_fm)) + assert md[8] == pytest.approx(np.min(expected_md_fm)) + assert md[9] == pytest.approx(np.mean(expected_md_fm)) diff --git a/source/tests/infer/gen_spin_model_devi.py b/source/tests/infer/gen_spin_model_devi.py new file mode 100644 index 0000000000..ad101fa719 --- /dev/null +++ b/source/tests/infer/gen_spin_model_devi.py @@ -0,0 +1,235 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-3.0-or-later +"""Generate deeppot_dpa_spin_md0.pt2 and deeppot_dpa_spin_md1.pt2 test models. + +Creates two DPA1 spin models with different seeds for model deviation testing. +Prints reference values for C++ tests. +""" + +import copy +import os +import sys + +import numpy as np + +# Ensure the source tree is on the path +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "..")) + +from gen_common import ( + ensure_inductor_compiler, + load_custom_ops, + print_cpp_spin_values, +) + + +def main(): + from deepmd.dpmodel.model.model import ( + get_model, + ) + + ensure_inductor_compiler() + + # ---- 1. DPA1 spin model config (same as gen_spin.py) ---- + config = { + "type_map": ["Ni", "O"], + "descriptor": { + "type": "se_atten", + "sel": 30, + "rcut_smth": 2.0, + "rcut": 6.0, + "neuron": [2, 4, 8], + "axis_neuron": 4, + "attn": 5, + "attn_layer": 2, + "attn_dotr": True, + "attn_mask": False, + "activation_function": "tanh", + "scaling_factor": 1.0, + "normalize": True, + "temperature": 1.0, + "type_one_side": True, + "seed": 1, + }, + "fitting_net": { + "neuron": [5, 5, 5], + "resnet_dt": True, + "seed": 1, + }, + "spin": { + "use_spin": [True, False], + "virtual_scale": [0.3140, 0.0], + }, + } + + # ---- 2. Build two models with different seeds ---- + from deepmd.pt_expt.utils.serialization import ( + deserialize_to_file as pt_expt_deserialize_to_file, + ) + + # Load custom ops after deepmd.pt import to avoid double registration + load_custom_ops() + + base_dir = os.path.dirname(__file__) + + models = [] + for idx, seed in enumerate([1, 2]): + cfg = copy.deepcopy(config) + cfg["descriptor"]["seed"] = seed + cfg["fitting_net"]["seed"] = seed + model = get_model(cfg) + model_dict = model.serialize() + data = { + "model": model_dict, + "model_def_script": cfg, + "backend": "dpmodel", + "software": "deepmd-kit", + "version": "3.0.0", + } + pt2_path = os.path.join(base_dir, f"deeppot_dpa_spin_md{idx}.pt2") + print(f"Exporting to {pt2_path} ...") # noqa: T201 + pt_expt_deserialize_to_file(pt2_path, copy.deepcopy(data)) + models.append(pt2_path) + + print("Export done.") # noqa: T201 + + # ---- 3. Run inference for both models ---- + from deepmd.infer import ( + DeepPot, + ) + + coord = np.array( + [ + 12.83, + 2.56, + 2.18, + 12.09, + 2.87, + 2.74, + 0.25, + 3.32, + 1.68, + 3.36, + 3.00, + 1.81, + 3.51, + 2.51, + 2.60, + 4.27, + 3.22, + 1.56, + ], + dtype=np.float64, + ) + spin = np.array( + [ + 0.13, + 0.02, + 0.03, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.14, + 0.10, + 0.12, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + ], + dtype=np.float64, + ) + atype = [0, 1, 1, 0, 1, 1] + box = np.array([13.0, 0.0, 0.0, 0.0, 13.0, 0.0, 0.0, 0.0, 13.0], dtype=np.float64) + + for idx, pt2_path in enumerate(models): + dp = DeepPot(pt2_path) + e, f, v, ae, av, fm, _ = dp.eval(coord, box, atype, atomic=True, spin=spin) + print(f"\n// Model {idx} total energy: {e[0, 0]:.18e}") # noqa: T201 + print_cpp_spin_values(f"Model {idx} reference values", ae, f, fm, v, av) + + # ---- 4. Also print LAMMPS 4-atom system reference values ---- + # The LAMMPS spin tests use a different coordinate layout (4 atoms: 2 Ni + 2 O) + lmp_coord = np.array( + [ + 12.83, + 2.56, + 2.18, + 12.09, + 2.87, + 2.74, + 3.51, + 2.51, + 2.60, + 4.27, + 3.22, + 1.56, + ], + dtype=np.float64, + ) + lmp_spin = np.array( + [ + 0, + 0, + 1.2737, + 0, + 0, + 1.2737, + 0, + 0, + 0, + 0, + 0, + 0, + ], + dtype=np.float64, + ) + lmp_atype = [0, 0, 1, 1] + lmp_box = np.array( + [13.0, 0.0, 0.0, 0.0, 13.0, 0.0, 0.0, 0.0, 13.0], dtype=np.float64 + ) + + print("\n// ---- LAMMPS 4-atom system (PBC) ----") # noqa: T201 + for idx, pt2_path in enumerate(models): + dp = DeepPot(pt2_path) + e, f, v, ae, av, fm, _ = dp.eval( + lmp_coord, lmp_box, lmp_atype, atomic=True, spin=lmp_spin + ) + print(f"\n// LAMMPS Model {idx} total energy: {e[0, 0]:.18e}") # noqa: T201 + print(f"// LAMMPS Model {idx} force:") # noqa: T201 + for ii in range(4): + print(f"// [{f[0, ii, 0]:.16e}, {f[0, ii, 1]:.16e}, {f[0, ii, 2]:.16e}]") # noqa: T201 + print(f"// LAMMPS Model {idx} force_mag:") # noqa: T201 + for ii in range(4): + msg = ( + f"// [{fm[0, ii, 0]:.16e}, {fm[0, ii, 1]:.16e}, {fm[0, ii, 2]:.16e}]" + ) + print(msg) # noqa: T201 + + # NoPBC for LAMMPS + print("\n// ---- LAMMPS 4-atom system (NoPBC) ----") # noqa: T201 + for idx, pt2_path in enumerate(models): + dp = DeepPot(pt2_path) + e, f, v, ae, av, fm, _ = dp.eval( + lmp_coord, None, lmp_atype, atomic=True, spin=lmp_spin + ) + print(f"\n// LAMMPS NoPBC Model {idx} total energy: {e[0, 0]:.18e}") # noqa: T201 + print(f"// LAMMPS NoPBC Model {idx} force:") # noqa: T201 + for ii in range(4): + print(f"// [{f[0, ii, 0]:.16e}, {f[0, ii, 1]:.16e}, {f[0, ii, 2]:.16e}]") # noqa: T201 + print(f"// LAMMPS NoPBC Model {idx} force_mag:") # noqa: T201 + for ii in range(4): + msg = ( + f"// [{fm[0, ii, 0]:.16e}, {fm[0, ii, 1]:.16e}, {fm[0, ii, 2]:.16e}]" + ) + print(msg) # noqa: T201 + + print("\nDone!") # noqa: T201 + + +if __name__ == "__main__": + main() diff --git a/source/tests/pt_expt/infer/test_deep_eval.py b/source/tests/pt_expt/infer/test_deep_eval.py index 112ada5dc7..15516ffb55 100644 --- a/source/tests/pt_expt/infer/test_deep_eval.py +++ b/source/tests/pt_expt/infer/test_deep_eval.py @@ -96,6 +96,10 @@ def test_get_sel_type(self) -> None: sel_type = self.dp.deep_eval.get_sel_type() self.assertEqual(sel_type, self.model.get_sel_type()) + def test_use_spin_non_spin_model(self) -> None: + self.assertFalse(self.dp.has_spin) + self.assertEqual(self.dp.use_spin, []) + def test_model_type(self) -> None: self.assertIs(self.dp.deep_eval.model_type, DeepPot) @@ -582,6 +586,10 @@ def test_get_sel_type(self) -> None: sel_type = self.dp.deep_eval.get_sel_type() self.assertEqual(sel_type, self.model.get_sel_type()) + def test_use_spin_non_spin_model(self) -> None: + self.assertFalse(self.dp.has_spin) + self.assertEqual(self.dp.use_spin, []) + def test_model_type(self) -> None: self.assertIs(self.dp.deep_eval.model_type, DeepPot) diff --git a/source/tests/pt_expt/infer/test_deep_eval_spin.py b/source/tests/pt_expt/infer/test_deep_eval_spin.py index 083157894b..69cebc8365 100644 --- a/source/tests/pt_expt/infer/test_deep_eval_spin.py +++ b/source/tests/pt_expt/infer/test_deep_eval_spin.py @@ -177,6 +177,17 @@ def test_get_has_spin(self, spin_model_files, ext) -> None: dp = DeepPot(files[ext]) assert dp.has_spin + def test_get_use_spin(self, spin_model_files, ext) -> None: + """Test that use_spin returns per-type spin usage.""" + from deepmd.infer import ( + DeepPot, + ) + + files, _, _ = spin_model_files + dp = DeepPot(files[ext]) + use_spin = dp.use_spin + assert use_spin == [True, False] + def test_get_ntypes_spin(self, spin_model_files, ext) -> None: """Test that get_ntypes_spin returns 0 (new spin implementation).""" from deepmd.infer import ( From b818feb5ce1c9fd2087cceb8b436aec3b9fbafcb Mon Sep 17 00:00:00 2001 From: Han Wang Date: Sat, 4 Apr 2026 00:35:10 +0800 Subject: [PATCH 03/13] fix(lmp): remove MPI tests from .pt2 spin LAMMPS tests pt_expt does not support MPI yet, so remove test_pair_deepmd_mpi from both test_lammps_spin_pt2.py and test_lammps_spin_nopbc_pt2.py. Also remove the now-unused imports (importlib, shutil, subprocess, sys, tempfile). --- .../lmp/tests/test_lammps_spin_nopbc_pt2.py | 53 ------------------- source/lmp/tests/test_lammps_spin_pt2.py | 53 ------------------- 2 files changed, 106 deletions(-) diff --git a/source/lmp/tests/test_lammps_spin_nopbc_pt2.py b/source/lmp/tests/test_lammps_spin_nopbc_pt2.py index 04226dee85..89a670e48c 100644 --- a/source/lmp/tests/test_lammps_spin_nopbc_pt2.py +++ b/source/lmp/tests/test_lammps_spin_nopbc_pt2.py @@ -1,10 +1,5 @@ # SPDX-License-Identifier: LGPL-3.0-or-later -import importlib import os -import shutil -import subprocess as sp -import sys -import tempfile from pathlib import ( Path, ) @@ -192,51 +187,3 @@ def test_pair_deepmd_model_devi_atomic_relative(lammps) -> None: assert md[7] == pytest.approx(np.max(expected_md_fm)) assert md[8] == pytest.approx(np.min(expected_md_fm)) assert md[9] == pytest.approx(np.mean(expected_md_fm)) - - -@pytest.mark.skipif( - shutil.which("mpirun") is None, reason="MPI is not installed on this system" -) -@pytest.mark.skipif( - importlib.util.find_spec("mpi4py") is None, reason="mpi4py is not installed" -) -@pytest.mark.parametrize( - ("balance_args",), - [(["--balance"],), ([],)], -) -def test_pair_deepmd_mpi(balance_args: list) -> None: - with tempfile.NamedTemporaryFile() as f: - sp.check_call( - [ - "mpirun", - "-n", - "2", - sys.executable, - Path(__file__).parent / "run_mpi_pair_deepmd_spin.py", - data_file, - pb_file, - pb_file2, - md_file, - f.name, - *balance_args, - ] - ) - arr = np.loadtxt(f.name, ndmin=1) - pe = arr[0] - - relative = 1.0 - assert pe == pytest.approx(expected_e) - # load model devi - md = np.loadtxt(md_file.resolve()) - norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) - norm_spin = np.linalg.norm(np.mean([expected_fm, expected_fm2], axis=0), axis=1) - expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) - expected_md_f /= norm + relative - expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) - expected_md_fm /= norm_spin + relative - assert md[4] == pytest.approx(np.max(expected_md_f)) - assert md[5] == pytest.approx(np.min(expected_md_f)) - assert md[6] == pytest.approx(np.mean(expected_md_f)) - assert md[7] == pytest.approx(np.max(expected_md_fm)) - assert md[8] == pytest.approx(np.min(expected_md_fm)) - assert md[9] == pytest.approx(np.mean(expected_md_fm)) diff --git a/source/lmp/tests/test_lammps_spin_pt2.py b/source/lmp/tests/test_lammps_spin_pt2.py index 520f29d7cb..fa0b7fcb7f 100644 --- a/source/lmp/tests/test_lammps_spin_pt2.py +++ b/source/lmp/tests/test_lammps_spin_pt2.py @@ -1,10 +1,5 @@ # SPDX-License-Identifier: LGPL-3.0-or-later -import importlib import os -import shutil -import subprocess as sp -import sys -import tempfile from pathlib import ( Path, ) @@ -275,51 +270,3 @@ def test_pair_deepmd_model_devi_atomic_relative(lammps) -> None: assert md[7] == pytest.approx(np.max(expected_md_fm)) assert md[8] == pytest.approx(np.min(expected_md_fm)) assert md[9] == pytest.approx(np.mean(expected_md_fm)) - - -@pytest.mark.skipif( - shutil.which("mpirun") is None, reason="MPI is not installed on this system" -) -@pytest.mark.skipif( - importlib.util.find_spec("mpi4py") is None, reason="mpi4py is not installed" -) -@pytest.mark.parametrize( - ("balance_args",), - [(["--balance"],), ([],)], -) -def test_pair_deepmd_mpi(balance_args: list) -> None: - with tempfile.NamedTemporaryFile() as f: - sp.check_call( - [ - "mpirun", - "-n", - "2", - sys.executable, - Path(__file__).parent / "run_mpi_pair_deepmd_spin.py", - data_file, - pb_file, - pb_file2, - md_file, - f.name, - *balance_args, - ] - ) - arr = np.loadtxt(f.name, ndmin=1) - pe = arr[0] - - relative = 1.0 - assert pe == pytest.approx(expected_e) - # load model devi - md = np.loadtxt(md_file.resolve()) - norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) - norm_spin = np.linalg.norm(np.mean([expected_fm, expected_fm2], axis=0), axis=1) - expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) - expected_md_f /= norm + relative - expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) - expected_md_fm /= norm_spin + relative - assert md[4] == pytest.approx(np.max(expected_md_f)) - assert md[5] == pytest.approx(np.min(expected_md_f)) - assert md[6] == pytest.approx(np.mean(expected_md_f)) - assert md[7] == pytest.approx(np.max(expected_md_fm)) - assert md[8] == pytest.approx(np.min(expected_md_fm)) - assert md[9] == pytest.approx(np.mean(expected_md_fm)) From 3c5a29f3dc59efdf558cf7bd8f9119d88e5f97c1 Mon Sep 17 00:00:00 2001 From: Han Wang Date: Sat, 4 Apr 2026 21:57:08 +0800 Subject: [PATCH 04/13] fix(dpmodel): fix spin model serialization and atomic virial (add_mag) - Add "type": "spin_ener" to spin model serialize() across all backends (dpmodel, pt, pt_expt) so BaseModel.deserialize() can dispatch correctly - Fix dpmodel spin_model add_mag=False -> add_mag=True for atomic virial in both call_common and call_common_lower, matching the pt backend behavior - Handle spin model deserialization in pt's deserialize_to_file and dpmodel's BaseModel.deserialize - Replace committed .pth with canonical .yaml format; gen_spin.py and gen_spin_model_devi.py now regenerate .pth/.pt2 from .yaml via convert_backend - Update all test reference values (C++, C API, LAMMPS) for the regenerated models --- deepmd/dpmodel/model/base_model.py | 8 + deepmd/dpmodel/model/spin_model.py | 14 +- deepmd/pt/model/model/spin_model.py | 3 + deepmd/pt/utils/serialization.py | 10 +- deepmd/pt_expt/model/spin_model.py | 2 + deepmd/pt_expt/utils/serialization.py | 2 +- source/api_c/tests/test_deepspin_a.cc | 73 +- source/api_c/tests/test_deepspin_a_hpp.cc | 72 +- .../api_cc/tests/test_deeppot_dpa_pt_spin.cc | 178 +- .../tests/test_deeppot_dpa_ptexpt_spin.cc | 40 +- source/lmp/tests/test_lammps_spin_nopbc_pt.py | 21 +- .../lmp/tests/test_lammps_spin_nopbc_pt2.py | 25 +- source/lmp/tests/test_lammps_spin_pt.py | 97 +- source/lmp/tests/test_lammps_spin_pt2.py | 101 +- source/tests/infer/deeppot_dpa_spin.pth | Bin 784536 -> 0 bytes source/tests/infer/deeppot_dpa_spin.yaml | 2391 +++++++++++++++++ source/tests/infer/deeppot_dpa_spin_md0.yaml | 2391 +++++++++++++++++ source/tests/infer/deeppot_dpa_spin_md1.yaml | 2391 +++++++++++++++++ source/tests/infer/gen_spin.py | 70 +- source/tests/infer/gen_spin_model_devi.py | 145 +- 20 files changed, 7668 insertions(+), 366 deletions(-) delete mode 100644 source/tests/infer/deeppot_dpa_spin.pth create mode 100644 source/tests/infer/deeppot_dpa_spin.yaml create mode 100644 source/tests/infer/deeppot_dpa_spin_md0.yaml create mode 100644 source/tests/infer/deeppot_dpa_spin_md1.yaml diff --git a/deepmd/dpmodel/model/base_model.py b/deepmd/dpmodel/model/base_model.py index b89172c4f6..9da6f8e585 100644 --- a/deepmd/dpmodel/model/base_model.py +++ b/deepmd/dpmodel/model/base_model.py @@ -127,6 +127,14 @@ def deserialize(cls, data: dict) -> "BaseBaseModel": model_type = data.get("type", "standard") if model_type == "standard": model_type = data.get("fitting", {}).get("type", "ener") + if model_type == "spin_ener": + # SpinModel is not a BaseModel subclass and cannot be + # registered via the plugin registry. Dispatch directly. + from deepmd.dpmodel.model.spin_model import ( + SpinModel, + ) + + return SpinModel.deserialize(data) return cls.get_class_by_type(model_type).deserialize(data) raise NotImplementedError(f"Not implemented in class {cls.__name__}") diff --git a/deepmd/dpmodel/model/spin_model.py b/deepmd/dpmodel/model/spin_model.py index e54a1e6d9b..e60bf809f9 100644 --- a/deepmd/dpmodel/model/spin_model.py +++ b/deepmd/dpmodel/model/spin_model.py @@ -549,12 +549,15 @@ def __getattr__(self, name: str) -> Any: def serialize(self) -> dict: return { + "type": "spin_ener", "backbone_model": self.backbone_model.serialize(), "spin": self.spin.serialize(), } @classmethod def deserialize(cls, data: dict) -> "SpinModel": + data = data.copy() + data.pop("type", None) backbone_model_obj = make_model( DPAtomicModel, T_Bases=(NativeOP, BaseModel) ).deserialize(data["backbone_model"]) @@ -646,7 +649,7 @@ def call_common( ) = self.process_spin_output( atype, model_ret[f"{var_name}_derv_c"], - add_mag=False, + add_mag=True, virtual_scale=False, ) # Always compute mask_mag from atom types (even when forces are unavailable) @@ -815,13 +818,6 @@ def call_common_lower( and do_atomic_virial and model_ret.get(f"{var_name}_derv_c") is not None ): - # Compute reduced virial from BOTH real and virtual atoms BEFORE - # splitting. process_spin_output_lower discards the virtual-atom - # contribution, so we must reduce first to get the correct total. - xp = array_api_compat.array_namespace(model_ret[f"{var_name}_derv_c"]) - model_ret[f"{var_name}_derv_c_redu"] = xp.sum( - model_ret[f"{var_name}_derv_c"], axis=1 - ) ( model_ret[f"{var_name}_derv_c"], model_ret[f"{var_name}_derv_c_mag"], @@ -830,7 +826,7 @@ def call_common_lower( extended_atype, model_ret[f"{var_name}_derv_c"], nloc, - add_mag=False, + add_mag=True, virtual_scale=False, ) # Always compute mask_mag from atom types (even when forces are unavailable) diff --git a/deepmd/pt/model/model/spin_model.py b/deepmd/pt/model/model/spin_model.py index a7b83c0fe0..91c6e2ea71 100644 --- a/deepmd/pt/model/model/spin_model.py +++ b/deepmd/pt/model/model/spin_model.py @@ -637,12 +637,15 @@ def forward_common_lower( def serialize(self) -> dict: return { + "type": "spin_ener", "backbone_model": self.backbone_model.serialize(), "spin": self.spin.serialize(), } @classmethod def deserialize(cls, data: dict[str, Any]) -> "SpinModel": + data = data.copy() + data.pop("type", None) backbone_model_obj = make_model(DPAtomicModel).deserialize( data["backbone_model"] ) diff --git a/deepmd/pt/utils/serialization.py b/deepmd/pt/utils/serialization.py index 5d3b02482a..e54ec9c76d 100644 --- a/deepmd/pt/utils/serialization.py +++ b/deepmd/pt/utils/serialization.py @@ -72,7 +72,15 @@ def deserialize_to_file(model_file: str, data: dict) -> None: """ if not model_file.endswith(".pth"): raise ValueError("PyTorch backend only supports converting .pth file") - model = BaseModel.deserialize(data["model"]) + model_data = data["model"] + if model_data.get("type") == "spin_ener": + from deepmd.pt.model.model.spin_model import ( + SpinEnergyModel, + ) + + model = SpinEnergyModel.deserialize(model_data) + else: + model = BaseModel.deserialize(model_data) # JIT will happy in this way... model.model_def_script = json.dumps(data["model_def_script"]) if "min_nbor_dist" in data.get("@variables", {}): diff --git a/deepmd/pt_expt/model/spin_model.py b/deepmd/pt_expt/model/spin_model.py index 259ff10698..70f41f0701 100644 --- a/deepmd/pt_expt/model/spin_model.py +++ b/deepmd/pt_expt/model/spin_model.py @@ -129,6 +129,8 @@ def deserialize(cls, data: dict) -> "SpinModel": DPEnergyAtomicModel, ) + data = data.copy() + data.pop("type", None) backbone_model_obj = make_model( DPEnergyAtomicModel, T_Bases=(BaseModel,) ).deserialize(data["backbone_model"]) diff --git a/deepmd/pt_expt/utils/serialization.py b/deepmd/pt_expt/utils/serialization.py index b041827e3c..1119cfa49b 100644 --- a/deepmd/pt_expt/utils/serialization.py +++ b/deepmd/pt_expt/utils/serialization.py @@ -373,7 +373,7 @@ def _trace_and_export( target_device = _env.DEVICE # Detect spin model - is_spin = "spin" in data["model"] and "backbone_model" in data["model"] + is_spin = data["model"].get("type") == "spin_ener" # 1. Deserialize model on CPU for make_fx tracing. # make_fx with _allow_non_fake_inputs=True keeps real model parameters; diff --git a/source/api_c/tests/test_deepspin_a.cc b/source/api_c/tests/test_deepspin_a.cc index 7f39638577..597825f99c 100644 --- a/source/api_c/tests/test_deepspin_a.cc +++ b/source/api_c/tests/test_deepspin_a.cc @@ -20,24 +20,31 @@ class TestInferDeepSpinA : public ::testing::Test { double box[9] = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; float boxf[9] = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; std::vector expected_e = { - -1.8626545229251095e+00, -2.3502165071948093e+00, -2.3500944968573521e+00, - -2.0688274735854710e+00, -2.3485113271625320e+00, -2.3489022338537353e+00, + -4.736511666341149118e-02, 2.663324583045018068e-01, + 2.662707880956619588e-01, -4.025182706753409334e-02, + 2.661383816099721633e-01, 2.663717506235512844e-01, }; std::vector expected_f = { - 3.7989110974834261e-02, -6.8203560994098300e-02, 3.1554995279414300e-02, - -6.0769407958790114e-02, 5.6658432967656878e-03, 2.1814741358389407e-02, - 1.5027739412753049e-02, 6.2090755323245192e-02, -5.3346442187326704e-02, - -5.2134406995188787e-02, 4.0990812807417676e-02, -1.6987454510304811e-02, - -6.7153786204261134e-03, -5.3801784772022326e-02, 5.6707773168242034e-02, - 6.6602343186817375e-02, 1.3257934338691726e-02, -3.9743613108414025e-02, + 1.309983290673980352e-02, 6.799786488006153221e-03, + 6.649738725468718609e-03, -1.144456277614634265e-03, + -3.728471118137270928e-03, -6.491178701583714961e-03, + -5.361730092721230315e-03, -2.772299524882485336e-03, + -4.492382686597841141e-04, 6.983026947998328959e-03, + 5.505263649468144886e-03, 1.166735707547454995e-02, + -5.356940629013495075e-03, -1.082410608691008200e-03, + -8.305081927004348899e-03, -8.219732855388919845e-03, + -4.721868885763546436e-03, -3.071596903695449424e-03, }; std::vector expected_fm = { - 4.8385521455777196e+00, 5.3158441514550137e-01, 1.0855626815019124e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 1.2140862110260138e+00, 9.6823434985033552e-01, 1.0689000529371890e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, + -2.702014342752852571e-01, -1.027058879186482226e-01, + -7.359539608958531876e-02, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 4.837763296762351284e-02, + 7.279460222389372293e-02, 5.692337419156127953e-02, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, }; int natoms; double expected_tot_e; @@ -195,24 +202,32 @@ class TestInferDeepSpinANoPBC : public ::testing::Test { 0.14, 0.10, 0.12, 0., 0., 0., 0., 0., 0.}; int atype[6] = {0, 1, 1, 0, 1, 1}; std::vector expected_e = { - -1.9136796509970209e+00, -2.3532121417832528e+00, - -2.3589759416772553e+00, -2.0689533840218703e+00, - -2.3485273598793084e+00, -2.3489022338537353e+00}; + -4.263824715539775434e-02, 2.659531961465150807e-01, + 2.679077652998275716e-01, -4.042215423551187570e-02, + 2.666009600722629158e-01, 2.666060991401024149e-01, + }; std::vector expected_f = { - 5.2440246818294511e-02, -8.2643189092284075e-03, -1.6057110078610215e-02, - -5.2440246818295698e-02, 8.2643189092281334e-03, 1.6057110078610277e-02, - -1.6724663644564395e-03, 7.9346065821642349e-05, -2.5251632397208987e-04, - -5.6934098675373246e-02, 4.0398593044712161e-02, -1.6520316500527876e-02, - -7.9878577602028808e-03, -5.3736758888210570e-02, 5.6516778947603999e-02, - 6.6594422800032166e-02, 1.3258819777676990e-02, -3.9743946123104140e-02, + 9.664606789041574331e-04, 4.875258490407333167e-03, + 8.372291856602237514e-03, -9.664606789041574331e-04, + -4.875258490407331433e-03, -8.372291856602209759e-03, + 3.462063530624336170e-03, -3.516414654756409722e-04, + 1.540231672543395411e-04, 9.145994016724501297e-03, + 6.127039584892107760e-03, 1.114133934233926815e-02, + -5.161415144547300271e-03, -1.229667699599260294e-03, + -8.053323256964733598e-03, -7.446642402801547170e-03, + -4.545730419817223950e-03, -3.242039252628891276e-03, }; std::vector expected_fm = { - 4.5904360179010135e+00, 6.2821415259365443e-01, 9.2483695213043082e-01, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 1.2125967529512662e+00, 9.6807902483755459e-01, 1.0691011858092361e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00}; + 2.426746573908480920e-02, -2.632265214292328626e-02, + -4.622069216845703377e-02, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 5.019524717501219757e-02, + 7.318340727755086317e-02, 5.710550212233043987e-02, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + }; int natoms; double expected_tot_e; // std::vector expected_tot_v; diff --git a/source/api_c/tests/test_deepspin_a_hpp.cc b/source/api_c/tests/test_deepspin_a_hpp.cc index 29fc201b1b..8f1e231d3b 100644 --- a/source/api_c/tests/test_deepspin_a_hpp.cc +++ b/source/api_c/tests/test_deepspin_a_hpp.cc @@ -20,24 +20,31 @@ class TestInferDeepSpinAHPP : public ::testing::Test { std::vector atype = {0, 1, 1, 0, 1, 1}; std::vector box = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; std::vector expected_e = { - -1.8626545229251095e+00, -2.3502165071948093e+00, -2.3500944968573521e+00, - -2.0688274735854710e+00, -2.3485113271625320e+00, -2.3489022338537353e+00, + -4.736511666341149118e-02, 2.663324583045018068e-01, + 2.662707880956619588e-01, -4.025182706753409334e-02, + 2.661383816099721633e-01, 2.663717506235512844e-01, }; std::vector expected_f = { - 3.7989110974834261e-02, -6.8203560994098300e-02, 3.1554995279414300e-02, - -6.0769407958790114e-02, 5.6658432967656878e-03, 2.1814741358389407e-02, - 1.5027739412753049e-02, 6.2090755323245192e-02, -5.3346442187326704e-02, - -5.2134406995188787e-02, 4.0990812807417676e-02, -1.6987454510304811e-02, - -6.7153786204261134e-03, -5.3801784772022326e-02, 5.6707773168242034e-02, - 6.6602343186817375e-02, 1.3257934338691726e-02, -3.9743613108414025e-02, + 1.309983290673980352e-02, 6.799786488006153221e-03, + 6.649738725468718609e-03, -1.144456277614634265e-03, + -3.728471118137270928e-03, -6.491178701583714961e-03, + -5.361730092721230315e-03, -2.772299524882485336e-03, + -4.492382686597841141e-04, 6.983026947998328959e-03, + 5.505263649468144886e-03, 1.166735707547454995e-02, + -5.356940629013495075e-03, -1.082410608691008200e-03, + -8.305081927004348899e-03, -8.219732855388919845e-03, + -4.721868885763546436e-03, -3.071596903695449424e-03, }; std::vector expected_fm = { - 4.8385521455777196e+00, 5.3158441514550137e-01, 1.0855626815019124e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 1.2140862110260138e+00, 9.6823434985033552e-01, 1.0689000529371890e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, + -2.702014342752852571e-01, -1.027058879186482226e-01, + -7.359539608958531876e-02, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 4.837763296762351284e-02, + 7.279460222389372293e-02, 5.692337419156127953e-02, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, }; unsigned int natoms; double expected_tot_e; @@ -167,24 +174,31 @@ class TestInferDeepSpinANoPbcHPP : public ::testing::Test { std::vector atype = {0, 1, 1, 0, 1, 1}; std::vector box = {}; std::vector expected_e = { - -1.9136796509970209e+00, -2.3532121417832528e+00, - -2.3589759416772553e+00, -2.0689533840218703e+00, - -2.3485273598793084e+00, -2.3489022338537353e+00}; + -4.263824715539775434e-02, 2.659531961465150807e-01, + 2.679077652998275716e-01, -4.042215423551187570e-02, + 2.666009600722629158e-01, 2.666060991401024149e-01, + }; std::vector expected_f = { - 5.2440246818294511e-02, -8.2643189092284075e-03, -1.6057110078610215e-02, - -5.2440246818295698e-02, 8.2643189092281334e-03, 1.6057110078610277e-02, - -1.6724663644564395e-03, 7.9346065821642349e-05, -2.5251632397208987e-04, - -5.6934098675373246e-02, 4.0398593044712161e-02, -1.6520316500527876e-02, - -7.9878577602028808e-03, -5.3736758888210570e-02, 5.6516778947603999e-02, - 6.6594422800032166e-02, 1.3258819777676990e-02, -3.9743946123104140e-02, + 9.664606789041574331e-04, 4.875258490407333167e-03, + 8.372291856602237514e-03, -9.664606789041574331e-04, + -4.875258490407331433e-03, -8.372291856602209759e-03, + 3.462063530624336170e-03, -3.516414654756409722e-04, + 1.540231672543395411e-04, 9.145994016724501297e-03, + 6.127039584892107760e-03, 1.114133934233926815e-02, + -5.161415144547300271e-03, -1.229667699599260294e-03, + -8.053323256964733598e-03, -7.446642402801547170e-03, + -4.545730419817223950e-03, -3.242039252628891276e-03, }; std::vector expected_fm = { - 4.5904360179010135e+00, 6.2821415259365443e-01, 9.2483695213043082e-01, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 1.2125967529512662e+00, 9.6807902483755459e-01, 1.0691011858092361e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, + 2.426746573908480920e-02, -2.632265214292328626e-02, + -4.622069216845703377e-02, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 5.019524717501219757e-02, + 7.318340727755086317e-02, 5.710550212233043987e-02, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, }; unsigned int natoms; double expected_tot_e; diff --git a/source/api_cc/tests/test_deeppot_dpa_pt_spin.cc b/source/api_cc/tests/test_deeppot_dpa_pt_spin.cc index d079635565..8791040a9a 100644 --- a/source/api_cc/tests/test_deeppot_dpa_pt_spin.cc +++ b/source/api_cc/tests/test_deeppot_dpa_pt_spin.cc @@ -49,49 +49,67 @@ class TestInferDeepSpinDpaPt : public ::testing::Test { // {ae.ravel()=}") std::vector expected_e = { - -1.8626545229251095e+00, -2.3502165071948093e+00, -2.3500944968573521e+00, - -2.0688274735854710e+00, -2.3485113271625320e+00, -2.3489022338537353e+00, + -4.736511666341149118e-02, 2.663324583045018068e-01, + 2.662707880956619588e-01, -4.025182706753409334e-02, + 2.661383816099721633e-01, 2.663717506235512844e-01, }; std::vector expected_f = { - 3.7989110974834261e-02, -6.8203560994098300e-02, 3.1554995279414300e-02, - -6.0769407958790114e-02, 5.6658432967656878e-03, 2.1814741358389407e-02, - 1.5027739412753049e-02, 6.2090755323245192e-02, -5.3346442187326704e-02, - -5.2134406995188787e-02, 4.0990812807417676e-02, -1.6987454510304811e-02, - -6.7153786204261134e-03, -5.3801784772022326e-02, 5.6707773168242034e-02, - 6.6602343186817375e-02, 1.3257934338691726e-02, -3.9743613108414025e-02, + 1.309983290673980352e-02, 6.799786488006153221e-03, + 6.649738725468718609e-03, -1.144456277614634265e-03, + -3.728471118137270928e-03, -6.491178701583714961e-03, + -5.361730092721230315e-03, -2.772299524882485336e-03, + -4.492382686597841141e-04, 6.983026947998328959e-03, + 5.505263649468144886e-03, 1.166735707547454995e-02, + -5.356940629013495075e-03, -1.082410608691008200e-03, + -8.305081927004348899e-03, -8.219732855388919845e-03, + -4.721868885763546436e-03, -3.071596903695449424e-03, }; std::vector expected_fm = { - 4.8385521455777196e+00, 5.3158441514550137e-01, 1.0855626815019124e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 1.2140862110260138e+00, 9.6823434985033552e-01, 1.0689000529371890e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, + -2.702014342752852571e-01, -1.027058879186482226e-01, + -7.359539608958531876e-02, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 4.837763296762351284e-02, + 7.279460222389372293e-02, 5.692337419156127953e-02, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, }; std::vector expected_tot_v = { - 1.3824836617610417e-01, 1.3936741842895785e-02, -6.6368919371499843e-02, - 2.7457622909082817e-02, 7.8421669005063782e-02, -7.3855775048417324e-02, - -6.6291165687501666e-02, -7.0321379535767850e-02, 9.3633139281050631e-02, + -3.296409925977442784e-02, -6.514341112515736193e-03, + 2.302568866291881608e-03, -3.920085383179669654e-03, + -3.902770613936823105e-03, -2.657953604957638679e-04, + 1.599970898976528456e-03, 1.167950771447608766e-03, + -9.311107385533376815e-03, }; std::vector expected_atom_v = { - 1.5062258683232639e-02, 1.2127480962864944e-03, -1.0162650648943013e-02, - 1.5209474134091445e-03, 1.1506421293176305e-02, -3.1879228754013102e-03, - -9.8921319202609839e-03, -3.2539620487815153e-03, 8.8506629253760523e-03, - 3.5246401477549733e-02, -1.2095530141782164e-02, -2.7192583359447204e-02, - -8.0687617219887668e-04, 8.7274423879230294e-04, 5.0653534823779300e-04, - -8.8959039912723942e-03, 1.4282170948379993e-03, 7.1793794296111050e-03, - 1.0454610564796012e-02, 4.9337241996913368e-03, -5.1956142767175060e-03, - 2.1322349032843767e-02, 3.6589953171335281e-02, -2.5233310907452358e-02, - -1.8978868056705719e-02, -3.1879121076347043e-02, 2.2823386401396493e-02, - 3.0685989273260134e-02, 3.3832992712807563e-03, -2.6187478868556556e-03, - 3.0642173785931769e-03, 6.0642419846717189e-03, -9.2730679711597770e-03, - -2.9147581597328805e-03, -8.9463130935045487e-03, 1.3848366583449021e-02, - 4.3089321022873554e-03, 4.6119905760196971e-03, -6.9703908253700266e-03, - -4.1294359596699753e-03, 2.0744263944150482e-02, -3.3186693638875019e-02, - 2.8946777313109276e-03, -1.9223536156324161e-02, 3.0643617186671183e-02, - 4.2490174074978321e-02, 1.1890509841399666e-02, -1.4228932374166448e-02, - 6.4864212161055840e-03, 2.6440443729376928e-03, -3.4813150037666628e-03, - -2.8504181290840619e-02, -8.4466642556485783e-03, 1.0287726754546783e-02, + -6.884133785830866270e-03, -1.121164398296095772e-03, + 2.349617433770582412e-03, -1.022026691568799937e-03, + -1.505129176989528951e-03, 6.393256900776127238e-04, + 2.630365807841273870e-03, 7.135622122988235366e-04, + -1.911276644703055428e-03, 2.743654218857313667e-03, + -7.881895490872514818e-04, -2.104426693877021765e-03, + 1.962048943234902601e-03, -1.049310174771551311e-03, + -1.494575973896533887e-03, 3.408026024086528976e-03, + -1.712970751848944505e-03, -2.576173589596463843e-03, + -1.201918779945609916e-02, -4.491798568020247129e-03, + 3.096386035183865820e-03, 9.950813669892615530e-04, + -7.365361184918026161e-04, 9.845327634837373713e-05, + -1.426610186908689078e-03, -1.277523649606296732e-03, + 1.099298580748801768e-03, -8.862984929390678099e-03, + -1.207887704777547457e-03, 1.866947330069956704e-03, + -2.034591943947313200e-03, -1.190516280519625511e-03, + 1.816162650652065067e-03, 1.888964404670585807e-03, + 1.695550260168729104e-03, -2.628706106868924485e-03, + -1.981095983149218712e-03, 2.124416489228214862e-03, + -3.803001677309152204e-03, 7.469960084091023956e-06, + 1.440128580078422951e-03, -2.264550990055120075e-03, + -1.502942461627763959e-03, 2.647480428239051657e-03, + -4.361425384715853296e-03, -5.960350980804883167e-03, + -1.029717381562808348e-03, 8.970464384536506412e-04, + -3.828067017971811641e-03, -8.614074432427376669e-04, + 9.393899863778386750e-04, -3.397832689085407594e-03, + -8.981477278037544023e-04, 1.067175759602119771e-03, }; int natoms; @@ -227,49 +245,67 @@ class TestInferDeepSpinDpaPtNopbc : public ::testing::Test { // {ae.ravel()=}") std::vector expected_e = { - -1.9136796509970209e+00, -2.3532121417832528e+00, - -2.3589759416772553e+00, -2.0689533840218703e+00, - -2.3485273598793084e+00, -2.3489022338537353e+00}; + -4.263824715539775434e-02, 2.659531961465150807e-01, + 2.679077652998275716e-01, -4.042215423551187570e-02, + 2.666009600722629158e-01, 2.666060991401024149e-01, + }; std::vector expected_f = { - 5.2440246818294511e-02, -8.2643189092284075e-03, -1.6057110078610215e-02, - -5.2440246818295698e-02, 8.2643189092281334e-03, 1.6057110078610277e-02, - -1.6724663644564395e-03, 7.9346065821642349e-05, -2.5251632397208987e-04, - -5.6934098675373246e-02, 4.0398593044712161e-02, -1.6520316500527876e-02, - -7.9878577602028808e-03, -5.3736758888210570e-02, 5.6516778947603999e-02, - 6.6594422800032166e-02, 1.3258819777676990e-02, -3.9743946123104140e-02, + 9.664606789041574331e-04, 4.875258490407333167e-03, + 8.372291856602237514e-03, -9.664606789041574331e-04, + -4.875258490407331433e-03, -8.372291856602209759e-03, + 3.462063530624336170e-03, -3.516414654756409722e-04, + 1.540231672543395411e-04, 9.145994016724501297e-03, + 6.127039584892107760e-03, 1.114133934233926815e-02, + -5.161415144547300271e-03, -1.229667699599260294e-03, + -8.053323256964733598e-03, -7.446642402801547170e-03, + -4.545730419817223950e-03, -3.242039252628891276e-03, }; std::vector expected_fm = { - 4.5904360179010135e+00, 6.2821415259365443e-01, 9.2483695213043082e-01, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 1.2125967529512662e+00, 9.6807902483755459e-01, 1.0691011858092361e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, - 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, + 2.426746573908480920e-02, -2.632265214292328626e-02, + -4.622069216845703377e-02, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 5.019524717501219757e-02, + 7.318340727755086317e-02, 5.710550212233043987e-02, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, + 0.000000000000000000e+00, 0.000000000000000000e+00, }; std::vector expected_tot_v = { - 1.0340989912297673e-01, 1.7731575682021676e-03, -5.2108130921436818e-02, - -2.3573500930805756e-03, 3.1835281809236504e-02, -4.1149040865495201e-02, - -3.8786409820505775e-02, -3.1539990930710131e-02, 6.3609050665518849e-02, + -1.760249353608427103e-02, 1.699089611551340799e-03, + -3.207143602659518616e-03, 3.802314035573836626e-04, + -2.021378920534677454e-03, -2.519436241845334455e-03, + 1.558229715287920425e-03, 6.867566983090854244e-04, + -1.026012201128513081e-02, }; std::vector expected_atom_v = { - 7.4120023328214657e-03, -3.1050280043021516e-03, -5.6090828464736842e-03, - -2.9955764634068682e-03, 1.2549036535866968e-03, 2.2669227290622353e-03, - -5.4203732932148890e-03, 2.2706969201286079e-03, 4.1019041137797078e-03, - 3.1393780312700348e-02, -1.3151448509374553e-02, -2.3757455371773359e-02, - -3.1200195294236038e-03, 1.3070352082720678e-03, 2.3610958601044327e-03, - -6.4618881649612936e-03, 2.7070072042405802e-03, 4.8900775302411284e-03, - 5.0796934697206701e-03, -6.2368435756216933e-04, 3.7915727217144920e-04, - -2.3541456235528688e-04, 4.7172356421924691e-05, -4.7741044651678936e-05, - 7.8040516599487829e-04, -1.0555907766399088e-04, 7.4337745788048400e-05, - 1.6774660014217457e-02, 1.9900026394719939e-03, -1.3757156420267647e-03, - 1.4918414385930168e-03, 5.8652659168653282e-03, -9.1012492701524200e-03, - -1.5633397202315658e-03, -8.7822339826287010e-03, 1.3702299440830762e-02, - 2.6638349513850509e-04, 4.7758974965528556e-03, -7.5202570595042720e-03, - -3.9854902437910233e-03, 2.0716934356864808e-02, -3.3146966232075720e-02, - 2.3833618251221655e-03, -1.9183462719327554e-02, 3.0553102668094204e-02, - 4.2483379498378271e-02, 1.1887418303416192e-02, -1.4224777273830189e-02, - 6.4873092673031901e-03, 2.6439703172256787e-03, -3.4811029077820542e-03, - -2.8504575633215068e-02, -8.4464392754590722e-03, 1.0287329166785000e-02, + -1.353712843126003013e-03, 5.670959207689790652e-04, + 1.024431340743884623e-03, 5.531561218273641292e-04, + -2.317275645492945053e-04, -4.186046327342319174e-04, + 1.000397204637967254e-03, -4.190853154562824371e-04, + -7.570573440501640085e-04, 2.068893745514948854e-03, + -8.666987312292658875e-04, -1.565649320930233464e-03, + 3.054535161074109495e-03, -1.279602567476957262e-03, + -2.311540121893843058e-03, 5.195098769247979975e-03, + -2.176325160090315791e-03, -3.931426095646995550e-03, + -9.856122919086314146e-03, 9.936684925752666681e-04, + -3.439719552552561802e-04, 1.052798535866198608e-03, + -9.900711767116699563e-05, 2.762122318620294312e-05, + -5.083128431155595943e-04, 4.192561625213921898e-05, + -5.371277558265975804e-06, -3.083086775875694928e-03, + -4.898407961814706460e-04, 6.858622907339557637e-04, + -4.946158568775761710e-04, -9.714324993191098684e-04, + 1.457171302666425070e-03, 7.625101053767464887e-04, + 1.428262196816965091e-03, -2.161588072178897285e-03, + -5.723947614714765264e-04, 2.340653893581970402e-03, + -3.822101811639220734e-03, -1.559120189565561809e-04, + 1.375865762882331946e-03, -2.173696052105959873e-03, + -1.277932982926627964e-03, 2.762213706055685614e-03, + -4.518197398377981483e-03, -4.806069982039730404e-03, + -8.457891679641386939e-04, 8.142858536873513742e-04, + -3.629730539376156001e-03, -8.154749344004806610e-04, + 8.996120390360722724e-04, -3.613530537932585843e-03, + -9.502343452691061620e-04, 1.113518176527171326e-03, }; int natoms; diff --git a/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc b/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc index 14b5ba88fe..98f30ea6d3 100644 --- a/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc +++ b/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc @@ -93,11 +93,11 @@ class TestInferDeepSpinDpaPtExpt : public ::testing::Test { -9.311107385533376815e-03, }; expected_atom_v = { - -3.317500147651446761e-03, -5.453620106200618781e-04, - 1.253012128253723576e-03, -4.341313022555767223e-04, - -8.474261758929188017e-04, 3.158911084565297830e-04, - 1.428597590986904363e-03, 3.418340644092453598e-04, - -1.048232718033599879e-03, 2.743654218857313667e-03, + -6.884133785830866270e-03, -1.121164398296095772e-03, + 2.349617433770582412e-03, -1.022026691568799937e-03, + -1.505129176989528951e-03, 6.393256900776127238e-04, + 2.630365807841273870e-03, 7.135622122988235366e-04, + -1.911276644703055428e-03, 2.743654218857313667e-03, -7.881895490872514818e-04, -2.104426693877021765e-03, 1.962048943234902601e-03, -1.049310174771551311e-03, -1.494575973896533887e-03, 3.408026024086528976e-03, @@ -106,11 +106,11 @@ class TestInferDeepSpinDpaPtExpt : public ::testing::Test { 3.096386035183865820e-03, 9.950813669892615530e-04, -7.365361184918026161e-04, 9.845327634837373713e-05, -1.426610186908689078e-03, -1.277523649606296732e-03, - 1.099298580748801768e-03, -4.322845112754755692e-03, - -5.390493138998655141e-04, 8.445031349176490218e-04, - -9.915231731252361659e-04, -6.214579519519495155e-04, - 9.500409608549969988e-04, 8.491271635631678690e-04, - 9.275347724790529869e-04, -1.452342638958830420e-03, + 1.099298580748801768e-03, -8.862984929390678099e-03, + -1.207887704777547457e-03, 1.866947330069956704e-03, + -2.034591943947313200e-03, -1.190516280519625511e-03, + 1.816162650652065067e-03, 1.888964404670585807e-03, + 1.695550260168729104e-03, -2.628706106868924485e-03, -1.981095983149218712e-03, 2.124416489228214862e-03, -3.803001677309152204e-03, 7.469960084091023956e-06, 1.440128580078422951e-03, -2.264550990055120075e-03, @@ -296,11 +296,11 @@ class TestInferDeepSpinDpaPtExptNopbc : public ::testing::Test { -1.026012201128513081e-02, }; expected_atom_v = { - -9.010484131816154374e-04, 3.774662271365247790e-04, - 6.818744748307292713e-04, 3.700909920694162025e-04, - -1.550381183003379792e-04, -2.800688588649180577e-04, - 6.691585522995424640e-04, -2.803231773155778761e-04, - -5.063902557961297290e-04, 2.068893745514948854e-03, + -1.353712843126003013e-03, 5.670959207689790652e-04, + 1.024431340743884623e-03, 5.531561218273641292e-04, + -2.317275645492945053e-04, -4.186046327342319174e-04, + 1.000397204637967254e-03, -4.190853154562824371e-04, + -7.570573440501640085e-04, 2.068893745514948854e-03, -8.666987312292658875e-04, -1.565649320930233464e-03, 3.054535161074109495e-03, -1.279602567476957262e-03, -2.311540121893843058e-03, 5.195098769247979975e-03, @@ -309,11 +309,11 @@ class TestInferDeepSpinDpaPtExptNopbc : public ::testing::Test { -3.439719552552561802e-04, 1.052798535866198608e-03, -9.900711767116699563e-05, 2.762122318620294312e-05, -5.083128431155595943e-04, 4.192561625213921898e-05, - -5.371277558265975804e-06, -1.703601525016029683e-03, - -2.250342243479974691e-04, 2.948710405297760850e-04, - -2.741660339186102746e-04, -5.140178418111540637e-04, - 7.694906072377993844e-04, 3.213894451938870134e-04, - 7.860699694575146168e-04, -1.201682807120130203e-03, + -5.371277558265975804e-06, -3.083086775875694928e-03, + -4.898407961814706460e-04, 6.858622907339557637e-04, + -4.946158568775761710e-04, -9.714324993191098684e-04, + 1.457171302666425070e-03, 7.625101053767464887e-04, + 1.428262196816965091e-03, -2.161588072178897285e-03, -5.723947614714765264e-04, 2.340653893581970402e-03, -3.822101811639220734e-03, -1.559120189565561809e-04, 1.375865762882331946e-03, -2.173696052105959873e-03, diff --git a/source/lmp/tests/test_lammps_spin_nopbc_pt.py b/source/lmp/tests/test_lammps_spin_nopbc_pt.py index c05a00afce..1fb1011c5b 100644 --- a/source/lmp/tests/test_lammps_spin_nopbc_pt.py +++ b/source/lmp/tests/test_lammps_spin_nopbc_pt.py @@ -31,24 +31,21 @@ data_type_map_file = Path(__file__).parent / "data_type_map.lmp" md_file = Path(__file__).parent / "md.out" -expected_ae = np.array( - [-2.337313880002, -2.339828637443377, -2.358478126000974, -2.358478126000974] -) -expected_e = np.sum(expected_ae) +expected_e = 4.506368054192911310e-01 expected_f = np.array( [ - [0.036908169450058, -0.0154615304452946, -0.0277072310206975], - [-0.036908169450058, 0.0154615304452946, 0.0277072310206975], - [-0.001114392839443, -0.0010410775210586, 0.0015249586223957], - [0.001114392839443, 0.0010410775210586, -0.0015249586223957], + [-4.3791408102373730e-03, 1.8345049340183590e-03, 8.0965764883528663e-03], + [4.3791408102373730e-03, -1.8345049340183590e-03, -8.0965764883528628e-03], + [1.8744375495035947e-04, 1.7511192896678328e-04, -2.5650198045838670e-04], + [-1.8744375495035947e-04, -1.7511192896678328e-04, 2.5650198045838670e-04], ] ) expected_fm = np.array( [ - [0.0075469514215227, -0.0031615607306379, 0.0204654183352036], - [-0.0074172317569893, 0.003107218709009, 0.020927678503653], - [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], - [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], + [-4.0225421856019317e-04, 1.6851190236981042e-04, 2.2376748889882192e-03], + [3.1808894918962933e-03, -1.3325347871457449e-03, 1.8162613930793377e-03], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], ] ) diff --git a/source/lmp/tests/test_lammps_spin_nopbc_pt2.py b/source/lmp/tests/test_lammps_spin_nopbc_pt2.py index 89a670e48c..d92058546e 100644 --- a/source/lmp/tests/test_lammps_spin_nopbc_pt2.py +++ b/source/lmp/tests/test_lammps_spin_nopbc_pt2.py @@ -22,29 +22,26 @@ data_file = Path(__file__).parent / "data.lmp" md_file = Path(__file__).parent / "md.out" -# Reference values from the seed=1 .pt2 model (same weights as .pth, NoPBC) -expected_ae = np.array( - [-2.337313880002, -2.339828637443377, -2.358478126000974, -2.358478126000974] -) -expected_e = np.sum(expected_ae) +# Reference values from the seed=1 .pt2 model (NoPBC, Model 0) +expected_e = 4.506368054192911310e-01 expected_f = np.array( [ - [0.036908169450058, -0.0154615304452946, -0.0277072310206975], - [-0.036908169450058, 0.0154615304452946, 0.0277072310206975], - [-0.001114392839443, -0.0010410775210586, 0.0015249586223957], - [0.001114392839443, 0.0010410775210586, -0.0015249586223957], + [-4.3791408102373730e-03, 1.8345049340183590e-03, 8.0965764883528663e-03], + [4.3791408102373730e-03, -1.8345049340183590e-03, -8.0965764883528628e-03], + [1.8744375495035947e-04, 1.7511192896678328e-04, -2.5650198045838670e-04], + [-1.8744375495035947e-04, -1.7511192896678328e-04, 2.5650198045838670e-04], ] ) expected_fm = np.array( [ - [0.0075469514215227, -0.0031615607306379, 0.0204654183352036], - [-0.0074172317569893, 0.003107218709009, 0.020927678503653], - [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], - [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], + [-4.0225421856019317e-04, 1.6851190236981042e-04, 2.2376748889882192e-03], + [3.1808894918962933e-03, -1.3325347871457449e-03, 1.8162613930793377e-03], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], ] ) -# Reference values from the seed=2 .pt2 model (deeppot_dpa_spin_md1.pt2, NoPBC) +# Reference values from the seed=2 .pt2 model (NoPBC, Model 1) expected_f2 = np.array( [ [-5.0313948956892344e-03, 2.1077465103562995e-03, 3.3650618879773678e-03], diff --git a/source/lmp/tests/test_lammps_spin_pt.py b/source/lmp/tests/test_lammps_spin_pt.py index 034ab1f431..3de0c7c19b 100644 --- a/source/lmp/tests/test_lammps_spin_pt.py +++ b/source/lmp/tests/test_lammps_spin_pt.py @@ -32,24 +32,29 @@ data_type_map_file = Path(__file__).parent / "data_type_map.lmp" md_file = Path(__file__).parent / "md.out" +expected_e = 4.508261273186509599e-01 expected_ae = np.array( - [-2.33730603846356, -2.339828637443377, -2.3584765990764933, -2.358478126000974] + [ + -4.384923692739055301e-02, + -4.127243767708395350e-02, + 2.679072197028402047e-01, + 2.680405822202852617e-01, + ] ) -expected_e = np.sum(expected_ae) expected_f = np.array( [ - [0.036819000183374, -0.0154603124989284, -0.0277136918031471], - [-0.0369115932121166, 0.0154614940830129, 0.0277067438704936], - [-0.0010240778189108, -0.0010425850123752, 0.0015323196618039], - [0.0011166708476534, 0.0010414034282908, -0.0015253717291505], + [-4.2676712486866839e-03, 1.8628771592081692e-03, 8.1929947798959294e-03], + [4.1470034985421397e-03, -1.8846167362954120e-03, -8.0779540071613375e-03], + [-1.5774196991860190e-05, 1.5095872055037390e-04, -2.7974166116106585e-04], + [1.3644194713640517e-04, -1.2921914346313107e-04, 1.6470088842647485e-04], ] ) expected_fm = np.array( [ - [0.007540380021158, -0.0031615447712641, 0.0204706018052022], - [-0.0074177167392878, 0.0031072528813168, 0.0209277147341756], - [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], - [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], + [-4.5085730123974212e-04, 1.8188156762674026e-04, 1.9591427407519438e-03], + [3.1582497858262133e-03, -1.3356926943075573e-03, 1.7139696951871720e-03], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], ] ) @@ -73,42 +78,42 @@ expected_v = -np.array( [ - 0.0138536891649799, - -0.0057815832940349, - -0.0104366273910430, - -0.0057802135977019, - 0.0024216972469495, - 0.0043747666241247, - -0.0120159787305366, - 0.0050342035124280, - 0.0090942101965059, - 0.0135151396517160, - -0.0056617476919350, - -0.0102276732499471, - -0.0056606594176084, - 0.0023713573235927, - 0.0042837422619739, - -0.0084858208754591, - 0.0035548709072868, - 0.0064217022841311, - 0.0007099617850315, - 0.0003917168967788, - -0.0005467867622337, - 0.0003906286224523, - 0.0003696501943719, - -0.0005419287758774, - -0.0005551067425154, - -0.0005416915274450, - 0.0007957607021995, - 0.0004252005652282, - 0.0003972268438316, - -0.0005818534050492, - 0.0003958571474987, - 0.0003698139141107, - -0.0005416992544720, - -0.0005797982376440, - -0.0005416536167464, - 0.0007934081146707, + -1.4794937634472474e-03, + 6.6688347518566377e-04, + 9.2820857914341511e-04, + 6.9899209610065787e-04, + -2.3202779455430261e-04, + -4.3062165105966181e-04, + 4.2186963636220076e-03, + -1.8596964037585618e-03, + -3.3537115627438724e-03, + -2.0962516214727486e-03, + 7.9319592962628796e-04, + 1.3351142815012081e-03, + 8.9145117156866685e-04, + -3.4764851549428505e-04, + -6.2285930526845095e-04, + 1.5422972351535255e-03, + -6.6089529841465919e-04, + -1.1822529939065273e-03, + 7.9431779279767246e-04, + -1.2677430787194573e-04, + 6.4796756091853292e-05, + -1.3924650354116248e-04, + -3.1301607401264882e-05, + 4.9296926793974502e-05, + -9.4965688637539702e-05, + 5.6156814646123667e-05, + -9.1198182079314316e-05, + 2.6039820355670405e-04, + 4.3106382567677546e-05, + -9.7016827514025993e-05, + -7.4785284620483794e-05, + -6.6085841514910694e-05, + 9.2317188787004601e-05, + 1.3480686702278333e-05, + 8.2958814726605517e-05, + -1.1609755379269147e-04, ] ).reshape(4, 9) diff --git a/source/lmp/tests/test_lammps_spin_pt2.py b/source/lmp/tests/test_lammps_spin_pt2.py index fa0b7fcb7f..9bdf50204a 100644 --- a/source/lmp/tests/test_lammps_spin_pt2.py +++ b/source/lmp/tests/test_lammps_spin_pt2.py @@ -23,29 +23,34 @@ data_file = Path(__file__).parent / "data.lmp" md_file = Path(__file__).parent / "md.out" -# Reference values from the seed=1 .pt2 model (same weights as .pth) +# Reference values from the seed=1 .pt2 model (PBC, Model 0) +expected_e = 4.508261273186509599e-01 expected_ae = np.array( - [-2.33730603846356, -2.339828637443377, -2.3584765990764933, -2.358478126000974] + [ + -4.384923692739055301e-02, + -4.127243767708395350e-02, + 2.679072197028402047e-01, + 2.680405822202852617e-01, + ] ) -expected_e = np.sum(expected_ae) expected_f = np.array( [ - [0.036819000183374, -0.0154603124989284, -0.0277136918031471], - [-0.0369115932121166, 0.0154614940830129, 0.0277067438704936], - [-0.0010240778189108, -0.0010425850123752, 0.0015323196618039], - [0.0011166708476534, 0.0010414034282908, -0.0015253717291505], + [-4.2676712486866839e-03, 1.8628771592081692e-03, 8.1929947798959294e-03], + [4.1470034985421397e-03, -1.8846167362954120e-03, -8.0779540071613375e-03], + [-1.5774196991860190e-05, 1.5095872055037390e-04, -2.7974166116106585e-04], + [1.3644194713640517e-04, -1.2921914346313107e-04, 1.6470088842647485e-04], ] ) expected_fm = np.array( [ - [0.007540380021158, -0.0031615447712641, 0.0204706018052022], - [-0.0074177167392878, 0.0031072528813168, 0.0209277147341756], - [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], - [0.0000000000000000, 0.00000000000000000, 0.00000000000000000], + [-4.5085730123974212e-04, 1.8188156762674026e-04, 1.9591427407519438e-03], + [3.1582497858262133e-03, -1.3356926943075573e-03, 1.7139696951871720e-03], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], + [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], ] ) -# Reference values from the seed=2 .pt2 model (deeppot_dpa_spin_md1.pt2, PBC) +# Reference values from the seed=2 .pt2 model (PBC, Model 1) expected_f2 = np.array( [ [-5.0903657013833805e-03, 2.2714596279667276e-03, 3.5699195164111686e-03], @@ -66,42 +71,42 @@ expected_v = -np.array( [ - 0.0138536891649799, - -0.0057815832940349, - -0.0104366273910430, - -0.0057802135977019, - 0.0024216972469495, - 0.0043747666241247, - -0.0120159787305366, - 0.0050342035124280, - 0.0090942101965059, - 0.0135151396517160, - -0.0056617476919350, - -0.0102276732499471, - -0.0056606594176084, - 0.0023713573235927, - 0.0042837422619739, - -0.0084858208754591, - 0.0035548709072868, - 0.0064217022841311, - 0.0007099617850315, - 0.0003917168967788, - -0.0005467867622337, - 0.0003906286224523, - 0.0003696501943719, - -0.0005419287758774, - -0.0005551067425154, - -0.0005416915274450, - 0.0007957607021995, - 0.0004252005652282, - 0.0003972268438316, - -0.0005818534050492, - 0.0003958571474987, - 0.0003698139141107, - -0.0005416992544720, - -0.0005797982376440, - -0.0005416536167464, - 0.0007934081146707, + -1.4794937634472474e-03, + 6.6688347518566377e-04, + 9.2820857914341511e-04, + 6.9899209610065787e-04, + -2.3202779455430261e-04, + -4.3062165105966181e-04, + 4.2186963636220076e-03, + -1.8596964037585618e-03, + -3.3537115627438724e-03, + -2.0962516214727486e-03, + 7.9319592962628796e-04, + 1.3351142815012081e-03, + 8.9145117156866685e-04, + -3.4764851549428505e-04, + -6.2285930526845095e-04, + 1.5422972351535255e-03, + -6.6089529841465919e-04, + -1.1822529939065273e-03, + 7.9431779279767246e-04, + -1.2677430787194573e-04, + 6.4796756091853292e-05, + -1.3924650354116248e-04, + -3.1301607401264882e-05, + 4.9296926793974502e-05, + -9.4965688637539702e-05, + 5.6156814646123667e-05, + -9.1198182079314316e-05, + 2.6039820355670405e-04, + 4.3106382567677546e-05, + -9.7016827514025993e-05, + -7.4785284620483794e-05, + -6.6085841514910694e-05, + 9.2317188787004601e-05, + 1.3480686702278333e-05, + 8.2958814726605517e-05, + -1.1609755379269147e-04, ] ).reshape(4, 9) diff --git a/source/tests/infer/deeppot_dpa_spin.pth b/source/tests/infer/deeppot_dpa_spin.pth deleted file mode 100644 index 4b11aaf61b49793e050d6d61ba2f3273dcb11a0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 784536 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ç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

?T!B`t@Ide%M5iwzFaEtxhr`Oe!^gfqg_M2P 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

H;$@4QC? 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 z%0AJRza6_W7a)TdDElBlWedt77Vri2M|p*I?Km+aSEP_RJ`-uWEyl%|sZZ2`0hcAP z%mxBTQI*M^r%0KAa))s1p8Q}Z;z$aJD4Y`{chbPp)?X8yQq#&M%<7Md_- z#Dt_ar(D98TkKx3QfJ+nZPe_ln4GR!QKd=l|7~@mo=9Sz3AGVN0qb@02nEDDHP6=P5Y?ZxbS(3Y zhU)_v!H)!#h^Qn1?5r_wN)2j8P>sN7D=_YJsvbr&vz4Br0&Ck43F77fl6b1*=)2p_ z#@(jEG<(HW%%=MSE&{=v9aD3o5QP!S*$C!C2Z@z-GR{)vk8EvvpFb%9w*J~+LKm$J z1zL$e*J(^G^=OnG?M71rW9*07!cr5{KTq%Xm1L}aZA($>+Qj8*>|~r;=IX|r`<|p- zjG^|6Oud${Jw-3`xV^AfI_d{fjdtcnB+M4gdH=4{L-c9DH^pcMBPhM^Rp`X1VP!Q2KRb<3b~1-$E_-ImR2PC3y+@m{HtR$FHmGb3kaJm3;r1rzw(Zo_ zS*{xNv#_3i+;nbK5CoVwB_8B>4Bz$ku~=fcNVF;83$}3#!ivVdE(bZLEivRXY!P3F ztH}*_)8}LEuv<{x6w2M!FC@#Cg!qn;-3FuR{X6vuaui2aYk;AY-+~J*jFO0bX7Emx zu#?&Yw2l5WD^D3c(2x9-MV}K*UiX#&+vko3|6_wlAv%}V*>u~qSFF|R!2!d8pyw#Fe=!jN4d-29GJ?$}nHTEw&x2cdQ0 zDGxq#A~jaHgL|nR{vWqNe@Gj7Wz7DbKvAgyIcM%tly5sAvLen2fIViVef4I*P$Q

3y2xwOw$q) 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 diff --git a/source/tests/infer/deeppot_dpa_spin.yaml b/source/tests/infer/deeppot_dpa_spin.yaml new file mode 100644 index 0000000000..2b631af422 --- /dev/null +++ b/source/tests/infer/deeppot_dpa_spin.yaml @@ -0,0 +1,2391 @@ +backend: dpmodel +model: + backbone_model: + "@class": Model + "@variables": + out_bias: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.0 + - - 0.0 + - - 0.0 + - - 0.0 + out_std: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 1.0 + - - 1.0 + - - 1.0 + - - 1.0 + "@version": 2 + atom_exclude_types: &id002 + - 2 + - 3 + descriptor: + "@class": Descriptor + "@variables": + davg: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + dstd: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + "@version": 2 + activation_function: tanh + attention_layers: + "@class": NeighborGatedAttention + "@version": 1 + attention_layers: + - attention_layer: + bias: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + in_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.0773000670322781 + - -0.11285163747198214 + - 0.09198909919347824 + - 0.0015564608025799428 + - 0.15993211721468997 + - -0.035699099756999086 + - 0.18711493296570436 + - -0.3680327413169358 + - 0.3146711889101303 + - -0.32196784941870205 + - 0.33080166106245973 + - -0.12427897663338351 + - 0.1971349848817013 + - -0.25328479452025787 + - 0.05619010862452457 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.5453136153500983 + - 0.11646421136015596 + - 0.2728998160990953 + - 0.19211628323790922 + - 0.5121592586576245 + - 0.14015660310197084 + - -0.21283653571712532 + - 0.19270563868027393 + - -0.2869005655415182 + - -0.2805799563301185 + - -0.14688711556497824 + - -0.004936387806237014 + - 0.26891251777915626 + - 0.15015452892352035 + - -0.07209428351171145 + - - -0.2060930999925437 + - -0.11668702412699229 + - 0.03240261480877325 + - -0.12456108006262341 + - 0.28163990564667885 + - -0.32450675882278157 + - 0.14710907975796425 + - 0.0671544495392095 + - -0.007634575731316958 + - -0.37838289250073254 + - 0.13263368708165285 + - -0.1273788347128481 + - 0.2354650725899286 + - -0.26961937359743937 + - -0.1435463708204026 + - - 0.2971343040732761 + - 0.07312988992907121 + - -0.1747043346951614 + - 0.08715563315955775 + - 0.13322347767678513 + - -0.3891940345628173 + - 0.1166655194884039 + - 0.21413329963118571 + - 0.05413909843388683 + - -0.045229184330072024 + - 0.11979871279396558 + - -0.12072731953778283 + - -0.08723066293101692 + - 0.18005965452317124 + - -0.21828380200177724 + - - 0.31671405071433606 + - -0.2716965170499195 + - -0.028361254616657144 + - -0.2617245750818101 + - -0.09699398154549994 + - 0.18481031199205442 + - -0.040465631029007854 + - 0.14108925561333863 + - 0.09429489296773111 + - 0.004655528693258085 + - 0.14898310008646545 + - -0.0857640356727124 + - 0.08773909782891427 + - -0.04149990595119324 + - 0.20601404664335912 + - - 0.21391505516854736 + - -0.09852256414914695 + - -0.1362372794021844 + - 0.22405812208425802 + - 0.049318368740786864 + - 0.009037517617669527 + - 0.048770806587957634 + - 0.20453428339492002 + - -0.06278337870025578 + - 0.13590408268075893 + - 0.16733094069618198 + - -0.2558069441971945 + - 0.2539692845486608 + - -0.3822830942851515 + - -0.01320077168697971 + - - -0.23618346749100957 + - -0.16088435397543652 + - 0.0012095524450221038 + - 0.3434566733111669 + - -0.10412101115096369 + - -0.41354077587368426 + - -0.15301108452052156 + - -0.19472850640297268 + - -0.04784752055915662 + - 0.309354831872237 + - 0.03900287287097172 + - 0.3515719847777949 + - 0.07311373265713761 + - 0.21008558400100064 + - -0.1422281223027184 + - - -0.2501972762466357 + - -0.3947710066769227 + - -0.22159627517439104 + - -0.23717546465166323 + - 0.20361999068539405 + - 0.15834318996454627 + - -0.30369339295139164 + - -0.04594643602162514 + - -0.47003800284266484 + - 0.251313081682966 + - -0.017108155336677568 + - 0.015343488107173805 + - 0.4568124119251754 + - 0.36168954038818313 + - 0.15217782345376488 + - - -0.2661915245836493 + - 0.02323691834885091 + - -0.08549345931548089 + - -0.01576948173458242 + - -0.28637250692974264 + - -0.21920098175766897 + - 0.12766631250579263 + - 0.11029243899731755 + - -0.2570174719864179 + - -0.15426636992711557 + - -0.021417667228726223 + - -0.2669338979262442 + - 0.028601378532179773 + - -0.09310383237144683 + - 0.08623985160238709 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + nnei: 30 + normalize: true + num_heads: 1 + out_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.012014674155435012 + - 0.3077665676691103 + - 0.0604726509386909 + - 0.1842684839388698 + - 0.6156330880385837 + - -0.32920196777558125 + - 0.25783671659080115 + - 0.33358312773786414 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.49949533257566686 + - 0.286547598925902 + - 0.4361493766595648 + - -0.1103280544393254 + - -0.5487598333772651 + - 0.24837784934669413 + - 0.21787651038518507 + - -0.3913940989346758 + - - -0.06463305179286359 + - -0.18513109011840434 + - 0.14079395290035332 + - -0.3234597846998149 + - 0.02730837414103255 + - 0.045234328486521896 + - -0.3465555485376244 + - 0.20186257177624717 + - - 0.4567961848887919 + - -0.521634029517498 + - -0.05827057440920121 + - 0.1202454889788886 + - -0.4149197758780397 + - 0.008473645410200539 + - 0.7860728226637158 + - -0.18512102597129287 + - - 0.02591992461101441 + - -0.19205447789337096 + - -0.37336035406244 + - -0.4396988201616634 + - -0.27280012147716604 + - 0.17196769473503715 + - -0.40497154915115735 + - -0.041913386087695355 + - - 0.15915541120069288 + - -0.1380975416704592 + - -0.218734837591988 + - 0.09092626183841235 + - -0.5174668044557068 + - -0.21180678070629808 + - -0.37390035436391533 + - 0.04945675263633716 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + precision: float64 + scaling_factor: 1.0 + smooth: true + temperature: 1.0 + attn_layer_norm: + "@class": LayerNorm + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + "@version": 1 + eps: 1.0e-05 + precision: float64 + trainable: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + ln_eps: 1.0e-05 + nnei: 30 + normalize: true + precision: float64 + scaling_factor: 1.0 + temperature: 1.0 + trainable_ln: true + - attention_layer: + bias: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + in_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.10962922619214345 + - 0.31595207859196284 + - 0.1823135348000062 + - -0.47792369353249897 + - 0.4364181173781324 + - -0.3836680647022722 + - -0.23463686987556562 + - 0.15404135306221578 + - -0.034120822158277005 + - 0.3183953470379359 + - -0.21392442825478622 + - 0.012841805580442784 + - -0.14095292079989144 + - -0.25141701907332686 + - 0.1621740147854236 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.04432651454819303 + - 0.07074892196496135 + - -0.19255895137584625 + - -0.19981566952132743 + - 0.10148299481604649 + - 0.2160756004145394 + - 0.16060596072069733 + - 0.17111513606428155 + - 0.4109950675037482 + - 0.26635356350735206 + - -0.18156367732081702 + - 0.0895314214571873 + - 0.057816100603675764 + - 0.016503413619334724 + - 0.08760411333791569 + - - -0.13766990184830316 + - 0.06014881349046379 + - -0.21980672183305355 + - -0.30839871665039914 + - 0.20953147387373508 + - -0.19082927049353332 + - -0.23181550452962923 + - -0.08936046171408488 + - -0.078280225924176 + - -0.1325851587956408 + - -0.25378443361135683 + - 0.2948729948552392 + - -0.09325140297939892 + - -0.14574024680698858 + - -0.22099090633027849 + - - 0.045429709573574166 + - -0.1263395702542033 + - -0.1300203926721312 + - 0.17373924393475976 + - 0.24047252246649992 + - 0.2004896569348133 + - 0.20631458219195267 + - 0.37839714562334414 + - 0.11135669898146744 + - -0.11463405996357577 + - -0.03808978768230989 + - 0.20798353705347675 + - -0.14121267899214504 + - 0.13967453150311643 + - 0.10088049506078772 + - - 0.11892678366002153 + - 0.2864895972170223 + - 0.29319963315715897 + - 0.06058700578532366 + - 0.004055425018954525 + - -0.14393427105036072 + - 0.16887631470301387 + - 0.28358557330493 + - -0.2595140635431548 + - -0.02930562910993671 + - 0.26503383245499845 + - 0.41983297531600466 + - -0.1124681545867535 + - -0.3398171732971656 + - -0.2741135582533697 + - - 0.13451906128088217 + - 0.010888133480175035 + - 0.0900078518183752 + - -0.06409830878187231 + - -0.10502100821502645 + - 0.023079499499871807 + - 0.07414436589853633 + - 0.2629215171254904 + - 0.04642960150718239 + - 0.1988755806789641 + - -0.07629100170815732 + - 0.09921524655438335 + - -0.2289820670174585 + - 0.2549805511788397 + - -0.45039023498387787 + - - -0.24464144170777996 + - 0.1967455257626083 + - 0.06764093107202199 + - 0.17382272995208178 + - 0.027916207219719564 + - 0.11966027564666307 + - 0.21745098879410188 + - 0.05692010383329585 + - 0.05971014511869595 + - 0.2977723229828997 + - 0.24776831698997398 + - -0.1902685339637046 + - -0.004666749646972437 + - 0.14935028239849343 + - 0.11645608666956703 + - - -0.4230216490733608 + - -0.05426691735793483 + - -0.023390428143421422 + - -0.5907755934689719 + - 0.37172730079511573 + - -0.21505335264933229 + - 0.17965771743929285 + - -0.035102260175337095 + - -0.0541735937355792 + - -0.47337366894672506 + - -0.10268872287553306 + - -0.15453291293456548 + - -0.04828618892238899 + - 0.14269963343173614 + - 0.07558848779475102 + - - -0.2613291714419873 + - 0.2311123903147909 + - 0.08476759425156882 + - 0.08210712764205921 + - -0.08585522877843707 + - -0.006389859842742848 + - -0.08540677949494811 + - -0.09499113487917653 + - 0.09788200135453207 + - 0.014852707999100719 + - -0.44929890038313824 + - 0.1175298080148149 + - -0.04776284449064017 + - -0.1359122467400183 + - 0.049414904555106914 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + nnei: 30 + normalize: true + num_heads: 1 + out_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.2565939634618157 + - 0.004620349221562676 + - 0.1883062163815952 + - -0.2239550357877486 + - 0.08983838195638551 + - 0.4820038902199821 + - -0.07270401390483885 + - -0.00404319693648555 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.16071798198404572 + - 0.10051996815693054 + - -0.5288655173097807 + - 0.130257474762195 + - 0.05581257096931307 + - 0.04277739706439883 + - -0.21694408078379357 + - 0.6915428323422272 + - - -0.2476547960349563 + - -0.03666478233510395 + - -0.06331623928804718 + - 0.24746908133520484 + - 0.2397629738591262 + - 0.4487859941811591 + - 0.15822993154370696 + - 0.07930115473978999 + - - 0.3274517903181917 + - 0.2301993971941225 + - -0.32163844585913093 + - 0.29445028785203947 + - -0.04638118953081447 + - -0.1381120700898825 + - 0.22376538676031252 + - -0.022521968311180376 + - - 0.04317334481920565 + - -0.1428718603586542 + - 0.3017126550044615 + - 0.4738575664985006 + - -0.27823139510825246 + - 0.007480026084941853 + - 0.038555120292235824 + - 0.5244825249079282 + - - 0.020736666414089052 + - 0.13216568109786306 + - -0.15650475768196248 + - 0.2089877109201956 + - 0.09322183733960938 + - -0.1896625990112233 + - 0.1445804222738735 + - 0.39042411800724985 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + precision: float64 + scaling_factor: 1.0 + smooth: true + temperature: 1.0 + attn_layer_norm: + "@class": LayerNorm + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + "@version": 1 + eps: 1.0e-05 + precision: float64 + trainable: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + ln_eps: 1.0e-05 + nnei: 30 + normalize: true + precision: float64 + scaling_factor: 1.0 + temperature: 1.0 + trainable_ln: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + layer_num: 2 + ln_eps: 1.0e-05 + nnei: 30 + normalize: true + precision: float64 + scaling_factor: 1.0 + temperature: 1.0 + trainable_ln: true + attn: 5 + attn_dotr: true + attn_layer: 2 + attn_mask: false + axis_neuron: 4 + concat_output_tebd: true + embeddings: + "@class": NetworkCollection + "@version": 1 + ndim: 0 + network_type: embedding_network + networks: + - "@class": EmbeddingNetwork + "@version": 2 + activation_function: tanh + bias: true + in_dim: 9 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.17372268332923477 + - 0.1871378134563067 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.18591758215712717 + - 0.27813472999079786 + - - 0.5413037502928204 + - -0.25070102149188617 + - - -0.6360424547704534 + - 0.21677859619201034 + - - -0.2596212453230471 + - -0.29375077070892397 + - - -0.04877331526782445 + - 0.19762680522737003 + - - 0.11098846129818017 + - -0.055797782097484434 + - - -0.006391287979703734 + - 0.41521313707463775 + - - 0.32771579096607567 + - -0.11341705155929026 + - - -0.1738235817859108 + - 0.05042848544602488 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.21199227364358092 + - 0.26084600040864775 + - -0.2672977629563241 + - -0.22294488782038938 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.2715638127686675 + - -0.39555091561915756 + - -0.49463070013277755 + - 0.2580401519962647 + - - -0.7238582261018045 + - -0.37337716297850404 + - -0.048321156004129756 + - 0.6516314685406116 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.04236615203535423 + - -0.39313642621575284 + - -0.14982659771560616 + - -0.05366082048750501 + - 0.1290929957744145 + - 0.32893913896132687 + - 0.4513568730490151 + - 0.10592804387643008 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.12373698637791548 + - -0.011845682303013905 + - -0.37854504841542985 + - -0.7733963434131446 + - 0.06982795430877005 + - -0.2911322653453856 + - -0.15962141672258884 + - 0.018716446641289086 + - - -0.45643928308288767 + - -0.4074922621785349 + - -0.10585596487381858 + - -0.4140870301183928 + - 0.15056708929600188 + - -0.24913213047723315 + - 0.1472722234467295 + - 0.207039979486021 + - - -0.1546276045097144 + - 0.45975631498836944 + - -0.2713617539469805 + - -0.4556419819708189 + - 0.46278476734589424 + - -0.16024061348091864 + - 0.27456475454336476 + - 0.41313594391240294 + - - -0.14985175126180378 + - 0.009489070195105672 + - 0.03606979879882141 + - 0.02529752572854437 + - 0.0772136131584972 + - -0.5502279296867952 + - -0.2340975341607699 + - 0.08633307850417127 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + neuron: + - 2 + - 4 + - 8 + precision: float64 + resnet_dt: false + ntypes: 4 + env_mat: + protection: 1.0e-06 + rcut: 6.0 + rcut_smth: 2.0 + use_exp_switch: false + env_protection: 1.0e-06 + exclude_types: &id003 + - - 3 + - 0 + - - 3 + - 1 + - - 3 + - 2 + - - 3 + - 3 + ln_eps: 1.0e-05 + neuron: + - 2 + - 4 + - 8 + normalize: true + ntypes: 4 + precision: float64 + rcut: 6.0 + rcut_smth: 2.0 + resnet_dt: false + scaling_factor: 1.0 + sel: + - 30 + set_davg_zero: false + smooth_type_embedding: true + spin: null + tebd_dim: 8 + tebd_input_mode: concat + temperature: 1.0 + trainable: true + trainable_ln: true + type: dpa1 + type_embedding: + "@class": TypeEmbedNet + "@version": 2 + activation_function: Linear + embedding: + "@class": EmbeddingNetwork + "@version": 2 + activation_function: Linear + bias: false + in_dim: 4 + layers: + - "@class": Layer + "@variables": + b: null + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.3161547360283977 + - -0.015297581090729784 + - 0.5765215950511243 + - 0.14176442717510646 + - -0.09436943428849595 + - -0.4827490593423835 + - -0.26022683704566674 + - -0.07816101487288045 + - - -0.03219910522911867 + - 0.14525736197208597 + - 0.4166300988982592 + - -0.11812510347880134 + - 0.1959689339789453 + - 0.14894583593855398 + - -0.4990495825239417 + - 0.11968195360930496 + - - -0.5890592166883595 + - -0.2716541312100993 + - 0.513605963081437 + - -0.12412954486366976 + - 0.21913762000348655 + - 0.16401626404198605 + - 0.2753790827646884 + - 0.12376172086553827 + - - 0.4800974125736142 + - 0.09359562730928006 + - -0.06277151252879534 + - 0.3007427466981146 + - -0.1825693326630776 + - -0.10899015324840414 + - 0.09999385450543531 + - -0.09509565217064518 + "@version": 2 + activation_function: Linear + bias: false + precision: float64 + resnet: true + trainable: true + use_timestep: false + neuron: + - 8 + precision: float64 + resnet_dt: false + neuron: + - 8 + ntypes: 4 + padding: true + precision: float64 + resnet_dt: false + trainable: true + type_map: &id001 + - Ni + - O + - Ni_spin + - O_spin + use_econf_tebd: false + use_tebd_bias: false + type_map: *id001 + type_one_side: true + use_econf_tebd: false + use_tebd_bias: false + fitting: + "@class": Fitting + "@variables": + aparam_avg: null + aparam_inv_std: null + bias_atom_e: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.0 + - - 0.0 + - - 0.0 + - - 0.0 + case_embd: null + fparam_avg: null + fparam_inv_std: null + "@version": 4 + activation_function: tanh + atom_ener: null + default_fparam: null + dim_case_embd: 0 + dim_descrpt: 40 + dim_out: 1 + exclude_types: *id002 + layer_name: null + mixed_types: true + nets: + "@class": NetworkCollection + "@version": 1 + ndim: 0 + network_type: fitting_network + networks: + - "@class": FittingNetwork + "@version": 1 + activation_function: tanh + bias_out: true + in_dim: 40 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.19213583785141547 + - 0.01913350809462838 + - 0.061740233764521854 + - -0.2267647790849183 + - 0.12812766437356768 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.10722944375625902 + - 0.030285954989448978 + - -0.07751213660639378 + - -0.05835862674862787 + - 0.06079658252374028 + - - -0.14917809664011292 + - -0.1917000836760898 + - -0.18217651694274126 + - -0.03027373632656806 + - -0.2626097492205049 + - - -0.01587052426328515 + - -0.10141758102785384 + - 0.2884812641234704 + - 0.04070913632457048 + - -0.22952775106142526 + - - -0.005339896387597923 + - 0.2026717424567498 + - -0.23570070258569312 + - 0.02517187837708613 + - 0.006776247990408211 + - - 0.05869629681843979 + - -0.04536473825638193 + - -0.3331387257924115 + - 0.10410925750982085 + - -0.06226317817610261 + - - -0.34375470875866937 + - -0.21165266854067688 + - -0.07367160504875508 + - -0.04451329922224857 + - -0.07669864755078881 + - - 0.0019798728717504406 + - -0.05723324006026723 + - 0.08134147353272701 + - -0.20416051853341133 + - -0.1489448413235881 + - - -0.1297286685333724 + - -0.10254001818713723 + - -0.06485973011482828 + - -0.030747888978288476 + - -0.02400913589645549 + - - -0.094789713046158 + - -0.19167746643213587 + - -0.2503250569998187 + - 0.26434536457709407 + - 0.017547558090668915 + - - -0.29183772248369166 + - -0.036914405343361524 + - 0.03792963273035814 + - 0.17868452483507827 + - 0.00045001937022070665 + - - 0.17243079119989835 + - -0.23834705710954138 + - -0.09220221952867924 + - 0.018321049065233186 + - 0.03436188061915956 + - - 0.11077420998763597 + - -0.049847014250950866 + - -0.013865251301544756 + - 0.06342369857555755 + - -0.06594080637876534 + - - 0.07959185404659529 + - 0.15264265616361125 + - 0.10610192766737493 + - 0.02332598396345151 + - 0.11973629760425605 + - - -0.004068585904498259 + - 0.022424747708734243 + - 0.0904892803921496 + - 0.05915257009060455 + - -0.16743070962990553 + - - -0.1344159533436917 + - 0.06890292754397642 + - 0.040088028773263784 + - 0.06200012741623026 + - 0.06572901068559592 + - - -0.11089129384208427 + - -0.0248775999154777 + - 0.22639251490169005 + - 0.08926907460675748 + - 0.007766677806386451 + - - 0.04732793883524216 + - 0.3566550898924153 + - 0.053342420260193917 + - 0.10532169496785464 + - 0.05480515327344935 + - - -0.14795892356277907 + - -0.033583652192236545 + - 0.09467702932906724 + - -0.003445970791527109 + - -0.02970262899767938 + - - 0.01798891613889279 + - -0.2134710507671308 + - -0.03858114609602234 + - 0.15849887117268416 + - -0.011587330107593236 + - - 0.11836949735270877 + - 0.18151152582621652 + - 0.07797861333058898 + - 0.03771976731550859 + - 0.03860339300326443 + - - -0.24233917378226116 + - 0.11523548951310575 + - 0.11274022558623038 + - -0.13891602078102852 + - 0.038197951979408194 + - - 0.14748023102987462 + - 0.03809724924008725 + - -0.24004342053841574 + - -0.11674077556127527 + - 0.015631624270000557 + - - 0.1225811593516911 + - 0.17781553932560712 + - 0.2019153965211837 + - -0.03911653241832874 + - -0.04308105521791055 + - - -0.22890975503121846 + - 0.2631927308266052 + - 0.3396422256608267 + - 0.0060877665369990334 + - -0.16396998978274016 + - - -0.09015288252228824 + - -0.1462415933363514 + - -0.15500878428971507 + - 0.07258538808048835 + - 0.06972580948759297 + - - -0.013411147005090846 + - -0.11250472915278566 + - 0.14883490023381404 + - -0.11578579710847242 + - 0.14989570157529938 + - - 0.007217452542531879 + - -0.006294431390605557 + - -0.06761263100067849 + - 0.1024456071698635 + - -0.11305751449457453 + - - 0.04974042427247295 + - -0.10506914162544219 + - 0.25137476343128823 + - -0.18546350417307744 + - 0.2169319752796324 + - - -0.36953714727489606 + - -0.010694988244169208 + - 0.10310978529691683 + - 0.40241055217283583 + - 0.130304630596996 + - - -0.1300988477379937 + - 0.13898156842052345 + - -0.29616754521862765 + - 0.05477159336390151 + - -0.07430155564400093 + - - -0.23757959434444867 + - 0.18864334118518866 + - -0.10919537505938344 + - 0.03221667898269365 + - 0.06298671553338492 + - - -0.13366418607892308 + - -0.2137613131165465 + - -0.049788669977315965 + - -0.14137793021258133 + - -0.2713394719317361 + - - 0.10569214804393999 + - 0.2510285905202212 + - -0.27513277377115314 + - 0.04690770942719883 + - -0.34809118312878895 + - - 0.05890615039488246 + - 0.24348639943784472 + - 0.2405967304273802 + - -0.0033626925137259346 + - 0.30761898255775194 + - - -0.17185651083822667 + - -0.10734343952635343 + - -0.06568054347536262 + - 0.14655475328776377 + - -0.0776926672052371 + - - 0.031163930588449826 + - 0.23226835010332045 + - -0.03809535974683978 + - 0.13765491602806237 + - 0.06396617651310808 + - - -0.08473934132044068 + - -0.2682902010461224 + - 0.09550142632352028 + - 0.09194416152248457 + - -0.022502798179882343 + - - 0.1799453451027606 + - 0.053161530662990036 + - 0.2540666599422615 + - -0.07199521485924587 + - 0.18012605784803465 + - - -0.1474306683388992 + - 0.01800791937891814 + - -0.24916194237740008 + - -0.08249392187563226 + - -0.039169320735019185 + - - -0.07061780826603485 + - -0.05039829819305093 + - -0.3158384285468677 + - 0.0026965883039741095 + - 0.19109727147593047 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.09501004658257778 + - 0.1663807327224991 + - -0.5185313341630086 + - -0.7740662908662731 + - -0.18752579321547022 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.2188085499554977 + - -0.4014642473754725 + - 0.032489550654357095 + - 0.06343911616091243 + - -0.00407617112574573 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.3141891418069332 + - 0.30132598326837057 + - -0.1868614701027005 + - -0.1853536726835805 + - -0.14904917553209618 + - - -0.4993776326714626 + - 0.2929711950476154 + - -0.3300253064210836 + - -0.4799775188835898 + - -0.12327559985245252 + - - 0.16627900477763782 + - 0.18281489789715116 + - -0.0796215789550366 + - 0.11637836794519682 + - 0.019126199990905587 + - - 0.47193798042526686 + - 0.3935489978037474 + - 0.1926588188573466 + - 0.11685532990383077 + - -0.3143759410105157 + - - 0.2619509948079511 + - 0.17134734041574828 + - 0.16467987243470003 + - -0.17768942725372738 + - 0.17196893072212313 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.1498329073500072 + - -0.10390305511196503 + - -0.7262688617464856 + - -0.14980303343140125 + - -0.3578894004618838 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.3290381873321775 + - 0.23103250534551598 + - -0.6940851206117438 + - -0.19335307745332778 + - -0.9240817753801489 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.3092290441156226 + - -0.496367611501348 + - -0.052492949379292775 + - 0.06663748312823926 + - 0.027714401468510886 + - - -0.10433141997317527 + - -0.323901631855259 + - -0.24739439873488192 + - 0.3076895568713741 + - 0.1593814472209255 + - - -0.07111829721069259 + - -0.27598680250101504 + - 0.16632764307325093 + - 0.1801382402999823 + - 0.3107523993064097 + - - -0.012140157566561928 + - 0.07469305237763302 + - 0.26428018852282276 + - -0.11500213881655802 + - -0.2731498304335624 + - - 0.29941998505510775 + - 0.39267279762211 + - 0.06586779164332648 + - 0.10010820203885952 + - -0.04143485413490972 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.044426160812178636 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.26432565710368733 + - - 0.17264367113482967 + - - -0.04729186377886323 + - - -0.08841444813809296 + - - 0.2969145415081517 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + neuron: + - 5 + - 5 + - 5 + out_dim: 1 + precision: float64 + resnet_dt: true + ntypes: 4 + neuron: + - 5 + - 5 + - 5 + ntypes: 4 + numb_aparam: 0 + numb_fparam: 0 + precision: float64 + rcond: null + resnet_dt: true + spin: null + tot_ener_zero: false + trainable: + - true + - true + - true + - true + type: ener + type_map: + - Ni + - O + - Ni_spin + - O_spin + use_aparam_as_mask: false + var_name: energy + pair_exclude_types: *id003 + preset_out_bias: null + rcond: null + type: standard + type_map: + - Ni + - O + - Ni_spin + - O_spin + spin: + use_spin: + - true + - false + virtual_scale: + - 0.314 + - 0.0 + type: spin_ener +model_def_script: + descriptor: + activation_function: tanh + attn: 5 + attn_dotr: true + attn_layer: 2 + attn_mask: false + axis_neuron: 4 + neuron: + - 2 + - 4 + - 8 + normalize: true + rcut: 6.0 + rcut_smth: 2.0 + scaling_factor: 1.0 + seed: 1 + sel: 30 + temperature: 1.0 + type: se_atten + type_one_side: true + fitting_net: + neuron: + - 5 + - 5 + - 5 + resnet_dt: true + seed: 1 + spin: + use_spin: + - true + - false + virtual_scale: + - 0.314 + - 0.0 + type_map: + - Ni + - O +software: deepmd-kit +time: "2026-04-04 10:38:37.220790+00:00" +version: 3.0.0 diff --git a/source/tests/infer/deeppot_dpa_spin_md0.yaml b/source/tests/infer/deeppot_dpa_spin_md0.yaml new file mode 100644 index 0000000000..3512d7015e --- /dev/null +++ b/source/tests/infer/deeppot_dpa_spin_md0.yaml @@ -0,0 +1,2391 @@ +backend: dpmodel +model: + backbone_model: + "@class": Model + "@variables": + out_bias: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.0 + - - 0.0 + - - 0.0 + - - 0.0 + out_std: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 1.0 + - - 1.0 + - - 1.0 + - - 1.0 + "@version": 2 + atom_exclude_types: &id002 + - 2 + - 3 + descriptor: + "@class": Descriptor + "@variables": + davg: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + dstd: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + "@version": 2 + activation_function: tanh + attention_layers: + "@class": NeighborGatedAttention + "@version": 1 + attention_layers: + - attention_layer: + bias: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + in_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.0773000670322781 + - -0.11285163747198214 + - 0.09198909919347824 + - 0.0015564608025799428 + - 0.15993211721468997 + - -0.035699099756999086 + - 0.18711493296570436 + - -0.3680327413169358 + - 0.3146711889101303 + - -0.32196784941870205 + - 0.33080166106245973 + - -0.12427897663338351 + - 0.1971349848817013 + - -0.25328479452025787 + - 0.05619010862452457 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.5453136153500983 + - 0.11646421136015596 + - 0.2728998160990953 + - 0.19211628323790922 + - 0.5121592586576245 + - 0.14015660310197084 + - -0.21283653571712532 + - 0.19270563868027393 + - -0.2869005655415182 + - -0.2805799563301185 + - -0.14688711556497824 + - -0.004936387806237014 + - 0.26891251777915626 + - 0.15015452892352035 + - -0.07209428351171145 + - - -0.2060930999925437 + - -0.11668702412699229 + - 0.03240261480877325 + - -0.12456108006262341 + - 0.28163990564667885 + - -0.32450675882278157 + - 0.14710907975796425 + - 0.0671544495392095 + - -0.007634575731316958 + - -0.37838289250073254 + - 0.13263368708165285 + - -0.1273788347128481 + - 0.2354650725899286 + - -0.26961937359743937 + - -0.1435463708204026 + - - 0.2971343040732761 + - 0.07312988992907121 + - -0.1747043346951614 + - 0.08715563315955775 + - 0.13322347767678513 + - -0.3891940345628173 + - 0.1166655194884039 + - 0.21413329963118571 + - 0.05413909843388683 + - -0.045229184330072024 + - 0.11979871279396558 + - -0.12072731953778283 + - -0.08723066293101692 + - 0.18005965452317124 + - -0.21828380200177724 + - - 0.31671405071433606 + - -0.2716965170499195 + - -0.028361254616657144 + - -0.2617245750818101 + - -0.09699398154549994 + - 0.18481031199205442 + - -0.040465631029007854 + - 0.14108925561333863 + - 0.09429489296773111 + - 0.004655528693258085 + - 0.14898310008646545 + - -0.0857640356727124 + - 0.08773909782891427 + - -0.04149990595119324 + - 0.20601404664335912 + - - 0.21391505516854736 + - -0.09852256414914695 + - -0.1362372794021844 + - 0.22405812208425802 + - 0.049318368740786864 + - 0.009037517617669527 + - 0.048770806587957634 + - 0.20453428339492002 + - -0.06278337870025578 + - 0.13590408268075893 + - 0.16733094069618198 + - -0.2558069441971945 + - 0.2539692845486608 + - -0.3822830942851515 + - -0.01320077168697971 + - - -0.23618346749100957 + - -0.16088435397543652 + - 0.0012095524450221038 + - 0.3434566733111669 + - -0.10412101115096369 + - -0.41354077587368426 + - -0.15301108452052156 + - -0.19472850640297268 + - -0.04784752055915662 + - 0.309354831872237 + - 0.03900287287097172 + - 0.3515719847777949 + - 0.07311373265713761 + - 0.21008558400100064 + - -0.1422281223027184 + - - -0.2501972762466357 + - -0.3947710066769227 + - -0.22159627517439104 + - -0.23717546465166323 + - 0.20361999068539405 + - 0.15834318996454627 + - -0.30369339295139164 + - -0.04594643602162514 + - -0.47003800284266484 + - 0.251313081682966 + - -0.017108155336677568 + - 0.015343488107173805 + - 0.4568124119251754 + - 0.36168954038818313 + - 0.15217782345376488 + - - -0.2661915245836493 + - 0.02323691834885091 + - -0.08549345931548089 + - -0.01576948173458242 + - -0.28637250692974264 + - -0.21920098175766897 + - 0.12766631250579263 + - 0.11029243899731755 + - -0.2570174719864179 + - -0.15426636992711557 + - -0.021417667228726223 + - -0.2669338979262442 + - 0.028601378532179773 + - -0.09310383237144683 + - 0.08623985160238709 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + nnei: 30 + normalize: true + num_heads: 1 + out_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.012014674155435012 + - 0.3077665676691103 + - 0.0604726509386909 + - 0.1842684839388698 + - 0.6156330880385837 + - -0.32920196777558125 + - 0.25783671659080115 + - 0.33358312773786414 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.49949533257566686 + - 0.286547598925902 + - 0.4361493766595648 + - -0.1103280544393254 + - -0.5487598333772651 + - 0.24837784934669413 + - 0.21787651038518507 + - -0.3913940989346758 + - - -0.06463305179286359 + - -0.18513109011840434 + - 0.14079395290035332 + - -0.3234597846998149 + - 0.02730837414103255 + - 0.045234328486521896 + - -0.3465555485376244 + - 0.20186257177624717 + - - 0.4567961848887919 + - -0.521634029517498 + - -0.05827057440920121 + - 0.1202454889788886 + - -0.4149197758780397 + - 0.008473645410200539 + - 0.7860728226637158 + - -0.18512102597129287 + - - 0.02591992461101441 + - -0.19205447789337096 + - -0.37336035406244 + - -0.4396988201616634 + - -0.27280012147716604 + - 0.17196769473503715 + - -0.40497154915115735 + - -0.041913386087695355 + - - 0.15915541120069288 + - -0.1380975416704592 + - -0.218734837591988 + - 0.09092626183841235 + - -0.5174668044557068 + - -0.21180678070629808 + - -0.37390035436391533 + - 0.04945675263633716 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + precision: float64 + scaling_factor: 1.0 + smooth: true + temperature: 1.0 + attn_layer_norm: + "@class": LayerNorm + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + "@version": 1 + eps: 1.0e-05 + precision: float64 + trainable: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + ln_eps: 1.0e-05 + nnei: 30 + normalize: true + precision: float64 + scaling_factor: 1.0 + temperature: 1.0 + trainable_ln: true + - attention_layer: + bias: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + in_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.10962922619214345 + - 0.31595207859196284 + - 0.1823135348000062 + - -0.47792369353249897 + - 0.4364181173781324 + - -0.3836680647022722 + - -0.23463686987556562 + - 0.15404135306221578 + - -0.034120822158277005 + - 0.3183953470379359 + - -0.21392442825478622 + - 0.012841805580442784 + - -0.14095292079989144 + - -0.25141701907332686 + - 0.1621740147854236 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.04432651454819303 + - 0.07074892196496135 + - -0.19255895137584625 + - -0.19981566952132743 + - 0.10148299481604649 + - 0.2160756004145394 + - 0.16060596072069733 + - 0.17111513606428155 + - 0.4109950675037482 + - 0.26635356350735206 + - -0.18156367732081702 + - 0.0895314214571873 + - 0.057816100603675764 + - 0.016503413619334724 + - 0.08760411333791569 + - - -0.13766990184830316 + - 0.06014881349046379 + - -0.21980672183305355 + - -0.30839871665039914 + - 0.20953147387373508 + - -0.19082927049353332 + - -0.23181550452962923 + - -0.08936046171408488 + - -0.078280225924176 + - -0.1325851587956408 + - -0.25378443361135683 + - 0.2948729948552392 + - -0.09325140297939892 + - -0.14574024680698858 + - -0.22099090633027849 + - - 0.045429709573574166 + - -0.1263395702542033 + - -0.1300203926721312 + - 0.17373924393475976 + - 0.24047252246649992 + - 0.2004896569348133 + - 0.20631458219195267 + - 0.37839714562334414 + - 0.11135669898146744 + - -0.11463405996357577 + - -0.03808978768230989 + - 0.20798353705347675 + - -0.14121267899214504 + - 0.13967453150311643 + - 0.10088049506078772 + - - 0.11892678366002153 + - 0.2864895972170223 + - 0.29319963315715897 + - 0.06058700578532366 + - 0.004055425018954525 + - -0.14393427105036072 + - 0.16887631470301387 + - 0.28358557330493 + - -0.2595140635431548 + - -0.02930562910993671 + - 0.26503383245499845 + - 0.41983297531600466 + - -0.1124681545867535 + - -0.3398171732971656 + - -0.2741135582533697 + - - 0.13451906128088217 + - 0.010888133480175035 + - 0.0900078518183752 + - -0.06409830878187231 + - -0.10502100821502645 + - 0.023079499499871807 + - 0.07414436589853633 + - 0.2629215171254904 + - 0.04642960150718239 + - 0.1988755806789641 + - -0.07629100170815732 + - 0.09921524655438335 + - -0.2289820670174585 + - 0.2549805511788397 + - -0.45039023498387787 + - - -0.24464144170777996 + - 0.1967455257626083 + - 0.06764093107202199 + - 0.17382272995208178 + - 0.027916207219719564 + - 0.11966027564666307 + - 0.21745098879410188 + - 0.05692010383329585 + - 0.05971014511869595 + - 0.2977723229828997 + - 0.24776831698997398 + - -0.1902685339637046 + - -0.004666749646972437 + - 0.14935028239849343 + - 0.11645608666956703 + - - -0.4230216490733608 + - -0.05426691735793483 + - -0.023390428143421422 + - -0.5907755934689719 + - 0.37172730079511573 + - -0.21505335264933229 + - 0.17965771743929285 + - -0.035102260175337095 + - -0.0541735937355792 + - -0.47337366894672506 + - -0.10268872287553306 + - -0.15453291293456548 + - -0.04828618892238899 + - 0.14269963343173614 + - 0.07558848779475102 + - - -0.2613291714419873 + - 0.2311123903147909 + - 0.08476759425156882 + - 0.08210712764205921 + - -0.08585522877843707 + - -0.006389859842742848 + - -0.08540677949494811 + - -0.09499113487917653 + - 0.09788200135453207 + - 0.014852707999100719 + - -0.44929890038313824 + - 0.1175298080148149 + - -0.04776284449064017 + - -0.1359122467400183 + - 0.049414904555106914 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + nnei: 30 + normalize: true + num_heads: 1 + out_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.2565939634618157 + - 0.004620349221562676 + - 0.1883062163815952 + - -0.2239550357877486 + - 0.08983838195638551 + - 0.4820038902199821 + - -0.07270401390483885 + - -0.00404319693648555 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.16071798198404572 + - 0.10051996815693054 + - -0.5288655173097807 + - 0.130257474762195 + - 0.05581257096931307 + - 0.04277739706439883 + - -0.21694408078379357 + - 0.6915428323422272 + - - -0.2476547960349563 + - -0.03666478233510395 + - -0.06331623928804718 + - 0.24746908133520484 + - 0.2397629738591262 + - 0.4487859941811591 + - 0.15822993154370696 + - 0.07930115473978999 + - - 0.3274517903181917 + - 0.2301993971941225 + - -0.32163844585913093 + - 0.29445028785203947 + - -0.04638118953081447 + - -0.1381120700898825 + - 0.22376538676031252 + - -0.022521968311180376 + - - 0.04317334481920565 + - -0.1428718603586542 + - 0.3017126550044615 + - 0.4738575664985006 + - -0.27823139510825246 + - 0.007480026084941853 + - 0.038555120292235824 + - 0.5244825249079282 + - - 0.020736666414089052 + - 0.13216568109786306 + - -0.15650475768196248 + - 0.2089877109201956 + - 0.09322183733960938 + - -0.1896625990112233 + - 0.1445804222738735 + - 0.39042411800724985 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + precision: float64 + scaling_factor: 1.0 + smooth: true + temperature: 1.0 + attn_layer_norm: + "@class": LayerNorm + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + "@version": 1 + eps: 1.0e-05 + precision: float64 + trainable: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + ln_eps: 1.0e-05 + nnei: 30 + normalize: true + precision: float64 + scaling_factor: 1.0 + temperature: 1.0 + trainable_ln: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + layer_num: 2 + ln_eps: 1.0e-05 + nnei: 30 + normalize: true + precision: float64 + scaling_factor: 1.0 + temperature: 1.0 + trainable_ln: true + attn: 5 + attn_dotr: true + attn_layer: 2 + attn_mask: false + axis_neuron: 4 + concat_output_tebd: true + embeddings: + "@class": NetworkCollection + "@version": 1 + ndim: 0 + network_type: embedding_network + networks: + - "@class": EmbeddingNetwork + "@version": 2 + activation_function: tanh + bias: true + in_dim: 9 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.17372268332923477 + - 0.1871378134563067 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.18591758215712717 + - 0.27813472999079786 + - - 0.5413037502928204 + - -0.25070102149188617 + - - -0.6360424547704534 + - 0.21677859619201034 + - - -0.2596212453230471 + - -0.29375077070892397 + - - -0.04877331526782445 + - 0.19762680522737003 + - - 0.11098846129818017 + - -0.055797782097484434 + - - -0.006391287979703734 + - 0.41521313707463775 + - - 0.32771579096607567 + - -0.11341705155929026 + - - -0.1738235817859108 + - 0.05042848544602488 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.21199227364358092 + - 0.26084600040864775 + - -0.2672977629563241 + - -0.22294488782038938 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.2715638127686675 + - -0.39555091561915756 + - -0.49463070013277755 + - 0.2580401519962647 + - - -0.7238582261018045 + - -0.37337716297850404 + - -0.048321156004129756 + - 0.6516314685406116 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.04236615203535423 + - -0.39313642621575284 + - -0.14982659771560616 + - -0.05366082048750501 + - 0.1290929957744145 + - 0.32893913896132687 + - 0.4513568730490151 + - 0.10592804387643008 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.12373698637791548 + - -0.011845682303013905 + - -0.37854504841542985 + - -0.7733963434131446 + - 0.06982795430877005 + - -0.2911322653453856 + - -0.15962141672258884 + - 0.018716446641289086 + - - -0.45643928308288767 + - -0.4074922621785349 + - -0.10585596487381858 + - -0.4140870301183928 + - 0.15056708929600188 + - -0.24913213047723315 + - 0.1472722234467295 + - 0.207039979486021 + - - -0.1546276045097144 + - 0.45975631498836944 + - -0.2713617539469805 + - -0.4556419819708189 + - 0.46278476734589424 + - -0.16024061348091864 + - 0.27456475454336476 + - 0.41313594391240294 + - - -0.14985175126180378 + - 0.009489070195105672 + - 0.03606979879882141 + - 0.02529752572854437 + - 0.0772136131584972 + - -0.5502279296867952 + - -0.2340975341607699 + - 0.08633307850417127 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + neuron: + - 2 + - 4 + - 8 + precision: float64 + resnet_dt: false + ntypes: 4 + env_mat: + protection: 1.0e-06 + rcut: 6.0 + rcut_smth: 2.0 + use_exp_switch: false + env_protection: 1.0e-06 + exclude_types: &id003 + - - 3 + - 0 + - - 3 + - 1 + - - 3 + - 2 + - - 3 + - 3 + ln_eps: 1.0e-05 + neuron: + - 2 + - 4 + - 8 + normalize: true + ntypes: 4 + precision: float64 + rcut: 6.0 + rcut_smth: 2.0 + resnet_dt: false + scaling_factor: 1.0 + sel: + - 30 + set_davg_zero: false + smooth_type_embedding: true + spin: null + tebd_dim: 8 + tebd_input_mode: concat + temperature: 1.0 + trainable: true + trainable_ln: true + type: dpa1 + type_embedding: + "@class": TypeEmbedNet + "@version": 2 + activation_function: Linear + embedding: + "@class": EmbeddingNetwork + "@version": 2 + activation_function: Linear + bias: false + in_dim: 4 + layers: + - "@class": Layer + "@variables": + b: null + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.3161547360283977 + - -0.015297581090729784 + - 0.5765215950511243 + - 0.14176442717510646 + - -0.09436943428849595 + - -0.4827490593423835 + - -0.26022683704566674 + - -0.07816101487288045 + - - -0.03219910522911867 + - 0.14525736197208597 + - 0.4166300988982592 + - -0.11812510347880134 + - 0.1959689339789453 + - 0.14894583593855398 + - -0.4990495825239417 + - 0.11968195360930496 + - - -0.5890592166883595 + - -0.2716541312100993 + - 0.513605963081437 + - -0.12412954486366976 + - 0.21913762000348655 + - 0.16401626404198605 + - 0.2753790827646884 + - 0.12376172086553827 + - - 0.4800974125736142 + - 0.09359562730928006 + - -0.06277151252879534 + - 0.3007427466981146 + - -0.1825693326630776 + - -0.10899015324840414 + - 0.09999385450543531 + - -0.09509565217064518 + "@version": 2 + activation_function: Linear + bias: false + precision: float64 + resnet: true + trainable: true + use_timestep: false + neuron: + - 8 + precision: float64 + resnet_dt: false + neuron: + - 8 + ntypes: 4 + padding: true + precision: float64 + resnet_dt: false + trainable: true + type_map: &id001 + - Ni + - O + - Ni_spin + - O_spin + use_econf_tebd: false + use_tebd_bias: false + type_map: *id001 + type_one_side: true + use_econf_tebd: false + use_tebd_bias: false + fitting: + "@class": Fitting + "@variables": + aparam_avg: null + aparam_inv_std: null + bias_atom_e: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.0 + - - 0.0 + - - 0.0 + - - 0.0 + case_embd: null + fparam_avg: null + fparam_inv_std: null + "@version": 4 + activation_function: tanh + atom_ener: null + default_fparam: null + dim_case_embd: 0 + dim_descrpt: 40 + dim_out: 1 + exclude_types: *id002 + layer_name: null + mixed_types: true + nets: + "@class": NetworkCollection + "@version": 1 + ndim: 0 + network_type: fitting_network + networks: + - "@class": FittingNetwork + "@version": 1 + activation_function: tanh + bias_out: true + in_dim: 40 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.19213583785141547 + - 0.01913350809462838 + - 0.061740233764521854 + - -0.2267647790849183 + - 0.12812766437356768 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.10722944375625902 + - 0.030285954989448978 + - -0.07751213660639378 + - -0.05835862674862787 + - 0.06079658252374028 + - - -0.14917809664011292 + - -0.1917000836760898 + - -0.18217651694274126 + - -0.03027373632656806 + - -0.2626097492205049 + - - -0.01587052426328515 + - -0.10141758102785384 + - 0.2884812641234704 + - 0.04070913632457048 + - -0.22952775106142526 + - - -0.005339896387597923 + - 0.2026717424567498 + - -0.23570070258569312 + - 0.02517187837708613 + - 0.006776247990408211 + - - 0.05869629681843979 + - -0.04536473825638193 + - -0.3331387257924115 + - 0.10410925750982085 + - -0.06226317817610261 + - - -0.34375470875866937 + - -0.21165266854067688 + - -0.07367160504875508 + - -0.04451329922224857 + - -0.07669864755078881 + - - 0.0019798728717504406 + - -0.05723324006026723 + - 0.08134147353272701 + - -0.20416051853341133 + - -0.1489448413235881 + - - -0.1297286685333724 + - -0.10254001818713723 + - -0.06485973011482828 + - -0.030747888978288476 + - -0.02400913589645549 + - - -0.094789713046158 + - -0.19167746643213587 + - -0.2503250569998187 + - 0.26434536457709407 + - 0.017547558090668915 + - - -0.29183772248369166 + - -0.036914405343361524 + - 0.03792963273035814 + - 0.17868452483507827 + - 0.00045001937022070665 + - - 0.17243079119989835 + - -0.23834705710954138 + - -0.09220221952867924 + - 0.018321049065233186 + - 0.03436188061915956 + - - 0.11077420998763597 + - -0.049847014250950866 + - -0.013865251301544756 + - 0.06342369857555755 + - -0.06594080637876534 + - - 0.07959185404659529 + - 0.15264265616361125 + - 0.10610192766737493 + - 0.02332598396345151 + - 0.11973629760425605 + - - -0.004068585904498259 + - 0.022424747708734243 + - 0.0904892803921496 + - 0.05915257009060455 + - -0.16743070962990553 + - - -0.1344159533436917 + - 0.06890292754397642 + - 0.040088028773263784 + - 0.06200012741623026 + - 0.06572901068559592 + - - -0.11089129384208427 + - -0.0248775999154777 + - 0.22639251490169005 + - 0.08926907460675748 + - 0.007766677806386451 + - - 0.04732793883524216 + - 0.3566550898924153 + - 0.053342420260193917 + - 0.10532169496785464 + - 0.05480515327344935 + - - -0.14795892356277907 + - -0.033583652192236545 + - 0.09467702932906724 + - -0.003445970791527109 + - -0.02970262899767938 + - - 0.01798891613889279 + - -0.2134710507671308 + - -0.03858114609602234 + - 0.15849887117268416 + - -0.011587330107593236 + - - 0.11836949735270877 + - 0.18151152582621652 + - 0.07797861333058898 + - 0.03771976731550859 + - 0.03860339300326443 + - - -0.24233917378226116 + - 0.11523548951310575 + - 0.11274022558623038 + - -0.13891602078102852 + - 0.038197951979408194 + - - 0.14748023102987462 + - 0.03809724924008725 + - -0.24004342053841574 + - -0.11674077556127527 + - 0.015631624270000557 + - - 0.1225811593516911 + - 0.17781553932560712 + - 0.2019153965211837 + - -0.03911653241832874 + - -0.04308105521791055 + - - -0.22890975503121846 + - 0.2631927308266052 + - 0.3396422256608267 + - 0.0060877665369990334 + - -0.16396998978274016 + - - -0.09015288252228824 + - -0.1462415933363514 + - -0.15500878428971507 + - 0.07258538808048835 + - 0.06972580948759297 + - - -0.013411147005090846 + - -0.11250472915278566 + - 0.14883490023381404 + - -0.11578579710847242 + - 0.14989570157529938 + - - 0.007217452542531879 + - -0.006294431390605557 + - -0.06761263100067849 + - 0.1024456071698635 + - -0.11305751449457453 + - - 0.04974042427247295 + - -0.10506914162544219 + - 0.25137476343128823 + - -0.18546350417307744 + - 0.2169319752796324 + - - -0.36953714727489606 + - -0.010694988244169208 + - 0.10310978529691683 + - 0.40241055217283583 + - 0.130304630596996 + - - -0.1300988477379937 + - 0.13898156842052345 + - -0.29616754521862765 + - 0.05477159336390151 + - -0.07430155564400093 + - - -0.23757959434444867 + - 0.18864334118518866 + - -0.10919537505938344 + - 0.03221667898269365 + - 0.06298671553338492 + - - -0.13366418607892308 + - -0.2137613131165465 + - -0.049788669977315965 + - -0.14137793021258133 + - -0.2713394719317361 + - - 0.10569214804393999 + - 0.2510285905202212 + - -0.27513277377115314 + - 0.04690770942719883 + - -0.34809118312878895 + - - 0.05890615039488246 + - 0.24348639943784472 + - 0.2405967304273802 + - -0.0033626925137259346 + - 0.30761898255775194 + - - -0.17185651083822667 + - -0.10734343952635343 + - -0.06568054347536262 + - 0.14655475328776377 + - -0.0776926672052371 + - - 0.031163930588449826 + - 0.23226835010332045 + - -0.03809535974683978 + - 0.13765491602806237 + - 0.06396617651310808 + - - -0.08473934132044068 + - -0.2682902010461224 + - 0.09550142632352028 + - 0.09194416152248457 + - -0.022502798179882343 + - - 0.1799453451027606 + - 0.053161530662990036 + - 0.2540666599422615 + - -0.07199521485924587 + - 0.18012605784803465 + - - -0.1474306683388992 + - 0.01800791937891814 + - -0.24916194237740008 + - -0.08249392187563226 + - -0.039169320735019185 + - - -0.07061780826603485 + - -0.05039829819305093 + - -0.3158384285468677 + - 0.0026965883039741095 + - 0.19109727147593047 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.09501004658257778 + - 0.1663807327224991 + - -0.5185313341630086 + - -0.7740662908662731 + - -0.18752579321547022 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.2188085499554977 + - -0.4014642473754725 + - 0.032489550654357095 + - 0.06343911616091243 + - -0.00407617112574573 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.3141891418069332 + - 0.30132598326837057 + - -0.1868614701027005 + - -0.1853536726835805 + - -0.14904917553209618 + - - -0.4993776326714626 + - 0.2929711950476154 + - -0.3300253064210836 + - -0.4799775188835898 + - -0.12327559985245252 + - - 0.16627900477763782 + - 0.18281489789715116 + - -0.0796215789550366 + - 0.11637836794519682 + - 0.019126199990905587 + - - 0.47193798042526686 + - 0.3935489978037474 + - 0.1926588188573466 + - 0.11685532990383077 + - -0.3143759410105157 + - - 0.2619509948079511 + - 0.17134734041574828 + - 0.16467987243470003 + - -0.17768942725372738 + - 0.17196893072212313 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.1498329073500072 + - -0.10390305511196503 + - -0.7262688617464856 + - -0.14980303343140125 + - -0.3578894004618838 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.3290381873321775 + - 0.23103250534551598 + - -0.6940851206117438 + - -0.19335307745332778 + - -0.9240817753801489 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.3092290441156226 + - -0.496367611501348 + - -0.052492949379292775 + - 0.06663748312823926 + - 0.027714401468510886 + - - -0.10433141997317527 + - -0.323901631855259 + - -0.24739439873488192 + - 0.3076895568713741 + - 0.1593814472209255 + - - -0.07111829721069259 + - -0.27598680250101504 + - 0.16632764307325093 + - 0.1801382402999823 + - 0.3107523993064097 + - - -0.012140157566561928 + - 0.07469305237763302 + - 0.26428018852282276 + - -0.11500213881655802 + - -0.2731498304335624 + - - 0.29941998505510775 + - 0.39267279762211 + - 0.06586779164332648 + - 0.10010820203885952 + - -0.04143485413490972 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.044426160812178636 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.26432565710368733 + - - 0.17264367113482967 + - - -0.04729186377886323 + - - -0.08841444813809296 + - - 0.2969145415081517 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + neuron: + - 5 + - 5 + - 5 + out_dim: 1 + precision: float64 + resnet_dt: true + ntypes: 4 + neuron: + - 5 + - 5 + - 5 + ntypes: 4 + numb_aparam: 0 + numb_fparam: 0 + precision: float64 + rcond: null + resnet_dt: true + spin: null + tot_ener_zero: false + trainable: + - true + - true + - true + - true + type: ener + type_map: + - Ni + - O + - Ni_spin + - O_spin + use_aparam_as_mask: false + var_name: energy + pair_exclude_types: *id003 + preset_out_bias: null + rcond: null + type: standard + type_map: + - Ni + - O + - Ni_spin + - O_spin + spin: + use_spin: + - true + - false + virtual_scale: + - 0.314 + - 0.0 + type: spin_ener +model_def_script: + descriptor: + activation_function: tanh + attn: 5 + attn_dotr: true + attn_layer: 2 + attn_mask: false + axis_neuron: 4 + neuron: + - 2 + - 4 + - 8 + normalize: true + rcut: 6.0 + rcut_smth: 2.0 + scaling_factor: 1.0 + seed: 1 + sel: 30 + temperature: 1.0 + type: se_atten + type_one_side: true + fitting_net: + neuron: + - 5 + - 5 + - 5 + resnet_dt: true + seed: 1 + spin: + use_spin: + - true + - false + virtual_scale: + - 0.314 + - 0.0 + type_map: + - Ni + - O +software: deepmd-kit +time: "2026-04-04 11:00:14.231903+00:00" +version: 3.0.0 diff --git a/source/tests/infer/deeppot_dpa_spin_md1.yaml b/source/tests/infer/deeppot_dpa_spin_md1.yaml new file mode 100644 index 0000000000..0c4e134ffb --- /dev/null +++ b/source/tests/infer/deeppot_dpa_spin_md1.yaml @@ -0,0 +1,2391 @@ +backend: dpmodel +model: + backbone_model: + "@class": Model + "@variables": + out_bias: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.0 + - - 0.0 + - - 0.0 + - - 0.0 + out_std: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 1.0 + - - 1.0 + - - 1.0 + - - 1.0 + "@version": 2 + atom_exclude_types: &id002 + - 2 + - 3 + descriptor: + "@class": Descriptor + "@variables": + davg: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + dstd: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + "@version": 2 + activation_function: tanh + attention_layers: + "@class": NeighborGatedAttention + "@version": 1 + attention_layers: + - attention_layer: + bias: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + in_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.18351022625104238 + - -0.04563840943844596 + - 0.13260332418881654 + - -0.0691278425455087 + - -0.06945926323289434 + - 0.43604143150778013 + - -0.08368462141427374 + - -0.1387981791306445 + - 0.005993298283937215 + - -0.5151420582401797 + - 0.19472845492587332 + - 0.19416952313404776 + - -0.010708458231856462 + - -0.18754060846205406 + - 0.07338291320712505 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.24841318089090828 + - 0.1038571583323193 + - -0.2091532332904543 + - 0.4136790735317951 + - -0.27303583663189573 + - -0.12466396686270144 + - 0.20857122043870152 + - 0.2276345670041446 + - -0.24270398224650405 + - 0.007281618781037467 + - -0.07665038914769577 + - -0.18006026900601504 + - -0.08609172045185601 + - -0.34723410497230056 + - 0.07922223598844129 + - - 0.20351217415988776 + - 0.22465419151464255 + - -0.33559874499082115 + - 0.13592429249065166 + - -0.1648509449996543 + - -0.23203528984387572 + - -0.0516465438807872 + - 0.0686370523996727 + - 0.41471124141728716 + - 0.0586914485741541 + - -0.1689459931450781 + - 0.0018059434210212844 + - -0.4147053758686676 + - -0.07048107144267868 + - 0.40259566794347623 + - - -0.11391575567260738 + - 0.23863818963619923 + - 0.18250695785065604 + - 0.19281299906723257 + - 0.247621826822558 + - -0.0985542576783352 + - -0.035082160489491136 + - 0.4792148584108256 + - 0.14167746853937516 + - -0.06814603614410701 + - -0.22665968961826935 + - 0.3242244773260558 + - -0.066079527329557 + - -0.1307307931893784 + - 0.051956143640524394 + - - -0.2056090732642919 + - 0.07357885580248055 + - 0.08681029379913797 + - 0.07247821343078562 + - -0.06712483720853006 + - 0.39719167006621764 + - 0.11149451147606776 + - -0.12278081601771884 + - 0.045171486309587526 + - -0.0755253250897645 + - -0.21640855235984527 + - 0.08547559318182094 + - 0.1653564252470324 + - 0.0952574448166531 + - -0.1377746815508281 + - - -0.022519359735599515 + - 0.05382946104963937 + - 0.005065503738307829 + - -0.11001639078999409 + - 0.2462411205677168 + - -0.2095220212541597 + - 0.1858887564410953 + - -0.1867738843692884 + - 0.016117042040479493 + - 0.28249082907284107 + - 0.22436922074999183 + - -0.22791154747547826 + - 0.29699526367685036 + - 0.3058975240069586 + - -0.1263063786358465 + - - 0.228630022209369 + - 0.03600580997662669 + - -0.30041096458994776 + - 0.05215707817418025 + - -0.11590856918439549 + - 0.04613204765185727 + - -0.15013167647158984 + - 0.03175216690660104 + - 0.12894979742295995 + - -0.14577555003932247 + - -0.20045529796863254 + - 0.03682374995063141 + - 0.07380272734778177 + - 0.13093301266802376 + - -0.10845218099118197 + - - 0.16340966236541793 + - 0.07891342207116378 + - -0.24332865990588795 + - -0.14554580109435383 + - 0.12531904655031273 + - -0.03349136271276537 + - 0.2971042679187557 + - 0.1386000661991385 + - 0.20111089109063607 + - 0.3347783227216307 + - -0.09930032441066812 + - 0.09254914049778377 + - 0.1523072534711225 + - -0.24890506615160968 + - -0.28977438340158623 + - - 0.101287925304405 + - -0.2563848385489577 + - 0.03647978373709844 + - 0.329129480771459 + - 0.3005480604309731 + - 0.07018058650703372 + - -0.08448764525029563 + - 0.2670352098254057 + - -0.039653866987632895 + - -0.06155552979117676 + - 0.0668749042632758 + - -0.1316809083091721 + - -0.21948380976866877 + - 0.06412295486182476 + - 0.1618133144682503 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + nnei: 30 + normalize: true + num_heads: 1 + out_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.20045376999128472 + - 0.2987805408490743 + - 0.24721299447247055 + - 0.09900927157798681 + - -0.0004981500361246952 + - -0.22867694046198447 + - 0.30251015671967146 + - 0.3634748074255848 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.32306219736034275 + - 0.19545694221853752 + - 0.27273162436938836 + - -0.4955183264027905 + - 0.2654826760807126 + - -0.2674345947352222 + - 0.2973724985053365 + - 0.2928827308944446 + - - 0.22558964338136114 + - 0.09428873844711233 + - 0.05575617130102639 + - 0.3111520828678394 + - 0.18699860063303472 + - 0.000685428165526647 + - -0.6174343148136284 + - -0.5491849734438004 + - - -0.0240211843189102 + - 0.08977892740110542 + - 0.12310787770210622 + - 0.12534700620727446 + - 0.5211921965444312 + - -0.18388986716415426 + - -0.49576670250576726 + - 0.2945145753065993 + - - 0.14386152783626194 + - -0.3834460473225381 + - 0.02287490748002227 + - -0.41445745412513074 + - -0.07366625228908175 + - -0.24473690111079943 + - 0.02841491531440257 + - -0.010521319178505545 + - - -0.43664598371558466 + - 0.18723071901975422 + - 0.1339203457643558 + - -0.2622484428593279 + - 0.2984576814138297 + - -0.1217610036415616 + - 0.29227045340860613 + - 0.12766039268491938 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + precision: float64 + scaling_factor: 1.0 + smooth: true + temperature: 1.0 + attn_layer_norm: + "@class": LayerNorm + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + "@version": 1 + eps: 1.0e-05 + precision: float64 + trainable: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + ln_eps: 1.0e-05 + nnei: 30 + normalize: true + precision: float64 + scaling_factor: 1.0 + temperature: 1.0 + trainable_ln: true + - attention_layer: + bias: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + in_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.46320425201766247 + - -0.0861544352136468 + - 0.2393678931194865 + - 0.11087545718505754 + - 0.2593361178266803 + - 0.2540074002087115 + - -0.5740614513048666 + - -0.007829221227449888 + - 0.03834047013818848 + - -0.004317709010731196 + - -0.0027632633376340767 + - -0.129202963065761 + - 0.19962765144963399 + - -0.31915441658681964 + - 0.013767837288653264 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.15278845751301479 + - -0.015117760586652125 + - 0.17105527645119087 + - -0.017690331684815156 + - 0.013004523084949588 + - 0.03592592325706536 + - -0.0015929443118154578 + - -0.18017603272628052 + - 0.2493718052519214 + - -0.01851252273831001 + - -0.36840239789481716 + - 0.07573562654747307 + - -0.09496153609588609 + - -0.217116034374993 + - -0.19437900375981282 + - - -0.20243734196131918 + - -0.19577994014285202 + - 0.13487904643057716 + - -0.09618343487121536 + - 0.1517371615159787 + - 0.2317393068058875 + - 0.12723189060826812 + - -0.21010011890877345 + - 0.02813198590045214 + - -0.09258860620336339 + - -0.1280896223225971 + - -0.11917063105802392 + - 0.04521303815511686 + - 0.20654944804245792 + - -0.15865221800841317 + - - 0.04613230757350663 + - 0.17291133888651458 + - -0.06930093162860351 + - 0.045228625938355055 + - -0.37356656687631423 + - -0.07925353159386202 + - 0.09488811507966938 + - 0.06244160229000192 + - -0.054835413565586515 + - 0.05835005467493042 + - -0.04564624157953147 + - -0.1867159393752215 + - 0.2151980108526414 + - 0.15604528498387527 + - -0.18474772218847696 + - - 0.3827994645389345 + - -0.010237764127357605 + - 0.12381495811086156 + - -0.07022891369526123 + - -0.13735614874469032 + - -0.017164374355980064 + - -0.4274370541318091 + - -0.24458731129502673 + - -0.18366825340135526 + - 0.09729400054763976 + - 0.09411515716806347 + - 0.11506950894475473 + - 0.10351955618709224 + - -0.39118396340839356 + - -0.19621858665487787 + - - -0.08753885247231129 + - -0.35366717552496174 + - -0.1877105395511413 + - -0.2703071905795911 + - -0.02658343547240909 + - -0.10019617555427808 + - -0.3917356859889574 + - -0.06819182655971401 + - -0.24428520138922613 + - 0.19318452395679075 + - 0.16284272315545056 + - 0.09549566838851437 + - -0.15404568857961887 + - -0.13201596319089784 + - 0.3598798855846083 + - - 0.014716388594522288 + - -0.17735110477484514 + - -0.061661526868765325 + - -0.18203671283898065 + - 0.012721645489698783 + - 0.107397816199318 + - 0.1811682413719007 + - -0.06356458406340935 + - -0.017564904489886752 + - -0.0696406040356576 + - 0.0149169373033483 + - -0.15882262096263317 + - 0.09525848781932615 + - 0.17964040252444105 + - -0.03624892800234665 + - - 0.1786610101163796 + - 0.13715969809908898 + - -0.1880461321004054 + - -0.3896933856757151 + - 0.041440821351723604 + - 0.041072593013709066 + - 0.24596001303001944 + - -0.40664783633033785 + - -0.1478716346596206 + - 0.071411819949603 + - 0.2325127968268579 + - -0.07342839058831764 + - 0.20895961640443458 + - 0.09181799202495412 + - 0.4926847223074976 + - - -0.04882295096710013 + - 0.07765052182971377 + - -0.34038490086778184 + - -0.1252117642283293 + - 0.021757235933785517 + - -0.011391859589372822 + - 0.13342940246719198 + - -0.3379964480138069 + - 0.21966774375378947 + - -0.03690015099190904 + - 0.0405116207259872 + - -0.20848626800286674 + - 0.31758221044797136 + - 0.05514498908692302 + - -0.09901035445881806 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + nnei: 30 + normalize: true + num_heads: 1 + out_proj: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.26027960344854445 + - -0.005037455883166034 + - -0.2357556083114248 + - 0.2502376952585402 + - -0.3861181832501032 + - 0.2251846251079561 + - -0.3787536933759104 + - -0.282026008969001 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.35287515934198155 + - 0.17037046689819482 + - 0.0674792027058034 + - 0.2359224430302736 + - -0.09908749500161877 + - 0.2413708908545201 + - 0.4516522336877069 + - -0.027166513316912725 + - - -0.2284947341144437 + - 0.0178700011547884 + - 0.3373485274023878 + - 0.12615306499365203 + - 0.38397500977326865 + - 0.3077434699570989 + - -0.21271028169402129 + - -0.12331826386489855 + - - 0.03490948953064142 + - 0.21388052092612841 + - 0.2976002080672586 + - -0.6828361893512437 + - -0.20327324806999922 + - 0.1679422439393503 + - -0.25029763669746585 + - 0.13859516541933636 + - - 0.22538603715419983 + - -0.04571464689496278 + - 0.1477185373369375 + - -0.715304012437922 + - 0.0036840425700703826 + - 0.006742848992578719 + - -0.2365182585758341 + - 0.14823007775766914 + - - 0.1174073817177984 + - 0.29161887216630056 + - -0.24494657592766272 + - 0.18743887078811955 + - -0.01507541506930442 + - -0.4834961103470373 + - -0.10159225497958217 + - 0.13148867132103184 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + precision: float64 + scaling_factor: 1.0 + smooth: true + temperature: 1.0 + attn_layer_norm: + "@class": LayerNorm + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + "@version": 1 + eps: 1.0e-05 + precision: float64 + trainable: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + ln_eps: 1.0e-05 + nnei: 30 + normalize: true + precision: float64 + scaling_factor: 1.0 + temperature: 1.0 + trainable_ln: true + do_mask: false + dotr: true + embed_dim: 8 + hidden_dim: 5 + layer_num: 2 + ln_eps: 1.0e-05 + nnei: 30 + normalize: true + precision: float64 + scaling_factor: 1.0 + temperature: 1.0 + trainable_ln: true + attn: 5 + attn_dotr: true + attn_layer: 2 + attn_mask: false + axis_neuron: 4 + concat_output_tebd: true + embeddings: + "@class": NetworkCollection + "@version": 1 + ndim: 0 + network_type: embedding_network + networks: + - "@class": EmbeddingNetwork + "@version": 2 + activation_function: tanh + bias: true + in_dim: 9 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.04113537876982132 + - 0.2135993577649116 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.19681532110926553 + - 0.16334979105313088 + - - 0.21075497962711434 + - 0.18561262316289895 + - - -0.2025368467015397 + - 0.30497479132960376 + - - 0.394623773693339 + - -0.5064923928042572 + - - -0.3114866097061708 + - 0.25480611739095393 + - - 0.3247253367745367 + - -0.12224922439692641 + - - -0.1454743994136753 + - -0.19056163028525014 + - - -0.4207890615015054 + - -0.04282640777790463 + - - -0.18224083572453986 + - 0.49440056045729425 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.9267767543746736 + - -0.7598444290615695 + - -0.472759170368349 + - -0.4522753423489502 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.5042381620446951 + - 0.2938947201880637 + - -0.08711840691805456 + - -0.11001290236600435 + - - -0.39743457833825646 + - 0.7121257502480001 + - -0.810708871828223 + - 0.5106226403219409 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.44005799868203765 + - 0.29655099423195885 + - -0.004267534184854465 + - -0.12538685355150112 + - -0.0633395411335549 + - 0.10241734942934799 + - 0.3702843665149265 + - -0.2000640846067108 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.047193055845247425 + - -0.19439221133072598 + - 0.09798453309569832 + - 0.6185785175412979 + - 0.3060557021582276 + - 0.0706692687554129 + - 0.035152222724231366 + - -0.014285605716690993 + - - -0.04599636222082389 + - 0.5238775079615289 + - -0.18638606304480843 + - -0.10150429650568861 + - 0.38656771075032204 + - -0.26565468801345316 + - -0.09795208618845697 + - -0.08426203696033274 + - - -0.31834471891577343 + - -0.42270207790248504 + - -0.5246839894162881 + - -0.2888396394992532 + - -0.35845154406297464 + - 0.2511035839965956 + - 0.31637016338538465 + - 0.08809323262145466 + - - 0.37578567353387815 + - 0.6808813311521732 + - 0.3026687574841046 + - -0.35554258162485597 + - -0.10377188866537626 + - 0.0093236771028058 + - 0.3334834453439019 + - 0.3598841898253352 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + neuron: + - 2 + - 4 + - 8 + precision: float64 + resnet_dt: false + ntypes: 4 + env_mat: + protection: 1.0e-06 + rcut: 6.0 + rcut_smth: 2.0 + use_exp_switch: false + env_protection: 1.0e-06 + exclude_types: &id003 + - - 3 + - 0 + - - 3 + - 1 + - - 3 + - 2 + - - 3 + - 3 + ln_eps: 1.0e-05 + neuron: + - 2 + - 4 + - 8 + normalize: true + ntypes: 4 + precision: float64 + rcut: 6.0 + rcut_smth: 2.0 + resnet_dt: false + scaling_factor: 1.0 + sel: + - 30 + set_davg_zero: false + smooth_type_embedding: true + spin: null + tebd_dim: 8 + tebd_input_mode: concat + temperature: 1.0 + trainable: true + trainable_ln: true + type: dpa1 + type_embedding: + "@class": TypeEmbedNet + "@version": 2 + activation_function: Linear + embedding: + "@class": EmbeddingNetwork + "@version": 2 + activation_function: Linear + bias: false + in_dim: 4 + layers: + - "@class": Layer + "@variables": + b: null + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.020653385621488805 + - 0.1752067402646656 + - 0.5662292560132125 + - 0.0003760753148009615 + - -0.161287498897469 + - 0.18311645742147376 + - 0.14067170321466588 + - -0.07330200862015916 + - - -0.5797430063221342 + - -0.23430216785765115 + - 0.09751594848969031 + - -0.1275282725471455 + - 0.10447577792569906 + - 0.2656998783938816 + - 0.18576344747248152 + - 0.1985024076041842 + - - -0.0015949275573732497 + - 0.1080567257619322 + - -0.3140326336613265 + - 0.34154803569918485 + - 0.46133209448956636 + - 0.23825678017091026 + - 0.0169393325427759 + - -0.19905570862776645 + - - -0.34614238555389887 + - -0.5554733591522888 + - 0.0554747771493338 + - -0.22776097630122913 + - -0.19790905891562305 + - -0.067880792892441 + - 0.013701852102543422 + - 0.7947302028726797 + "@version": 2 + activation_function: Linear + bias: false + precision: float64 + resnet: true + trainable: true + use_timestep: false + neuron: + - 8 + precision: float64 + resnet_dt: false + neuron: + - 8 + ntypes: 4 + padding: true + precision: float64 + resnet_dt: false + trainable: true + type_map: &id001 + - Ni + - O + - Ni_spin + - O_spin + use_econf_tebd: false + use_tebd_bias: false + type_map: *id001 + type_one_side: true + use_econf_tebd: false + use_tebd_bias: false + fitting: + "@class": Fitting + "@variables": + aparam_avg: null + aparam_inv_std: null + bias_atom_e: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.0 + - - 0.0 + - - 0.0 + - - 0.0 + case_embd: null + fparam_avg: null + fparam_inv_std: null + "@version": 4 + activation_function: tanh + atom_ener: null + default_fparam: null + dim_case_embd: 0 + dim_descrpt: 40 + dim_out: 1 + exclude_types: *id002 + layer_name: null + mixed_types: true + nets: + "@class": NetworkCollection + "@version": 1 + ndim: 0 + network_type: fitting_network + networks: + - "@class": FittingNetwork + "@version": 1 + activation_function: tanh + bias_out: true + in_dim: 40 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.009036579787368115 + - -0.12043526618489708 + - -0.04022044991652253 + - -0.07825004058183097 + - -0.03264115403416456 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.5674676307341504 + - 0.023782010403849002 + - -0.05443603388599015 + - -0.15118658175337193 + - 0.08335549354993747 + - - 0.01687856484895976 + - -0.13669933269916298 + - -0.2583871114562561 + - -0.04336961815137456 + - -0.026271419761158384 + - - 0.09928924983316419 + - -0.030823465543671564 + - -0.07236236499507996 + - -0.22291471951912412 + - -0.21573877326789404 + - - -0.09278605203002248 + - 0.08377078773775477 + - -0.12961456608914707 + - -0.016839851437396955 + - 0.13415295214606296 + - - 0.012335469675728256 + - 0.05184437952876085 + - -0.006423649584056193 + - 0.0791277707651413 + - -0.30098066435096815 + - - 0.23047299924070833 + - 0.011873576382302296 + - 0.22526527610353067 + - -0.06817268037111866 + - 0.11189913048627279 + - - 0.014153472220860053 + - 0.08806719945921511 + - 0.3664242447098106 + - 0.04321403733928968 + - 0.1858804281169388 + - - 0.1548207212141085 + - 0.2621489519409535 + - -0.11858615560353057 + - -0.12486224876756297 + - 0.1168018815762926 + - - -0.0644985068316256 + - -0.08224138961544007 + - -0.03860328395788887 + - -0.046369682409357724 + - 0.1947426895691133 + - - -0.04919127545001311 + - -0.03737675099438821 + - -0.13411235417788264 + - 0.08224130773840631 + - 0.09273243988485456 + - - 0.22884824021908912 + - -0.03432459474452931 + - 0.17747812279031197 + - -0.12259533332014795 + - -0.0671810862789741 + - - -0.19586402439269535 + - 0.0644752438559895 + - -0.08847227949125148 + - -0.25926144778729854 + - 0.009478352142050912 + - - -0.020722424919005625 + - -0.08223270799818304 + - -0.15521951221770625 + - -0.0756580525932391 + - -0.056335758172860115 + - - 0.06378860044971417 + - 0.14929019221442877 + - -0.07871463028411804 + - 0.16852607421450178 + - -0.0447403453422747 + - - -0.06359553037472998 + - -0.010390961964384993 + - -0.14393618071816852 + - -0.21213322102177767 + - 0.0897102042442112 + - - 0.01804669930433539 + - 0.14674879958354925 + - -0.017738920787244743 + - -0.016183756496653465 + - -0.29793276333150465 + - - 0.18210173304243182 + - -0.13730027353137575 + - -0.07346146478717386 + - -0.031191012311731544 + - 0.12537243686809474 + - - -0.11221715474289964 + - 0.05614844128429898 + - 0.2940867170363763 + - -0.04008343210251607 + - 0.015773474566291266 + - - -0.22386665106548173 + - -0.14287116672063896 + - 0.03033590052843445 + - -0.0021294415782683856 + - -0.1600639422299111 + - - 0.16566164576662784 + - 0.14021528100045616 + - -0.005984056874067132 + - -0.22380037058326285 + - 0.24795710844174867 + - - -0.16244535887812667 + - -0.011359963616265218 + - 0.10884484432008126 + - -0.11031271551782482 + - -0.11652383232883412 + - - 0.0789223130568038 + - -0.19447458197651937 + - 0.05028051160586014 + - -0.12502497281504069 + - 0.17874575133706475 + - - -0.04332541874413034 + - -0.09993328082148574 + - -0.18411659529765192 + - 0.0935944320660105 + - -0.33895082223337825 + - - -0.10838342367642219 + - -0.04524333046162522 + - 0.018546594982928204 + - 0.3063305262005577 + - 0.11113911791179494 + - - 0.0473308698137412 + - -0.058165912497369444 + - 0.00473311818493111 + - -0.059462573376019685 + - 0.1006336845979852 + - - 0.12908464929081007 + - -0.13313986313838141 + - -0.20928277607170023 + - 0.29836459384363634 + - 0.09928401850939896 + - - -0.24244062130712524 + - 0.1721702535661161 + - 0.02843127684651192 + - -0.394476087897458 + - 0.33465902429328837 + - - 0.015147371330177416 + - 0.23211333058570127 + - -0.04257089989510875 + - 0.13395758446604872 + - 0.12976115854406703 + - - -0.1374936613829365 + - 0.046660173610344934 + - 0.16708061294983348 + - -0.30135250793158086 + - 0.09318435731037113 + - - -0.03632629541960811 + - -0.14877276597072533 + - -0.1102234695591099 + - 0.1863501585429565 + - 0.07549035140825774 + - - -0.03997042105254072 + - 0.15656325179297784 + - -0.0065638339229475125 + - -0.12944465676032332 + - 0.05411008410228317 + - - 0.010669872823749345 + - -0.12935249288214815 + - -0.1385873222444772 + - -0.2070331017648454 + - -0.02494997965825636 + - - -0.3542082175568733 + - -0.0029689418300270264 + - -0.07077892590307655 + - -0.2394118031138418 + - -0.10368891108719153 + - - -0.09148078381449777 + - 0.1532323355014287 + - 0.06754382410937022 + - -0.09826612014397533 + - 0.10145241597381519 + - - -0.06796982244136958 + - -0.21017464073201012 + - 0.21892110823154312 + - -0.2642604118410783 + - -0.044278605467948276 + - - -0.15383256844109483 + - -0.07503131599790384 + - 0.044603233877947554 + - 0.1409223114210914 + - -0.11099125566007907 + - - -0.2597948642623824 + - -0.10479807608530682 + - 0.30379811203169355 + - 0.11779849062588124 + - 0.2654714226553592 + - - 0.11349409442040773 + - -0.08763039088292908 + - -0.07340049416285838 + - -0.10576665782169115 + - 0.09672263326368545 + - - -0.1369501584766069 + - -0.016660386267711477 + - 0.016662926615926787 + - -0.046144852317728635 + - -0.013642370032357963 + - - 0.032093404136984964 + - 0.18132681764897873 + - -0.19317412976507092 + - -0.1040142623744361 + - -0.13801410477127313 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.14983067341331888 + - 0.12371841881354884 + - -0.22986822312961094 + - -0.25875449872749423 + - -0.03397589432487195 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.2386111924902191 + - 0.07479470127640106 + - -0.024271667699068782 + - 0.33407859647648697 + - 0.2155095839218714 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.05337260536385372 + - 0.7893095165846483 + - 0.10146750020477836 + - -0.07382069876495147 + - -0.049906208789190866 + - - 0.13920694268407685 + - 0.17288646920139744 + - 0.19417177418429363 + - -0.24360246237209826 + - 0.2751854797025152 + - - 0.4201478494578695 + - -0.5180712872213497 + - -0.06046142567704595 + - -0.4688142500317172 + - -0.8738568809019925 + - - -0.16989341023698443 + - -0.24304566774226685 + - -0.1426724141105585 + - -0.3334006993671281 + - 0.2956326142653607 + - - -0.29078211029181533 + - 0.38314560365399564 + - -0.4314685894513315 + - 0.26153727274597066 + - 0.23244982168063325 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.1320183473911962 + - -0.4571722822420062 + - 0.010185901995519605 + - -0.16274352453991572 + - 0.11544273543463468 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.3011321904860118 + - -0.026753189393662627 + - -0.27834555279220746 + - -0.22656052647725025 + - 0.3535284718490197 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.488455469755746 + - -0.4501682102794183 + - 0.4473504692939388 + - -0.4013567727531333 + - -0.14017839613594146 + - - 0.11170356672506891 + - -0.19534689826061877 + - -0.19463584842339451 + - -0.32895518006240027 + - 0.4787047201183065 + - - 0.30562395194923836 + - 0.05207863515608017 + - 0.2811214296141219 + - 0.4060824734214178 + - -0.11467282115018355 + - - -0.4336905376571399 + - 0.1257782559999088 + - -0.22904030891735902 + - -0.13508914819534892 + - 0.7275596041551536 + - - -0.3862074614822706 + - 0.026603801148868712 + - 0.17689513330383833 + - 0.13340030783705445 + - -0.13151994511392598 + "@version": 2 + activation_function: tanh + bias: true + precision: float64 + resnet: true + trainable: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.47944902606795525 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.3447980243495368 + - - 0.7370552717974026 + - - 0.38464511744143104 + - - 0.24069092502948974 + - - -0.03192455313254351 + "@version": 2 + activation_function: none + bias: true + precision: float64 + resnet: false + trainable: true + use_timestep: false + neuron: + - 5 + - 5 + - 5 + out_dim: 1 + precision: float64 + resnet_dt: true + ntypes: 4 + neuron: + - 5 + - 5 + - 5 + ntypes: 4 + numb_aparam: 0 + numb_fparam: 0 + precision: float64 + rcond: null + resnet_dt: true + spin: null + tot_ener_zero: false + trainable: + - true + - true + - true + - true + type: ener + type_map: + - Ni + - O + - Ni_spin + - O_spin + use_aparam_as_mask: false + var_name: energy + pair_exclude_types: *id003 + preset_out_bias: null + rcond: null + type: standard + type_map: + - Ni + - O + - Ni_spin + - O_spin + spin: + use_spin: + - true + - false + virtual_scale: + - 0.314 + - 0.0 + type: spin_ener +model_def_script: + descriptor: + activation_function: tanh + attn: 5 + attn_dotr: true + attn_layer: 2 + attn_mask: false + axis_neuron: 4 + neuron: + - 2 + - 4 + - 8 + normalize: true + rcut: 6.0 + rcut_smth: 2.0 + scaling_factor: 1.0 + seed: 2 + sel: 30 + temperature: 1.0 + type: se_atten + type_one_side: true + fitting_net: + neuron: + - 5 + - 5 + - 5 + resnet_dt: true + seed: 2 + spin: + use_spin: + - true + - false + virtual_scale: + - 0.314 + - 0.0 + type_map: + - Ni + - O +software: deepmd-kit +time: "2026-04-04 11:00:14.262957+00:00" +version: 3.0.0 diff --git a/source/tests/infer/gen_spin.py b/source/tests/infer/gen_spin.py index 49d48d55b0..e8d0329011 100644 --- a/source/tests/infer/gen_spin.py +++ b/source/tests/infer/gen_spin.py @@ -2,8 +2,14 @@ # SPDX-License-Identifier: LGPL-3.0-or-later """Generate deeppot_dpa_spin.pth and deeppot_dpa_spin.pt2 test models. -Creates a DPA1 spin model from dpmodel config, serializes, and exports to both -.pth (torch.jit) and .pt2 (torch.export) from the same weights. +The canonical model weights are stored in ``deeppot_dpa_spin.yaml`` (dpmodel +serialization, committed to git). This script converts the .yaml to both +.pth (torch.jit) and .pt2 (torch.export) formats. + +If the .yaml does not yet exist, it is created from a dpmodel built with +a deterministic config+seed — but this should only be done once (the .yaml +is then committed). + Also prints reference values for C++ tests (PBC and NoPbc). """ @@ -23,14 +29,15 @@ ) -def main(): +def _build_yaml(yaml_path: str) -> None: + """Build the dpmodel from config+seed and save as .yaml.""" from deepmd.dpmodel.model.model import ( get_model, ) + from deepmd.dpmodel.utils.serialization import ( + save_dp_model, + ) - ensure_inductor_compiler() - - # ---- 1. DPA1 spin model config ---- config = { "type_map": ["Ni", "O"], "descriptor": { @@ -62,7 +69,6 @@ def main(): }, } - # ---- 2. Build dpmodel and serialize ---- model = get_model(copy.deepcopy(config)) model_dict = model.serialize() @@ -74,33 +80,43 @@ def main(): "version": "3.0.0", } - # ---- 3. Export to .pt2 and .pth ---- - from deepmd.pt.utils.serialization import ( - deserialize_to_file as pt_deserialize_to_file, - ) - from deepmd.pt_expt.utils.serialization import ( - deserialize_to_file as pt_expt_deserialize_to_file, + print(f"Building dpmodel and saving to {yaml_path} ...") # noqa: T201 + save_dp_model(yaml_path, data) + + +def main(): + from deepmd.entrypoints.convert_backend import ( + convert_backend, ) - # Load custom ops after deepmd.pt import to avoid double registration - load_custom_ops() + ensure_inductor_compiler() base_dir = os.path.dirname(__file__) - + yaml_path = os.path.join(base_dir, "deeppot_dpa_spin.yaml") + pth_path = os.path.join(base_dir, "deeppot_dpa_spin.pth") pt2_path = os.path.join(base_dir, "deeppot_dpa_spin.pt2") - print(f"Exporting to {pt2_path} ...") # noqa: T201 - pt_expt_deserialize_to_file(pt2_path, copy.deepcopy(data)) - pth_path = os.path.join(base_dir, "deeppot_dpa_spin.pth") - print(f"Exporting to {pth_path} ...") # noqa: T201 - try: - pt_deserialize_to_file(pth_path, copy.deepcopy(data)) - except Exception as e: - print(f"WARNING: .pth export failed ({type(e).__name__}: {e}), skipping.") # noqa: T201 + # ---- 1. Build .yaml if it doesn't exist ---- + if not os.path.exists(yaml_path): + _build_yaml(yaml_path) + else: + print(f"Using existing {yaml_path}") # noqa: T201 + + # ---- 2. Convert .yaml -> .pth and .yaml -> .pt2 ---- + # Import deepmd.pt to register the backend (needed for convert_backend) + import deepmd.pt # noqa: F401 + + load_custom_ops() + + print(f"Converting to {pth_path} ...") # noqa: T201 + convert_backend(INPUT=yaml_path, OUTPUT=pth_path) + + print(f"Converting to {pt2_path} ...") # noqa: T201 + convert_backend(INPUT=yaml_path, OUTPUT=pt2_path) print("Export done.") # noqa: T201 - # ---- 4. Run inference for PBC test ---- + # ---- 3. Run inference for PBC test ---- from deepmd.infer import ( DeepPot, ) @@ -160,14 +176,14 @@ def main(): print(f"\n// PBC total energy: {e1[0, 0]:.18e}") # noqa: T201 print_cpp_spin_values("PBC reference values", ae1, f1, fm1, v1, av1) - # ---- 5. Run inference for NoPbc test ---- + # ---- 4. Run inference for NoPbc test ---- e_np, f_np, v_np, ae_np, av_np, fm_np, _ = dp.eval( coord, None, atype, atomic=True, spin=spin ) print(f"\n// NoPbc total energy: {e_np[0, 0]:.18e}") # noqa: T201 print_cpp_spin_values("NoPbc reference values", ae_np, f_np, fm_np, v_np, av_np) - # ---- 6. Verify .pth gives same results ---- + # ---- 5. Verify .pth gives same results ---- if os.path.exists(pth_path): dp_pth = DeepPot(pth_path) e_pth, f_pth, v_pth, ae_pth, av_pth, fm_pth, _ = dp_pth.eval( diff --git a/source/tests/infer/gen_spin_model_devi.py b/source/tests/infer/gen_spin_model_devi.py index ad101fa719..eec2fe56ab 100644 --- a/source/tests/infer/gen_spin_model_devi.py +++ b/source/tests/infer/gen_spin_model_devi.py @@ -2,7 +2,13 @@ # SPDX-License-Identifier: LGPL-3.0-or-later """Generate deeppot_dpa_spin_md0.pt2 and deeppot_dpa_spin_md1.pt2 test models. -Creates two DPA1 spin models with different seeds for model deviation testing. +The canonical model weights are stored in .yaml files (dpmodel serialization, +committed to git). This script converts them to .pt2 format. + +If the .yaml files do not yet exist, they are created from dpmodel with +different seeds — but this should only be done once (the .yaml files are +then committed). + Prints reference values for C++ tests. """ @@ -21,74 +27,96 @@ print_cpp_spin_values, ) +# Model config (same architecture as gen_spin.py, different seeds) +_BASE_CONFIG = { + "type_map": ["Ni", "O"], + "descriptor": { + "type": "se_atten", + "sel": 30, + "rcut_smth": 2.0, + "rcut": 6.0, + "neuron": [2, 4, 8], + "axis_neuron": 4, + "attn": 5, + "attn_layer": 2, + "attn_dotr": True, + "attn_mask": False, + "activation_function": "tanh", + "scaling_factor": 1.0, + "normalize": True, + "temperature": 1.0, + "type_one_side": True, + }, + "fitting_net": { + "neuron": [5, 5, 5], + "resnet_dt": True, + }, + "spin": { + "use_spin": [True, False], + "virtual_scale": [0.3140, 0.0], + }, +} -def main(): + +def _build_yaml(yaml_path: str, seed: int) -> None: + """Build a dpmodel with given seed and save as .yaml.""" from deepmd.dpmodel.model.model import ( get_model, ) + from deepmd.dpmodel.utils.serialization import ( + save_dp_model, + ) - ensure_inductor_compiler() + cfg = copy.deepcopy(_BASE_CONFIG) + cfg["descriptor"]["seed"] = seed + cfg["fitting_net"]["seed"] = seed + model = get_model(cfg) + model_dict = model.serialize() - # ---- 1. DPA1 spin model config (same as gen_spin.py) ---- - config = { - "type_map": ["Ni", "O"], - "descriptor": { - "type": "se_atten", - "sel": 30, - "rcut_smth": 2.0, - "rcut": 6.0, - "neuron": [2, 4, 8], - "axis_neuron": 4, - "attn": 5, - "attn_layer": 2, - "attn_dotr": True, - "attn_mask": False, - "activation_function": "tanh", - "scaling_factor": 1.0, - "normalize": True, - "temperature": 1.0, - "type_one_side": True, - "seed": 1, - }, - "fitting_net": { - "neuron": [5, 5, 5], - "resnet_dt": True, - "seed": 1, - }, - "spin": { - "use_spin": [True, False], - "virtual_scale": [0.3140, 0.0], - }, + data = { + "model": model_dict, + "model_def_script": cfg, + "backend": "dpmodel", + "software": "deepmd-kit", + "version": "3.0.0", } - # ---- 2. Build two models with different seeds ---- - from deepmd.pt_expt.utils.serialization import ( - deserialize_to_file as pt_expt_deserialize_to_file, + print(f"Building dpmodel (seed={seed}) and saving to {yaml_path} ...") # noqa: T201 + save_dp_model(yaml_path, data) + + +def main(): + from deepmd.entrypoints.convert_backend import ( + convert_backend, ) - # Load custom ops after deepmd.pt import to avoid double registration - load_custom_ops() + ensure_inductor_compiler() base_dir = os.path.dirname(__file__) - models = [] - for idx, seed in enumerate([1, 2]): - cfg = copy.deepcopy(config) - cfg["descriptor"]["seed"] = seed - cfg["fitting_net"]["seed"] = seed - model = get_model(cfg) - model_dict = model.serialize() - data = { - "model": model_dict, - "model_def_script": cfg, - "backend": "dpmodel", - "software": "deepmd-kit", - "version": "3.0.0", - } + # ---- 1. Ensure .yaml files exist ---- + seeds = [1, 2] + yaml_paths = [] + pt2_paths = [] + for idx, seed in enumerate(seeds): + yaml_path = os.path.join(base_dir, f"deeppot_dpa_spin_md{idx}.yaml") + yaml_paths.append(yaml_path) + if not os.path.exists(yaml_path): + _build_yaml(yaml_path, seed) + else: + print(f"Using existing {yaml_path}") # noqa: T201 + + # ---- 2. Convert .yaml -> .pt2 ---- + # Import deepmd.pt to register the backend + import deepmd.pt # noqa: F401 + + load_custom_ops() + + for idx, yaml_path in enumerate(yaml_paths): pt2_path = os.path.join(base_dir, f"deeppot_dpa_spin_md{idx}.pt2") - print(f"Exporting to {pt2_path} ...") # noqa: T201 - pt_expt_deserialize_to_file(pt2_path, copy.deepcopy(data)) - models.append(pt2_path) + pt2_paths.append(pt2_path) + print(f"Converting to {pt2_path} ...") # noqa: T201 + convert_backend(INPUT=yaml_path, OUTPUT=pt2_path) print("Export done.") # noqa: T201 @@ -146,14 +174,13 @@ def main(): atype = [0, 1, 1, 0, 1, 1] box = np.array([13.0, 0.0, 0.0, 0.0, 13.0, 0.0, 0.0, 0.0, 13.0], dtype=np.float64) - for idx, pt2_path in enumerate(models): + for idx, pt2_path in enumerate(pt2_paths): dp = DeepPot(pt2_path) e, f, v, ae, av, fm, _ = dp.eval(coord, box, atype, atomic=True, spin=spin) print(f"\n// Model {idx} total energy: {e[0, 0]:.18e}") # noqa: T201 print_cpp_spin_values(f"Model {idx} reference values", ae, f, fm, v, av) # ---- 4. Also print LAMMPS 4-atom system reference values ---- - # The LAMMPS spin tests use a different coordinate layout (4 atoms: 2 Ni + 2 O) lmp_coord = np.array( [ 12.83, @@ -194,7 +221,7 @@ def main(): ) print("\n// ---- LAMMPS 4-atom system (PBC) ----") # noqa: T201 - for idx, pt2_path in enumerate(models): + for idx, pt2_path in enumerate(pt2_paths): dp = DeepPot(pt2_path) e, f, v, ae, av, fm, _ = dp.eval( lmp_coord, lmp_box, lmp_atype, atomic=True, spin=lmp_spin @@ -212,7 +239,7 @@ def main(): # NoPBC for LAMMPS print("\n// ---- LAMMPS 4-atom system (NoPBC) ----") # noqa: T201 - for idx, pt2_path in enumerate(models): + for idx, pt2_path in enumerate(pt2_paths): dp = DeepPot(pt2_path) e, f, v, ae, av, fm, _ = dp.eval( lmp_coord, None, lmp_atype, atomic=True, spin=lmp_spin From b7eb496134aae9c4aebac8a43e9efb1f3cf96d28 Mon Sep 17 00:00:00 2001 From: Han Wang Date: Sat, 4 Apr 2026 23:59:50 +0800 Subject: [PATCH 05/13] fix(test): use 3-type spin model (Ni, O, H) with dummy H type Update gen_spin.py and gen_spin_model_devi.py to produce models with type_map=["Ni", "O", "H"] and use_spin=[True, False, False], adding a dummy unused type to verify correct handling. Regenerate all .yaml canonical weights and update reference values in C/C++/LAMMPS tests. Add rel=1e-4 tolerance doc for md.out model devi assertions (LAMMPS writes ~6 significant digits in default scientific format). --- source/api_c/tests/test_deepspin_a.cc | 72 +- source/api_c/tests/test_deepspin_a_hpp.cc | 70 +- .../api_cc/tests/test_deeppot_dpa_pt_spin.cc | 176 ++--- .../tests/test_deeppot_dpa_ptexpt_spin.cc | 179 ++--- source/lmp/tests/test_lammps_spin_nopbc_pt.py | 14 +- .../lmp/tests/test_lammps_spin_nopbc_pt2.py | 52 +- source/lmp/tests/test_lammps_spin_pt.py | 94 +-- source/lmp/tests/test_lammps_spin_pt2.py | 132 ++-- source/tests/infer/deeppot_dpa_spin.yaml | 618 ++++++++++++++++-- source/tests/infer/deeppot_dpa_spin_md0.yaml | 618 ++++++++++++++++-- source/tests/infer/deeppot_dpa_spin_md1.yaml | 618 ++++++++++++++++-- source/tests/infer/gen_spin.py | 6 +- source/tests/infer/gen_spin_model_devi.py | 6 +- 13 files changed, 2075 insertions(+), 580 deletions(-) diff --git a/source/api_c/tests/test_deepspin_a.cc b/source/api_c/tests/test_deepspin_a.cc index 597825f99c..bfd30f1ec4 100644 --- a/source/api_c/tests/test_deepspin_a.cc +++ b/source/api_c/tests/test_deepspin_a.cc @@ -20,31 +20,24 @@ class TestInferDeepSpinA : public ::testing::Test { double box[9] = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; float boxf[9] = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; std::vector expected_e = { - -4.736511666341149118e-02, 2.663324583045018068e-01, - 2.662707880956619588e-01, -4.025182706753409334e-02, - 2.661383816099721633e-01, 2.663717506235512844e-01, + 7.020322773655288e-03, 1.099636038493644e-01, 1.093176595258250e-01, + 4.865300228001564e-02, 1.096547558413134e-01, 1.099754340356070e-01, }; std::vector expected_f = { - 1.309983290673980352e-02, 6.799786488006153221e-03, - 6.649738725468718609e-03, -1.144456277614634265e-03, - -3.728471118137270928e-03, -6.491178701583714961e-03, - -5.361730092721230315e-03, -2.772299524882485336e-03, - -4.492382686597841141e-04, 6.983026947998328959e-03, - 5.505263649468144886e-03, 1.166735707547454995e-02, - -5.356940629013495075e-03, -1.082410608691008200e-03, - -8.305081927004348899e-03, -8.219732855388919845e-03, - -4.721868885763546436e-03, -3.071596903695449424e-03, + 2.980086586841411e-02, 2.670602118823960e-03, -6.205408022135627e-03, + -7.946653268248605e-03, 4.217792180550986e-03, 1.822080579891798e-03, + -3.416928812442276e-03, -6.992749479424899e-03, 4.728288289346775e-03, + 5.049869641953204e-03, 1.550913149717830e-02, 1.801899070929784e-02, + -1.411871008097311e-02, -8.283139367982638e-03, -7.058623315726573e-03, + -9.368443348703582e-03, -7.121636949145627e-03, -1.130532824067422e-02, }; std::vector expected_fm = { - -2.702014342752852571e-01, -1.027058879186482226e-01, - -7.359539608958531876e-02, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 4.837763296762351284e-02, - 7.279460222389372293e-02, 5.692337419156127953e-02, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, + -1.112646578617150e+00, -2.239176906831133e-01, -2.513101985142691e-01, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + -9.763058480695873e-02, 1.564710428447471e-02, -3.735332673990924e-02, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, }; int natoms; double expected_tot_e; @@ -170,7 +163,7 @@ TEST_F(TestInferDeepSpinA, float_infer) { TEST_F(TestInferDeepSpinA, cutoff) { double cutoff = DP_DeepSpinGetCutoff(dp); - EXPECT_EQ(cutoff, 4.0); + EXPECT_EQ(cutoff, 6.0); } TEST_F(TestInferDeepSpinA, numb_types) { @@ -202,31 +195,24 @@ class TestInferDeepSpinANoPBC : public ::testing::Test { 0.14, 0.10, 0.12, 0., 0., 0., 0., 0., 0.}; int atype[6] = {0, 1, 1, 0, 1, 1}; std::vector expected_e = { - -4.263824715539775434e-02, 2.659531961465150807e-01, - 2.679077652998275716e-01, -4.042215423551187570e-02, - 2.666009600722629158e-01, 2.666060991401024149e-01, + 1.298915294144196e-02, 1.095576145701290e-01, 1.083914166945241e-01, + 4.932338375417146e-02, 1.099860785812512e-01, 1.100478936528533e-01, }; std::vector expected_f = { - 9.664606789041574331e-04, 4.875258490407333167e-03, - 8.372291856602237514e-03, -9.664606789041574331e-04, - -4.875258490407331433e-03, -8.372291856602209759e-03, - 3.462063530624336170e-03, -3.516414654756409722e-04, - 1.540231672543395411e-04, 9.145994016724501297e-03, - 6.127039584892107760e-03, 1.114133934233926815e-02, - -5.161415144547300271e-03, -1.229667699599260294e-03, - -8.053323256964733598e-03, -7.446642402801547170e-03, - -4.545730419817223950e-03, -3.242039252628891276e-03, + 1.300765817095240e-02, -1.593967210478553e-03, -3.196759265340465e-03, + -1.300765817095220e-02, 1.593967210478477e-03, 3.196759265340509e-03, + 9.196695370628910e-03, -9.044559760114149e-04, 5.658266727670325e-04, + 1.012744085443978e-02, 1.680427054831429e-02, 1.807036969424208e-02, + -1.133453822298158e-02, -8.941333904804914e-03, -6.627672717506913e-03, + -7.989598002087154e-03, -6.958480667497971e-03, -1.200852364950221e-02, }; std::vector expected_fm = { - 2.426746573908480920e-02, -2.632265214292328626e-02, - -4.622069216845703377e-02, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 5.019524717501219757e-02, - 7.318340727755086317e-02, 5.710550212233043987e-02, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, + -9.651705644713781e-01, -1.704326891282164e-01, -2.605677204117113e-01, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + -9.168034653189444e-02, 1.736913887115685e-02, -3.908906640474424e-02, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, }; int natoms; double expected_tot_e; diff --git a/source/api_c/tests/test_deepspin_a_hpp.cc b/source/api_c/tests/test_deepspin_a_hpp.cc index 8f1e231d3b..821bf94bb7 100644 --- a/source/api_c/tests/test_deepspin_a_hpp.cc +++ b/source/api_c/tests/test_deepspin_a_hpp.cc @@ -20,31 +20,24 @@ class TestInferDeepSpinAHPP : public ::testing::Test { std::vector atype = {0, 1, 1, 0, 1, 1}; std::vector box = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; std::vector expected_e = { - -4.736511666341149118e-02, 2.663324583045018068e-01, - 2.662707880956619588e-01, -4.025182706753409334e-02, - 2.661383816099721633e-01, 2.663717506235512844e-01, + 7.020322773655288e-03, 1.099636038493644e-01, 1.093176595258250e-01, + 4.865300228001564e-02, 1.096547558413134e-01, 1.099754340356070e-01, }; std::vector expected_f = { - 1.309983290673980352e-02, 6.799786488006153221e-03, - 6.649738725468718609e-03, -1.144456277614634265e-03, - -3.728471118137270928e-03, -6.491178701583714961e-03, - -5.361730092721230315e-03, -2.772299524882485336e-03, - -4.492382686597841141e-04, 6.983026947998328959e-03, - 5.505263649468144886e-03, 1.166735707547454995e-02, - -5.356940629013495075e-03, -1.082410608691008200e-03, - -8.305081927004348899e-03, -8.219732855388919845e-03, - -4.721868885763546436e-03, -3.071596903695449424e-03, + 2.980086586841411e-02, 2.670602118823960e-03, -6.205408022135627e-03, + -7.946653268248605e-03, 4.217792180550986e-03, 1.822080579891798e-03, + -3.416928812442276e-03, -6.992749479424899e-03, 4.728288289346775e-03, + 5.049869641953204e-03, 1.550913149717830e-02, 1.801899070929784e-02, + -1.411871008097311e-02, -8.283139367982638e-03, -7.058623315726573e-03, + -9.368443348703582e-03, -7.121636949145627e-03, -1.130532824067422e-02, }; std::vector expected_fm = { - -2.702014342752852571e-01, -1.027058879186482226e-01, - -7.359539608958531876e-02, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 4.837763296762351284e-02, - 7.279460222389372293e-02, 5.692337419156127953e-02, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, + -1.112646578617150e+00, -2.239176906831133e-01, -2.513101985142691e-01, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + -9.763058480695873e-02, 1.564710428447471e-02, -3.735332673990924e-02, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, }; unsigned int natoms; double expected_tot_e; @@ -174,31 +167,24 @@ class TestInferDeepSpinANoPbcHPP : public ::testing::Test { std::vector atype = {0, 1, 1, 0, 1, 1}; std::vector box = {}; std::vector expected_e = { - -4.263824715539775434e-02, 2.659531961465150807e-01, - 2.679077652998275716e-01, -4.042215423551187570e-02, - 2.666009600722629158e-01, 2.666060991401024149e-01, + 1.298915294144196e-02, 1.095576145701290e-01, 1.083914166945241e-01, + 4.932338375417146e-02, 1.099860785812512e-01, 1.100478936528533e-01, }; std::vector expected_f = { - 9.664606789041574331e-04, 4.875258490407333167e-03, - 8.372291856602237514e-03, -9.664606789041574331e-04, - -4.875258490407331433e-03, -8.372291856602209759e-03, - 3.462063530624336170e-03, -3.516414654756409722e-04, - 1.540231672543395411e-04, 9.145994016724501297e-03, - 6.127039584892107760e-03, 1.114133934233926815e-02, - -5.161415144547300271e-03, -1.229667699599260294e-03, - -8.053323256964733598e-03, -7.446642402801547170e-03, - -4.545730419817223950e-03, -3.242039252628891276e-03, + 1.300765817095240e-02, -1.593967210478553e-03, -3.196759265340465e-03, + -1.300765817095220e-02, 1.593967210478477e-03, 3.196759265340509e-03, + 9.196695370628910e-03, -9.044559760114149e-04, 5.658266727670325e-04, + 1.012744085443978e-02, 1.680427054831429e-02, 1.807036969424208e-02, + -1.133453822298158e-02, -8.941333904804914e-03, -6.627672717506913e-03, + -7.989598002087154e-03, -6.958480667497971e-03, -1.200852364950221e-02, }; std::vector expected_fm = { - 2.426746573908480920e-02, -2.632265214292328626e-02, - -4.622069216845703377e-02, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 5.019524717501219757e-02, - 7.318340727755086317e-02, 5.710550212233043987e-02, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, + -9.651705644713781e-01, -1.704326891282164e-01, -2.605677204117113e-01, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + -9.168034653189444e-02, 1.736913887115685e-02, -3.908906640474424e-02, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, }; unsigned int natoms; double expected_tot_e; diff --git a/source/api_cc/tests/test_deeppot_dpa_pt_spin.cc b/source/api_cc/tests/test_deeppot_dpa_pt_spin.cc index 8791040a9a..20318504a2 100644 --- a/source/api_cc/tests/test_deeppot_dpa_pt_spin.cc +++ b/source/api_cc/tests/test_deeppot_dpa_pt_spin.cc @@ -49,67 +49,49 @@ class TestInferDeepSpinDpaPt : public ::testing::Test { // {ae.ravel()=}") std::vector expected_e = { - -4.736511666341149118e-02, 2.663324583045018068e-01, - 2.662707880956619588e-01, -4.025182706753409334e-02, - 2.661383816099721633e-01, 2.663717506235512844e-01, + 7.020322773655288e-03, 1.099636038493644e-01, 1.093176595258250e-01, + 4.865300228001564e-02, 1.096547558413134e-01, 1.099754340356070e-01, }; std::vector expected_f = { - 1.309983290673980352e-02, 6.799786488006153221e-03, - 6.649738725468718609e-03, -1.144456277614634265e-03, - -3.728471118137270928e-03, -6.491178701583714961e-03, - -5.361730092721230315e-03, -2.772299524882485336e-03, - -4.492382686597841141e-04, 6.983026947998328959e-03, - 5.505263649468144886e-03, 1.166735707547454995e-02, - -5.356940629013495075e-03, -1.082410608691008200e-03, - -8.305081927004348899e-03, -8.219732855388919845e-03, - -4.721868885763546436e-03, -3.071596903695449424e-03, + 2.980086586841411e-02, 2.670602118823960e-03, -6.205408022135627e-03, + -7.946653268248605e-03, 4.217792180550986e-03, 1.822080579891798e-03, + -3.416928812442276e-03, -6.992749479424899e-03, 4.728288289346775e-03, + 5.049869641953204e-03, 1.550913149717830e-02, 1.801899070929784e-02, + -1.411871008097311e-02, -8.283139367982638e-03, -7.058623315726573e-03, + -9.368443348703582e-03, -7.121636949145627e-03, -1.130532824067422e-02, }; std::vector expected_fm = { - -2.702014342752852571e-01, -1.027058879186482226e-01, - -7.359539608958531876e-02, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 4.837763296762351284e-02, - 7.279460222389372293e-02, 5.692337419156127953e-02, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, + -1.112646578617150e+00, -2.239176906831133e-01, -2.513101985142691e-01, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + -9.763058480695873e-02, 1.564710428447471e-02, -3.735332673990924e-02, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, }; std::vector expected_tot_v = { - -3.296409925977442784e-02, -6.514341112515736193e-03, - 2.302568866291881608e-03, -3.920085383179669654e-03, - -3.902770613936823105e-03, -2.657953604957638679e-04, - 1.599970898976528456e-03, 1.167950771447608766e-03, - -9.311107385533376815e-03, + -7.128128841285764e-02, -8.315622874246201e-03, -4.731536549332887e-03, + -1.341290773830820e-02, -1.469079587670170e-03, 1.056456080782730e-03, + -1.192681253424153e-02, 4.978114518702803e-03, -3.966123865761229e-03, }; std::vector expected_atom_v = { - -6.884133785830866270e-03, -1.121164398296095772e-03, - 2.349617433770582412e-03, -1.022026691568799937e-03, - -1.505129176989528951e-03, 6.393256900776127238e-04, - 2.630365807841273870e-03, 7.135622122988235366e-04, - -1.911276644703055428e-03, 2.743654218857313667e-03, - -7.881895490872514818e-04, -2.104426693877021765e-03, - 1.962048943234902601e-03, -1.049310174771551311e-03, - -1.494575973896533887e-03, 3.408026024086528976e-03, - -1.712970751848944505e-03, -2.576173589596463843e-03, - -1.201918779945609916e-02, -4.491798568020247129e-03, - 3.096386035183865820e-03, 9.950813669892615530e-04, - -7.365361184918026161e-04, 9.845327634837373713e-05, - -1.426610186908689078e-03, -1.277523649606296732e-03, - 1.099298580748801768e-03, -8.862984929390678099e-03, - -1.207887704777547457e-03, 1.866947330069956704e-03, - -2.034591943947313200e-03, -1.190516280519625511e-03, - 1.816162650652065067e-03, 1.888964404670585807e-03, - 1.695550260168729104e-03, -2.628706106868924485e-03, - -1.981095983149218712e-03, 2.124416489228214862e-03, - -3.803001677309152204e-03, 7.469960084091023956e-06, - 1.440128580078422951e-03, -2.264550990055120075e-03, - -1.502942461627763959e-03, 2.647480428239051657e-03, - -4.361425384715853296e-03, -5.960350980804883167e-03, - -1.029717381562808348e-03, 8.970464384536506412e-04, - -3.828067017971811641e-03, -8.614074432427376669e-04, - 9.393899863778386750e-04, -3.397832689085407594e-03, - -8.981477278037544023e-04, 1.067175759602119771e-03, + -3.619151252102697e-03, -1.915456807909512e-03, -1.193634026800710e-03, + -1.785172610866009e-03, 4.134184812978909e-03, -6.166519257514488e-05, + -2.157590794793008e-03, -2.693885020778555e-04, 1.587443946069703e-03, + 2.056276410594536e-03, -1.371452525359132e-03, -3.000322809812329e-03, + -2.204910668541369e-03, -2.235579614907452e-04, 1.766238823282138e-03, + 1.610936535839619e-04, -2.104451576692437e-04, -1.804779669204414e-06, + -3.221463421325033e-02, -7.637227088481205e-03, 5.718223298429893e-03, + -2.919861817651578e-04, -7.691370555547318e-03, 4.007185089114448e-03, + 4.811410568749122e-04, 4.415618310181523e-03, -2.774565137306631e-03, + -5.845767386476995e-03, -9.718890770743884e-04, 2.149933205072918e-03, + -1.901140917532940e-03, 7.116473330687919e-04, -1.348184104909009e-03, + 2.280135921727739e-03, -1.281729466483908e-03, 2.259352377835986e-03, + -1.358169386053482e-02, 6.217682155741852e-03, -1.084162229060967e-02, + 1.479497817858454e-04, 3.526517898332583e-03, -5.588222116376142e-03, + -3.264343884716279e-03, 4.301831360658648e-03, -7.109217034201159e-03, + -1.807631811108731e-02, -2.637279531163817e-03, 2.435886074387011e-03, + -7.377647141388572e-03, -1.926501115012390e-03, 2.281103582246440e-03, + -9.427248486918859e-03, -1.977772025906360e-03, 2.072666761510075e-03, }; int natoms; @@ -245,67 +227,49 @@ class TestInferDeepSpinDpaPtNopbc : public ::testing::Test { // {ae.ravel()=}") std::vector expected_e = { - -4.263824715539775434e-02, 2.659531961465150807e-01, - 2.679077652998275716e-01, -4.042215423551187570e-02, - 2.666009600722629158e-01, 2.666060991401024149e-01, + 1.298915294144196e-02, 1.095576145701290e-01, 1.083914166945241e-01, + 4.932338375417146e-02, 1.099860785812512e-01, 1.100478936528533e-01, }; std::vector expected_f = { - 9.664606789041574331e-04, 4.875258490407333167e-03, - 8.372291856602237514e-03, -9.664606789041574331e-04, - -4.875258490407331433e-03, -8.372291856602209759e-03, - 3.462063530624336170e-03, -3.516414654756409722e-04, - 1.540231672543395411e-04, 9.145994016724501297e-03, - 6.127039584892107760e-03, 1.114133934233926815e-02, - -5.161415144547300271e-03, -1.229667699599260294e-03, - -8.053323256964733598e-03, -7.446642402801547170e-03, - -4.545730419817223950e-03, -3.242039252628891276e-03, + 1.300765817095240e-02, -1.593967210478553e-03, -3.196759265340465e-03, + -1.300765817095220e-02, 1.593967210478477e-03, 3.196759265340509e-03, + 9.196695370628910e-03, -9.044559760114149e-04, 5.658266727670325e-04, + 1.012744085443978e-02, 1.680427054831429e-02, 1.807036969424208e-02, + -1.133453822298158e-02, -8.941333904804914e-03, -6.627672717506913e-03, + -7.989598002087154e-03, -6.958480667497971e-03, -1.200852364950221e-02, }; std::vector expected_fm = { - 2.426746573908480920e-02, -2.632265214292328626e-02, - -4.622069216845703377e-02, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 5.019524717501219757e-02, - 7.318340727755086317e-02, 5.710550212233043987e-02, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, + -9.651705644713781e-01, -1.704326891282164e-01, -2.605677204117113e-01, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + -9.168034653189444e-02, 1.736913887115685e-02, -3.908906640474424e-02, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, }; std::vector expected_tot_v = { - -1.760249353608427103e-02, 1.699089611551340799e-03, - -3.207143602659518616e-03, 3.802314035573836626e-04, - -2.021378920534677454e-03, -2.519436241845334455e-03, - 1.558229715287920425e-03, 6.867566983090854244e-04, - -1.026012201128513081e-02, + -2.794677047149250e-02, 2.706780654409338e-03, -1.543674466954783e-02, + -6.040095143502448e-03, 3.055091789429398e-03, -4.313832703172029e-03, + -1.604723023732680e-02, 1.777744336229196e-03, -5.171028133240485e-04, }; std::vector expected_atom_v = { - -1.353712843126003013e-03, 5.670959207689790652e-04, - 1.024431340743884623e-03, 5.531561218273641292e-04, - -2.317275645492945053e-04, -4.186046327342319174e-04, - 1.000397204637967254e-03, -4.190853154562824371e-04, - -7.570573440501640085e-04, 2.068893745514948854e-03, - -8.666987312292658875e-04, -1.565649320930233464e-03, - 3.054535161074109495e-03, -1.279602567476957262e-03, - -2.311540121893843058e-03, 5.195098769247979975e-03, - -2.176325160090315791e-03, -3.931426095646995550e-03, - -9.856122919086314146e-03, 9.936684925752666681e-04, - -3.439719552552561802e-04, 1.052798535866198608e-03, - -9.900711767116699563e-05, 2.762122318620294312e-05, - -5.083128431155595943e-04, 4.192561625213921898e-05, - -5.371277558265975804e-06, -3.083086775875694928e-03, - -4.898407961814706460e-04, 6.858622907339557637e-04, - -4.946158568775761710e-04, -9.714324993191098684e-04, - 1.457171302666425070e-03, 7.625101053767464887e-04, - 1.428262196816965091e-03, -2.161588072178897285e-03, - -5.723947614714765264e-04, 2.340653893581970402e-03, - -3.822101811639220734e-03, -1.559120189565561809e-04, - 1.375865762882331946e-03, -2.173696052105959873e-03, - -1.277932982926627964e-03, 2.762213706055685614e-03, - -4.518197398377981483e-03, -4.806069982039730404e-03, - -8.457891679641386939e-04, 8.142858536873513742e-04, - -3.629730539376156001e-03, -8.154749344004806610e-04, - 8.996120390360722724e-04, -3.613530537932585843e-03, - -9.502343452691061620e-04, 1.113518176527171326e-03, + 2.306155467987514e-03, -9.660921555042744e-04, -1.745198732526081e-03, + -9.476983959938838e-04, 3.970087875108642e-04, 7.171771645359225e-04, + -1.713485354054099e-03, 7.178114321056426e-04, 1.296691619287112e-03, + 7.319511578522508e-03, -3.066281877489238e-03, -5.539089843206328e-03, + -2.318373397601943e-04, 9.712104773733529e-05, 1.754444733319547e-04, + -6.521165022942005e-04, 2.731839401501884e-04, 4.934935693035620e-04, + -2.688582999243521e-02, 2.879540148031285e-03, -1.319893926076197e-03, + 2.654650285707574e-03, -3.069982439259916e-04, 1.657790217325663e-04, + -1.692335959139460e-03, 2.136332667243511e-04, -1.340912177342011e-04, + 4.337039816878673e-03, -4.892467685548227e-04, 1.504317649360216e-03, + -5.929947364721471e-04, 9.606430484810017e-04, -1.606901551850972e-03, + 1.319957388254711e-03, -1.503407517480697e-03, 2.524877227122832e-03, + -3.426950456916239e-03, 6.054673894090045e-03, -9.902054694804960e-03, + -4.978554214552650e-04, 3.694171795596980e-03, -5.898283613865629e-03, + -2.340485739136391e-03, 4.340998169957810e-03, -7.094248555283199e-03, + -1.159669688552975e-02, -1.705812586163657e-03, 1.565174877705520e-03, + -6.424359535528532e-03, -1.786854645970792e-03, 2.132951802944129e-03, + -1.096876407095736e-02, -2.264474955228100e-03, 2.396174543979845e-03, }; int natoms; diff --git a/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc b/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc index 98f30ea6d3..27c1836aa1 100644 --- a/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc +++ b/source/api_cc/tests/test_deeppot_dpa_ptexpt_spin.cc @@ -59,67 +59,49 @@ class TestInferDeepSpinDpaPtExpt : public ::testing::Test { // PBC reference values from gen_spin.py expected_e = { - -4.736511666341149118e-02, 2.663324583045018068e-01, - 2.662707880956619588e-01, -4.025182706753409334e-02, - 2.661383816099721633e-01, 2.663717506235512844e-01, + 7.020322773655288e-03, 1.099636038493644e-01, 1.093176595258250e-01, + 4.865300228001564e-02, 1.096547558413134e-01, 1.099754340356070e-01, }; expected_f = { - 1.309983290673980352e-02, 6.799786488006153221e-03, - 6.649738725468718609e-03, -1.144456277614634265e-03, - -3.728471118137270928e-03, -6.491178701583714961e-03, - -5.361730092721230315e-03, -2.772299524882485336e-03, - -4.492382686597841141e-04, 6.983026947998328959e-03, - 5.505263649468144886e-03, 1.166735707547454995e-02, - -5.356940629013495075e-03, -1.082410608691008200e-03, - -8.305081927004348899e-03, -8.219732855388919845e-03, - -4.721868885763546436e-03, -3.071596903695449424e-03, + 2.980086586841411e-02, 2.670602118823960e-03, -6.205408022135627e-03, + -7.946653268248605e-03, 4.217792180550986e-03, 1.822080579891798e-03, + -3.416928812442276e-03, -6.992749479424899e-03, 4.728288289346775e-03, + 5.049869641953204e-03, 1.550913149717830e-02, 1.801899070929784e-02, + -1.411871008097311e-02, -8.283139367982638e-03, -7.058623315726573e-03, + -9.368443348703582e-03, -7.121636949145627e-03, -1.130532824067422e-02, }; expected_fm = { - -2.702014342752852571e-01, -1.027058879186482226e-01, - -7.359539608958531876e-02, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 4.837763296762351284e-02, - 7.279460222389372293e-02, 5.692337419156127953e-02, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, + -1.112646578617150e+00, -2.239176906831133e-01, -2.513101985142691e-01, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + -9.763058480695873e-02, 1.564710428447471e-02, -3.735332673990924e-02, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, }; expected_tot_v = { - -3.296409925977442784e-02, -6.514341112515736193e-03, - 2.302568866291881608e-03, -3.920085383179669654e-03, - -3.902770613936823105e-03, -2.657953604957638679e-04, - 1.599970898976528456e-03, 1.167950771447608766e-03, - -9.311107385533376815e-03, + -7.128128841285764e-02, -8.315622874246201e-03, -4.731536549332887e-03, + -1.341290773830820e-02, -1.469079587670170e-03, 1.056456080782730e-03, + -1.192681253424153e-02, 4.978114518702803e-03, -3.966123865761229e-03, }; expected_atom_v = { - -6.884133785830866270e-03, -1.121164398296095772e-03, - 2.349617433770582412e-03, -1.022026691568799937e-03, - -1.505129176989528951e-03, 6.393256900776127238e-04, - 2.630365807841273870e-03, 7.135622122988235366e-04, - -1.911276644703055428e-03, 2.743654218857313667e-03, - -7.881895490872514818e-04, -2.104426693877021765e-03, - 1.962048943234902601e-03, -1.049310174771551311e-03, - -1.494575973896533887e-03, 3.408026024086528976e-03, - -1.712970751848944505e-03, -2.576173589596463843e-03, - -1.201918779945609916e-02, -4.491798568020247129e-03, - 3.096386035183865820e-03, 9.950813669892615530e-04, - -7.365361184918026161e-04, 9.845327634837373713e-05, - -1.426610186908689078e-03, -1.277523649606296732e-03, - 1.099298580748801768e-03, -8.862984929390678099e-03, - -1.207887704777547457e-03, 1.866947330069956704e-03, - -2.034591943947313200e-03, -1.190516280519625511e-03, - 1.816162650652065067e-03, 1.888964404670585807e-03, - 1.695550260168729104e-03, -2.628706106868924485e-03, - -1.981095983149218712e-03, 2.124416489228214862e-03, - -3.803001677309152204e-03, 7.469960084091023956e-06, - 1.440128580078422951e-03, -2.264550990055120075e-03, - -1.502942461627763959e-03, 2.647480428239051657e-03, - -4.361425384715853296e-03, -5.960350980804883167e-03, - -1.029717381562808348e-03, 8.970464384536506412e-04, - -3.828067017971811641e-03, -8.614074432427376669e-04, - 9.393899863778386750e-04, -3.397832689085407594e-03, - -8.981477278037544023e-04, 1.067175759602119771e-03, + -3.619151252102697e-03, -1.915456807909512e-03, -1.193634026800710e-03, + -1.785172610866009e-03, 4.134184812978909e-03, -6.166519257514488e-05, + -2.157590794793008e-03, -2.693885020778555e-04, 1.587443946069703e-03, + 2.056276410594536e-03, -1.371452525359132e-03, -3.000322809812329e-03, + -2.204910668541369e-03, -2.235579614907452e-04, 1.766238823282138e-03, + 1.610936535839619e-04, -2.104451576692437e-04, -1.804779669204414e-06, + -3.221463421325033e-02, -7.637227088481205e-03, 5.718223298429893e-03, + -2.919861817651578e-04, -7.691370555547318e-03, 4.007185089114448e-03, + 4.811410568749122e-04, 4.415618310181523e-03, -2.774565137306631e-03, + -5.845767386476995e-03, -9.718890770743884e-04, 2.149933205072918e-03, + -1.901140917532940e-03, 7.116473330687919e-04, -1.348184104909009e-03, + 2.280135921727739e-03, -1.281729466483908e-03, 2.259352377835986e-03, + -1.358169386053482e-02, 6.217682155741852e-03, -1.084162229060967e-02, + 1.479497817858454e-04, 3.526517898332583e-03, -5.588222116376142e-03, + -3.264343884716279e-03, 4.301831360658648e-03, -7.109217034201159e-03, + -1.807631811108731e-02, -2.637279531163817e-03, 2.435886074387011e-03, + -7.377647141388572e-03, -1.926501115012390e-03, 2.281103582246440e-03, + -9.427248486918859e-03, -1.977772025906360e-03, 2.072666761510075e-03, }; natoms = expected_e.size(); @@ -141,9 +123,10 @@ TYPED_TEST_SUITE(TestInferDeepSpinDpaPtExpt, ValueTypes); TYPED_TEST(TestInferDeepSpinDpaPtExpt, test_get_use_spin) { deepmd::DeepSpin& dp = this->dp; std::vector use_spin = dp.get_use_spin(); - EXPECT_EQ(use_spin.size(), 2); + EXPECT_EQ(use_spin.size(), 3); EXPECT_TRUE(use_spin[0]); // Ni has spin EXPECT_FALSE(use_spin[1]); // O has no spin + EXPECT_FALSE(use_spin[2]); // H has no spin } TYPED_TEST(TestInferDeepSpinDpaPtExpt, cpu_build_nlist) { @@ -262,67 +245,49 @@ class TestInferDeepSpinDpaPtExptNopbc : public ::testing::Test { // NoPBC reference values from gen_spin.py expected_e = { - -4.263824715539775434e-02, 2.659531961465150807e-01, - 2.679077652998275716e-01, -4.042215423551187570e-02, - 2.666009600722629158e-01, 2.666060991401024149e-01, + 1.298915294144196e-02, 1.095576145701290e-01, 1.083914166945241e-01, + 4.932338375417146e-02, 1.099860785812512e-01, 1.100478936528533e-01, }; expected_f = { - 9.664606789041574331e-04, 4.875258490407333167e-03, - 8.372291856602237514e-03, -9.664606789041574331e-04, - -4.875258490407331433e-03, -8.372291856602209759e-03, - 3.462063530624336170e-03, -3.516414654756409722e-04, - 1.540231672543395411e-04, 9.145994016724501297e-03, - 6.127039584892107760e-03, 1.114133934233926815e-02, - -5.161415144547300271e-03, -1.229667699599260294e-03, - -8.053323256964733598e-03, -7.446642402801547170e-03, - -4.545730419817223950e-03, -3.242039252628891276e-03, + 1.300765817095240e-02, -1.593967210478553e-03, -3.196759265340465e-03, + -1.300765817095220e-02, 1.593967210478477e-03, 3.196759265340509e-03, + 9.196695370628910e-03, -9.044559760114149e-04, 5.658266727670325e-04, + 1.012744085443978e-02, 1.680427054831429e-02, 1.807036969424208e-02, + -1.133453822298158e-02, -8.941333904804914e-03, -6.627672717506913e-03, + -7.989598002087154e-03, -6.958480667497971e-03, -1.200852364950221e-02, }; expected_fm = { - 2.426746573908480920e-02, -2.632265214292328626e-02, - -4.622069216845703377e-02, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 5.019524717501219757e-02, - 7.318340727755086317e-02, 5.710550212233043987e-02, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, - 0.000000000000000000e+00, 0.000000000000000000e+00, + -9.651705644713781e-01, -1.704326891282164e-01, -2.605677204117113e-01, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + -9.168034653189444e-02, 1.736913887115685e-02, -3.908906640474424e-02, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, + 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, }; expected_tot_v = { - -1.760249353608427103e-02, 1.699089611551340799e-03, - -3.207143602659518616e-03, 3.802314035573836626e-04, - -2.021378920534677454e-03, -2.519436241845334455e-03, - 1.558229715287920425e-03, 6.867566983090854244e-04, - -1.026012201128513081e-02, + -2.794677047149250e-02, 2.706780654409338e-03, -1.543674466954783e-02, + -6.040095143502448e-03, 3.055091789429398e-03, -4.313832703172029e-03, + -1.604723023732680e-02, 1.777744336229196e-03, -5.171028133240485e-04, }; expected_atom_v = { - -1.353712843126003013e-03, 5.670959207689790652e-04, - 1.024431340743884623e-03, 5.531561218273641292e-04, - -2.317275645492945053e-04, -4.186046327342319174e-04, - 1.000397204637967254e-03, -4.190853154562824371e-04, - -7.570573440501640085e-04, 2.068893745514948854e-03, - -8.666987312292658875e-04, -1.565649320930233464e-03, - 3.054535161074109495e-03, -1.279602567476957262e-03, - -2.311540121893843058e-03, 5.195098769247979975e-03, - -2.176325160090315791e-03, -3.931426095646995550e-03, - -9.856122919086314146e-03, 9.936684925752666681e-04, - -3.439719552552561802e-04, 1.052798535866198608e-03, - -9.900711767116699563e-05, 2.762122318620294312e-05, - -5.083128431155595943e-04, 4.192561625213921898e-05, - -5.371277558265975804e-06, -3.083086775875694928e-03, - -4.898407961814706460e-04, 6.858622907339557637e-04, - -4.946158568775761710e-04, -9.714324993191098684e-04, - 1.457171302666425070e-03, 7.625101053767464887e-04, - 1.428262196816965091e-03, -2.161588072178897285e-03, - -5.723947614714765264e-04, 2.340653893581970402e-03, - -3.822101811639220734e-03, -1.559120189565561809e-04, - 1.375865762882331946e-03, -2.173696052105959873e-03, - -1.277932982926627964e-03, 2.762213706055685614e-03, - -4.518197398377981483e-03, -4.806069982039730404e-03, - -8.457891679641386939e-04, 8.142858536873513742e-04, - -3.629730539376156001e-03, -8.154749344004806610e-04, - 8.996120390360722724e-04, -3.613530537932585843e-03, - -9.502343452691061620e-04, 1.113518176527171326e-03, + 2.306155467987514e-03, -9.660921555042744e-04, -1.745198732526081e-03, + -9.476983959938838e-04, 3.970087875108642e-04, 7.171771645359225e-04, + -1.713485354054099e-03, 7.178114321056426e-04, 1.296691619287112e-03, + 7.319511578522508e-03, -3.066281877489238e-03, -5.539089843206328e-03, + -2.318373397601943e-04, 9.712104773733529e-05, 1.754444733319547e-04, + -6.521165022942005e-04, 2.731839401501884e-04, 4.934935693035620e-04, + -2.688582999243521e-02, 2.879540148031285e-03, -1.319893926076197e-03, + 2.654650285707574e-03, -3.069982439259916e-04, 1.657790217325663e-04, + -1.692335959139460e-03, 2.136332667243511e-04, -1.340912177342011e-04, + 4.337039816878673e-03, -4.892467685548227e-04, 1.504317649360216e-03, + -5.929947364721471e-04, 9.606430484810017e-04, -1.606901551850972e-03, + 1.319957388254711e-03, -1.503407517480697e-03, 2.524877227122832e-03, + -3.426950456916239e-03, 6.054673894090045e-03, -9.902054694804960e-03, + -4.978554214552650e-04, 3.694171795596980e-03, -5.898283613865629e-03, + -2.340485739136391e-03, 4.340998169957810e-03, -7.094248555283199e-03, + -1.159669688552975e-02, -1.705812586163657e-03, 1.565174877705520e-03, + -6.424359535528532e-03, -1.786854645970792e-03, 2.132951802944129e-03, + -1.096876407095736e-02, -2.264474955228100e-03, 2.396174543979845e-03, }; natoms = expected_e.size(); diff --git a/source/lmp/tests/test_lammps_spin_nopbc_pt.py b/source/lmp/tests/test_lammps_spin_nopbc_pt.py index 1fb1011c5b..486538fe8b 100644 --- a/source/lmp/tests/test_lammps_spin_nopbc_pt.py +++ b/source/lmp/tests/test_lammps_spin_nopbc_pt.py @@ -31,19 +31,19 @@ data_type_map_file = Path(__file__).parent / "data_type_map.lmp" md_file = Path(__file__).parent / "md.out" -expected_e = 4.506368054192911310e-01 +expected_e = 3.5101080091096860e-01 expected_f = np.array( [ - [-4.3791408102373730e-03, 1.8345049340183590e-03, 8.0965764883528663e-03], - [4.3791408102373730e-03, -1.8345049340183590e-03, -8.0965764883528628e-03], - [1.8744375495035947e-04, 1.7511192896678328e-04, -2.5650198045838670e-04], - [-1.8744375495035947e-04, -1.7511192896678328e-04, 2.5650198045838670e-04], + [3.9007324220254663e-03, -1.6340906092268837e-03, 2.4784543132550553e-03], + [-3.9007324220254660e-03, 1.6340906092268837e-03, -2.4784543132550550e-03], + [1.0879565176984952e-04, 1.0163804310078055e-04, -1.4887826031663627e-04], + [-1.0879565176984952e-04, -1.0163804310078055e-04, 1.4887826031663627e-04], ] ) expected_fm = np.array( [ - [-4.0225421856019317e-04, 1.6851190236981042e-04, 2.2376748889882192e-03], - [3.1808894918962933e-03, -1.3325347871457449e-03, 1.8162613930793377e-03], + [3.4589594972289518e-03, -1.4490235731634794e-03, 2.3561281037953720e-03], + [-3.0400436796538990e-04, 1.2735318117469008e-04, -1.4949786028183132e-03], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], ] diff --git a/source/lmp/tests/test_lammps_spin_nopbc_pt2.py b/source/lmp/tests/test_lammps_spin_nopbc_pt2.py index d92058546e..ca0778d52f 100644 --- a/source/lmp/tests/test_lammps_spin_nopbc_pt2.py +++ b/source/lmp/tests/test_lammps_spin_nopbc_pt2.py @@ -23,19 +23,19 @@ md_file = Path(__file__).parent / "md.out" # Reference values from the seed=1 .pt2 model (NoPBC, Model 0) -expected_e = 4.506368054192911310e-01 +expected_e = 3.5101080091096860e-01 expected_f = np.array( [ - [-4.3791408102373730e-03, 1.8345049340183590e-03, 8.0965764883528663e-03], - [4.3791408102373730e-03, -1.8345049340183590e-03, -8.0965764883528628e-03], - [1.8744375495035947e-04, 1.7511192896678328e-04, -2.5650198045838670e-04], - [-1.8744375495035947e-04, -1.7511192896678328e-04, 2.5650198045838670e-04], + [3.9007324220254663e-03, -1.6340906092268837e-03, 2.4784543132550553e-03], + [-3.9007324220254660e-03, 1.6340906092268837e-03, -2.4784543132550550e-03], + [1.0879565176984952e-04, 1.0163804310078055e-04, -1.4887826031663627e-04], + [-1.0879565176984952e-04, -1.0163804310078055e-04, 1.4887826031663627e-04], ] ) expected_fm = np.array( [ - [-4.0225421856019317e-04, 1.6851190236981042e-04, 2.2376748889882192e-03], - [3.1808894918962933e-03, -1.3325347871457449e-03, 1.8162613930793377e-03], + [3.4589594972289518e-03, -1.4490235731634794e-03, 2.3561281037953720e-03], + [-3.0400436796538990e-04, 1.2735318117469008e-04, -1.4949786028183132e-03], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], ] @@ -44,17 +44,17 @@ # Reference values from the seed=2 .pt2 model (NoPBC, Model 1) expected_f2 = np.array( [ - [-5.0313948956892344e-03, 2.1077465103562995e-03, 3.3650618879773678e-03], - [5.0313948956892335e-03, -2.1077465103562999e-03, -3.3650618879773678e-03], - [7.8146213901410743e-04, 7.3005015618423231e-04, -1.0693692428614104e-03], - [-7.8146213901410743e-04, -7.3005015618423231e-04, 1.0693692428614104e-03], + [-3.0870239868329980e-02, 1.2932127512408504e-02, 2.7561357633479750e-02], + [3.0870239868329978e-02, -1.2932127512408506e-02, -2.7561357633479742e-02], + [4.5712656471395960e-04, 4.2705244861435744e-04, -6.2554161487173430e-04], + [-4.5712656471395960e-04, -4.2705244861435744e-04, 6.2554161487173430e-04], ] ) expected_fm2 = np.array( [ - [1.4597145672945039e-03, -6.1150204846121062e-04, -1.3469050004718076e-02], - [-1.7167887170022188e-03, 7.1919527333876780e-04, -1.3100088729734645e-02], + [-7.2838456252868870e-03, 3.0513407349174793e-03, -1.9672009896273334e-02], + [9.7240358761389140e-03, -4.0735825967608950e-03, -1.7012161861151297e-02], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], ] @@ -150,12 +150,13 @@ def test_pair_deepmd_model_devi(lammps) -> None: md = np.loadtxt(md_file.resolve()) expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) - assert md[4] == pytest.approx(np.max(expected_md_f)) - assert md[5] == pytest.approx(np.min(expected_md_f)) - assert md[6] == pytest.approx(np.mean(expected_md_f)) - assert md[7] == pytest.approx(np.max(expected_md_fm)) - assert md[8] == pytest.approx(np.min(expected_md_fm)) - assert md[9] == pytest.approx(np.mean(expected_md_fm)) + # rel=1e-4: md.out is written with default scientific format (~6 significant digits) + assert md[4] == pytest.approx(np.max(expected_md_f), rel=1e-4) + assert md[5] == pytest.approx(np.min(expected_md_f), rel=1e-4) + assert md[6] == pytest.approx(np.mean(expected_md_f), rel=1e-4) + assert md[7] == pytest.approx(np.max(expected_md_fm), rel=1e-4) + assert md[8] == pytest.approx(np.min(expected_md_fm), rel=1e-4) + assert md[9] == pytest.approx(np.mean(expected_md_fm), rel=1e-4) def test_pair_deepmd_model_devi_atomic_relative(lammps) -> None: @@ -178,9 +179,10 @@ def test_pair_deepmd_model_devi_atomic_relative(lammps) -> None: expected_md_f /= norm + relative expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) expected_md_fm /= norm_spin + relative - assert md[4] == pytest.approx(np.max(expected_md_f)) - assert md[5] == pytest.approx(np.min(expected_md_f)) - assert md[6] == pytest.approx(np.mean(expected_md_f)) - assert md[7] == pytest.approx(np.max(expected_md_fm)) - assert md[8] == pytest.approx(np.min(expected_md_fm)) - assert md[9] == pytest.approx(np.mean(expected_md_fm)) + # rel=1e-4: md.out is written with default scientific format (~6 significant digits) + assert md[4] == pytest.approx(np.max(expected_md_f), rel=1e-4) + assert md[5] == pytest.approx(np.min(expected_md_f), rel=1e-4) + assert md[6] == pytest.approx(np.mean(expected_md_f), rel=1e-4) + assert md[7] == pytest.approx(np.max(expected_md_fm), rel=1e-4) + assert md[8] == pytest.approx(np.min(expected_md_fm), rel=1e-4) + assert md[9] == pytest.approx(np.mean(expected_md_fm), rel=1e-4) diff --git a/source/lmp/tests/test_lammps_spin_pt.py b/source/lmp/tests/test_lammps_spin_pt.py index 3de0c7c19b..8a21f27710 100644 --- a/source/lmp/tests/test_lammps_spin_pt.py +++ b/source/lmp/tests/test_lammps_spin_pt.py @@ -32,27 +32,27 @@ data_type_map_file = Path(__file__).parent / "data_type_map.lmp" md_file = Path(__file__).parent / "md.out" -expected_e = 4.508261273186509599e-01 +expected_e = 3.5053686886040974e-01 expected_ae = np.array( [ - -4.384923692739055301e-02, - -4.127243767708395350e-02, - 2.679072197028402047e-01, - 2.680405822202852617e-01, + 6.8203336981159180e-02, + 6.4899945717305470e-02, + 1.0867432727951952e-01, + 1.0875925888242556e-01, ] ) expected_f = np.array( [ - [-4.2676712486866839e-03, 1.8628771592081692e-03, 8.1929947798959294e-03], - [4.1470034985421397e-03, -1.8846167362954120e-03, -8.0779540071613375e-03], - [-1.5774196991860190e-05, 1.5095872055037390e-04, -2.7974166116106585e-04], - [1.3644194713640517e-04, -1.2921914346313107e-04, 1.6470088842647485e-04], + [3.9965859059739960e-03, -1.5714685255928385e-03, 2.5489246986054267e-03], + [-3.2538293505478910e-03, 1.5372892024705638e-03, -2.6183962915675120e-03], + [-5.8572951970559290e-04, 1.2789559354576532e-04, -8.4978782279560860e-05], + [-1.5702703572051152e-04, -9.3716270423490900e-05, 1.5445037524164582e-04], ] ) expected_fm = np.array( [ - [-4.5085730123974212e-04, 1.8188156762674026e-04, 1.9591427407519438e-03], - [3.1582497858262133e-03, -1.3356926943075573e-03, 1.7139696951871720e-03], + [3.5882891345325510e-03, -1.4332293643181068e-03, 2.1309512069449844e-03], + [-2.2686566316524877e-04, 1.1563585411337640e-04, -1.5585998391414227e-03], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], ] @@ -78,42 +78,42 @@ expected_v = -np.array( [ - -1.4794937634472474e-03, - 6.6688347518566377e-04, - 9.2820857914341511e-04, - 6.9899209610065787e-04, - -2.3202779455430261e-04, - -4.3062165105966181e-04, - 4.2186963636220076e-03, - -1.8596964037585618e-03, - -3.3537115627438724e-03, - -2.0962516214727486e-03, - 7.9319592962628796e-04, - 1.3351142815012081e-03, - 8.9145117156866685e-04, - -3.4764851549428505e-04, - -6.2285930526845095e-04, - 1.5422972351535255e-03, - -6.6089529841465919e-04, - -1.1822529939065273e-03, - 7.9431779279767246e-04, - -1.2677430787194573e-04, - 6.4796756091853292e-05, - -1.3924650354116248e-04, - -3.1301607401264882e-05, - 4.9296926793974502e-05, - -9.4965688637539702e-05, - 5.6156814646123667e-05, - -9.1198182079314316e-05, - 2.6039820355670405e-04, - 4.3106382567677546e-05, - -9.7016827514025993e-05, - -7.4785284620483794e-05, - -6.6085841514910694e-05, - 9.2317188787004601e-05, - 1.3480686702278333e-05, - 8.2958814726605517e-05, - -1.1609755379269147e-04, + -6.5442162870715910e-04, + 3.3133477241365930e-04, + 3.9883281200020510e-04, + 3.5002780951132103e-04, + -1.1589573685630256e-04, + -2.2265549504892014e-04, + 3.4055402098896265e-04, + -1.9139376762381335e-04, + -3.3133994148957030e-04, + 3.1589094549377213e-03, + -1.3741877857714818e-03, + -2.5227682918535005e-03, + -1.4131573474734480e-03, + 6.0225037103514220e-04, + 1.0902107277722482e-03, + 1.4702420402848647e-03, + -6.1977156785934680e-04, + -1.1144364605899786e-03, + -2.1325917337790670e-03, + 7.0758382747778870e-05, + -1.2848658004242357e-05, + 1.0290158078156647e-04, + -2.7842261103620382e-05, + 3.2953845020209020e-05, + 2.2234591227388966e-04, + 2.2930239123112260e-05, + -3.1997128170916170e-05, + -8.1674704416169310e-04, + -1.1094383565005458e-04, + 1.6599006542109280e-04, + -1.2281050907954750e-04, + -5.0200238466137690e-05, + 7.2193112591762430e-05, + 2.7750902949636390e-04, + 8.2718432747583720e-05, + -1.1997871423457964e-04, ] ).reshape(4, 9) diff --git a/source/lmp/tests/test_lammps_spin_pt2.py b/source/lmp/tests/test_lammps_spin_pt2.py index 9bdf50204a..dec9b75104 100644 --- a/source/lmp/tests/test_lammps_spin_pt2.py +++ b/source/lmp/tests/test_lammps_spin_pt2.py @@ -24,27 +24,27 @@ md_file = Path(__file__).parent / "md.out" # Reference values from the seed=1 .pt2 model (PBC, Model 0) -expected_e = 4.508261273186509599e-01 +expected_e = 3.5053686886040974e-01 expected_ae = np.array( [ - -4.384923692739055301e-02, - -4.127243767708395350e-02, - 2.679072197028402047e-01, - 2.680405822202852617e-01, + 6.8203336981159180e-02, + 6.4899945717305470e-02, + 1.0867432727951952e-01, + 1.0875925888242556e-01, ] ) expected_f = np.array( [ - [-4.2676712486866839e-03, 1.8628771592081692e-03, 8.1929947798959294e-03], - [4.1470034985421397e-03, -1.8846167362954120e-03, -8.0779540071613375e-03], - [-1.5774196991860190e-05, 1.5095872055037390e-04, -2.7974166116106585e-04], - [1.3644194713640517e-04, -1.2921914346313107e-04, 1.6470088842647485e-04], + [3.9965859059739960e-03, -1.5714685255928385e-03, 2.5489246986054267e-03], + [-3.2538293505478910e-03, 1.5372892024705638e-03, -2.6183962915675120e-03], + [-5.8572951970559290e-04, 1.2789559354576532e-04, -8.4978782279560860e-05], + [-1.5702703572051152e-04, -9.3716270423490900e-05, 1.5445037524164582e-04], ] ) expected_fm = np.array( [ - [-4.5085730123974212e-04, 1.8188156762674026e-04, 1.9591427407519438e-03], - [3.1582497858262133e-03, -1.3356926943075573e-03, 1.7139696951871720e-03], + [3.5882891345325510e-03, -1.4332293643181068e-03, 2.1309512069449844e-03], + [-2.2686566316524877e-04, 1.1563585411337640e-04, -1.5585998391414227e-03], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], ] @@ -53,17 +53,17 @@ # Reference values from the seed=2 .pt2 model (PBC, Model 1) expected_f2 = np.array( [ - [-5.0903657013833805e-03, 2.2714596279667276e-03, 3.5699195164111686e-03], - [4.9335267498655496e-03, -2.2027414621596151e-03, -3.6334615119367475e-03], - [1.1774037584944407e-03, 6.9469696563881659e-04, -1.0467746979479903e-03], - [-1.0205648069766093e-03, -7.6341513144592970e-04, 1.1103166934735694e-03], + [-3.0262814573947916e-02, 1.3107838688513508e-02, 2.7456572609621283e-02], + [3.2096308278552410e-02, -1.3110841000027918e-02, -2.7788457969008994e-02], + [-8.0682873449542990e-04, 5.2993401057113383e-04, -4.9511667664325060e-04], + [-1.0266649701090702e-03, -5.2693779419693080e-04, 8.2700203603093960e-04], ] ) expected_fm2 = np.array( [ - [1.6161523921420901e-03, -6.1507586761937660e-04, -1.4084754563287318e-02], - [-1.7131909329371128e-03, 7.1495794003373391e-04, -1.3238736630706918e-02], + [-6.7580350367321040e-03, 3.1210297243763260e-03, -2.0248402789380206e-02], + [1.0009759711324267e-02, -4.1032469729948700e-03, -1.7144003722544775e-02], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], [0.0000000000000000e00, 0.0000000000000000e00, 0.0000000000000000e00], ] @@ -71,42 +71,42 @@ expected_v = -np.array( [ - -1.4794937634472474e-03, - 6.6688347518566377e-04, - 9.2820857914341511e-04, - 6.9899209610065787e-04, - -2.3202779455430261e-04, - -4.3062165105966181e-04, - 4.2186963636220076e-03, - -1.8596964037585618e-03, - -3.3537115627438724e-03, - -2.0962516214727486e-03, - 7.9319592962628796e-04, - 1.3351142815012081e-03, - 8.9145117156866685e-04, - -3.4764851549428505e-04, - -6.2285930526845095e-04, - 1.5422972351535255e-03, - -6.6089529841465919e-04, - -1.1822529939065273e-03, - 7.9431779279767246e-04, - -1.2677430787194573e-04, - 6.4796756091853292e-05, - -1.3924650354116248e-04, - -3.1301607401264882e-05, - 4.9296926793974502e-05, - -9.4965688637539702e-05, - 5.6156814646123667e-05, - -9.1198182079314316e-05, - 2.6039820355670405e-04, - 4.3106382567677546e-05, - -9.7016827514025993e-05, - -7.4785284620483794e-05, - -6.6085841514910694e-05, - 9.2317188787004601e-05, - 1.3480686702278333e-05, - 8.2958814726605517e-05, - -1.1609755379269147e-04, + -6.5442162870715910e-04, + 3.3133477241365930e-04, + 3.9883281200020510e-04, + 3.5002780951132103e-04, + -1.1589573685630256e-04, + -2.2265549504892014e-04, + 3.4055402098896265e-04, + -1.9139376762381335e-04, + -3.3133994148957030e-04, + 3.1589094549377213e-03, + -1.3741877857714818e-03, + -2.5227682918535005e-03, + -1.4131573474734480e-03, + 6.0225037103514220e-04, + 1.0902107277722482e-03, + 1.4702420402848647e-03, + -6.1977156785934680e-04, + -1.1144364605899786e-03, + -2.1325917337790670e-03, + 7.0758382747778870e-05, + -1.2848658004242357e-05, + 1.0290158078156647e-04, + -2.7842261103620382e-05, + 3.2953845020209020e-05, + 2.2234591227388966e-04, + 2.2930239123112260e-05, + -3.1997128170916170e-05, + -8.1674704416169310e-04, + -1.1094383565005458e-04, + 1.6599006542109280e-04, + -1.2281050907954750e-04, + -5.0200238466137690e-05, + 7.2193112591762430e-05, + 2.7750902949636390e-04, + 8.2718432747583720e-05, + -1.1997871423457964e-04, ] ).reshape(4, 9) @@ -241,12 +241,13 @@ def test_pair_deepmd_model_devi(lammps) -> None: md = np.loadtxt(md_file.resolve()) expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) - assert md[4] == pytest.approx(np.max(expected_md_f)) - assert md[5] == pytest.approx(np.min(expected_md_f)) - assert md[6] == pytest.approx(np.mean(expected_md_f)) - assert md[7] == pytest.approx(np.max(expected_md_fm)) - assert md[8] == pytest.approx(np.min(expected_md_fm)) - assert md[9] == pytest.approx(np.mean(expected_md_fm)) + # rel=1e-4: md.out is written with default scientific format (~6 significant digits) + assert md[4] == pytest.approx(np.max(expected_md_f), rel=1e-4) + assert md[5] == pytest.approx(np.min(expected_md_f), rel=1e-4) + assert md[6] == pytest.approx(np.mean(expected_md_f), rel=1e-4) + assert md[7] == pytest.approx(np.max(expected_md_fm), rel=1e-4) + assert md[8] == pytest.approx(np.min(expected_md_fm), rel=1e-4) + assert md[9] == pytest.approx(np.mean(expected_md_fm), rel=1e-4) def test_pair_deepmd_model_devi_atomic_relative(lammps) -> None: @@ -269,9 +270,10 @@ def test_pair_deepmd_model_devi_atomic_relative(lammps) -> None: expected_md_f /= norm + relative expected_md_fm = np.linalg.norm(np.std([expected_fm, expected_fm2], axis=0), axis=1) expected_md_fm /= norm_spin + relative - assert md[4] == pytest.approx(np.max(expected_md_f)) - assert md[5] == pytest.approx(np.min(expected_md_f)) - assert md[6] == pytest.approx(np.mean(expected_md_f)) - assert md[7] == pytest.approx(np.max(expected_md_fm)) - assert md[8] == pytest.approx(np.min(expected_md_fm)) - assert md[9] == pytest.approx(np.mean(expected_md_fm)) + # rel=1e-4: md.out is written with default scientific format (~6 significant digits) + assert md[4] == pytest.approx(np.max(expected_md_f), rel=1e-4) + assert md[5] == pytest.approx(np.min(expected_md_f), rel=1e-4) + assert md[6] == pytest.approx(np.mean(expected_md_f), rel=1e-4) + assert md[7] == pytest.approx(np.max(expected_md_fm), rel=1e-4) + assert md[8] == pytest.approx(np.min(expected_md_fm), rel=1e-4) + assert md[9] == pytest.approx(np.mean(expected_md_fm), rel=1e-4) diff --git a/source/tests/infer/deeppot_dpa_spin.yaml b/source/tests/infer/deeppot_dpa_spin.yaml index 2b631af422..b3088ef8b7 100644 --- a/source/tests/infer/deeppot_dpa_spin.yaml +++ b/source/tests/infer/deeppot_dpa_spin.yaml @@ -13,6 +13,8 @@ model: - - 0.0 - - 0.0 - - 0.0 + - - 0.0 + - - 0.0 out_std: "@class": np.ndarray "@is_variable": true @@ -23,10 +25,13 @@ model: - - 1.0 - - 1.0 - - 1.0 + - - 1.0 + - - 1.0 "@version": 2 atom_exclude_types: &id002 - - 2 - 3 + - 4 + - 5 descriptor: "@class": Descriptor "@variables": @@ -516,6 +521,246 @@ model: - 0.0 - 0.0 - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 dstd: "@class": np.ndarray "@is_variable": true @@ -1002,6 +1247,246 @@ model: - 1.0 - 1.0 - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 "@version": 2 activation_function: tanh attention_layers: @@ -1758,7 +2243,7 @@ model: - 8 precision: float64 resnet_dt: false - ntypes: 4 + ntypes: 6 env_mat: protection: 1.0e-06 rcut: 6.0 @@ -1766,21 +2251,37 @@ model: use_exp_switch: false env_protection: 1.0e-06 exclude_types: &id003 - - - 3 + - - 4 - 0 - - - 3 + - - 4 - 1 - - - 3 + - - 4 - 2 - - - 3 + - - 4 - 3 + - - 4 + - 4 + - - 4 + - 5 + - - 5 + - 0 + - - 5 + - 1 + - - 5 + - 2 + - - 5 + - 3 + - - 5 + - 4 + - - 5 + - 5 ln_eps: 1.0e-05 neuron: - 2 - 4 - 8 normalize: true - ntypes: 4 + ntypes: 6 precision: float64 rcut: 6.0 rcut_smth: 2.0 @@ -1806,7 +2307,7 @@ model: "@version": 2 activation_function: Linear bias: false - in_dim: 4 + in_dim: 6 layers: - "@class": Layer "@variables": @@ -1818,38 +2319,54 @@ model: "@version": 1 dtype: float64 value: - - - -0.3161547360283977 - - -0.015297581090729784 - - 0.5765215950511243 - - 0.14176442717510646 - - -0.09436943428849595 - - -0.4827490593423835 - - -0.26022683704566674 - - -0.07816101487288045 - - - -0.03219910522911867 - - 0.14525736197208597 - - 0.4166300988982592 - - -0.11812510347880134 - - 0.1959689339789453 - - 0.14894583593855398 - - -0.4990495825239417 - - 0.11968195360930496 - - - -0.5890592166883595 - - -0.2716541312100993 - - 0.513605963081437 - - -0.12412954486366976 - - 0.21913762000348655 - - 0.16401626404198605 - - 0.2753790827646884 - - 0.12376172086553827 - - - 0.4800974125736142 - - 0.09359562730928006 - - -0.06277151252879534 - - 0.3007427466981146 - - -0.1825693326630776 - - -0.10899015324840414 - - 0.09999385450543531 - - -0.09509565217064518 + - - -0.2927024092533758 + - -0.014162808051698143 + - 0.5337552806512624 + - 0.13124835611145563 + - -0.08736911906845456 + - -0.4469387822854708 + - -0.24092323623711465 + - -0.07236303858793405 + - - -0.029810578815809525 + - 0.13448218535369424 + - 0.3857245197302343 + - -0.1093625950883868 + - 0.18143197800870767 + - 0.1378970486893381 + - -0.4620301342837659 + - 0.11080395823154059 + - - -0.5453628627663579 + - -0.2515028548605599 + - 0.4755067239838334 + - -0.11492162761040413 + - 0.20288201321554736 + - 0.15184955393967264 + - 0.2549514898804775 + - 0.11458108875975528 + - - 0.4444838344094473 + - 0.0866527130137522 + - -0.05811512799228326 + - 0.2784336797539196 + - -0.16902635778153863 + - -0.10090527455466318 + - 0.09257632035486411 + - -0.08804146618056256 + - - -0.5361517594910684 + - -0.5304567668606835 + - 0.013353255324733446 + - 0.09254196348234821 + - 0.020815206464360567 + - 0.2831940642833442 + - -0.0032802268194216514 + - 0.04518720923263511 + - - -0.19075762886775724 + - 0.1670238834313649 + - 0.31687760687930183 + - -0.023313802928756507 + - -0.08946247104463122 + - -0.08622297317524152 + - -0.14368061835507168 + - 0.2766849049027015 "@version": 2 activation_function: Linear bias: false @@ -1863,7 +2380,7 @@ model: resnet_dt: false neuron: - 8 - ntypes: 4 + ntypes: 6 padding: true precision: float64 resnet_dt: false @@ -1871,8 +2388,10 @@ model: type_map: &id001 - Ni - O + - H - Ni_spin - O_spin + - H_spin use_econf_tebd: false use_tebd_bias: false type_map: *id001 @@ -1894,6 +2413,8 @@ model: - - 0.0 - - 0.0 - - 0.0 + - - 0.0 + - - 0.0 case_embd: null fparam_avg: null fparam_inv_std: null @@ -2305,12 +2826,12 @@ model: out_dim: 1 precision: float64 resnet_dt: true - ntypes: 4 + ntypes: 6 neuron: - 5 - 5 - 5 - ntypes: 4 + ntypes: 6 numb_aparam: 0 numb_fparam: 0 precision: float64 @@ -2327,8 +2848,10 @@ model: type_map: - Ni - O + - H - Ni_spin - O_spin + - H_spin use_aparam_as_mask: false var_name: energy pair_exclude_types: *id003 @@ -2338,15 +2861,19 @@ model: type_map: - Ni - O + - H - Ni_spin - O_spin + - H_spin spin: use_spin: - true - false + - false virtual_scale: - 0.314 - 0.0 + - 0.0 type: spin_ener model_def_script: descriptor: @@ -2380,12 +2907,15 @@ model_def_script: use_spin: - true - false + - false virtual_scale: - 0.314 - 0.0 + - 0.0 type_map: - Ni - O + - H software: deepmd-kit -time: "2026-04-04 10:38:37.220790+00:00" +time: "2026-04-04 15:06:22.248682+00:00" version: 3.0.0 diff --git a/source/tests/infer/deeppot_dpa_spin_md0.yaml b/source/tests/infer/deeppot_dpa_spin_md0.yaml index 3512d7015e..32f719ba39 100644 --- a/source/tests/infer/deeppot_dpa_spin_md0.yaml +++ b/source/tests/infer/deeppot_dpa_spin_md0.yaml @@ -13,6 +13,8 @@ model: - - 0.0 - - 0.0 - - 0.0 + - - 0.0 + - - 0.0 out_std: "@class": np.ndarray "@is_variable": true @@ -23,10 +25,13 @@ model: - - 1.0 - - 1.0 - - 1.0 + - - 1.0 + - - 1.0 "@version": 2 atom_exclude_types: &id002 - - 2 - 3 + - 4 + - 5 descriptor: "@class": Descriptor "@variables": @@ -516,6 +521,246 @@ model: - 0.0 - 0.0 - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 dstd: "@class": np.ndarray "@is_variable": true @@ -1002,6 +1247,246 @@ model: - 1.0 - 1.0 - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 "@version": 2 activation_function: tanh attention_layers: @@ -1758,7 +2243,7 @@ model: - 8 precision: float64 resnet_dt: false - ntypes: 4 + ntypes: 6 env_mat: protection: 1.0e-06 rcut: 6.0 @@ -1766,21 +2251,37 @@ model: use_exp_switch: false env_protection: 1.0e-06 exclude_types: &id003 - - - 3 + - - 4 - 0 - - - 3 + - - 4 - 1 - - - 3 + - - 4 - 2 - - - 3 + - - 4 - 3 + - - 4 + - 4 + - - 4 + - 5 + - - 5 + - 0 + - - 5 + - 1 + - - 5 + - 2 + - - 5 + - 3 + - - 5 + - 4 + - - 5 + - 5 ln_eps: 1.0e-05 neuron: - 2 - 4 - 8 normalize: true - ntypes: 4 + ntypes: 6 precision: float64 rcut: 6.0 rcut_smth: 2.0 @@ -1806,7 +2307,7 @@ model: "@version": 2 activation_function: Linear bias: false - in_dim: 4 + in_dim: 6 layers: - "@class": Layer "@variables": @@ -1818,38 +2319,54 @@ model: "@version": 1 dtype: float64 value: - - - -0.3161547360283977 - - -0.015297581090729784 - - 0.5765215950511243 - - 0.14176442717510646 - - -0.09436943428849595 - - -0.4827490593423835 - - -0.26022683704566674 - - -0.07816101487288045 - - - -0.03219910522911867 - - 0.14525736197208597 - - 0.4166300988982592 - - -0.11812510347880134 - - 0.1959689339789453 - - 0.14894583593855398 - - -0.4990495825239417 - - 0.11968195360930496 - - - -0.5890592166883595 - - -0.2716541312100993 - - 0.513605963081437 - - -0.12412954486366976 - - 0.21913762000348655 - - 0.16401626404198605 - - 0.2753790827646884 - - 0.12376172086553827 - - - 0.4800974125736142 - - 0.09359562730928006 - - -0.06277151252879534 - - 0.3007427466981146 - - -0.1825693326630776 - - -0.10899015324840414 - - 0.09999385450543531 - - -0.09509565217064518 + - - -0.2927024092533758 + - -0.014162808051698143 + - 0.5337552806512624 + - 0.13124835611145563 + - -0.08736911906845456 + - -0.4469387822854708 + - -0.24092323623711465 + - -0.07236303858793405 + - - -0.029810578815809525 + - 0.13448218535369424 + - 0.3857245197302343 + - -0.1093625950883868 + - 0.18143197800870767 + - 0.1378970486893381 + - -0.4620301342837659 + - 0.11080395823154059 + - - -0.5453628627663579 + - -0.2515028548605599 + - 0.4755067239838334 + - -0.11492162761040413 + - 0.20288201321554736 + - 0.15184955393967264 + - 0.2549514898804775 + - 0.11458108875975528 + - - 0.4444838344094473 + - 0.0866527130137522 + - -0.05811512799228326 + - 0.2784336797539196 + - -0.16902635778153863 + - -0.10090527455466318 + - 0.09257632035486411 + - -0.08804146618056256 + - - -0.5361517594910684 + - -0.5304567668606835 + - 0.013353255324733446 + - 0.09254196348234821 + - 0.020815206464360567 + - 0.2831940642833442 + - -0.0032802268194216514 + - 0.04518720923263511 + - - -0.19075762886775724 + - 0.1670238834313649 + - 0.31687760687930183 + - -0.023313802928756507 + - -0.08946247104463122 + - -0.08622297317524152 + - -0.14368061835507168 + - 0.2766849049027015 "@version": 2 activation_function: Linear bias: false @@ -1863,7 +2380,7 @@ model: resnet_dt: false neuron: - 8 - ntypes: 4 + ntypes: 6 padding: true precision: float64 resnet_dt: false @@ -1871,8 +2388,10 @@ model: type_map: &id001 - Ni - O + - H - Ni_spin - O_spin + - H_spin use_econf_tebd: false use_tebd_bias: false type_map: *id001 @@ -1894,6 +2413,8 @@ model: - - 0.0 - - 0.0 - - 0.0 + - - 0.0 + - - 0.0 case_embd: null fparam_avg: null fparam_inv_std: null @@ -2305,12 +2826,12 @@ model: out_dim: 1 precision: float64 resnet_dt: true - ntypes: 4 + ntypes: 6 neuron: - 5 - 5 - 5 - ntypes: 4 + ntypes: 6 numb_aparam: 0 numb_fparam: 0 precision: float64 @@ -2327,8 +2848,10 @@ model: type_map: - Ni - O + - H - Ni_spin - O_spin + - H_spin use_aparam_as_mask: false var_name: energy pair_exclude_types: *id003 @@ -2338,15 +2861,19 @@ model: type_map: - Ni - O + - H - Ni_spin - O_spin + - H_spin spin: use_spin: - true - false + - false virtual_scale: - 0.314 - 0.0 + - 0.0 type: spin_ener model_def_script: descriptor: @@ -2380,12 +2907,15 @@ model_def_script: use_spin: - true - false + - false virtual_scale: - 0.314 - 0.0 + - 0.0 type_map: - Ni - O + - H software: deepmd-kit -time: "2026-04-04 11:00:14.231903+00:00" +time: "2026-04-04 15:08:00.212056+00:00" version: 3.0.0 diff --git a/source/tests/infer/deeppot_dpa_spin_md1.yaml b/source/tests/infer/deeppot_dpa_spin_md1.yaml index 0c4e134ffb..bebf070303 100644 --- a/source/tests/infer/deeppot_dpa_spin_md1.yaml +++ b/source/tests/infer/deeppot_dpa_spin_md1.yaml @@ -13,6 +13,8 @@ model: - - 0.0 - - 0.0 - - 0.0 + - - 0.0 + - - 0.0 out_std: "@class": np.ndarray "@is_variable": true @@ -23,10 +25,13 @@ model: - - 1.0 - - 1.0 - - 1.0 + - - 1.0 + - - 1.0 "@version": 2 atom_exclude_types: &id002 - - 2 - 3 + - 4 + - 5 descriptor: "@class": Descriptor "@variables": @@ -516,6 +521,246 @@ model: - 0.0 - 0.0 - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 dstd: "@class": np.ndarray "@is_variable": true @@ -1002,6 +1247,246 @@ model: - 1.0 - 1.0 - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 + - - 1.0 + - 1.0 + - 1.0 + - 1.0 "@version": 2 activation_function: tanh attention_layers: @@ -1758,7 +2243,7 @@ model: - 8 precision: float64 resnet_dt: false - ntypes: 4 + ntypes: 6 env_mat: protection: 1.0e-06 rcut: 6.0 @@ -1766,21 +2251,37 @@ model: use_exp_switch: false env_protection: 1.0e-06 exclude_types: &id003 - - - 3 + - - 4 - 0 - - - 3 + - - 4 - 1 - - - 3 + - - 4 - 2 - - - 3 + - - 4 - 3 + - - 4 + - 4 + - - 4 + - 5 + - - 5 + - 0 + - - 5 + - 1 + - - 5 + - 2 + - - 5 + - 3 + - - 5 + - 4 + - - 5 + - 5 ln_eps: 1.0e-05 neuron: - 2 - 4 - 8 normalize: true - ntypes: 4 + ntypes: 6 precision: float64 rcut: 6.0 rcut_smth: 2.0 @@ -1806,7 +2307,7 @@ model: "@version": 2 activation_function: Linear bias: false - in_dim: 4 + in_dim: 6 layers: - "@class": Layer "@variables": @@ -1818,38 +2319,54 @@ model: "@version": 1 dtype: float64 value: - - - 0.020653385621488805 - - 0.1752067402646656 - - 0.5662292560132125 - - 0.0003760753148009615 - - -0.161287498897469 - - 0.18311645742147376 - - 0.14067170321466588 - - -0.07330200862015916 - - - -0.5797430063221342 - - -0.23430216785765115 - - 0.09751594848969031 - - -0.1275282725471455 - - 0.10447577792569906 - - 0.2656998783938816 - - 0.18576344747248152 - - 0.1985024076041842 - - - -0.0015949275573732497 - - 0.1080567257619322 - - -0.3140326336613265 - - 0.34154803569918485 - - 0.46133209448956636 - - 0.23825678017091026 - - 0.0169393325427759 - - -0.19905570862776645 - - - -0.34614238555389887 - - -0.5554733591522888 - - 0.0554747771493338 - - -0.22776097630122913 - - -0.19790905891562305 - - -0.067880792892441 - - 0.013701852102543422 - - 0.7947302028726797 + - - 0.019121319536727743 + - 0.1622099217526562 + - 0.52422642629629 + - 0.0003481780854710199 + - -0.14932320832132 + - 0.16953289687994497 + - 0.13023669030537668 + - -0.06786447293424418 + - - -0.5367377279555972 + - -0.21692165642289568 + - 0.09028222516014006 + - -0.11806823801341935 + - 0.09672577514298564 + - 0.2459902879241782 + - 0.17198353347306597 + - 0.18377751881319745 + - - -0.0014766159902972935 + - 0.1000410886260073 + - -0.2907377242281664 + - 0.3162120364881382 + - 0.4271105257486104 + - 0.22058291598931898 + - 0.01568277454483321 + - -0.18428977602205465 + - - -0.3204655779290196 + - -0.5142684007913663 + - 0.05135966371525627 + - -0.21086568980349768 + - -0.18322818467115387 + - -0.06284540244831963 + - 0.012685450080645493 + - 0.7357771957158443 + - - 0.11857625691428302 + - 0.267816433264396 + - 0.45158171239301803 + - -0.2714794645199128 + - 0.37071886022802414 + - 0.12196019501846228 + - 0.08852737862760002 + - 0.2852190944801097 + - - 0.06018288011343084 + - -0.39027247236445695 + - -0.12053609546119343 + - -0.36430465334314277 + - -0.03307079734770386 + - 0.03239794425444641 + - 0.18978829125202099 + - -0.05638835726844023 "@version": 2 activation_function: Linear bias: false @@ -1863,7 +2380,7 @@ model: resnet_dt: false neuron: - 8 - ntypes: 4 + ntypes: 6 padding: true precision: float64 resnet_dt: false @@ -1871,8 +2388,10 @@ model: type_map: &id001 - Ni - O + - H - Ni_spin - O_spin + - H_spin use_econf_tebd: false use_tebd_bias: false type_map: *id001 @@ -1894,6 +2413,8 @@ model: - - 0.0 - - 0.0 - - 0.0 + - - 0.0 + - - 0.0 case_embd: null fparam_avg: null fparam_inv_std: null @@ -2305,12 +2826,12 @@ model: out_dim: 1 precision: float64 resnet_dt: true - ntypes: 4 + ntypes: 6 neuron: - 5 - 5 - 5 - ntypes: 4 + ntypes: 6 numb_aparam: 0 numb_fparam: 0 precision: float64 @@ -2327,8 +2848,10 @@ model: type_map: - Ni - O + - H - Ni_spin - O_spin + - H_spin use_aparam_as_mask: false var_name: energy pair_exclude_types: *id003 @@ -2338,15 +2861,19 @@ model: type_map: - Ni - O + - H - Ni_spin - O_spin + - H_spin spin: use_spin: - true - false + - false virtual_scale: - 0.314 - 0.0 + - 0.0 type: spin_ener model_def_script: descriptor: @@ -2380,12 +2907,15 @@ model_def_script: use_spin: - true - false + - false virtual_scale: - 0.314 - 0.0 + - 0.0 type_map: - Ni - O + - H software: deepmd-kit -time: "2026-04-04 11:00:14.262957+00:00" +time: "2026-04-04 15:08:00.247584+00:00" version: 3.0.0 diff --git a/source/tests/infer/gen_spin.py b/source/tests/infer/gen_spin.py index e8d0329011..3053e0ad4f 100644 --- a/source/tests/infer/gen_spin.py +++ b/source/tests/infer/gen_spin.py @@ -39,7 +39,7 @@ def _build_yaml(yaml_path: str) -> None: ) config = { - "type_map": ["Ni", "O"], + "type_map": ["Ni", "O", "H"], "descriptor": { "type": "se_atten", "sel": 30, @@ -64,8 +64,8 @@ def _build_yaml(yaml_path: str) -> None: "seed": 1, }, "spin": { - "use_spin": [True, False], - "virtual_scale": [0.3140, 0.0], + "use_spin": [True, False, False], + "virtual_scale": [0.3140, 0.0, 0.0], }, } diff --git a/source/tests/infer/gen_spin_model_devi.py b/source/tests/infer/gen_spin_model_devi.py index eec2fe56ab..3dc5240e14 100644 --- a/source/tests/infer/gen_spin_model_devi.py +++ b/source/tests/infer/gen_spin_model_devi.py @@ -29,7 +29,7 @@ # Model config (same architecture as gen_spin.py, different seeds) _BASE_CONFIG = { - "type_map": ["Ni", "O"], + "type_map": ["Ni", "O", "H"], "descriptor": { "type": "se_atten", "sel": 30, @@ -52,8 +52,8 @@ "resnet_dt": True, }, "spin": { - "use_spin": [True, False], - "virtual_scale": [0.3140, 0.0], + "use_spin": [True, False, False], + "virtual_scale": [0.3140, 0.0, 0.0], }, } From 703d9939a32da222f6f586486e4df18b60061039 Mon Sep 17 00:00:00 2001 From: Han Wang Date: Sun, 5 Apr 2026 00:26:44 +0800 Subject: [PATCH 06/13] fix(api_cc): shift NoPBC coordinates into synthetic box in DeepSpinPTExpt Add coordinate shift in the NoPBC code path of DeepSpinPTExpt::compute, matching the existing logic in DeepPotPTExpt. Without the shift, negative or out-of-box coordinates could produce incorrect neighbor lists via copy_coord. --- source/api_cc/src/DeepSpinPTExpt.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/api_cc/src/DeepSpinPTExpt.cc b/source/api_cc/src/DeepSpinPTExpt.cc index 8a0169d7f8..ae4ef423ed 100644 --- a/source/api_cc/src/DeepSpinPTExpt.cc +++ b/source/api_cc/src/DeepSpinPTExpt.cc @@ -495,6 +495,7 @@ void DeepSpinPTExpt::compute(ENERGYVTYPE& ener, std::vector spin_d(spin.begin(), spin.end()); std::vector box_d(box.begin(), box.end()); if (box_d.empty()) { + // Create a fake orthorhombic box that contains all atoms with margin double min_x = coord_d[0], max_x = coord_d[0]; double min_y = coord_d[1], max_y = coord_d[1]; double min_z = coord_d[2], max_z = coord_d[2]; @@ -506,6 +507,15 @@ void DeepSpinPTExpt::compute(ENERGYVTYPE& ener, min_z = std::min(min_z, coord_d[ii * 3 + 2]); max_z = std::max(max_z, coord_d[ii * 3 + 2]); } + // Shift coords so minimum is at rcut (ensures all atoms are in [0, L)) + double shift_x = rcut - min_x; + double shift_y = rcut - min_y; + double shift_z = rcut - min_z; + for (int ii = 0; ii < natoms; ++ii) { + coord_d[ii * 3 + 0] += shift_x; + coord_d[ii * 3 + 1] += shift_y; + coord_d[ii * 3 + 2] += shift_z; + } box_d.resize(9, 0.0); box_d[0] = (max_x - min_x) + 2.0 * rcut; box_d[4] = (max_y - min_y) + 2.0 * rcut; From 6e048efa89e91ec4abd60ad0ddac4b790f0a3f8a Mon Sep 17 00:00:00 2001 From: Han Wang Date: Sun, 5 Apr 2026 01:01:01 +0800 Subject: [PATCH 07/13] fix(pt_expt): add default_fparam fallback for both .pt2 and .pte Both _eval_model() and _eval_model_spin() guarded the default_fparam fallback with self._is_pt2, but .pte models also export fparam as a required positional input when dim_fparam > 0. Passing None crashes with "NoneType has no attribute size". Remove the _is_pt2 guard so the fallback applies to both .pt2 and .pte. Add TestSpinDefaultFparam test covering both formats. --- deepmd/pt_expt/infer/deep_eval.py | 22 ++++++- .../pt_expt/infer/test_deep_eval_spin.py | 60 +++++++++++++++++++ 2 files changed, 79 insertions(+), 3 deletions(-) diff --git a/deepmd/pt_expt/infer/deep_eval.py b/deepmd/pt_expt/infer/deep_eval.py index 98cad6e666..4ea5700533 100644 --- a/deepmd/pt_expt/infer/deep_eval.py +++ b/deepmd/pt_expt/infer/deep_eval.py @@ -670,9 +670,9 @@ def _eval_model( dtype=torch.float64, device=DEVICE, ) - elif self._is_pt2 and self.get_dim_fparam() > 0: - # .pt2 models are compiled with fparam as a required input. - # When the user omits fparam, fill with default values from metadata. + elif self.get_dim_fparam() > 0: + # Exported models (.pt2/.pte) are compiled with fparam as a + # required input. Fill with default values from metadata. default_fp = self.metadata.get("default_fparam") if default_fp is not None: fparam_t = ( @@ -808,6 +808,22 @@ def _eval_model_spin( dtype=torch.float64, device=DEVICE, ) + elif self.get_dim_fparam() > 0: + # Exported models (.pt2/.pte) are compiled with fparam as a + # required input. Fill with default values from metadata. + default_fp = self.metadata.get("default_fparam") + if default_fp is not None: + fparam_t = ( + torch.tensor(default_fp, dtype=torch.float64, device=DEVICE) + .unsqueeze(0) + .expand(nframes, -1) + .contiguous() + ) + else: + raise ValueError( + f"fparam is required for this model (dim_fparam={self.get_dim_fparam()}) " + "but was not provided, and no default_fparam is stored in the model." + ) else: fparam_t = None diff --git a/source/tests/pt_expt/infer/test_deep_eval_spin.py b/source/tests/pt_expt/infer/test_deep_eval_spin.py index 69cebc8365..1a4a26eb56 100644 --- a/source/tests/pt_expt/infer/test_deep_eval_spin.py +++ b/source/tests/pt_expt/infer/test_deep_eval_spin.py @@ -321,3 +321,63 @@ def test_eval_nopbc_nonatomic(self, spin_model_files, ext) -> None: rtol=1e-10, atol=1e-10, ) + + +SPIN_FPARAM_CONFIG = copy.deepcopy(SPIN_CONFIG) +SPIN_FPARAM_CONFIG["fitting_net"]["numb_fparam"] = 1 +SPIN_FPARAM_CONFIG["fitting_net"]["default_fparam"] = [0.5] + + +@pytest.fixture(scope="module") +def spin_fparam_model_files(): + """Create .pt2 and .pte spin model files with default fparam.""" + dp_model = get_model_dp(copy.deepcopy(SPIN_FPARAM_CONFIG)) + model_dict = dp_model.serialize() + data = { + "model": model_dict, + "model_def_script": SPIN_FPARAM_CONFIG, + "backend": "dpmodel", + "software": "deepmd-kit", + "version": "3.0.0", + } + files = {} + tmpdir = tempfile.mkdtemp() + for ext in (".pt2", ".pte"): + path = os.path.join(tmpdir, f"spin_fparam_test{ext}") + deserialize_to_file(path, copy.deepcopy(data)) + files[ext] = path + yield files + for path in files.values(): + if os.path.exists(path): + os.unlink(path) + os.rmdir(tmpdir) + + +@pytest.mark.parametrize("ext", [".pt2", ".pte"]) # model format +class TestSpinDefaultFparam: + """Test spin model with default_fparam via DeepPot API.""" + + def test_eval_without_fparam_matches_explicit( + self, spin_fparam_model_files, ext + ) -> None: + """Eval without fparam should use default and match explicit fparam.""" + from deepmd.infer import ( + DeepPot, + ) + + files = spin_fparam_model_files + dp = DeepPot(files[ext]) + + # Eval WITHOUT fparam — should use default_fparam=[0.5] + e_no, f_no, v_no, fm_no, mm_no = dp.eval( + COORD, BOX, ATYPE, atomic=False, spin=SPIN + ) + # Eval WITH explicit fparam=[0.5] + e_ex, f_ex, v_ex, fm_ex, mm_ex = dp.eval( + COORD, BOX, ATYPE, atomic=False, spin=SPIN, fparam=[0.5] + ) + + np.testing.assert_allclose(e_no, e_ex, atol=1e-10) + np.testing.assert_allclose(f_no, f_ex, atol=1e-10) + np.testing.assert_allclose(v_no, v_ex, atol=1e-10) + np.testing.assert_allclose(fm_no, fm_ex, atol=1e-10) From 0ff88be3f65ca3f0c09afee19a06264b853b4836 Mon Sep 17 00:00:00 2001 From: Han Wang Date: Sun, 5 Apr 2026 01:32:08 +0800 Subject: [PATCH 08/13] feat(pt_expt): validate spin/model consistency and add aparam/fparam tests - Raise ValueError when spin model is called without spin input or non-spin model is called with spin input - Add test_eval_spin_model_requires_spin for both .pt2/.pte - Add test_nonspin_model_rejects_spin for .pt2 - Add TestSpinAparam: verify aparam takes effect at eager model level (torch.export doesn't support dynamic nframes with aparam yet) - Add test_pte_eval_default_fparam: extend default_fparam coverage to .pte --- deepmd/pt_expt/infer/deep_eval.py | 10 ++++ .../pt_expt/infer/test_deep_eval_spin.py | 56 +++++++++++++++++++ source/tests/pt_expt/test_dp_freeze.py | 39 +++++++++++-- 3 files changed, 100 insertions(+), 5 deletions(-) diff --git a/deepmd/pt_expt/infer/deep_eval.py b/deepmd/pt_expt/infer/deep_eval.py index 4ea5700533..0fddc01205 100644 --- a/deepmd/pt_expt/infer/deep_eval.py +++ b/deepmd/pt_expt/infer/deep_eval.py @@ -324,6 +324,16 @@ def eval( ) request_defs = self._get_request_defs(atomic) spins = kwargs.get("spin") + if self._is_spin and spins is None: + raise ValueError( + "This is a spin model but no `spin` argument was provided. " + "Please call eval(..., spin=spin_array)." + ) + if not self._is_spin and spins is not None: + raise ValueError( + "This is not a spin model but a `spin` argument was provided. " + "Please call eval(...) without the `spin` argument." + ) if spins is not None: spins = np.array(spins) out = self._eval_func(self._eval_model_spin, numb_test, natoms)( diff --git a/source/tests/pt_expt/infer/test_deep_eval_spin.py b/source/tests/pt_expt/infer/test_deep_eval_spin.py index 1a4a26eb56..c15fa73fb6 100644 --- a/source/tests/pt_expt/infer/test_deep_eval_spin.py +++ b/source/tests/pt_expt/infer/test_deep_eval_spin.py @@ -198,6 +198,17 @@ def test_get_ntypes_spin(self, spin_model_files, ext) -> None: dp = DeepPot(files[ext]) assert dp.get_ntypes_spin() == 0 + def test_eval_spin_model_requires_spin(self, spin_model_files, ext) -> None: + """Spin model must raise ValueError when spin is not provided.""" + from deepmd.infer import ( + DeepPot, + ) + + files, _, _ = spin_model_files + dp = DeepPot(files[ext]) + with pytest.raises(ValueError, match="no `spin` argument was provided"): + dp.eval(COORD, BOX, ATYPE) + def test_eval_pbc_atomic(self, spin_model_files, ext) -> None: """Test PBC evaluation with atomic=True.""" from deepmd.infer import ( @@ -381,3 +392,48 @@ def test_eval_without_fparam_matches_explicit( np.testing.assert_allclose(f_no, f_ex, atol=1e-10) np.testing.assert_allclose(v_no, v_ex, atol=1e-10) np.testing.assert_allclose(fm_no, fm_ex, atol=1e-10) + + +SPIN_APARAM_CONFIG = copy.deepcopy(SPIN_CONFIG) +SPIN_APARAM_CONFIG["fitting_net"]["numb_aparam"] = 2 + + +class TestSpinAparam: + """Test spin model with aparam at the eager model level. + + torch.export currently does not support dynamic nframes with aparam, + so we test at the eager pt_expt model level instead of via .pt2/.pte. + """ + + def test_aparam_takes_effect(self) -> None: + """Verify that different aparam values produce different outputs.""" + dp_model = get_model_dp(copy.deepcopy(SPIN_APARAM_CONFIG)) + pt_model = SpinEnergyModel.deserialize(dp_model.serialize()).to(env.DEVICE) + pt_model.eval() + + natoms = len(ATYPE) + coord_t = torch.tensor( + COORD.reshape(1, natoms, 3), dtype=torch.float64, device=env.DEVICE + ) + coord_t.requires_grad_(True) + atype_t = torch.tensor([ATYPE], dtype=torch.int64, device=env.DEVICE) + spin_t = torch.tensor( + SPIN.reshape(1, natoms, 3), dtype=torch.float64, device=env.DEVICE + ) + box_t = torch.tensor(BOX.reshape(1, 9), dtype=torch.float64, device=env.DEVICE) + + aparam_zero = torch.zeros(1, natoms, 2, dtype=torch.float64, device=env.DEVICE) + aparam_nonzero = torch.full( + (1, natoms, 2), 0.5, dtype=torch.float64, device=env.DEVICE + ) + + ret0 = pt_model(coord_t, atype_t, spin_t, box_t, aparam=aparam_zero) + ret1 = pt_model(coord_t, atype_t, spin_t, box_t, aparam=aparam_nonzero) + + e0 = ret0["energy"].detach().cpu().numpy() + e1 = ret1["energy"].detach().cpu().numpy() + + # Different aparam must produce different energy + assert not np.allclose(e0, e1), ( + "Changing aparam did not change output — aparam may be ignored" + ) diff --git a/source/tests/pt_expt/test_dp_freeze.py b/source/tests/pt_expt/test_dp_freeze.py index 60eab4f50a..97c742ab8c 100644 --- a/source/tests/pt_expt/test_dp_freeze.py +++ b/source/tests/pt_expt/test_dp_freeze.py @@ -193,6 +193,29 @@ def test_freeze_pt2_nopbc_negative_coords(self) -> None: np.testing.assert_allclose(f_pte, f_pt2, atol=1e-10) np.testing.assert_allclose(v_pte, v_pt2, atol=1e-10) + def test_nonspin_model_rejects_spin(self) -> None: + """Non-spin model must raise ValueError when spin is provided.""" + import numpy as np + + from deepmd.infer import ( + DeepPot, + ) + + pt2_path = os.path.join(self.tmpdir, "nonspin_reject.pt2") + freeze(model=self.ckpt_file, output=pt2_path) + + coord = np.array( + [0.0, 0.0, 0.1, 1.0, 0.3, 0.2, 0.1, 1.9, 3.4], + dtype=np.float64, + ) + box = np.array([5.0, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 5.0], dtype=np.float64) + atype = [0, 1, 2] + spin = np.zeros(9, dtype=np.float64) + + dp = DeepPot(pt2_path) + with self.assertRaises(ValueError): + dp.eval(coord, box, atype, spin=spin) + class TestDPFreezePt2DefaultFparam(unittest.TestCase): """Test .pt2 with default fparam — eval without providing fparam.""" @@ -214,16 +237,16 @@ def setUpClass(cls) -> None: def tearDownClass(cls) -> None: shutil.rmtree(cls.tmpdir) - def test_pt2_eval_default_fparam(self) -> None: - """Eval .pt2 without fparam should match eval with explicit default value.""" + def _test_eval_default_fparam(self, ext) -> None: + """Eval without fparam should match eval with explicit default value.""" import numpy as np from deepmd.infer import ( DeepPot, ) - pt2_path = os.path.join(self.tmpdir, "dfp.pt2") - freeze(model=self.ckpt_file, output=pt2_path) + out_path = os.path.join(self.tmpdir, f"dfp{ext}") + freeze(model=self.ckpt_file, output=out_path) coord = np.array( [0.0, 0.0, 0.1, 1.0, 0.3, 0.2, 0.1, 1.9, 3.4], @@ -232,7 +255,7 @@ def test_pt2_eval_default_fparam(self) -> None: box = np.array([5.0, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 5.0], dtype=np.float64) atype = [0, 1, 2] - dp = DeepPot(pt2_path) + dp = DeepPot(out_path) # Eval WITHOUT fparam — model should use default (0.5) e_no, f_no, v_no = dp.eval(coord, box, atype) @@ -243,6 +266,12 @@ def test_pt2_eval_default_fparam(self) -> None: np.testing.assert_allclose(f_no, f_ex, atol=1e-10) np.testing.assert_allclose(v_no, v_ex, atol=1e-10) + def test_pt2_eval_default_fparam(self) -> None: + self._test_eval_default_fparam(".pt2") + + def test_pte_eval_default_fparam(self) -> None: + self._test_eval_default_fparam(".pte") + if __name__ == "__main__": unittest.main() From e453b36fe0fdbac9ed5c06c233232b778391f28c Mon Sep 17 00:00:00 2001 From: Han Wang Date: Sun, 5 Apr 2026 14:06:26 +0800 Subject: [PATCH 09/13] fix(pt_expt): support aparam in .pt2/.pte export and eval - Fix torch.export duck-sizing collision: choose sample nframes that doesn't match any other tensor dimension, preventing spurious guards that lock nframes to a constant - Add aparam validation in eval: raise ValueError when dim_aparam > 0 but aparam is not provided (both spin and non-spin paths) - Upgrade TestSpinAparam to test through .pt2/.pte (was eager-only) - Add test_eval_without_aparam_raises for both .pt2/.pte --- deepmd/pt_expt/infer/deep_eval.py | 12 +++ deepmd/pt_expt/utils/serialization.py | 19 ++++- .../pt_expt/infer/test_deep_eval_spin.py | 80 ++++++++++++------- 3 files changed, 82 insertions(+), 29 deletions(-) diff --git a/deepmd/pt_expt/infer/deep_eval.py b/deepmd/pt_expt/infer/deep_eval.py index 0fddc01205..72f24c3ef5 100644 --- a/deepmd/pt_expt/infer/deep_eval.py +++ b/deepmd/pt_expt/infer/deep_eval.py @@ -705,6 +705,13 @@ def _eval_model( dtype=torch.float64, device=DEVICE, ) + elif self.get_dim_aparam() > 0: + # Exported models (.pt2/.pte) are compiled with aparam as a + # required positional input. Unlike fparam, there is no default. + raise ValueError( + f"aparam is required for this model (dim_aparam={self.get_dim_aparam()}) " + "but was not provided." + ) else: aparam_t = None @@ -843,6 +850,11 @@ def _eval_model_spin( dtype=torch.float64, device=DEVICE, ) + elif self.get_dim_aparam() > 0: + raise ValueError( + f"aparam is required for this model (dim_aparam={self.get_dim_aparam()}) " + "but was not provided." + ) else: aparam_t = None diff --git a/deepmd/pt_expt/utils/serialization.py b/deepmd/pt_expt/utils/serialization.py index 1119cfa49b..2eb83b5f6c 100644 --- a/deepmd/pt_expt/utils/serialization.py +++ b/deepmd/pt_expt/utils/serialization.py @@ -395,11 +395,26 @@ def _trace_and_export( metadata = _collect_metadata(model, is_spin=is_spin) # 3. Create sample inputs on CPU for tracing - # Use nframes=2 so make_fx doesn't specialize on nframes=1 + # torch.export's duck-sizing unifies dimensions with the same sample value, + # so nframes must differ from every other dimension in the sample tensors. + # We first build with nframes=2, collect all non-batch dimension sizes, + # then rebuild if there is a collision. _orig_device = _env.DEVICE _env.DEVICE = torch.device("cpu") try: - sample_inputs = _make_sample_inputs(model, nframes=2, has_spin=is_spin) + nframes = 2 + sample_inputs = _make_sample_inputs(model, nframes=nframes, has_spin=is_spin) + # Collect all dimension sizes except dim-0 (nframes) from every tensor + other_dims: set[int] = set() + for t in sample_inputs: + if t is not None: + other_dims.update(t.shape[1:]) + while nframes in other_dims: + nframes += 1 + if nframes != 2: + sample_inputs = _make_sample_inputs( + model, nframes=nframes, has_spin=is_spin + ) finally: _env.DEVICE = _orig_device diff --git a/source/tests/pt_expt/infer/test_deep_eval_spin.py b/source/tests/pt_expt/infer/test_deep_eval_spin.py index c15fa73fb6..64eb169dc9 100644 --- a/source/tests/pt_expt/infer/test_deep_eval_spin.py +++ b/source/tests/pt_expt/infer/test_deep_eval_spin.py @@ -398,42 +398,68 @@ def test_eval_without_fparam_matches_explicit( SPIN_APARAM_CONFIG["fitting_net"]["numb_aparam"] = 2 -class TestSpinAparam: - """Test spin model with aparam at the eager model level. +@pytest.fixture(scope="module") +def spin_aparam_model_files(): + """Create .pt2 and .pte spin model files with aparam.""" + dp_model = get_model_dp(copy.deepcopy(SPIN_APARAM_CONFIG)) + model_dict = dp_model.serialize() + data = { + "model": model_dict, + "model_def_script": SPIN_APARAM_CONFIG, + "backend": "dpmodel", + "software": "deepmd-kit", + "version": "3.0.0", + } + files = {} + tmpdir = tempfile.mkdtemp() + for ext in (".pt2", ".pte"): + path = os.path.join(tmpdir, f"spin_aparam_test{ext}") + deserialize_to_file(path, copy.deepcopy(data)) + files[ext] = path + yield files + for path in files.values(): + if os.path.exists(path): + os.unlink(path) + os.rmdir(tmpdir) - torch.export currently does not support dynamic nframes with aparam, - so we test at the eager pt_expt model level instead of via .pt2/.pte. - """ - def test_aparam_takes_effect(self) -> None: - """Verify that different aparam values produce different outputs.""" - dp_model = get_model_dp(copy.deepcopy(SPIN_APARAM_CONFIG)) - pt_model = SpinEnergyModel.deserialize(dp_model.serialize()).to(env.DEVICE) - pt_model.eval() +@pytest.mark.parametrize("ext", [".pt2", ".pte"]) # model format +class TestSpinAparam: + """Test spin model with aparam via DeepPot API (.pt2/.pte).""" - natoms = len(ATYPE) - coord_t = torch.tensor( - COORD.reshape(1, natoms, 3), dtype=torch.float64, device=env.DEVICE - ) - coord_t.requires_grad_(True) - atype_t = torch.tensor([ATYPE], dtype=torch.int64, device=env.DEVICE) - spin_t = torch.tensor( - SPIN.reshape(1, natoms, 3), dtype=torch.float64, device=env.DEVICE + def test_aparam_takes_effect(self, spin_aparam_model_files, ext) -> None: + """Verify that different aparam values produce different outputs.""" + from deepmd.infer import ( + DeepPot, ) - box_t = torch.tensor(BOX.reshape(1, 9), dtype=torch.float64, device=env.DEVICE) - aparam_zero = torch.zeros(1, natoms, 2, dtype=torch.float64, device=env.DEVICE) - aparam_nonzero = torch.full( - (1, natoms, 2), 0.5, dtype=torch.float64, device=env.DEVICE - ) + files = spin_aparam_model_files + dp = DeepPot(files[ext]) + natoms = len(ATYPE) - ret0 = pt_model(coord_t, atype_t, spin_t, box_t, aparam=aparam_zero) - ret1 = pt_model(coord_t, atype_t, spin_t, box_t, aparam=aparam_nonzero) + aparam_zero = np.zeros(natoms * 2, dtype=np.float64) + aparam_nonzero = np.full(natoms * 2, 0.5, dtype=np.float64) - e0 = ret0["energy"].detach().cpu().numpy() - e1 = ret1["energy"].detach().cpu().numpy() + e0, f0, v0, fm0, mm0 = dp.eval( + COORD, BOX, ATYPE, atomic=False, spin=SPIN, aparam=aparam_zero + ) + e1, f1, v1, fm1, mm1 = dp.eval( + COORD, BOX, ATYPE, atomic=False, spin=SPIN, aparam=aparam_nonzero + ) # Different aparam must produce different energy assert not np.allclose(e0, e1), ( "Changing aparam did not change output — aparam may be ignored" ) + + def test_eval_without_aparam_raises(self, spin_aparam_model_files, ext) -> None: + """Model with dim_aparam > 0 must raise when aparam not provided.""" + from deepmd.infer import ( + DeepPot, + ) + + files = spin_aparam_model_files + dp = DeepPot(files[ext]) + + with pytest.raises(ValueError, match="aparam is required"): + dp.eval(COORD, BOX, ATYPE, atomic=False, spin=SPIN) From 590244a5136f6e8e4f1a509b1ec47b91fb4caa9d Mon Sep 17 00:00:00 2001 From: Han Wang Date: Sun, 5 Apr 2026 15:58:06 +0800 Subject: [PATCH 10/13] test(pt_expt): move fparam/aparam inference tests to test_deep_eval.py Move default_fparam and aparam tests from test_dp_freeze.py (freeze entrypoint tests) to test_deep_eval.py (inference tests) where they belong. Add .pte and .pt2 test classes for both, with consistency checks against eager model forward and cross-format comparison. --- source/tests/pt_expt/infer/test_deep_eval.py | 436 +++++++++++++++++++ source/tests/pt_expt/test_dp_freeze.py | 56 --- 2 files changed, 436 insertions(+), 56 deletions(-) diff --git a/source/tests/pt_expt/infer/test_deep_eval.py b/source/tests/pt_expt/infer/test_deep_eval.py index 15516ffb55..f0bef34cf8 100644 --- a/source/tests/pt_expt/infer/test_deep_eval.py +++ b/source/tests/pt_expt/infer/test_deep_eval.py @@ -863,5 +863,441 @@ def test_pt2_vs_pte_consistency(self) -> None: ) +class TestDeepEvalEnerDefaultFparam(unittest.TestCase): + """Test .pte inference with default fparam (non-spin model).""" + + @classmethod + def setUpClass(cls) -> None: + cls.rcut = 4.0 + cls.rcut_smth = 0.5 + cls.sel = [8, 6] + cls.nt = 2 + cls.type_map = ["foo", "bar"] + cls.numb_fparam = 1 + cls.default_fparam = [0.5] + + ds = DescrptSeA(cls.rcut, cls.rcut_smth, cls.sel) + ft = EnergyFittingNet( + cls.nt, + ds.get_dim_out(), + mixed_types=ds.mixed_types(), + numb_fparam=cls.numb_fparam, + default_fparam=cls.default_fparam, + seed=GLOBAL_SEED, + ) + cls.model = EnergyModel(ds, ft, type_map=cls.type_map) + cls.model = cls.model.to(torch.float64) + cls.model.eval() + + cls.model_data = {"model": cls.model.serialize()} + cls.tmpfile = tempfile.NamedTemporaryFile(suffix=".pte", delete=False) + cls.tmpfile.close() + deserialize_to_file(cls.tmpfile.name, cls.model_data) + + cls.dp = DeepPot(cls.tmpfile.name) + + @classmethod + def tearDownClass(cls) -> None: + import os + + os.unlink(cls.tmpfile.name) + + def test_get_dim_fparam(self) -> None: + self.assertEqual(self.dp.deep_eval.get_dim_fparam(), self.numb_fparam) + + def test_eval_without_fparam_matches_explicit(self) -> None: + """Eval without fparam should use default and match explicit fparam.""" + rng = np.random.default_rng(GLOBAL_SEED) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + + # Eval WITHOUT fparam — should use default_fparam=[0.5] + e_no, f_no, v_no = self.dp.eval(coords, cells, atom_types) + # Eval WITH explicit fparam=[0.5] + e_ex, f_ex, v_ex = self.dp.eval( + coords, cells, atom_types, fparam=self.default_fparam + ) + + np.testing.assert_allclose(e_no, e_ex, atol=1e-10) + np.testing.assert_allclose(f_no, f_ex, atol=1e-10) + np.testing.assert_allclose(v_no, v_ex, atol=1e-10) + + def test_fparam_takes_effect(self) -> None: + """Different fparam values must produce different outputs.""" + rng = np.random.default_rng(GLOBAL_SEED) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + + e0, f0, v0 = self.dp.eval(coords, cells, atom_types, fparam=[0.0]) + e1, f1, v1 = self.dp.eval(coords, cells, atom_types, fparam=[1.0]) + + assert not np.allclose(e0, e1), ( + "Changing fparam did not change output — fparam may be ignored" + ) + + +class TestDeepEvalEnerDefaultFparamPt2(unittest.TestCase): + """Test .pt2 inference with default fparam (non-spin model).""" + + @classmethod + def setUpClass(cls) -> None: + cls.rcut = 4.0 + cls.rcut_smth = 0.5 + cls.sel = [8, 6] + cls.nt = 2 + cls.type_map = ["foo", "bar"] + cls.numb_fparam = 1 + cls.default_fparam = [0.5] + + ds = DescrptSeA(cls.rcut, cls.rcut_smth, cls.sel) + ft = EnergyFittingNet( + cls.nt, + ds.get_dim_out(), + mixed_types=ds.mixed_types(), + numb_fparam=cls.numb_fparam, + default_fparam=cls.default_fparam, + seed=GLOBAL_SEED, + ) + cls.model = EnergyModel(ds, ft, type_map=cls.type_map) + cls.model = cls.model.to(torch.float64) + cls.model.eval() + + cls.model_data = {"model": cls.model.serialize()} + cls.tmpfile = tempfile.NamedTemporaryFile(suffix=".pt2", delete=False) + cls.tmpfile.close() + torch.set_default_device(None) + try: + deserialize_to_file(cls.tmpfile.name, cls.model_data) + finally: + torch.set_default_device("cuda:9999999") + + # Also save .pte for cross-format comparison + cls.pte_tmpfile = tempfile.NamedTemporaryFile(suffix=".pte", delete=False) + cls.pte_tmpfile.close() + deserialize_to_file(cls.pte_tmpfile.name, cls.model_data) + + cls.dp = DeepPot(cls.tmpfile.name) + cls.dp_pte = DeepPot(cls.pte_tmpfile.name) + + @classmethod + def tearDownClass(cls) -> None: + import os + + os.unlink(cls.tmpfile.name) + os.unlink(cls.pte_tmpfile.name) + + def test_get_dim_fparam(self) -> None: + self.assertEqual(self.dp.deep_eval.get_dim_fparam(), self.numb_fparam) + + def test_eval_without_fparam_matches_explicit(self) -> None: + """Eval without fparam should use default and match explicit fparam.""" + rng = np.random.default_rng(GLOBAL_SEED) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + + e_no, f_no, v_no = self.dp.eval(coords, cells, atom_types) + e_ex, f_ex, v_ex = self.dp.eval( + coords, cells, atom_types, fparam=self.default_fparam + ) + + np.testing.assert_allclose(e_no, e_ex, atol=1e-10) + np.testing.assert_allclose(f_no, f_ex, atol=1e-10) + np.testing.assert_allclose(v_no, v_ex, atol=1e-10) + + def test_fparam_takes_effect(self) -> None: + """Different fparam values must produce different outputs.""" + rng = np.random.default_rng(GLOBAL_SEED) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + + e0, f0, v0 = self.dp.eval(coords, cells, atom_types, fparam=[0.0]) + e1, f1, v1 = self.dp.eval(coords, cells, atom_types, fparam=[1.0]) + + assert not np.allclose(e0, e1), ( + "Changing fparam did not change output — fparam may be ignored" + ) + + def test_pt2_vs_pte_consistency(self) -> None: + """Outputs from .pt2 with default fparam should match .pte.""" + rng = np.random.default_rng(GLOBAL_SEED + 19) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + + # Both use default fparam (no explicit fparam) + e1, f1, v1 = self.dp.eval(coords, cells, atom_types) + e2, f2, v2 = self.dp_pte.eval(coords, cells, atom_types) + + np.testing.assert_allclose(e1, e2, rtol=1e-10, atol=1e-10, err_msg="energy") + np.testing.assert_allclose(f1, f2, rtol=1e-10, atol=1e-10, err_msg="force") + np.testing.assert_allclose(v1, v2, rtol=1e-10, atol=1e-10, err_msg="virial") + + +class TestDeepEvalEnerAparam(unittest.TestCase): + """Test .pte inference with aparam (non-spin model).""" + + @classmethod + def setUpClass(cls) -> None: + cls.rcut = 4.0 + cls.rcut_smth = 0.5 + cls.sel = [8, 6] + cls.nt = 2 + cls.type_map = ["foo", "bar"] + cls.numb_aparam = 2 + + ds = DescrptSeA(cls.rcut, cls.rcut_smth, cls.sel) + ft = EnergyFittingNet( + cls.nt, + ds.get_dim_out(), + mixed_types=ds.mixed_types(), + numb_aparam=cls.numb_aparam, + seed=GLOBAL_SEED, + ) + cls.model = EnergyModel(ds, ft, type_map=cls.type_map) + cls.model = cls.model.to(torch.float64) + cls.model.eval() + + cls.model_data = {"model": cls.model.serialize()} + cls.tmpfile = tempfile.NamedTemporaryFile(suffix=".pte", delete=False) + cls.tmpfile.close() + deserialize_to_file(cls.tmpfile.name, cls.model_data) + + cls.dp = DeepPot(cls.tmpfile.name) + + @classmethod + def tearDownClass(cls) -> None: + import os + + os.unlink(cls.tmpfile.name) + + def test_get_dim_aparam(self) -> None: + self.assertEqual(self.dp.deep_eval.get_dim_aparam(), self.numb_aparam) + + def test_aparam_takes_effect(self) -> None: + """Different aparam values must produce different outputs.""" + rng = np.random.default_rng(GLOBAL_SEED) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + + aparam_zero = np.zeros(natoms * self.numb_aparam, dtype=np.float64) + aparam_nonzero = np.full(natoms * self.numb_aparam, 0.5, dtype=np.float64) + + e0, f0, v0 = self.dp.eval(coords, cells, atom_types, aparam=aparam_zero) + e1, f1, v1 = self.dp.eval(coords, cells, atom_types, aparam=aparam_nonzero) + + assert not np.allclose(e0, e1), ( + "Changing aparam did not change output — aparam may be ignored" + ) + + def test_eval_without_aparam_raises(self) -> None: + """Model with dim_aparam > 0 must raise when aparam not provided.""" + rng = np.random.default_rng(GLOBAL_SEED) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + + with self.assertRaises(ValueError): + self.dp.eval(coords, cells, atom_types) + + def test_eval_consistency(self) -> None: + """Test that DeepPot.eval with aparam matches direct model forward.""" + rng = np.random.default_rng(GLOBAL_SEED) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + aparam = rng.random(natoms * self.numb_aparam) + + e, f, v, ae, av = self.dp.eval( + coords, cells, atom_types, atomic=True, aparam=aparam + ) + + coord_t = torch.tensor( + coords, dtype=torch.float64, device=DEVICE + ).requires_grad_(True) + atype_t = torch.tensor( + atom_types.reshape(1, -1), dtype=torch.int64, device=DEVICE + ) + cell_t = torch.tensor(cells, dtype=torch.float64, device=DEVICE) + aparam_t = torch.tensor( + aparam.reshape(1, natoms, self.numb_aparam), + dtype=torch.float64, + device=DEVICE, + ) + ref = self.model.forward( + coord_t, atype_t, cell_t, aparam=aparam_t, do_atomic_virial=True + ) + + np.testing.assert_allclose( + e, ref["energy"].detach().cpu().numpy(), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + f, ref["force"].detach().cpu().numpy(), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + v, ref["virial"].detach().cpu().numpy(), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + ae, ref["atom_energy"].detach().cpu().numpy(), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + av, ref["atom_virial"].detach().cpu().numpy(), rtol=1e-10, atol=1e-10 + ) + + +class TestDeepEvalEnerAparamPt2(unittest.TestCase): + """Test .pt2 inference with aparam (non-spin model).""" + + @classmethod + def setUpClass(cls) -> None: + cls.rcut = 4.0 + cls.rcut_smth = 0.5 + cls.sel = [8, 6] + cls.nt = 2 + cls.type_map = ["foo", "bar"] + cls.numb_aparam = 2 + + ds = DescrptSeA(cls.rcut, cls.rcut_smth, cls.sel) + ft = EnergyFittingNet( + cls.nt, + ds.get_dim_out(), + mixed_types=ds.mixed_types(), + numb_aparam=cls.numb_aparam, + seed=GLOBAL_SEED, + ) + cls.model = EnergyModel(ds, ft, type_map=cls.type_map) + cls.model = cls.model.to(torch.float64) + cls.model.eval() + + cls.model_data = {"model": cls.model.serialize()} + cls.tmpfile = tempfile.NamedTemporaryFile(suffix=".pt2", delete=False) + cls.tmpfile.close() + torch.set_default_device(None) + try: + deserialize_to_file(cls.tmpfile.name, cls.model_data) + finally: + torch.set_default_device("cuda:9999999") + + # Also save .pte for cross-format comparison + cls.pte_tmpfile = tempfile.NamedTemporaryFile(suffix=".pte", delete=False) + cls.pte_tmpfile.close() + deserialize_to_file(cls.pte_tmpfile.name, cls.model_data) + + cls.dp = DeepPot(cls.tmpfile.name) + cls.dp_pte = DeepPot(cls.pte_tmpfile.name) + + @classmethod + def tearDownClass(cls) -> None: + import os + + os.unlink(cls.tmpfile.name) + os.unlink(cls.pte_tmpfile.name) + + def test_get_dim_aparam(self) -> None: + self.assertEqual(self.dp.deep_eval.get_dim_aparam(), self.numb_aparam) + + def test_aparam_takes_effect(self) -> None: + """Different aparam values must produce different outputs.""" + rng = np.random.default_rng(GLOBAL_SEED) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + + aparam_zero = np.zeros(natoms * self.numb_aparam, dtype=np.float64) + aparam_nonzero = np.full(natoms * self.numb_aparam, 0.5, dtype=np.float64) + + e0, f0, v0 = self.dp.eval(coords, cells, atom_types, aparam=aparam_zero) + e1, f1, v1 = self.dp.eval(coords, cells, atom_types, aparam=aparam_nonzero) + + assert not np.allclose(e0, e1), ( + "Changing aparam did not change output — aparam may be ignored" + ) + + def test_eval_without_aparam_raises(self) -> None: + """Model with dim_aparam > 0 must raise when aparam not provided.""" + rng = np.random.default_rng(GLOBAL_SEED) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + + with self.assertRaises(ValueError): + self.dp.eval(coords, cells, atom_types) + + def test_eval_consistency(self) -> None: + """Test that .pt2 DeepPot.eval with aparam matches direct model forward.""" + rng = np.random.default_rng(GLOBAL_SEED) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + aparam = rng.random(natoms * self.numb_aparam) + + e, f, v, ae, av = self.dp.eval( + coords, cells, atom_types, atomic=True, aparam=aparam + ) + + coord_t = torch.tensor( + coords, dtype=torch.float64, device=DEVICE + ).requires_grad_(True) + atype_t = torch.tensor( + atom_types.reshape(1, -1), dtype=torch.int64, device=DEVICE + ) + cell_t = torch.tensor(cells, dtype=torch.float64, device=DEVICE) + aparam_t = torch.tensor( + aparam.reshape(1, natoms, self.numb_aparam), + dtype=torch.float64, + device=DEVICE, + ) + ref = self.model.forward( + coord_t, atype_t, cell_t, aparam=aparam_t, do_atomic_virial=True + ) + + np.testing.assert_allclose( + e, ref["energy"].detach().cpu().numpy(), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + f, ref["force"].detach().cpu().numpy(), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + v, ref["virial"].detach().cpu().numpy(), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + ae, ref["atom_energy"].detach().cpu().numpy(), rtol=1e-10, atol=1e-10 + ) + np.testing.assert_allclose( + av, ref["atom_virial"].detach().cpu().numpy(), rtol=1e-10, atol=1e-10 + ) + + def test_pt2_vs_pte_consistency(self) -> None: + """Outputs from .pt2 with aparam should match .pte.""" + rng = np.random.default_rng(GLOBAL_SEED + 19) + natoms = 5 + coords = rng.random((1, natoms, 3)) * 8.0 + cells = np.eye(3).reshape(1, 9) * 10.0 + atom_types = np.array([i % self.nt for i in range(natoms)], dtype=np.int32) + aparam = rng.random(natoms * self.numb_aparam) + + e1, f1, v1 = self.dp.eval(coords, cells, atom_types, aparam=aparam) + e2, f2, v2 = self.dp_pte.eval(coords, cells, atom_types, aparam=aparam) + + np.testing.assert_allclose(e1, e2, rtol=1e-10, atol=1e-10, err_msg="energy") + np.testing.assert_allclose(f1, f2, rtol=1e-10, atol=1e-10, err_msg="force") + np.testing.assert_allclose(v1, v2, rtol=1e-10, atol=1e-10, err_msg="virial") + + if __name__ == "__main__": unittest.main() diff --git a/source/tests/pt_expt/test_dp_freeze.py b/source/tests/pt_expt/test_dp_freeze.py index 97c742ab8c..f9c5807a83 100644 --- a/source/tests/pt_expt/test_dp_freeze.py +++ b/source/tests/pt_expt/test_dp_freeze.py @@ -217,61 +217,5 @@ def test_nonspin_model_rejects_spin(self) -> None: dp.eval(coord, box, atype, spin=spin) -class TestDPFreezePt2DefaultFparam(unittest.TestCase): - """Test .pt2 with default fparam — eval without providing fparam.""" - - @classmethod - def setUpClass(cls) -> None: - cls.tmpdir = tempfile.mkdtemp() - - model_params = deepcopy(model_se_e2_a) - model_params["fitting_net"]["numb_fparam"] = 1 - model_params["fitting_net"]["default_fparam"] = [0.5] - model = get_model(model_params) - wrapper = ModelWrapper(model, model_params=model_params) - state_dict = wrapper.state_dict() - cls.ckpt_file = os.path.join(cls.tmpdir, "model_dfp.pt") - torch.save({"model": state_dict}, cls.ckpt_file) - - @classmethod - def tearDownClass(cls) -> None: - shutil.rmtree(cls.tmpdir) - - def _test_eval_default_fparam(self, ext) -> None: - """Eval without fparam should match eval with explicit default value.""" - import numpy as np - - from deepmd.infer import ( - DeepPot, - ) - - out_path = os.path.join(self.tmpdir, f"dfp{ext}") - freeze(model=self.ckpt_file, output=out_path) - - coord = np.array( - [0.0, 0.0, 0.1, 1.0, 0.3, 0.2, 0.1, 1.9, 3.4], - dtype=np.float64, - ) - box = np.array([5.0, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 5.0], dtype=np.float64) - atype = [0, 1, 2] - - dp = DeepPot(out_path) - - # Eval WITHOUT fparam — model should use default (0.5) - e_no, f_no, v_no = dp.eval(coord, box, atype) - # Eval WITH explicit default value - e_ex, f_ex, v_ex = dp.eval(coord, box, atype, fparam=[0.5]) - - np.testing.assert_allclose(e_no, e_ex, atol=1e-10) - np.testing.assert_allclose(f_no, f_ex, atol=1e-10) - np.testing.assert_allclose(v_no, v_ex, atol=1e-10) - - def test_pt2_eval_default_fparam(self) -> None: - self._test_eval_default_fparam(".pt2") - - def test_pte_eval_default_fparam(self) -> None: - self._test_eval_default_fparam(".pte") - - if __name__ == "__main__": unittest.main() From 48703dcc5c85c8649e4dd9eeb5b65e1bf3c824c5 Mon Sep 17 00:00:00 2001 From: Han Wang Date: Sun, 5 Apr 2026 16:50:40 +0800 Subject: [PATCH 11/13] fix(pt_expt): clear default device during spin .pt2 export in tests AOTInductor internally creates tensors using PyTorch's default device. When pt/__init__.py sets torch.set_default_device("cuda:9999999") as a test sentinel, spin .pt2 compilation fails on CPU-only CI with "Torch not compiled with CUDA enabled". Clear the default device around deserialize_to_file calls in spin test fixtures, matching the pattern already used in non-spin .pt2 tests. --- .../pt_expt/infer/test_deep_eval_spin.py | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/source/tests/pt_expt/infer/test_deep_eval_spin.py b/source/tests/pt_expt/infer/test_deep_eval_spin.py index 64eb169dc9..829b1f5666 100644 --- a/source/tests/pt_expt/infer/test_deep_eval_spin.py +++ b/source/tests/pt_expt/infer/test_deep_eval_spin.py @@ -154,7 +154,14 @@ def spin_model_files(): tmpdir = tempfile.mkdtemp() for ext in (".pt2", ".pte"): path = os.path.join(tmpdir, f"spin_test{ext}") - deserialize_to_file(path, copy.deepcopy(data)) + # AOTInductor (.pt2) internally creates tensors using the PyTorch + # default device. Clear it so compilation stays on CPU. + prev = torch.get_default_device() + torch.set_default_device(None) + try: + deserialize_to_file(path, copy.deepcopy(data)) + finally: + torch.set_default_device(prev) files[ext] = path yield files, ref_pbc, ref_nopbc for path in files.values(): @@ -355,7 +362,12 @@ def spin_fparam_model_files(): tmpdir = tempfile.mkdtemp() for ext in (".pt2", ".pte"): path = os.path.join(tmpdir, f"spin_fparam_test{ext}") - deserialize_to_file(path, copy.deepcopy(data)) + prev = torch.get_default_device() + torch.set_default_device(None) + try: + deserialize_to_file(path, copy.deepcopy(data)) + finally: + torch.set_default_device(prev) files[ext] = path yield files for path in files.values(): @@ -414,7 +426,12 @@ def spin_aparam_model_files(): tmpdir = tempfile.mkdtemp() for ext in (".pt2", ".pte"): path = os.path.join(tmpdir, f"spin_aparam_test{ext}") - deserialize_to_file(path, copy.deepcopy(data)) + prev = torch.get_default_device() + torch.set_default_device(None) + try: + deserialize_to_file(path, copy.deepcopy(data)) + finally: + torch.set_default_device(prev) files[ext] = path yield files for path in files.values(): From 34d4935acf7d53bc94d0d209fe0c074b77793707 Mon Sep 17 00:00:00 2001 From: Han Wang Date: Sun, 5 Apr 2026 18:56:24 +0800 Subject: [PATCH 12/13] fix(pt_expt): clean up md_file in spin LAMMPS tests, add ZIP comment Add md_file cleanup to teardown_module in spin pt2 LAMMPS tests. Add inline comment documenting PyTorch ZIP STORED assumption. --- source/api_cc/src/commonPTExpt.h | 6 ++++++ source/lmp/tests/test_lammps_spin_nopbc_pt2.py | 2 ++ source/lmp/tests/test_lammps_spin_pt2.py | 2 ++ 3 files changed, 10 insertions(+) diff --git a/source/api_cc/src/commonPTExpt.h b/source/api_cc/src/commonPTExpt.h index 7aded4f37a..7dd02d09a9 100644 --- a/source/api_cc/src/commonPTExpt.h +++ b/source/api_cc/src/commonPTExpt.h @@ -421,6 +421,12 @@ inline std::string read_zip_entry(const std::string& zip_path, uint16_t local_extra_len = read_u16(local_header_offset + 28); size_t data_offset = local_header_offset + 30 + local_name_len + local_extra_len; + // PyTorch archives (.pth, .pte, .pt2) always use ZIP STORED (compression + // method 0) for every entry. PyTorch needs to mmap tensor data directly + // from the archive without decompression, so its C++ writer + // (caffe2::serialize::PyTorchStreamWriter) and torch.export.save both + // write uncompressed entries with 64-byte alignment. No decompression is + // needed. return content.substr(data_offset, uncompressed_size); } diff --git a/source/lmp/tests/test_lammps_spin_nopbc_pt2.py b/source/lmp/tests/test_lammps_spin_nopbc_pt2.py index ca0778d52f..56952fdc0d 100644 --- a/source/lmp/tests/test_lammps_spin_nopbc_pt2.py +++ b/source/lmp/tests/test_lammps_spin_nopbc_pt2.py @@ -90,6 +90,8 @@ def setup_module() -> None: def teardown_module() -> None: os.remove(data_file) + if md_file.exists(): + os.remove(md_file) def _lammps(data_file, units="metal") -> PyLammps: diff --git a/source/lmp/tests/test_lammps_spin_pt2.py b/source/lmp/tests/test_lammps_spin_pt2.py index dec9b75104..6a6dc50933 100644 --- a/source/lmp/tests/test_lammps_spin_pt2.py +++ b/source/lmp/tests/test_lammps_spin_pt2.py @@ -140,6 +140,8 @@ def setup_module() -> None: def teardown_module() -> None: os.remove(data_file) + if md_file.exists(): + os.remove(md_file) def _lammps(data_file, units="metal") -> PyLammps: From 540683d9660994121a259e536933cc7f11b77f08 Mon Sep 17 00:00:00 2001 From: Han Wang Date: Thu, 9 Apr 2026 12:14:58 +0800 Subject: [PATCH 13/13] fix: address review feedback on spin model detection and shape assertions 1. Unify spin detection: use `model_data.get("type") == "spin_ener"` consistently in both _init_from_model_json and _trace_and_export. 2. Improve _strip_shape_assertions docstring: document why filtering by assertion message is not feasible (opaque symbolic var names) and why removing all assertions is safe (spin-only, nall/nloc only). --- deepmd/pt_expt/infer/deep_eval.py | 2 +- deepmd/pt_expt/utils/serialization.py | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/deepmd/pt_expt/infer/deep_eval.py b/deepmd/pt_expt/infer/deep_eval.py index 72f24c3ef5..dd1831a4ba 100644 --- a/deepmd/pt_expt/infer/deep_eval.py +++ b/deepmd/pt_expt/infer/deep_eval.py @@ -127,7 +127,7 @@ def _init_from_model_json(self, model_json_str: str) -> None: model_dict = _json_to_numpy(model_dict) model_data = model_dict["model"] - if "spin" in model_data and "backbone_model" in model_data: + if model_data.get("type") == "spin_ener": from deepmd.pt_expt.model.spin_model import ( SpinModel, ) diff --git a/deepmd/pt_expt/utils/serialization.py b/deepmd/pt_expt/utils/serialization.py index 2eb83b5f6c..f59c397525 100644 --- a/deepmd/pt_expt/utils/serialization.py +++ b/deepmd/pt_expt/utils/serialization.py @@ -17,13 +17,23 @@ def _strip_shape_assertions(graph_module: torch.nn.Module) -> None: - """Remove shape-guard assertion nodes from an exported graph. + """Remove shape-guard assertion nodes from a spin model's exported graph. ``torch.export`` inserts ``aten._assert_scalar`` nodes for symbolic shape - relationships discovered during tracing (e.g. ``Ne(nall, nloc)``). For the - spin model, these are overly conservative — the model computes correct - results even when ``nall == nloc`` (NoPBC, no ghost atoms). Stripping - them allows the model to accept any valid shape combination. + relationships discovered during tracing. For the spin model, the atom- + doubling logic creates slice patterns that depend on ``(nall - nloc)``, + producing guards like ``Ne(nall, nloc)``. These guards are spurious: the + model computes correct results even when ``nall == nloc`` (NoPBC, no ghost + atoms). + + This function is **only called for spin models** (guarded by ``if is_spin`` + in ``_trace_and_export``). The assertion messages use opaque symbolic + variable names (e.g. ``Ne(s22, s96)``) rather than human-readable names, + so filtering by message content is not reliable. Since + ``prefer_deferred_runtime_asserts_over_guards=True`` converts all shape + guards into these deferred assertions, and the only shape relationships in + the spin model involve nall/nloc, removing all of them is safe in this + context. """ graph = graph_module.graph for node in list(graph.nodes):