Skip to content

feat(dpmodel): add NEP descriptor#5597

Open
OutisLi wants to merge 2 commits into
deepmodeling:masterfrom
OutisLi:pr/nep
Open

feat(dpmodel): add NEP descriptor#5597
OutisLi wants to merge 2 commits into
deepmodeling:masterfrom
OutisLi:pr/nep

Conversation

@OutisLi

@OutisLi OutisLi commented Jun 27, 2026

Copy link
Copy Markdown
Collaborator

Summary by CodeRabbit

  • New Features
    • Added the NEP (neuroevolution potential) descriptor support across supported backends.
    • Added a command-line tool (and Python function) to export trained NEP models to GPUMD-compatible nep.txt.
    • Added a NEP training example for a water system.
  • Documentation
    • Added NEP model documentation and linked it from the model index.
  • Tests
    • Added NEP descriptor tests covering serialization/deserialization, invariance/consistency, and backend/export/parameter-sharing behavior.

@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 25b3272f-9874-438c-8d8a-7d17f43d12cb

📥 Commits

Reviewing files that changed from the base of the PR and between 691a86c and 18d9584.

📒 Files selected for processing (9)
  • deepmd/dpmodel/descriptor/nep.py
  • deepmd/jax/descriptor/nep.py
  • deepmd/pt_expt/descriptor/nep.py
  • deepmd/pt_expt/descriptor/nep_coeff.py
  • deepmd/tools/nep_txt.py
  • deepmd/utils/argcheck.py
  • source/tests/common/dpmodel/test_descriptor_nep.py
  • source/tests/consistent/descriptor/test_nep.py
  • source/tests/pt_expt/descriptor/test_nep.py
🚧 Files skipped from review as they are similar to previous changes (9)
  • deepmd/jax/descriptor/nep.py
  • deepmd/utils/argcheck.py
  • source/tests/pt_expt/descriptor/test_nep.py
  • deepmd/pt_expt/descriptor/nep.py
  • deepmd/pt_expt/descriptor/nep_coeff.py
  • source/tests/consistent/descriptor/test_nep.py
  • deepmd/tools/nep_txt.py
  • source/tests/common/dpmodel/test_descriptor_nep.py
  • deepmd/dpmodel/descriptor/nep.py

📝 Walkthrough

Walkthrough

Adds NEP descriptor support across dpmodel, JAX, and PyTorch backends, plus schema registration, a GPUMD nep.txt exporter, documentation, an example input, and backend consistency and unit tests.

Changes

NEP Descriptor Feature

Layer / File(s) Summary
dpmodel NEP core
deepmd/dpmodel/descriptor/nep.py, deepmd/dpmodel/descriptor/__init__.py
Adds NEP math primitives, coefficient operators, descriptor construction, forward evaluation, statistics, serialization, and selection updates.
JAX and PyTorch wrappers
deepmd/jax/descriptor/nep.py, deepmd/jax/descriptor/__init__.py, deepmd/pt_expt/descriptor/nep.py, deepmd/pt_expt/descriptor/nep_coeff.py, deepmd/pt_expt/descriptor/__init__.py
Adds JAX and PyTorch wrapper modules for the NEP descriptor and coefficient operator, including parameter/buffer handling and mapping registration.
Schema, exporter, docs, and example
deepmd/utils/argcheck.py, deepmd/tools/nep_txt.py, deepmd/tools/__init__.py, doc/model/index.rst, doc/model/nep.md, examples/water/nep/input.json
Adds NEP argument schema registration, the GPUMD nep.txt exporter CLI and checkpoint loader, model index and NEP documentation, package init metadata, and the water example input.
Descriptor tests
source/tests/common/dpmodel/test_descriptor_nep.py, source/tests/consistent/descriptor/test_nep.py, source/tests/pt_expt/descriptor/test_nep.py
Adds dpmodel unit tests, backend consistency tests, and PyTorch wrapper tests for serialization, invariance, export, tracing, and parameter sharing.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Suggested labels

new feature, Core

Suggested reviewers

  • njzjz
  • iProzd
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 48.05% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding the NEP descriptor, even though the PR also includes related backend, tooling, docs, and tests.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 OpenGrep (1.23.0)
deepmd/jax/descriptor/nep.py

┌──────────────┐
│ Opengrep CLI │
└──────────────┘

�[32m✔�[39m �[1mOpengrep OSS�[0m
�[32m✔�[39m Basic security coverage for first-party code vulnerabilities.

[00.13][ERROR]: unable to find a config; path .coderabbit-opengrep-fallback.yml does not exist

source/tests/common/dpmodel/test_descriptor_nep.py

┌──────────────┐
│ Opengrep CLI │
└──────────────┘

�[32m✔�[39m �[1mOpengrep OSS�[0m
�[32m✔�[39m Basic security coverage for first-party code vulnerabilities.

[00.20][ERROR]: unable to find a config; path .coderabbit-opengrep-fallback.yml does not exist

deepmd/pt_expt/descriptor/nep_coeff.py

┌──────────────┐
│ Opengrep CLI │
└──────────────┘

�[32m✔�[39m �[1mOpengrep OSS�[0m
�[32m✔�[39m Basic security coverage for first-party code vulnerabilities.

[00.21][ERROR]: unable to find a config; path .coderabbit-opengrep-fallback.yml does not exist

  • 6 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@deepmd/dpmodel/descriptor/nep.py`:
- Around line 509-510: Reject non-positive cutoff values in the NEP descriptor
initialization before they are stored. In the cutoff validation logic around the
rcut_radial and rcut_angular checks in nep.py, add explicit strict-positivity
validation for both values so rcut_radial=0.0 and rcut_angular=0.0 are rejected
early, preventing _nep_cutoff() from dividing by zero on the first forward pass.
- Around line 513-518: The validation in nep.py currently allows 4-body terms
even when l_max is below 2, which later causes the harmonic indexing in
descrpt_nep_args() to fail at runtime. Add an upfront guard in the parameter
validation near l_max_4body/l_max_5body checks that rejects any configuration
with l_max_4body enabled unless l_max >= 2, and make sure the default
l_max_4body path in descrpt_nep_args() is covered by this check. Keep the
existing constraints around l_max_4body, l_max_5body, and the 5-body invariant
consistent with the new l_max requirement.

In `@deepmd/tools/nep_txt.py`:
- Around line 264-265: The backend export path in serialize_hook is being called
with input_file even though Backend.detect_backend_by_model(input_file) already
returns a callable hook; update the logic in nep_txt.py so serialize_hook is
invoked with no filename argument and its return value is assigned to model. Use
the existing Backend.detect_backend_by_model and serialize_hook symbols to
locate the change, and keep the non-.pt export flow for
.pte/.pt2/.jax/.savedmodel consistent with the backend contract.

In `@doc/model/nep.md`:
- Around line 146-148: The storage-scaling claim in the NEP documentation is
incorrect because the dense table used by the expansion coefficients still
scales as O(ntypes ** 2); update the text in the section describing the
`(ntypes, ntypes, n_desc, k_max)` tensor to say memory/storage is quadratic in
`ntypes`, while only the forward/runtime access pattern is neighbor-driven. Keep
the wording aligned with the surrounding explanation of the expansion
coefficients and their use in the backends.

In `@source/tests/consistent/descriptor/test_nep.py`:
- Around line 67-69: The skip_dp property is returning a missing class attribute
from CommonTest, which causes an AttributeError when the skip logic checks it.
Update the skip_dp property in test_nep.py to return an actual boolean value for
this test class instead of referencing CommonTest.skip_dp, and make sure the
value matches the intended skip behavior for the NEP descriptor tests.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 448e5088-af3b-4b12-b64f-5f55831263d0

📥 Commits

Reviewing files that changed from the base of the PR and between dbdc9a3 and 691a86c.

📒 Files selected for processing (16)
  • deepmd/dpmodel/descriptor/__init__.py
  • deepmd/dpmodel/descriptor/nep.py
  • deepmd/jax/descriptor/__init__.py
  • deepmd/jax/descriptor/nep.py
  • deepmd/pt_expt/descriptor/__init__.py
  • deepmd/pt_expt/descriptor/nep.py
  • deepmd/pt_expt/descriptor/nep_coeff.py
  • deepmd/tools/__init__.py
  • deepmd/tools/nep_txt.py
  • deepmd/utils/argcheck.py
  • doc/model/index.rst
  • doc/model/nep.md
  • examples/water/nep/input.json
  • source/tests/common/dpmodel/test_descriptor_nep.py
  • source/tests/consistent/descriptor/test_nep.py
  • source/tests/pt_expt/descriptor/test_nep.py

Comment on lines +509 to +510
if rcut_angular > rcut_radial:
raise ValueError("rcut_angular must not exceed rcut_radial")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Reject non-positive cutoffs up front.

These checks only compare the two cutoffs against each other. rcut_radial=0.0 and rcut_angular=0.0 still pass here, then _nep_cutoff() divides by zero on Line 192 during the first forward pass. Please require both cutoffs to be strictly positive before storing them.

Suggested fix
         if sel is None:
             raise ValueError("sel must be provided for the NEP descriptor")
+        if rcut_radial <= 0.0 or rcut_angular <= 0.0:
+            raise ValueError("rcut_radial and rcut_angular must be positive")
         if rcut_angular > rcut_radial:
             raise ValueError("rcut_angular must not exceed rcut_radial")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if rcut_angular > rcut_radial:
raise ValueError("rcut_angular must not exceed rcut_radial")
if sel is None:
raise ValueError("sel must be provided for the NEP descriptor")
if rcut_radial <= 0.0 or rcut_angular <= 0.0:
raise ValueError("rcut_radial and rcut_angular must be positive")
if rcut_angular > rcut_radial:
raise ValueError("rcut_angular must not exceed rcut_radial")
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deepmd/dpmodel/descriptor/nep.py` around lines 509 - 510, Reject non-positive
cutoff values in the NEP descriptor initialization before they are stored. In
the cutoff validation logic around the rcut_radial and rcut_angular checks in
nep.py, add explicit strict-positivity validation for both values so
rcut_radial=0.0 and rcut_angular=0.0 are rejected early, preventing
_nep_cutoff() from dividing by zero on the first forward pass.

Comment on lines +513 to +518
if l_max_4body not in (0, 2):
raise ValueError("l_max_4body must be 0 or 2")
if l_max_5body not in (0, 1):
raise ValueError("l_max_5body must be 0 or 1")
if l_max_5body == 1 and l_max_4body != 2:
raise ValueError("the 5-body invariant requires l_max_4body == 2")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Disallow 4-body invariants when l_max < 2.

l_max_4body=2 currently passes validation even when l_max=1. Line 875 then indexes the missing L=2 harmonic block (sum_s[:, :, 3:8]), so a config as small as {l_max: 1} crashes at runtime because descrpt_nep_args() defaults l_max_4body to 2. Add an upfront guard that requires l_max >= 2 whenever 4-body terms are enabled.

Suggested fix
         if l_max < 1 or l_max > 8:
             raise ValueError("l_max must be in [1, 8]")
         if l_max_4body not in (0, 2):
             raise ValueError("l_max_4body must be 0 or 2")
+        if l_max_4body == 2 and l_max < 2:
+            raise ValueError("l_max must be at least 2 when l_max_4body == 2")
         if l_max_5body not in (0, 1):
             raise ValueError("l_max_5body must be 0 or 1")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if l_max_4body not in (0, 2):
raise ValueError("l_max_4body must be 0 or 2")
if l_max_5body not in (0, 1):
raise ValueError("l_max_5body must be 0 or 1")
if l_max_5body == 1 and l_max_4body != 2:
raise ValueError("the 5-body invariant requires l_max_4body == 2")
if l_max < 1 or l_max > 8:
raise ValueError("l_max must be in [1, 8]")
if l_max_4body not in (0, 2):
raise ValueError("l_max_4body must be 0 or 2")
if l_max_4body == 2 and l_max < 2:
raise ValueError("l_max must be at least 2 when l_max_4body == 2")
if l_max_5body not in (0, 1):
raise ValueError("l_max_5body must be 0 or 1")
if l_max_5body == 1 and l_max_4body != 2:
raise ValueError("the 5-body invariant requires l_max_4body == 2")
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deepmd/dpmodel/descriptor/nep.py` around lines 513 - 518, The validation in
nep.py currently allows 4-body terms even when l_max is below 2, which later
causes the harmonic indexing in descrpt_nep_args() to fail at runtime. Add an
upfront guard in the parameter validation near l_max_4body/l_max_5body checks
that rejects any configuration with l_max_4body enabled unless l_max >= 2, and
make sure the default l_max_4body path in descrpt_nep_args() is covered by this
check. Keep the existing constraints around l_max_4body, l_max_5body, and the
5-body invariant consistent with the new l_max requirement.

Comment thread deepmd/tools/nep_txt.py
Comment on lines +264 to +265
backend = Backend.detect_backend_by_model(input_file)()
model = backend.serialize_hook(input_file)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win

Call the backend serialize hook, don't pass the filename to the method.

Line 265 treats serialize_hook as though it accepts input_file, but the backend contract returns a callable. As written, the advertised non-.pt paths (.pte/.pt2/.jax/.savedmodel) will fail with TypeError before any export happens.

Proposed fix
-        model = backend.serialize_hook(input_file)
+        model = backend.serialize_hook()(input_file)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
backend = Backend.detect_backend_by_model(input_file)()
model = backend.serialize_hook(input_file)
backend = Backend.detect_backend_by_model(input_file)()
model = backend.serialize_hook()(input_file)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deepmd/tools/nep_txt.py` around lines 264 - 265, The backend export path in
serialize_hook is being called with input_file even though
Backend.detect_backend_by_model(input_file) already returns a callable hook;
update the logic in nep_txt.py so serialize_hook is invoked with no filename
argument and its return value is assigned to model. Use the existing
Backend.detect_backend_by_model and serialize_hook symbols to locate the change,
and keep the non-.pt export flow for .pte/.pt2/.jax/.savedmodel consistent with
the backend contract.

Comment thread doc/model/nep.md
Comment on lines +146 to +148
backends. The expansion coefficients are stored as a single dense tensor of
shape `(ntypes, ntypes, n_desc, k_max)`, so both the memory footprint and the
forward cost follow the neighbor count rather than `ntypes ** 2`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀 Performance & Scalability | 🟡 Minor | ⚡ Quick win

Fix the storage-scaling claim.

Lines 146-148 say the dense (ntypes, ntypes, n_desc, k_max) table makes memory follow neighbor count, but that storage is still O(ntypes ** 2). Only the runtime access pattern is neighbor-driven.

Suggested wording
-The expansion coefficients are stored as a single dense tensor of
-shape `(ntypes, ntypes, n_desc, k_max)`, so both the memory footprint and the
-forward cost follow the neighbor count rather than `ntypes ** 2`.
+The expansion coefficients are stored as a single dense tensor of
+shape `(ntypes, ntypes, n_desc, k_max)`. This keeps the forward cost tied to the
+actual neighbor pairs visited at runtime, but the coefficient storage itself
+still scales as `ntypes ** 2`.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
backends. The expansion coefficients are stored as a single dense tensor of
shape `(ntypes, ntypes, n_desc, k_max)`, so both the memory footprint and the
forward cost follow the neighbor count rather than `ntypes ** 2`.
The expansion coefficients are stored as a single dense tensor of
shape `(ntypes, ntypes, n_desc, k_max)`. This keeps the forward cost tied to the
actual neighbor pairs visited at runtime, but the coefficient storage itself
still scales as `ntypes ** 2`.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@doc/model/nep.md` around lines 146 - 148, The storage-scaling claim in the
NEP documentation is incorrect because the dense table used by the expansion
coefficients still scales as O(ntypes ** 2); update the text in the section
describing the `(ntypes, ntypes, n_desc, k_max)` tensor to say memory/storage is
quadratic in `ntypes`, while only the forward/runtime access pattern is
neighbor-driven. Keep the wording aligned with the surrounding explanation of
the expansion coefficients and their use in the backends.

Comment on lines +67 to +69
@property
def skip_dp(self) -> bool:
return CommonTest.skip_dp

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Locate CommonTest and skip_dp definitions =="
rg -nC2 'class CommonTest|def skip_dp|skip_dp\s*=' \
  source/tests/consistent/descriptor/common.py \
  source/tests/consistent/descriptor/test_nep.py

echo
echo "== Show the relevant CommonTest section =="
sed -n '1,220p' source/tests/consistent/descriptor/common.py | nl -ba | sed -n '1,220p'

echo
echo "== Show the local override =="
sed -n '60,80p' source/tests/consistent/descriptor/test_nep.py | nl -ba

Repository: deepmodeling/deepmd-kit

Length of output: 625


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Find CommonTest and skip_dp declarations =="
fd -a 'common.py' source/tests/consistent/descriptor
rg -nC3 'class CommonTest|skip_dp\s*[:=]|`@property`\s*$|def skip_dp' source/tests/consistent/descriptor/common.py source/tests/consistent/descriptor/test_nep.py

echo
echo "== Read the relevant CommonTest file section with line numbers =="
python3 - <<'PY'
from pathlib import Path
path = Path("source/tests/consistent/descriptor/common.py")
for i, line in enumerate(path.read_text().splitlines(), 1):
    if 1 <= i <= 260:
        print(f"{i:4d}: {line}")
PY

echo
echo "== Read the local override with line numbers =="
python3 - <<'PY'
from pathlib import Path
path = Path("source/tests/consistent/descriptor/test_nep.py")
for i, line in enumerate(path.read_text().splitlines(), 1):
    if 55 <= i <= 80:
        print(f"{i:4d}: {line}")
PY

Repository: deepmodeling/deepmd-kit

Length of output: 16257


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Search for any skip_dp definition or override across the descriptor tests =="
rg -nC2 'skip_dp\s*[:=]|def\s+skip_dp|`@property`\s*$' source/tests/consistent/descriptor

echo
echo "== Inspect the surrounding CommonTest class around skip flags =="
python3 - <<'PY'
from pathlib import Path
path = Path("source/tests/consistent/descriptor/common.py")
for i, line in enumerate(path.read_text().splitlines(), 1):
    if 330 <= i <= 380:
        print(f"{i:4d}: {line}")
PY

Repository: deepmodeling/deepmd-kit

Length of output: 44186


Return a real boolean here instead of CommonTest.skip_dp. CommonTest does not define skip_dp, so this property raises AttributeError when the skip logic reads it.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@source/tests/consistent/descriptor/test_nep.py` around lines 67 - 69, The
skip_dp property is returning a missing class attribute from CommonTest, which
causes an AttributeError when the skip logic checks it. Update the skip_dp
property in test_nep.py to return an actual boolean value for this test class
instead of referencing CommonTest.skip_dp, and make sure the value matches the
intended skip behavior for the NEP descriptor tests.

Comment on lines +813 to +822
def call(
self,
coord_ext: Array,
atype_ext: Array,
nlist: Array,
mapping: Array | None = None,
fparam: Array | None = None,
comm_dict: dict | None = None,
charge_spin: Array | None = None,
) -> tuple[Array, None, None, None, Array]:
size=(ntypes, ntypes, n_desc, k_max),
).astype(prec)

def call(self, fn: Array, pair_index: Array) -> Array:
ClassVar,
)

import deepmd.jax.utils.exclude_mask as _jax_exclude_mask # noqa: F401
def __call__(self, *args: Any, **kwargs: Any) -> Any:
return torch.nn.Module.__call__(self, *args, **kwargs)

def __setattr__(self, name: str, value: Any) -> None:
@codecov

codecov Bot commented Jun 27, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 64.84375% with 180 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.25%. Comparing base (adfa278) to head (18d9584).
⚠️ Report is 3 commits behind head on master.

Files with missing lines Patch % Lines
deepmd/tools/nep_txt.py 0.00% 112 Missing ⚠️
deepmd/dpmodel/descriptor/nep.py 80.63% 61 Missing ⚠️
deepmd/pt_expt/descriptor/nep_coeff.py 75.00% 7 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #5597      +/-   ##
==========================================
- Coverage   82.29%   82.25%   -0.05%     
==========================================
  Files         887      900      +13     
  Lines      100452   101354     +902     
  Branches     4056     4056              
==========================================
+ Hits        82670    83369     +699     
- Misses      16318    16520     +202     
- Partials     1464     1465       +1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants