Skip to content

feat(pt): add model branch alias#4883

Merged
iProzd merged 10 commits intodeepmodeling:develfrom
iProzd:D0812_devel_head_alias
Aug 27, 2025
Merged

feat(pt): add model branch alias#4883
iProzd merged 10 commits intodeepmodeling:develfrom
iProzd:D0812_devel_head_alias

Conversation

@iProzd
Copy link
Copy Markdown
Member

@iProzd iProzd commented Aug 12, 2025

Introduces model branch alias and info fields to model configuration, adds utility functions for handling model branch dictionaries, and updates related modules to use alias-based lookup and provide detailed branch information. Enhances multi-task model usability and improves logging of available model branches.

example:

dp --pt show 0415_compat_new.pt model-branch

[2025-08-14 10:05:54,246] DEEPMD WARNING To get the best performance, it is recommended to adjust the number of threads by setting the environment variables OMP_NUM_THREADS, DP_INTRA_OP_PARALLELISM_THREADS, and DP_INTER_OP_PARALLELISM_THREADS. See https://deepmd.rtfd.io/parallelism/ for more information.
[2025-08-14 10:05:59,122] DEEPMD INFO    This is a multitask model
[2025-08-14 10:05:59,122] DEEPMD INFO    Available model branches are ['Dai2023Alloy', 'Zhang2023Cathode', 'Gong2023Cluster', 'Yang2023ab', 'UniPero', 'Huang2021Deep-PBE', 'Liu2024Machine', 'Zhang2021Phase', 'Jinag2021Accurate', 'Chen2023Modeling', 'Wen2021Specialising', 'Wang2022Classical', 'Wang2022Tungsten', 'Wu2021Deep', 'Huang2021Deep-PBEsol', 'Transition1x', 'Wang2021Generalizable', 'Wu2021Accurate', 'MPTraj', 'Li2025APEX', 'Shi2024SSE', 'Tuo2023Hybrid', 'Unke2019PhysNet', 'Shi2024Electrolyte', 'ODAC23', 'Alex2D', 'OMAT24', 'SPICE2', 'OC20M', 'OC22', 'Li2025General', 'RANDOM'], where 'RANDOM' means using a randomly initialized fitting net.
[2025-08-14 10:05:59,125] DEEPMD INFO    Detailed information:
+-----------------------+------------------------------+--------------------------------+--------------------------------+
| Model Branch          | Alias                        | description                    | observed_type                  |
+-----------------------+------------------------------+--------------------------------+--------------------------------+
| Dai2023Alloy          | Alloys, Domains_Alloy        | The dataset contains           | ['La', 'Fe', 'Ho', 'Cu', 'Sn', |
|                       |                              | structure-energy-force-virial  | 'Cd', 'Y', 'Be', 'V', 'Sm',    |
|                       |                              | data for 53 typical metallic   | 'In', 'Pr', 'Mo', 'Mn', 'Gd',  |
|                       |                              | elements in alloy systems,     | 'Ru', 'Nd', 'Li', 'Tm', 'K',   |
|                       |                              | including ~9000 intermetallic  | 'Pt', 'Ir', 'Na', 'Hf', 'Dy',  |
|                       |                              | compounds and FCC, BCC, HCP    | 'Ca', 'Nb', 'Au', 'Sr', 'Si',  |
|                       |                              | structures. It consists of two | 'Ge', 'Co', 'W', 'Cr', 'Zn',   |
|                       |                              | parts: DFT-generated relaxed   | 'Ag', 'Ti', 'Ni', 'Zr', 'Pd',  |
|                       |                              | and deformed structures, and   | 'Os', 'Ta', 'Rh', 'Sc', 'Tb',  |
|                       |                              | randomly distorted structures  | 'Al', 'Ga', 'Re', 'Lu', 'Er',  |
|                       |                              | produced covering pure metals, | 'Mg', 'Ce', 'Pb']              |
|                       |                              | solid solutions, and           |                                |
|                       |                              | intermetallics with vacancies. |                                |
+-----------------------+------------------------------+--------------------------------+--------------------------------+
| OMAT24                | Default, Materials, Omat24   | OMat24 is a large-scale open   | ['La', 'Fe', 'Cu', 'Cd', 'Be', |
|                       |                              | dataset containing over 110    | 'Ar', 'V', 'Sm', 'In', 'Pm',   |
|                       |                              | million DFT calculations       | 'Pr', 'Mn', 'Ru', 'He', 'Nd',  |
|                       |                              | spanning diverse structures    | 'Th', 'Pa', 'K', 'Pt', 'Yb',   |
|                       |                              | and compositions. It is        | 'Dy', 'Sr', 'Co', 'Np', 'Cr',  |
|                       |                              | designed to support AI-driven  | 'Tl', 'Br', 'Se', 'Ni', 'Zr',  |
|                       |                              | materials discovery by         | 'Pu', 'O', 'Xe', 'Tb', 'Ga',   |
|                       |                              | providing broad and deep       | 'Lu', 'H', 'Ne', 'Er', 'Ce',   |
|                       |                              | coverage of chemical space.    | 'I', 'Kr', 'Ho', 'Cs', 'Sn',   |
|                       |                              |                                | 'Rb', 'Y', 'N', 'F', 'Mo',     |
|                       |                              |                                | 'Gd', 'B', 'Li', 'Tm', 'Sb',   |
|                       |                              |                                | 'Ir', 'Hf', 'Na', 'Ca', 'Nb',  |
|                       |                              |                                | 'Au', 'As', 'Si', 'Ge', 'W',   |
|                       |                              |                                | 'Zn', 'Hg', 'Ag', 'Bi', 'Ti',  |
|                       |                              |                                | 'Os', 'Cl', 'Pd', 'P', 'U',    |
|                       |                              |                                | 'Tc', 'Ta', 'Ba', 'Rh', 'Sc',  |
|                       |                              |                                | 'C', 'S', 'Te', 'Al', 'Re',    |
|                       |                              |                                | 'Eu', 'Mg', 'Pb', 'Ac']        |
+-----------------------+------------------------------+--------------------------------+--------------------------------+

Summary by CodeRabbit

  • New Features

    • Alias-based multi-task branch selection for evaluation and fine-tuning; new API to query model alias/branch info; show now prints a detailed model-branch table.
  • Documentation

    • Model config gains optional fields to declare branch aliases and per-branch info (PyTorch-only).
  • Examples

    • Added a two-task PyTorch example demonstrating aliases, shared components, and per-branch info.
  • Tests

    • Tests include the new example and now filter out table-like show output.

Introduces model branch alias and info fields to model configuration, adds utility functions for handling model branch dictionaries, and updates related modules to use alias-based lookup and provide detailed branch information. Enhances multi-task model usability and improves logging of available model branches.
@iProzd iProzd marked this pull request as draft August 12, 2025 13:48
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Aug 12, 2025

📝 Walkthrough

Walkthrough

Adds alias-aware model-branch utilities and integrates them into show, DeepEval, and finetune flows; extends model argument schema with optional alias/info fields; adds an ASCII table renderer for branch details; updates examples and tests to cover alias-based multi-task setups.

Changes

Cohort / File(s) Summary
Model-branch utilities
deepmd/utils/model_branch_dict.py
New get_model_dict(model_dict) returning (model_alias_dict, model_branch_dict) and OrderedDictTableWrapper for ASCII table rendering of branch info.
Entrypoint: show enhancements
deepmd/entrypoints/show.py
Imports get_model_dict and OrderedDictTableWrapper; when showing "model-branch" uses get_model_dict(...), logs a "Detailed information" ASCII table, and prefers branch info.observed_type over always calling DeepEval.
PT inference alias resolution
deepmd/pt/infer/deep_eval.py
Adds alias-aware multitask head resolution using get_model_dict; supports Default alias, integer head fallback, case-insensitive alias matching, remaps state_dict keys for branch-prefixed params, updates error messaging, and adds public DeepEval.get_model_branch().
PT fine-tune alias resolution
deepmd/pt/utils/finetune.py
Uses get_model_dict to validate/map chosen alias to canonical branch for multi-task finetuning; updates assertions and error guidance to reference aliases/model-branch.
Argument schema updates
deepmd/utils/argcheck.py
Adds optional model_branch_alias (list) and info (dict) to standard_model_args with local docs (doc_model_branch_alias, doc_info), marked PyTorch-only.
Examples / Tests
examples/water_multi_task/.../input_torch_with_alias.json, source/tests/common/test_examples.py, source/tests/pt/test_dp_show.py
Adds a two-task PyTorch example using aliases/info and includes it in multi-task test inputs; tightens dp show test filtering to ignore table-like output and "Detailed information" lines.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant ShowCmd as "dp show"
  participant DeepEval
  participant Utils as get_model_dict
  Note over ShowCmd,Utils: Show "model-branch" path
  ShowCmd->>DeepEval: load model for inspection
  DeepEval->>Utils: get_model_dict(model_dict)
  Utils-->>DeepEval: (model_alias_dict, model_branch_dict)
  DeepEval-->>ShowCmd: model_branch_dict
  ShowCmd->>Utils: OrderedDictTableWrapper(model_branch_dict).as_table()
  Utils-->>ShowCmd: ASCII table ("Detailed information")
  ShowCmd-->>User: prints branches + table
Loading
sequenceDiagram
  participant Caller
  participant DeepEval
  participant Utils as get_model_dict
  Note over Caller,DeepEval: Head resolution for evaluation
  Caller->>DeepEval: init(head?)
  DeepEval->>Utils: get_model_dict(model_dict) [if multitask]
  Utils-->>DeepEval: (model_alias_dict, model_branch_dict)
  DeepEval->>DeepEval: map/validate head (alias / int / Default / case-insensitive)
  DeepEval->>DeepEval: remap state_dict keys for chosen branch
  DeepEval-->>Caller: proceed with evaluation
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~35 minutes

Possibly related PRs

Suggested reviewers

  • njzjz
  • wanghan-iapcm
  • Chengqian-Zhang

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.


📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 3421fa5 and 3780f90.

📒 Files selected for processing (1)
  • deepmd/utils/argcheck.py (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • deepmd/utils/argcheck.py
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (15)
  • GitHub Check: Build wheels for cp311-win_amd64
  • GitHub Check: Build wheels for cp310-manylinux_aarch64
  • GitHub Check: Build wheels for cp311-manylinux_x86_64
  • GitHub Check: Build wheels for cp311-macosx_arm64
  • GitHub Check: Test C++ (false)
  • GitHub Check: Build C++ (cuda120, cuda)
  • GitHub Check: Build C library (2.18, libdeepmd_c.tar.gz)
  • GitHub Check: Test Python (2, 3.12)
  • GitHub Check: Test Python (3, 3.12)
  • GitHub Check: Build C++ (cpu, cpu)
  • GitHub Check: Test Python (4, 3.9)
  • GitHub Check: Test Python (3, 3.9)
  • GitHub Check: Build C++ (rocm, rocm)
  • GitHub Check: Build C++ (cuda, cuda)
  • GitHub Check: Build C++ (clang, clang)
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

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

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (5)
deepmd/utils/argcheck.py (1)

2308-2340: Constrain types for model_branch_alias and clarify schema

model_branch_alias is declared as a bare list, which weakens validation. Since aliases are strings, prefer list[str] for stricter schema checking. info can remain as dict (free-form metadata), which aligns with the intended flexibility.

Apply this diff:

-            Argument(
-                "model_branch_alias",
-                list,
-                optional=True,
-                default=[],
-                doc=doc_only_pt_supported + doc_model_branch_alias,
-            ),
+            Argument(
+                "model_branch_alias",
+                list[str],
+                optional=True,
+                default=[],
+                doc=doc_only_pt_supported + doc_model_branch_alias,
+            ),
deepmd/utils/model_branch_dict.py (3)

88-96: Avoid dict.keys() in iteration for simplicity

Use direct iteration over the dict to satisfy linters and improve clarity.

Apply this diff:

-        for _, payload in self.data.items():
-            info = payload.get("info") or {}
-            for k in info.keys():
+        for _, payload in self.data.items():
+            info = payload.get("info") or {}
+            for k in info:
                 if k not in seen:
                     seen.add(k)
                     self.info_keys.append(k)

166-176: Remove unused loop index in enumerate

The loop index i is unused. Drop enumerate for readability.

Apply this diff:

-        for i, row_cells in enumerate(wrapped_rows):
+        for row_cells in wrapped_rows:
             # Determine the maximum number of wrapped lines in this row
             max_lines = max(len(cell) for cell in row_cells)

44-46: Remove meta comment

The comment “generated with GPT for formatted print” is not actionable and can be confusing in source control history.

Apply this diff:

-# generated with GPT for formatted print
deepmd/entrypoints/show.py (1)

40-48: Surface aliases alongside branches in the log

Since selection accepts aliases, include them explicitly in the “Available” message to reduce confusion.

Apply this diff:

-        log.info(
-            f"Available model branches are {model_branches}, "
-            f"where 'RANDOM' means using a randomly initialized fitting net."
-        )
+        aliases = [k for k in model_alias_dict.keys() if k not in model_params["model_dict"]]
+        log.info(
+            f"Available model branches: {model_branches}; aliases: {aliases}. "
+            f"'RANDOM' means using a randomly initialized fitting net."
+        )
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 88b71e8 and d1ba115.

📒 Files selected for processing (5)
  • deepmd/entrypoints/show.py (2 hunks)
  • deepmd/pt/infer/deep_eval.py (3 hunks)
  • deepmd/pt/utils/finetune.py (2 hunks)
  • deepmd/utils/argcheck.py (2 hunks)
  • deepmd/utils/model_branch_dict.py (1 hunks)
🧰 Additional context used
🪛 Ruff (0.12.2)
deepmd/utils/model_branch_dict.py

92-92: Use key in dict instead of key in dict.keys()

Remove .keys()

(SIM118)


166-166: Loop control variable i not used within loop body

Rename unused i to _i

(B007)

🔇 Additional comments (1)
deepmd/pt/infer/deep_eval.py (1)

269-279: New public API get_model_branch is a useful addition

The method cleanly exposes alias and branch info and falls back correctly for single-task models. Good addition.

Comment thread deepmd/pt/infer/deep_eval.py
Comment thread deepmd/pt/utils/finetune.py
Comment thread deepmd/utils/model_branch_dict.py
Improve efficiency by directly using observed_type from model parameters if available, avoiding unnecessary DeepEval instantiation. Update test to filter out table lines in output parsing.
@codecov
Copy link
Copy Markdown

codecov bot commented Aug 13, 2025

Codecov Report

❌ Patch coverage is 80.00000% with 24 lines in your changes missing coverage. Please review.
✅ Project coverage is 84.29%. Comparing base (3f0087b) to head (3780f90).
⚠️ Report is 74 commits behind head on devel.

Files with missing lines Patch % Lines
deepmd/pt/infer/deep_eval.py 45.00% 11 Missing ⚠️
deepmd/utils/model_branch_dict.py 87.20% 11 Missing ⚠️
deepmd/entrypoints/show.py 75.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##            devel    #4883      +/-   ##
==========================================
- Coverage   84.29%   84.29%   -0.01%     
==========================================
  Files         703      704       +1     
  Lines       68728    68842     +114     
  Branches     3572     3573       +1     
==========================================
+ Hits        57934    58027      +93     
- Misses       9653     9675      +22     
+ Partials     1141     1140       -1     

☔ View full report in Codecov by Sentry.
📢 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.

Added a new example input file with model branch aliases for the water multi-task PyTorch example. Updated test_examples.py to include the new input file in multi-task input tests. Also fixed observed_type output in show.py to use the unsorted list.
@iProzd iProzd marked this pull request as ready for review August 14, 2025 10:07
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🔭 Outside diff range comments (3)
source/tests/pt/test_dp_show.py (3)

59-61: Fix assertions that accidentally test only the last substring.

Using chained string "and" returns the last string, so the test only checks one token, weakening coverage.

Apply this diff:

-        assert (
-            "{'type': 'se_e2_a'" and "'sel': [46, 92, 4]" and "'rcut': 4.0"
-        ) in results[2]
+        assert all(
+            s in results[2]
+            for s in ("{'type': 'se_e2_a'", "'sel': [46, 92, 4]", "'rcut': 4.0")
+        )

185-195: Fix multitask descriptor assertions to check all expected substrings.

Same issue: chained constants via "and" reduce to the last string.

Apply this diff:

-        assert (
-            "model_1"
-            and "'type': 'se_e2_a'"
-            and "'sel': [46, 92, 4]"
-            and "'rcut_smth': 0.5"
-        ) in results[4]
+        assert all(
+            s in results[4]
+            for s in ("model_1", "'type': 'se_e2_a'", "'sel': [46, 92, 4]", "'rcut_smth': 0.5")
+        )
-        assert (
-            "model_2"
-            and "'type': 'se_e2_a'"
-            and "'sel': [46, 92, 4]"
-            and "'rcut_smth': 0.5"
-        ) in results[5]
+        assert all(
+            s in results[5]
+            for s in ("model_2", "'type': 'se_e2_a'", "'sel': [46, 92, 4]", "'rcut_smth': 0.5")
+        )

227-228: Fix singletask (frozen) descriptor assertion to check all substrings.

Same chained "and" issue here.

Apply this diff:

-        assert (
-            "'type': 'se_e2_a'" and "'sel': [46, 92, 4]" and "'rcut_smth': 0.5"
-        ) in results[2]
+        assert all(
+            s in results[2]
+            for s in ("'type': 'se_e2_a'", "'sel': [46, 92, 4]", "'rcut_smth': 0.5")
+        )
🧹 Nitpick comments (2)
source/tests/pt/test_dp_show.py (2)

169-175: Robustly filter table output in multitask show tests.

Good call filtering ASCII tables and headers to stabilize assertions across richer show outputs.

For reuse and clarity, consider extracting the filter into a small helper to avoid repeating magic substrings:

def _filter_show_output(lines: list[str]) -> list[str]:
    banned = ("DEEPMD WARNING", "|", "+-", "Detailed information")
    return [ln for ln in lines if all(b not in ln for b in banned)]

Then use:

results = _filter_show_output(f.getvalue().split("\n")[:-1])

163-175: Optional: add a targeted assertion that the alias table is emitted.

Given the new alias-aware table in show, consider a small focused test that asserts the presence of "Detailed information" and expected alias headers when model_dict contains alias/info, to guard against regressions in the table path. Keep the existing filtered test for the non-table content.

I can draft a self-contained test method that runs dp --pt show with model-branch and asserts the table header and a couple of alias values without depending on exact column widths. Want me to propose it?

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these settings in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between d1ba115 and b5740e5.

📒 Files selected for processing (4)
  • deepmd/entrypoints/show.py (3 hunks)
  • examples/water_multi_task/pytorch_example/input_torch_with_alias.json (1 hunks)
  • source/tests/common/test_examples.py (1 hunks)
  • source/tests/pt/test_dp_show.py (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • deepmd/entrypoints/show.py
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
  • GitHub Check: Build wheels for cp311-macosx_x86_64
  • GitHub Check: Build wheels for cp310-manylinux_aarch64
  • GitHub Check: Build wheels for cp311-win_amd64
  • GitHub Check: Build wheels for cp311-manylinux_x86_64
  • GitHub Check: Build wheels for cp311-manylinux_x86_64
  • GitHub Check: Build C library (2.14, >=2.5.0,<2.15, libdeepmd_c_cu11.tar.gz)
  • GitHub Check: Build C library (2.18, libdeepmd_c.tar.gz)
  • GitHub Check: Analyze (c-cpp)
  • GitHub Check: Analyze (python)
🔇 Additional comments (4)
examples/water_multi_task/pytorch_example/input_torch_with_alias.json (3)

1-148: Well-structured multi-task PT example with aliases. LGTM.

The example cleanly demonstrates model_branch_alias and info usage with shared components. The configuration is consistent and should pass arg checks and normalizations.


61-64: No action needed — observed_type values are subsets of shared type_map_all

Checked with the provided script; output: "OK: observed_type values are subsets of the shared type map."

  • Verified locations:
    • examples/water_multi_task/pytorch_example/input_torch_with_alias.json — lines 61–64
    • examples/water_multi_task/pytorch_example/input_torch_with_alias.json — lines 71–74

60-65: Aliases verified — unique (case-insensitive) and no reserved name used

Ran the provided validation script against examples/water_multi_task/pytorch_example/input_torch_with_alias.json. Output: "OK: aliases are unique and do not use reserved names."

  • Files/locations checked: examples/water_multi_task/pytorch_example/input_torch_with_alias.json (lines 60–65, 70–75)
  • Action: no changes required.
source/tests/common/test_examples.py (1)

71-72: Add alias-based multi-task input to examples test. LGTM.

Including input_torch_with_alias.json in input_files_multi ensures arg checking covers the new alias/info fields.

Comment thread deepmd/utils/argcheck.py Outdated
Co-authored-by: Jinzhe Zeng <jinzhe.zeng@rutgers.edu>
Signed-off-by: Duo <50307526+iProzd@users.noreply.github.com>
Copy link
Copy Markdown
Collaborator

@wanghan-iapcm wanghan-iapcm left a comment

Choose a reason for hiding this comment

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

  1. should the branch names case sensitive or not ?
  2. we may adjust first and 2nd col width of the printed table to the maximum size of the branch name and alias name.

Comment thread deepmd/pt/infer/deep_eval.py
Comment thread deepmd/entrypoints/show.py Outdated
@njzjz njzjz closed this Aug 15, 2025
@njzjz njzjz reopened this Aug 15, 2025
Comment thread deepmd/pt/infer/deep_eval.py
Co-authored-by: Han Wang <92130845+wanghan-iapcm@users.noreply.github.com>
Signed-off-by: Duo <50307526+iProzd@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (1)
deepmd/entrypoints/show.py (1)

40-40: Past suggestion addressed: unpack from get_model_dict correctly

Using "_, model_branch_dict = get_model_dict(...)" matches the earlier review suggestion. LGTM.

🧹 Nitpick comments (4)
deepmd/entrypoints/show.py (4)

31-49: Nice integration of alias-aware branch listing with a detailed table

  • Properly guards the "model-branch" path to multitask models.
  • The human-readable list plus the ASCII table is a good UX improvement.

One nit: you list "RANDOM" in the short list but it’s absent from the table. Consider adding a row for clarity (see next comment with a concrete diff).


45-48: Optionally include a 'RANDOM' row in the table for consistency

Right now "RANDOM" appears in the plain list but not in the table, which may confuse users. You can inject a minimal placeholder row before rendering.

Apply this diff:

         _, model_branch_dict = get_model_dict(model_params["model_dict"])
         log.info(
             f"Available model branches are {model_branches}, "
             f"where 'RANDOM' means using a randomly initialized fitting net."
         )
-        log.info(
+        # Optionally reflect RANDOM in the table as a placeholder
+        model_branch_dict = dict(model_branch_dict)
+        model_branch_dict.setdefault(
+            "RANDOM",
+            {"alias": [], "info": {"description": "Randomly initialized fitting net"}},
+        )
+        log.info(
             "Detailed information: \n"
             + OrderedDictTableWrapper(model_branch_dict).as_table()
         )

91-106: Validate and normalize info.observed_type; dedupe to avoid double-counting

If info.observed_type is mis-typed (e.g., a string) or contains duplicates, logs and totals become misleading. Light validation and normalization would make this robust while preserving order.

Apply this diff:

-                if (
-                    model_params["model_dict"][branch]
-                    .get("info", {})
-                    .get("observed_type", None)
-                    is not None
-                ):
-                    observed_type_list = model_params["model_dict"][branch]["info"][
-                        "observed_type"
-                    ]
-                    observed_types = {
-                        "type_num": len(observed_type_list),
-                        "observed_type": observed_type_list,
-                    }
+                if (
+                    model_params["model_dict"][branch]
+                    .get("info", {})
+                    .get("observed_type", None)
+                    is not None
+                ):
+                    observed_type_list = model_params["model_dict"][branch]["info"]["observed_type"]
+                    # Normalize: accept a single string, preserve order, remove dups
+                    if isinstance(observed_type_list, (str, bytes)):
+                        observed_type_list = [observed_type_list]
+                    if not isinstance(observed_type_list, (list, tuple)):
+                        log.warning(
+                            "Branch %s: info.observed_type must be a list of strings; falling back to model introspection.",
+                            branch,
+                        )
+                        tmp_model = DeepEval(INPUT, head=branch, no_jit=True)
+                        observed_types = tmp_model.get_observed_types()
+                    else:
+                        unique_observed = list(dict.fromkeys(observed_type_list))
+                        observed_types = {
+                            "type_num": len(unique_observed),
+                            "observed_type": unique_observed,
+                        }
                 else:
                     tmp_model = DeepEval(INPUT, head=branch, no_jit=True)
                     observed_types = tmp_model.get_observed_types()

105-106: Avoid repeated model instantiation when falling back to introspection

Creating a new DeepEval per branch can be expensive. If the API allows, consider reusing a single instance and switching heads, or caching results per branch to cut load time.

If you want, I can sketch a small cache layer keyed by branch to avoid redundant DeepEval(...) calls when many branches miss observed_type in info.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between bf31822 and fba956a.

📒 Files selected for processing (1)
  • deepmd/entrypoints/show.py (3 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
deepmd/entrypoints/show.py (1)
deepmd/utils/model_branch_dict.py (3)
  • OrderedDictTableWrapper (45-177)
  • get_model_dict (11-41)
  • as_table (115-177)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (29)
  • GitHub Check: Test Python (5, 3.9)
  • GitHub Check: Test Python (6, 3.12)
  • GitHub Check: Test Python (3, 3.9)
  • GitHub Check: Test Python (4, 3.9)
  • GitHub Check: Test Python (2, 3.12)
  • GitHub Check: Test Python (1, 3.12)
  • GitHub Check: Test Python (6, 3.9)
  • GitHub Check: Test Python (2, 3.9)
  • GitHub Check: Test Python (4, 3.12)
  • GitHub Check: Test Python (3, 3.12)
  • GitHub Check: Test Python (5, 3.12)
  • GitHub Check: Test Python (1, 3.9)
  • GitHub Check: Test C++ (true)
  • GitHub Check: Test C++ (false)
  • GitHub Check: Build wheels for cp311-manylinux_x86_64
  • GitHub Check: Build wheels for cp311-macosx_x86_64
  • GitHub Check: Build C++ (cuda120, cuda)
  • GitHub Check: Build wheels for cp310-manylinux_aarch64
  • GitHub Check: Build wheels for cp311-macosx_arm64
  • GitHub Check: Build C library (2.14, >=2.5.0,<2.15, libdeepmd_c_cu11.tar.gz)
  • GitHub Check: Build wheels for cp311-win_amd64
  • GitHub Check: Build wheels for cp311-manylinux_x86_64
  • GitHub Check: Build C library (2.18, libdeepmd_c.tar.gz)
  • GitHub Check: Build C++ (clang, clang)
  • GitHub Check: Build C++ (rocm, rocm)
  • GitHub Check: Analyze (python)
  • GitHub Check: Build C++ (cuda, cuda)
  • GitHub Check: Build C++ (cpu, cpu)
  • GitHub Check: Analyze (c-cpp)
🔇 Additional comments (1)
deepmd/entrypoints/show.py (1)

10-13: Imports look correct and align with new utilities

Brings in OrderedDictTableWrapper and get_model_dict from the new helper module; usage below is consistent with their APIs. No concerns about ordering or circularity from this file’s perspective.

@iProzd
Copy link
Copy Markdown
Member Author

iProzd commented Aug 26, 2025

  1. should the branch names case sensitive or not ?
  2. we may adjust first and 2nd col width of the printed table to the maximum size of the branch name and alias name.
  1. For inner design, case sensitive is better, which is assumed in both state keys in checkpoint or model keys in multi-task. While for user interface, maybe it's better we first accept case sensitive names, then case-insensitive names by normalizing to lowercase and mapping to the first matching key.
  2. Fixed.

@iProzd iProzd requested review from njzjz and wanghan-iapcm August 26, 2025 08:43
@iProzd iProzd requested a review from Chengqian-Zhang August 26, 2025 08:44
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

♻️ Duplicate comments (1)
deepmd/utils/model_branch_dict.py (1)

32-41: Replace assert with explicit exception and harden None handling for aliases/info

Asserts can be stripped with Python -O, turning user input errors into silent misbehavior. Also, model_branch_alias or info may be None, which would raise at iteration time.

Apply this diff:

-        alias_list = model_dict[key].get("model_branch_alias", [])
+        alias_list = model_dict[key].get("model_branch_alias") or []
         model_branch_dict[key]["alias"] = alias_list
-        branch_info = model_dict[key].get("info", {})
+        branch_info = model_dict[key].get("info") or {}
         model_branch_dict[key]["info"] = branch_info
         for alias in alias_list:
-            assert alias not in model_alias_dict, (
-                f"Alias {alias} for model_branch {key} already exists in model_branch {model_alias_dict[alias]}!"
-            )
+            if alias in model_alias_dict:
+                raise ValueError(
+                    f"Alias '{alias}' for model_branch '{key}' already exists in model_branch "
+                    f"'{model_alias_dict[alias]}'!"
+                )
             model_alias_dict[alias] = key
🧹 Nitpick comments (9)
deepmd/utils/model_branch_dict.py (6)

91-97: Drop redundant .keys() usage when iterating and checking membership

Minor cleanup to satisfy linters (SIM118) and improve readability.

Apply this diff:

-        for _, payload in self.data.items():
-            info = payload.get("info") or {}
-            for k in info.keys():
-                if k not in seen:
-                    seen.add(k)
-                    self.info_keys.append(k)
+        for _, payload in self.data.items():
+            info = payload.get("info") or {}
+            for k in info:
+                if k not in seen:
+                    seen.add(k)
+                    self.info_keys.append(k)

127-131: Use direct dict iteration to compute branch width

Matches Ruff’s SIM118 and is a minor readability win.

Apply this diff:

-        for branch in self.data.keys():
+        for branch in self.data:
             branch_col_width = max(branch_col_width, len(str(branch)))

133-137: Alias column may wrap unexpectedly; compute width from the rendered alias string

You calculate width from the maximum single alias, but display a comma-joined string. For multiple aliases, the actual cell content can exceed the computed width, causing unintended wrapping.

Apply this diff:

-        alias_col_width = len(self.headers[1])  # "Alias"
-        for payload in self.data.values():
-            alias_list = payload.get("alias", [])
-            for alias in alias_list:
-                alias_col_width = max(alias_col_width, len(str(alias)))
+        alias_col_width = len(self.headers[1])  # "Alias"
+        for payload in self.data.values():
+            alias_str = ", ".join(map(str, payload.get("alias", [])))
+            alias_col_width = max(alias_col_width, len(alias_str))

Also applies to: 145-147


198-198: Rename unused loop index

The loop variable i is unused (B007). Rename to _ to signal intentional discard.

Apply this diff:

-        for i, row_cells in enumerate(wrapped_rows):
+        for _, row_cells in enumerate(wrapped_rows):

98-101: Nit: Header text mismatch with docstring

Docstring says “Model Branch Name” while header uses “Model Branch”. Pick one for consistency.

Example:

-        self.headers: list[str] = ["Model Branch", "Alias", *self.info_keys]
+        self.headers: list[str] = ["Model Branch Name", "Alias", *self.info_keys]

12-26: Add type hints for clarity and downstream tooling

get_model_dict lacks type hints; adding them improves IDE help and self-documentation.

Apply this diff:

-from typing import (
-    Any,
-    Optional,
-)
+from typing import Any, Optional, Dict, Tuple, OrderedDict as TOrderedDict
@@
-def get_model_dict(model_dict):
+def get_model_dict(
+    model_dict: Dict[str, Dict[str, Any]]
+) -> Tuple[Dict[str, str], Dict[str, Dict[str, Any]]]:
deepmd/pt/infer/deep_eval.py (3)

125-127: Drop unused variable to avoid linter noise

model_branch_dict is not used in this method.

Apply this diff:

-                model_alias_dict, model_branch_dict = get_model_dict(
+                model_alias_dict, _ = get_model_dict(
                     self.input_param["model_dict"]
                 )

140-148: Case-insensitive fallback should only run for string inputs

If head is not a string, calling .lower() will raise. Also, keep behavior unchanged for non-strings.

Apply this diff:

-                if head not in model_alias_dict:
-                    # preprocess with potentially case-insensitive input
-                    head_lower = head.lower()
-                    for mk in model_alias_dict:
-                        if mk.lower() == head_lower:
-                            # mapped the first matched head
-                            head = mk
-                            break
+                if isinstance(head, str) and head not in model_alias_dict:
+                    # case-insensitive fallback: map to the first matching key
+                    head_lower = head.lower()
+                    for mk in model_alias_dict:
+                        if mk.lower() == head_lower:
+                            head = mk
+                            break

153-163: Optional: record the resolved branch and log selection

Expose the resolved branch for downstream consumers (debugging, telemetry, or UIs) and log it once.

Apply this diff:

-                head = model_alias_dict[head]
+                head = model_alias_dict[head]
+                self.selected_model_branch = head  # for introspection
+                log.info(f"Selected multitask head: {head}")
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between fba956a and 3421fa5.

📒 Files selected for processing (2)
  • deepmd/pt/infer/deep_eval.py (4 hunks)
  • deepmd/utils/model_branch_dict.py (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
deepmd/pt/infer/deep_eval.py (2)
deepmd/utils/model_branch_dict.py (1)
  • get_model_dict (12-42)
deepmd/utils/finetune.py (1)
  • get_model_branch (47-49)
🪛 Ruff (0.12.2)
deepmd/utils/model_branch_dict.py

93-93: Use key in dict instead of key in dict.keys()

Remove .keys()

(SIM118)


129-129: Use key in dict instead of key in dict.keys()

Remove .keys()

(SIM118)


198-198: Loop control variable i not used within loop body

Rename unused i to _i

(B007)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (19)
  • GitHub Check: Test C++ (false)
  • GitHub Check: Test C++ (true)
  • GitHub Check: Test Python (6, 3.9)
  • GitHub Check: Test Python (6, 3.12)
  • GitHub Check: Test Python (5, 3.9)
  • GitHub Check: Test Python (1, 3.9)
  • GitHub Check: Build C library (2.18, libdeepmd_c.tar.gz)
  • GitHub Check: Build C library (2.14, >=2.5.0,<2.15, libdeepmd_c_cu11.tar.gz)
  • GitHub Check: Build wheels for cp311-macosx_x86_64
  • GitHub Check: Build wheels for cp311-win_amd64
  • GitHub Check: Build wheels for cp310-manylinux_aarch64
  • GitHub Check: Build wheels for cp311-manylinux_x86_64
  • GitHub Check: Build wheels for cp311-manylinux_x86_64
  • GitHub Check: Build wheels for cp311-macosx_arm64
  • GitHub Check: Build C++ (cuda120, cuda)
  • GitHub Check: Build C++ (clang, clang)
  • GitHub Check: Build C++ (rocm, rocm)
  • GitHub Check: Analyze (python)
  • GitHub Check: Analyze (c-cpp)
🔇 Additional comments (2)
deepmd/pt/infer/deep_eval.py (2)

129-133: Good defaulting behavior with clear logging

Defaulting to the “Default” alias when present and logging the decision improves UX for multitask models.


283-293: LGTM: clear and useful branch introspection for callers

The new get_model_branch() method returns both alias mapping and branch metadata, and provides a sensible single-task fallback.

Comment thread deepmd/pt/infer/deep_eval.py
Comment thread deepmd/pt/infer/deep_eval.py
Comment thread deepmd/pt/infer/deep_eval.py
Comment thread deepmd/utils/argcheck.py Outdated
@iProzd iProzd requested a review from njzjz August 27, 2025 10:53
@iProzd iProzd added this pull request to the merge queue Aug 27, 2025
Merged via the queue into deepmodeling:devel with commit 58ce1aa Aug 27, 2025
60 checks passed
@iProzd iProzd deleted the D0812_devel_head_alias branch August 27, 2025 18:08
ChiahsinChu pushed a commit to ChiahsinChu/deepmd-kit that referenced this pull request Dec 17, 2025
Introduces model branch alias and info fields to model configuration,
adds utility functions for handling model branch dictionaries, and
updates related modules to use alias-based lookup and provide detailed
branch information. Enhances multi-task model usability and improves
logging of available model branches.

example:
```
dp --pt show 0415_compat_new.pt model-branch

[2025-08-14 10:05:54,246] DEEPMD WARNING To get the best performance, it is recommended to adjust the number of threads by setting the environment variables OMP_NUM_THREADS, DP_INTRA_OP_PARALLELISM_THREADS, and DP_INTER_OP_PARALLELISM_THREADS. See https://deepmd.rtfd.io/parallelism/ for more information.
[2025-08-14 10:05:59,122] DEEPMD INFO    This is a multitask model
[2025-08-14 10:05:59,122] DEEPMD INFO    Available model branches are ['Dai2023Alloy', 'Zhang2023Cathode', 'Gong2023Cluster', 'Yang2023ab', 'UniPero', 'Huang2021Deep-PBE', 'Liu2024Machine', 'Zhang2021Phase', 'Jinag2021Accurate', 'Chen2023Modeling', 'Wen2021Specialising', 'Wang2022Classical', 'Wang2022Tungsten', 'Wu2021Deep', 'Huang2021Deep-PBEsol', 'Transition1x', 'Wang2021Generalizable', 'Wu2021Accurate', 'MPTraj', 'Li2025APEX', 'Shi2024SSE', 'Tuo2023Hybrid', 'Unke2019PhysNet', 'Shi2024Electrolyte', 'ODAC23', 'Alex2D', 'OMAT24', 'SPICE2', 'OC20M', 'OC22', 'Li2025General', 'RANDOM'], where 'RANDOM' means using a randomly initialized fitting net.
[2025-08-14 10:05:59,125] DEEPMD INFO    Detailed information:
+-----------------------+------------------------------+--------------------------------+--------------------------------+
| Model Branch          | Alias                        | description                    | observed_type                  |
+-----------------------+------------------------------+--------------------------------+--------------------------------+
| Dai2023Alloy          | Alloys, Domains_Alloy        | The dataset contains           | ['La', 'Fe', 'Ho', 'Cu', 'Sn', |
|                       |                              | structure-energy-force-virial  | 'Cd', 'Y', 'Be', 'V', 'Sm',    |
|                       |                              | data for 53 typical metallic   | 'In', 'Pr', 'Mo', 'Mn', 'Gd',  |
|                       |                              | elements in alloy systems,     | 'Ru', 'Nd', 'Li', 'Tm', 'K',   |
|                       |                              | including ~9000 intermetallic  | 'Pt', 'Ir', 'Na', 'Hf', 'Dy',  |
|                       |                              | compounds and FCC, BCC, HCP    | 'Ca', 'Nb', 'Au', 'Sr', 'Si',  |
|                       |                              | structures. It consists of two | 'Ge', 'Co', 'W', 'Cr', 'Zn',   |
|                       |                              | parts: DFT-generated relaxed   | 'Ag', 'Ti', 'Ni', 'Zr', 'Pd',  |
|                       |                              | and deformed structures, and   | 'Os', 'Ta', 'Rh', 'Sc', 'Tb',  |
|                       |                              | randomly distorted structures  | 'Al', 'Ga', 'Re', 'Lu', 'Er',  |
|                       |                              | produced covering pure metals, | 'Mg', 'Ce', 'Pb']              |
|                       |                              | solid solutions, and           |                                |
|                       |                              | intermetallics with vacancies. |                                |
+-----------------------+------------------------------+--------------------------------+--------------------------------+
| OMAT24                | Default, Materials, Omat24   | OMat24 is a large-scale open   | ['La', 'Fe', 'Cu', 'Cd', 'Be', |
|                       |                              | dataset containing over 110    | 'Ar', 'V', 'Sm', 'In', 'Pm',   |
|                       |                              | million DFT calculations       | 'Pr', 'Mn', 'Ru', 'He', 'Nd',  |
|                       |                              | spanning diverse structures    | 'Th', 'Pa', 'K', 'Pt', 'Yb',   |
|                       |                              | and compositions. It is        | 'Dy', 'Sr', 'Co', 'Np', 'Cr',  |
|                       |                              | designed to support AI-driven  | 'Tl', 'Br', 'Se', 'Ni', 'Zr',  |
|                       |                              | materials discovery by         | 'Pu', 'O', 'Xe', 'Tb', 'Ga',   |
|                       |                              | providing broad and deep       | 'Lu', 'H', 'Ne', 'Er', 'Ce',   |
|                       |                              | coverage of chemical space.    | 'I', 'Kr', 'Ho', 'Cs', 'Sn',   |
|                       |                              |                                | 'Rb', 'Y', 'N', 'F', 'Mo',     |
|                       |                              |                                | 'Gd', 'B', 'Li', 'Tm', 'Sb',   |
|                       |                              |                                | 'Ir', 'Hf', 'Na', 'Ca', 'Nb',  |
|                       |                              |                                | 'Au', 'As', 'Si', 'Ge', 'W',   |
|                       |                              |                                | 'Zn', 'Hg', 'Ag', 'Bi', 'Ti',  |
|                       |                              |                                | 'Os', 'Cl', 'Pd', 'P', 'U',    |
|                       |                              |                                | 'Tc', 'Ta', 'Ba', 'Rh', 'Sc',  |
|                       |                              |                                | 'C', 'S', 'Te', 'Al', 'Re',    |
|                       |                              |                                | 'Eu', 'Mg', 'Pb', 'Ac']        |
+-----------------------+------------------------------+--------------------------------+--------------------------------+
```


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Alias-based multi-task branch selection for evaluation and
fine-tuning; new API to query model alias/branch info; show now prints a
detailed model-branch table.

* **Documentation**
* Model config gains optional fields to declare branch aliases and
per-branch info (PyTorch-only).

* **Examples**
* Added a two-task PyTorch example demonstrating aliases, shared
components, and per-branch info.

* **Tests**
* Tests include the new example and now filter out table-like show
output.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Duo <50307526+iProzd@users.noreply.github.com>
Co-authored-by: Jinzhe Zeng <jinzhe.zeng@rutgers.edu>
Co-authored-by: Han Wang <92130845+wanghan-iapcm@users.noreply.github.com>
iProzd added a commit to iProzd/deepmd-kit that referenced this pull request Mar 27, 2026
* feat(pt): support zbl finetune (#4849)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added an option to control whether output statistics are computed or
loaded across atomic models.

* **Bug Fixes**
* More robust parameter transfer during fine‑tuning to handle renamed
branches and missing pretrained keys.

* **Refactor**
* Revised output-statistics workflow and refined per‑type output bias
application in composite models.

* **Tests**
* Simplified linear-model bias checks and added a ZBL finetuning test
path.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: anyangml <anyangpeng.ca@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(pt/pd): fix eta computation (#4886)

fix eta computation code

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved ETA accuracy in training/validation progress logs by adapting
calculations to recent step intervals, reducing misleading estimates
early in runs.
* Consistent behavior across both backends, providing more reliable
remaining-time estimates without changing any public interfaces.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

* fix: get correct intensive property prediction when using virtual atoms (#4869)

When using virtual atoms, the property output of virtual atom is `0`.
- If predicting energy or other extensive properties, it works well,
that's because the virtual atom property `0` do not contribute to the
total energy or other extensive properties.
- However, if predicting intensive properties, there is some error. For
example, a frame has two real atoms and two virtual atoms, the atomic
property contribution is [2, 2, 0, 0](the atomic property of virtual
atoms are always 0), the final property should be `(2+2)/real_atoms =
2`, not be `(2+2)/total_atoms =1`.

This PR is used to solve this bug mentioned above.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Models now provide accessors to retrieve property names and their
fitting network; property fitting nets expose output definitions.

* **Bug Fixes**
* Intensive property reduction respects atom masks so padded/dummy atoms
are ignored, keeping results invariant to padding.

* **Tests**
* Added PyTorch, JAX, and core tests validating consistent behavior with
padded atoms.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(tf): fix compatibility with TF 2.20 (#4890)

Fix version finding in pip and CMake; pin TF to <2.20 on Windows; fix
TENSORFLOW_ROOT in the CI.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Added compatibility with TensorFlow 2.20+ via runtime version
detection and generated version macros.

- Bug Fixes
  - Clearer errors when a specified TensorFlow root is invalid.
  - Improved version-parsing fallback for newer TensorFlow releases.
- Tightened Windows CPU wheel constraint to avoid incompatible versions.

- Chores
- Updated devcontainer scripts and CI workflows to more reliably locate
TensorFlow without importing it directly.
- Linked TensorFlow during version checks to ensure accurate detection.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>
Signed-off-by: Jinzhe Zeng <njzjz@qq.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: relax `atol` and `rtol` value of padding atoms UT (#4892)

The UT of padding atoms(pytorch backend) sometimes fails like:
```
Mismatched elements: 1 / 2 (50%)
Max absolute difference among violations: 1.97471693e-08
Max relative difference among violations: 6.45619919e-07
 ACTUAL: array([[-0.236542],
       [ 0.030586]])
 DESIRED: array([[-0.236542],
       [ 0.030586]])
= 1 failed, 15442 passed, 4135 skipped, 97877 deselected, 224 warnings in 2825.25s (0:47:05) =
```

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Tests**
- Adjusted numerical comparison assertions to use both absolute and
relative tolerances in padding-related tests.
- Aligns checks between computed results and references, improving
resilience to minor floating-point variation.
- Reduces intermittent test failures across environments and dependency
versions.
  - No impact on features, performance, or user workflows.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

* doc(pd): update paddle installation scripts and paddle related content in dpa3 document (#4887)

update paddle installation scripts and custom border op error message

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Documentation**
* Updated installation guides to reference PaddlePaddle 3.1.1 for CUDA
12.6, CUDA 11.8, and CPU; added nightly pre-release install examples.
* Refined training docs wording and CINN note; added Paddle backend
guidance and explicit OP-install instructions in DPA3 docs.

* **Chores**
* Improved error messages when custom Paddle operators are unavailable,
adding clearer install instructions and links to documentation.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: HydrogenSulfate <490868991@qq.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(pt): fix CMake compatibility with PyTorch 2.8 (#4891)

Fix #4877.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- Bug Fixes
- Improved build compatibility with PyTorch 2.8+ on UNIX-like systems
(excluding macOS) by aligning the default ABI selection with PyTorch’s
behavior. This reduces potential linker/runtime issues when building
against newer PyTorch versions. Behavior on other platforms and with
older PyTorch remains unchanged. No runtime functionality changes for
end users.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

* feat: add yaml input file support (#4894)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Training entrypoints now accept YAML configuration files in addition
to JSON, offering more flexibility when launching training.
* Unified configuration loading across frameworks for consistent
behavior (PyTorch, Paddle, TensorFlow).
* Backward compatible: existing JSON-based workflows continue to work
unchanged.

* **Tests**
* Added coverage to verify YAML input produces the expected training
output.
  * Improved test cleanup to remove generated artifacts after execution.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* build(deps): bump actions/checkout from 4 to 5 (#4897)

Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to
5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/checkout/releases">actions/checkout's
releases</a>.</em></p>
<blockquote>
<h2>v5.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Update actions checkout to use node 24 by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2226">actions/checkout#2226</a></li>
<li>Prepare v5.0.0 release by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2238">actions/checkout#2238</a></li>
</ul>
<h2>⚠️ Minimum Compatible Runner Version</h2>
<p><strong>v2.327.1</strong><br />
<a
href="https://github.com/actions/runner/releases/tag/v2.327.1">Release
Notes</a></p>
<p>Make sure your runner is updated to this version or newer to use this
release.</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v4...v5.0.0">https://github.com/actions/checkout/compare/v4...v5.0.0</a></p>
<h2>v4.3.0</h2>
<h2>What's Changed</h2>
<ul>
<li>docs: update README.md by <a
href="https://github.com/motss"><code>@​motss</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li>
<li>Add internal repos for checking out multiple repositories by <a
href="https://github.com/mouismail"><code>@​mouismail</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li>
<li>Documentation update - add recommended permissions to Readme by <a
href="https://github.com/benwells"><code>@​benwells</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li>
<li>Adjust positioning of user email note and permissions heading by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2044">actions/checkout#2044</a></li>
<li>Update README.md by <a
href="https://github.com/nebuk89"><code>@​nebuk89</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li>
<li>Update CODEOWNERS for actions by <a
href="https://github.com/TingluoHuang"><code>@​TingluoHuang</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/2224">actions/checkout#2224</a></li>
<li>Update package dependencies by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li>
<li>Prepare release v4.3.0 by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2237">actions/checkout#2237</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/motss"><code>@​motss</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li>
<li><a href="https://github.com/mouismail"><code>@​mouismail</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li>
<li><a href="https://github.com/benwells"><code>@​benwells</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li>
<li><a href="https://github.com/nebuk89"><code>@​nebuk89</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li>
<li><a href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v4...v4.3.0">https://github.com/actions/checkout/compare/v4...v4.3.0</a></p>
<h2>v4.2.2</h2>
<h2>What's Changed</h2>
<ul>
<li><code>url-helper.ts</code> now leverages well-known environment
variables by <a href="https://github.com/jww3"><code>@​jww3</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/1941">actions/checkout#1941</a></li>
<li>Expand unit test coverage for <code>isGhes</code> by <a
href="https://github.com/jww3"><code>@​jww3</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1946">actions/checkout#1946</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v4.2.1...v4.2.2">https://github.com/actions/checkout/compare/v4.2.1...v4.2.2</a></p>
<h2>v4.2.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Check out other refs/* by commit if provided, fall back to ref by <a
href="https://github.com/orhantoy"><code>@​orhantoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1924">actions/checkout#1924</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/Jcambass"><code>@​Jcambass</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/1919">actions/checkout#1919</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v4.2.0...v4.2.1">https://github.com/actions/checkout/compare/v4.2.0...v4.2.1</a></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/actions/checkout/blob/main/CHANGELOG.md">actions/checkout's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<h2>V5.0.0</h2>
<ul>
<li>Update actions checkout to use node 24 by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2226">actions/checkout#2226</a></li>
</ul>
<h2>V4.3.0</h2>
<ul>
<li>docs: update README.md by <a
href="https://github.com/motss"><code>@​motss</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li>
<li>Add internal repos for checking out multiple repositories by <a
href="https://github.com/mouismail"><code>@​mouismail</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li>
<li>Documentation update - add recommended permissions to Readme by <a
href="https://github.com/benwells"><code>@​benwells</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li>
<li>Adjust positioning of user email note and permissions heading by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2044">actions/checkout#2044</a></li>
<li>Update README.md by <a
href="https://github.com/nebuk89"><code>@​nebuk89</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li>
<li>Update CODEOWNERS for actions by <a
href="https://github.com/TingluoHuang"><code>@​TingluoHuang</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/2224">actions/checkout#2224</a></li>
<li>Update package dependencies by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li>
</ul>
<h2>v4.2.2</h2>
<ul>
<li><code>url-helper.ts</code> now leverages well-known environment
variables by <a href="https://github.com/jww3"><code>@​jww3</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/1941">actions/checkout#1941</a></li>
<li>Expand unit test coverage for <code>isGhes</code> by <a
href="https://github.com/jww3"><code>@​jww3</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1946">actions/checkout#1946</a></li>
</ul>
<h2>v4.2.1</h2>
<ul>
<li>Check out other refs/* by commit if provided, fall back to ref by <a
href="https://github.com/orhantoy"><code>@​orhantoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1924">actions/checkout#1924</a></li>
</ul>
<h2>v4.2.0</h2>
<ul>
<li>Add Ref and Commit outputs by <a
href="https://github.com/lucacome"><code>@​lucacome</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1180">actions/checkout#1180</a></li>
<li>Dependency updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>- <a
href="https://redirect.github.com/actions/checkout/pull/1777">actions/checkout#1777</a>,
<a
href="https://redirect.github.com/actions/checkout/pull/1872">actions/checkout#1872</a></li>
</ul>
<h2>v4.1.7</h2>
<ul>
<li>Bump the minor-npm-dependencies group across 1 directory with 4
updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1739">actions/checkout#1739</a></li>
<li>Bump actions/checkout from 3 to 4 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1697">actions/checkout#1697</a></li>
<li>Check out other refs/* by commit by <a
href="https://github.com/orhantoy"><code>@​orhantoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1774">actions/checkout#1774</a></li>
<li>Pin actions/checkout's own workflows to a known, good, stable
version. by <a href="https://github.com/jww3"><code>@​jww3</code></a> in
<a
href="https://redirect.github.com/actions/checkout/pull/1776">actions/checkout#1776</a></li>
</ul>
<h2>v4.1.6</h2>
<ul>
<li>Check platform to set archive extension appropriately by <a
href="https://github.com/cory-miller"><code>@​cory-miller</code></a> in
<a
href="https://redirect.github.com/actions/checkout/pull/1732">actions/checkout#1732</a></li>
</ul>
<h2>v4.1.5</h2>
<ul>
<li>Update NPM dependencies by <a
href="https://github.com/cory-miller"><code>@​cory-miller</code></a> in
<a
href="https://redirect.github.com/actions/checkout/pull/1703">actions/checkout#1703</a></li>
<li>Bump github/codeql-action from 2 to 3 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1694">actions/checkout#1694</a></li>
<li>Bump actions/setup-node from 1 to 4 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1696">actions/checkout#1696</a></li>
<li>Bump actions/upload-artifact from 2 to 4 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1695">actions/checkout#1695</a></li>
<li>README: Suggest <code>user.email</code> to be
<code>41898282+github-actions[bot]@users.noreply.github.com</code> by <a
href="https://github.com/cory-miller"><code>@​cory-miller</code></a> in
<a
href="https://redirect.github.com/actions/checkout/pull/1707">actions/checkout#1707</a></li>
</ul>
<h2>v4.1.4</h2>
<ul>
<li>Disable <code>extensions.worktreeConfig</code> when disabling
<code>sparse-checkout</code> by <a
href="https://github.com/jww3"><code>@​jww3</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1692">actions/checkout#1692</a></li>
<li>Add dependabot config by <a
href="https://github.com/cory-miller"><code>@​cory-miller</code></a> in
<a
href="https://redirect.github.com/actions/checkout/pull/1688">actions/checkout#1688</a></li>
<li>Bump the minor-actions-dependencies group with 2 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1693">actions/checkout#1693</a></li>
<li>Bump word-wrap from 1.2.3 to 1.2.5 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1643">actions/checkout#1643</a></li>
</ul>
<h2>v4.1.3</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/checkout/commit/08c6903cd8c0fde910a37f88322edcfb5dd907a8"><code>08c6903</code></a>
Prepare v5.0.0 release (<a
href="https://redirect.github.com/actions/checkout/issues/2238">#2238</a>)</li>
<li><a
href="https://github.com/actions/checkout/commit/9f265659d3bb64ab1440b03b12f4d47a24320917"><code>9f26565</code></a>
Update actions checkout to use node 24 (<a
href="https://redirect.github.com/actions/checkout/issues/2226">#2226</a>)</li>
<li>See full diff in <a
href="https://github.com/actions/checkout/compare/v4...v5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=4&new-version=5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* [pre-commit.ci] pre-commit autoupdate (#4898)

<!--pre-commit.ci start-->
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.8 →
v0.12.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.8...v0.12.9)
<!--pre-commit.ci end-->

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Fix(pt): add comm_dict for zbl, linear, dipole, dos, polar model to fix bugs mentioned in issue #4906 (#4908)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- New Features
- Added optional support to pass a communication dictionary through
lower-level model computations across energy, dipole, DOS, polarization,
and related models. This enables advanced workflows while remaining
fully backward compatible.
- Refactor
- Standardized internal propagation of the communication dictionary
across sub-models to ensure consistent behavior.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

* docs: add comprehensive GitHub Copilot instructions and environment setup (#4911)

This PR adds comprehensive development support for GitHub Copilot agents
working in the DeePMD-kit codebase.

## What's included

**Comprehensive Copilot Instructions
(`.github/copilot-instructions.md`)**
- Complete build workflow with exact timing expectations (67s Python
build, 164s C++ build)
- Virtual environment setup and dependency installation for all backends
(TensorFlow, PyTorch, JAX, Paddle)
- **Optimized testing guidance**: Emphasizes single test execution
(~8-13 seconds) over full test suite (60+ minutes) for faster
development feedback
- Linting and formatting with ruff (1 second execution)
- Multiple validation scenarios for CLI, Python interface, and training
workflows
- Directory structure reference and key file locations
- Critical warnings with specific timeout recommendations to prevent
premature cancellation
- **Conventional commit specification**: Guidelines for commit messages
and PR titles following `type(scope): description` format

**Automated Environment Setup
(`.github/workflows/copilot-setup-steps.yml`)**
- Pre-configures Python environment using uv for fast dependency
management
- Installs TensorFlow CPU and PyTorch automatically
- Builds the DeePMD-kit package with all dependencies
- Sets up pre-commit hooks for code quality
- Validates installation to ensure environment readiness

**Development Efficiency Features**
- All commands tested and validated with accurate timing measurements
- Imperative tone throughout for clear action items
- Copy-paste ready validation scenarios
- Gitignore rules to prevent temporary test files from being committed

## Key improvements for Copilot agents

- **Faster iteration**: Single test recommendations instead of 60+
minute full test suites
- **Automated setup**: No manual environment configuration needed
- **Precise expectations**: Exact timing guidance prevents timeout
issues during builds
- **Multi-backend support**: Complete coverage of TensorFlow, PyTorch,
JAX, and Paddle workflows
- **Consistent commit standards**: Enforces conventional commit
specification for all changes

The instructions enable any GitHub Copilot agent to work effectively in
this codebase from a fresh clone with precise expectations for build
times, test execution, and validation workflows.

Fixes #4910.

<!-- START COPILOT CODING AGENT TIPS -->
---

💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: njzjz <9496702+njzjz@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(pt,pd): remove redundant tensor handling to eliminate tensor construction warnings (#4907)

This PR fixes deprecation warnings that occur when `torch.tensor()` or
`paddle.to_tensor()` is called on existing tensor objects:

**PyTorch warning:**
```
UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).
```

**PaddlePaddle warning:**
```
UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach(), rather than paddle.to_tensor(sourceTensor).
```

## Root Cause

The warnings were being triggered in multiple locations:

1. **PyTorch**: Test cases were passing tensor objects directly to ASE
calculators, which internally convert them using `torch.tensor()`
2. **PaddlePaddle**: Similar issues in `eval_model` function and
`to_paddle_tensor` utility, plus a TypeError where `tensor.to()` method
was incorrectly using `place=` instead of `device=`

## Solution

**For PyTorch:**
- Modified test cases to convert tensor inputs to numpy arrays before
passing to ASE calculators
- Removed redundant tensor handling in `to_torch_tensor` utility
function since the non-numpy check already handles tensors by returning
them as-is

**For PaddlePaddle:**
- Added proper type checking in `eval_model` function to handle existing
tensors with `clone().detach()`
- Removed redundant tensor handling in `to_paddle_tensor` utility
function, applying the same optimization as PyTorch
- Fixed TypeError by changing `place=` to `device=` in all `tensor.to()`
method calls (PaddlePaddle's tensor `.to()` method expects `device=`
parameter, while `paddle.to_tensor()` correctly uses `place=`)

## Changes Made

1. **`source/tests/pt/test_calculator.py`**: Fixed `TestCalculator` and
`TestCalculatorWithFparamAparam` to convert PyTorch tensors to numpy
arrays before passing to ASE calculator
2. **`deepmd/pt/utils/utils.py`**: Removed redundant tensor-specific
handling in `to_torch_tensor` function
3. **`source/tests/pd/common.py`**: Updated `eval_model` function with
type checking for PaddlePaddle tensors and fixed `tensor.to()` method
calls to use `device=` instead of `place=`
4. **`deepmd/pd/utils/utils.py`**: Removed redundant tensor-specific
handling in `to_paddle_tensor` function for consistency with PyTorch

Both utility functions now use a simplified approach where the `if not
isinstance(xx, np.ndarray): return xx` check handles all non-numpy
inputs (including tensors) by returning them unchanged, eliminating the
need for separate tensor-specific code paths.

This change is backward compatible and maintains the same functionality
while eliminating both deprecation warnings and TypeErrors, improving
code consistency between PyTorch and PaddlePaddle backends.

Fixes #3790.

<!-- START COPILOT CODING AGENT TIPS -->
---

💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: njzjz <9496702+njzjz@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* feat: Add eval-desc CLI command for descriptor evaluation with 3D output format (#4903)

This PR implements a new command-line interface for evaluating
descriptors using trained DeePMD models, addressing the feature request
for making the `eval_descriptor` function available from the command
line.

## Overview

The new `dp eval-desc` command allows users to generate descriptor
matrices from their models using a simple CLI interface, similar to the
existing `dp test` command.

## Usage

```bash
# Basic usage
dp eval-desc -m model.pb -s /path/to/system

# With custom output directory  
dp eval-desc -m model.pth -s /path/to/system -o my_descriptors

# Using datafile with multiple systems
dp eval-desc -m model.pb -f systems_list.txt -o desc_output

# For multi-task models
dp eval-desc -m model.pth -s system_dir --head task_branch
```

## Output Format

Descriptors are saved as NumPy `.npy` files in 3D format (nframes,
natoms, ndesc) preserving the natural structure of the data with
separate dimensions for frames, atoms, and descriptor components. This
format maintains the original data organization and is suitable for
various analysis workflows.

## Implementation Details

The implementation follows the same architectural pattern as the
existing `dp test` command:

- **CLI Parser**: Added argument parser in `deepmd/main.py` with options
for model (`-m`), system (`-s`), datafile (`-f`), output (`-o`), and
model branch (`--head`)
- **Command Routing**: Integrated into the entrypoints system in
`deepmd/entrypoints/main.py`
- **Core Functionality**: New `eval_desc.py` module that uses
`DeepEval.eval_descriptor()` to generate descriptors and saves them as
`.npy` files in their natural 3D format
- **Documentation**: Updated user guide and API documentation with
output format details
- **Testing**: Comprehensive tests following the pattern of existing `dp
test` functionality

Fixes #4503.

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ Let Copilot coding agent [set things up for
you](https://github.com/deepmodeling/deepmd-kit/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: njzjz <9496702+njzjz@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* build(deps): bump actions/upload-pages-artifact from 3 to 4 (#4918)

Bumps
[actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact)
from 3 to 4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/upload-pages-artifact/releases">actions/upload-pages-artifact's
releases</a>.</em></p>
<blockquote>
<h2>v4.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Potentially breaking change: hidden files (specifically dotfiles)
will not be included in the artifact by <a
href="https://github.com/tsusdere"><code>@​tsusdere</code></a> in <a
href="https://redirect.github.com/actions/upload-pages-artifact/pull/102">actions/upload-pages-artifact#102</a>
If you need to include dotfiles in your artifact: instead of using this
action, create your own artifact according to these requirements <a
href="https://github.com/actions/upload-pages-artifact?tab=readme-ov-file#artifact-validation">https://github.com/actions/upload-pages-artifact?tab=readme-ov-file#artifact-validation</a></li>
<li>Pin <code>actions/upload-artifact</code> to SHA by <a
href="https://github.com/heavymachinery"><code>@​heavymachinery</code></a>
in <a
href="https://redirect.github.com/actions/upload-pages-artifact/pull/127">actions/upload-pages-artifact#127</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/upload-pages-artifact/compare/v3.0.1...v4.0.0">https://github.com/actions/upload-pages-artifact/compare/v3.0.1...v4.0.0</a></p>
<h2>v3.0.1</h2>
<h1>Changelog</h1>
<ul>
<li>Group tar's output to prevent it from messing up action logs <a
href="https://github.com/SilverRainZ"><code>@​SilverRainZ</code></a> (<a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/94">#94</a>)</li>
<li>Update README.md <a
href="https://github.com/uiolee"><code>@​uiolee</code></a> (<a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/88">#88</a>)</li>
<li>Bump the non-breaking-changes group with 1 update <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> (<a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/92">#92</a>)</li>
<li>Update Dependabot config to group non-breaking changes <a
href="https://github.com/JamesMGreene"><code>@​JamesMGreene</code></a>
(<a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/91">#91</a>)</li>
<li>Bump actions/checkout from 3 to 4 <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> (<a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/76">#76</a>)</li>
</ul>
<p>See details of <a
href="https://github.com/actions/upload-pages-artifact/compare/v3.0.0...v3.0.1">all
code changes</a> since previous release.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/7b1f4a764d45c48632c6b24a0339c27f5614fb0b"><code>7b1f4a7</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/127">#127</a>
from heavymachinery/pin-sha</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/4cc19c7d3f3e6c87c68366501382a03c8b1ba6db"><code>4cc19c7</code></a>
Pin <code>actions/upload-artifact</code> to SHA</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/2d163be3ddce01512f3eea7ac5b7023b5d643ce1"><code>2d163be</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/107">#107</a>
from KittyChiu/main</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/c70484322b1c476728dcd37fac23c4dea2a0c51a"><code>c704843</code></a>
fix: linted README</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/9605915f1d2fc79418cdce4d5fbe80511c457655"><code>9605915</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/106">#106</a>
from KittyChiu/kittychiu/update-readme-1</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/e59cdfe6d6b061aab8f0619e759cded914f3ab03"><code>e59cdfe</code></a>
Update README.md</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/a2d67043267d885050434d297d3dd3a3a14fd899"><code>a2d6704</code></a>
doc: updated usage section in readme</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/984864e7b70fb5cb764344dc9c4b5c087662ef50"><code>984864e</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/105">#105</a>
from actions/Jcambass-patch-1</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/45dc78884ca148c05eddcd8ac0a804d3365e9014"><code>45dc788</code></a>
Add workflow file for publishing releases to immutable action
package</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/efaad07812d4b9ad2e8667cd46426fdfb7c22e22"><code>efaad07</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/102">#102</a>
from actions/hidden-files</li>
<li>Additional commits viewable in <a
href="https://github.com/actions/upload-pages-artifact/compare/v3...v4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/upload-pages-artifact&package-manager=github_actions&previous-version=3&new-version=4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix: Avoid setting pin_memory in tests (#4919)

Avoid specifying pin_memory for test DataLoaders to eliminate warnings
when no accelerator is available.
#4874

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Tests**
* Updated test configurations to rely on default memory pinning behavior
in data loading, improving compatibility across environments.
* Simplified test setup parameters to reduce potential flakiness and
align with framework defaults.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

* [pre-commit.ci] pre-commit autoupdate (#4917)

<!--pre-commit.ci start-->
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.12.9 →
v0.12.10](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.9...v0.12.10)
<!--pre-commit.ci end-->

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* chore(CI): bump PyTorch from 2.7 to 2.8 (#4884)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Upgraded PyTorch to 2.8 across CPU and CUDA 12.x environments for
improved compatibility and stability.
* Updated development container to download the matching LibTorch 2.8
CPU bundle.
* Refreshed CI pipelines (build, test, analysis) to install and validate
against PyTorch 2.8.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Jinzhe Zeng <njzjz@qq.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix(pd): change numel function return type from int to size_t to prevent overflow (#4924)

The `numel` function in the Paddle backend was using `int` for computing
tensor element counts, which can overflow for large tensors. This fix
changes the return type and intermediate calculations to `size_t` to
handle larger tensor sizes safely.

## Problem

The original implementation multiplied tensor dimensions as `int`
values:

```cpp
int numel(const paddle_infer::Tensor& x) const {
  // TODO: There might be a overflow problem here for multiply int numbers.
  int ret = 1;
  std::vector<int> x_shape = x.shape();
  for (std::size_t i = 0, n = x_shape.size(); i < n; ++i) {
    ret *= x_shape[i];  // Can overflow for large tensors
  }
  return ret;
}
```

For large tensors (e.g., shape `[50000, 50000, 10]` = 25 billion
elements), this causes integer overflow and returns negative values.

## Solution

- Changed return type from `int` to `size_t`
- Changed intermediate calculations to use `size_t` with explicit
casting
- Updated all calling sites to use `size_t` variables
- Removed the TODO comment since the overflow issue is now resolved

```cpp
size_t numel(const paddle_infer::Tensor& x) const {
  size_t ret = 1;
  std::vector<int> x_shape = x.shape();
  for (std::size_t i = 0, n = x_shape.size(); i < n; ++i) {
    ret *= static_cast<size_t>(x_shape[i]);  // Safe from overflow
  }
  return ret;
}
```

The `size_t` type can handle up to 2^64 elements on 64-bit systems (vs
2^31 for `int`), making it appropriate for tensor element counts. This
change is backward compatible since `std::vector::resize()` and other
consumers already accept `size_t`.

Fixes #4551.

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ Let Copilot coding agent [set things up for
you](https://github.com/deepmodeling/deepmd-kit/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: njzjz <9496702+njzjz@users.noreply.github.com>

* feat(pd): support gradient accumulation (#4920)

support gradient accumulation for paddle backend.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Configurable gradient accumulation (acc_freq) that batches optimizer
updates, optional gradient clipping, and multi‑GPU gradient sync to
occur at the configured interval; acc_freq=1 preserves prior behavior.

- **Documentation**
  - Added argument docs and a Paddle backend notice describing acc_freq.

- **Tests**
- Added tests exercising gradient accumulation and updated test cleanup.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

* feat(pt): add model branch alias (#4883)

Introduces model branch alias and info fields to model configuration,
adds utility functions for handling model branch dictionaries, and
updates related modules to use alias-based lookup and provide detailed
branch information. Enhances multi-task model usability and improves
logging of available model branches.

example:
```
dp --pt show 0415_compat_new.pt model-branch

[2025-08-14 10:05:54,246] DEEPMD WARNING To get the best performance, it is recommended to adjust the number of threads by setting the environment variables OMP_NUM_THREADS, DP_INTRA_OP_PARALLELISM_THREADS, and DP_INTER_OP_PARALLELISM_THREADS. See https://deepmd.rtfd.io/parallelism/ for more information.
[2025-08-14 10:05:59,122] DEEPMD INFO    This is a multitask model
[2025-08-14 10:05:59,122] DEEPMD INFO    Available model branches are ['Dai2023Alloy', 'Zhang2023Cathode', 'Gong2023Cluster', 'Yang2023ab', 'UniPero', 'Huang2021Deep-PBE', 'Liu2024Machine', 'Zhang2021Phase', 'Jinag2021Accurate', 'Chen2023Modeling', 'Wen2021Specialising', 'Wang2022Classical', 'Wang2022Tungsten', 'Wu2021Deep', 'Huang2021Deep-PBEsol', 'Transition1x', 'Wang2021Generalizable', 'Wu2021Accurate', 'MPTraj', 'Li2025APEX', 'Shi2024SSE', 'Tuo2023Hybrid', 'Unke2019PhysNet', 'Shi2024Electrolyte', 'ODAC23', 'Alex2D', 'OMAT24', 'SPICE2', 'OC20M', 'OC22', 'Li2025General', 'RANDOM'], where 'RANDOM' means using a randomly initialized fitting net.
[2025-08-14 10:05:59,125] DEEPMD INFO    Detailed information:
+-----------------------+------------------------------+--------------------------------+--------------------------------+
| Model Branch          | Alias                        | description                    | observed_type                  |
+-----------------------+------------------------------+--------------------------------+--------------------------------+
| Dai2023Alloy          | Alloys, Domains_Alloy        | The dataset contains           | ['La', 'Fe', 'Ho', 'Cu', 'Sn', |
|                       |                              | structure-energy-force-virial  | 'Cd', 'Y', 'Be', 'V', 'Sm',    |
|                       |                              | data for 53 typical metallic   | 'In', 'Pr', 'Mo', 'Mn', 'Gd',  |
|                       |                              | elements in alloy systems,     | 'Ru', 'Nd', 'Li', 'Tm', 'K',   |
|                       |                              | including ~9000 intermetallic  | 'Pt', 'Ir', 'Na', 'Hf', 'Dy',  |
|                       |                              | compounds and FCC, BCC, HCP    | 'Ca', 'Nb', 'Au', 'Sr', 'Si',  |
|                       |                              | structures. It consists of two | 'Ge', 'Co', 'W', 'Cr', 'Zn',   |
|                       |                              | parts: DFT-generated relaxed   | 'Ag', 'Ti', 'Ni', 'Zr', 'Pd',  |
|                       |                              | and deformed structures, and   | 'Os', 'Ta', 'Rh', 'Sc', 'Tb',  |
|                       |                              | randomly distorted structures  | 'Al', 'Ga', 'Re', 'Lu', 'Er',  |
|                       |                              | produced covering pure metals, | 'Mg', 'Ce', 'Pb']              |
|                       |                              | solid solutions, and           |                                |
|                       |                              | intermetallics with vacancies. |                                |
+-----------------------+------------------------------+--------------------------------+--------------------------------+
| OMAT24                | Default, Materials, Omat24   | OMat24 is a large-scale open   | ['La', 'Fe', 'Cu', 'Cd', 'Be', |
|                       |                              | dataset containing over 110    | 'Ar', 'V', 'Sm', 'In', 'Pm',   |
|                       |                              | million DFT calculations       | 'Pr', 'Mn', 'Ru', 'He', 'Nd',  |
|                       |                              | spanning diverse structures    | 'Th', 'Pa', 'K', 'Pt', 'Yb',   |
|                       |                              | and compositions. It is        | 'Dy', 'Sr', 'Co', 'Np', 'Cr',  |
|                       |                              | designed to support AI-driven  | 'Tl', 'Br', 'Se', 'Ni', 'Zr',  |
|                       |                              | materials discovery by         | 'Pu', 'O', 'Xe', 'Tb', 'Ga',   |
|                       |                              | providing broad and deep       | 'Lu', 'H', 'Ne', 'Er', 'Ce',   |
|                       |                              | coverage of chemical space.    | 'I', 'Kr', 'Ho', 'Cs', 'Sn',   |
|                       |                              |                                | 'Rb', 'Y', 'N', 'F', 'Mo',     |
|                       |                              |                                | 'Gd', 'B', 'Li', 'Tm', 'Sb',   |
|                       |                              |                                | 'Ir', 'Hf', 'Na', 'Ca', 'Nb',  |
|                       |                              |                                | 'Au', 'As', 'Si', 'Ge', 'W',   |
|                       |                              |                                | 'Zn', 'Hg', 'Ag', 'Bi', 'Ti',  |
|                       |                              |                                | 'Os', 'Cl', 'Pd', 'P', 'U',    |
|                       |                              |                                | 'Tc', 'Ta', 'Ba', 'Rh', 'Sc',  |
|                       |                              |                                | 'C', 'S', 'Te', 'Al', 'Re',    |
|                       |                              |                                | 'Eu', 'Mg', 'Pb', 'Ac']        |
+-----------------------+------------------------------+--------------------------------+--------------------------------+
```


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Alias-based multi-task branch selection for evaluation and
fine-tuning; new API to query model alias/branch info; show now prints a
detailed model-branch table.

* **Documentation**
* Model config gains optional fields to declare branch aliases and
per-branch info (PyTorch-only).

* **Examples**
* Added a two-task PyTorch example demonstrating aliases, shared
components, and per-branch info.

* **Tests**
* Tests include the new example and now filter out table-like show
output.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Duo <50307526+iProzd@users.noreply.github.com>
Co-authored-by: Jinzhe Zeng <jinzhe.zeng@rutgers.edu>
Co-authored-by: Han Wang <92130845+wanghan-iapcm@users.noreply.github.com>

* feat(ci): skip workflows on bot branches to avoid redundant CI runs (#4916)

This PR implements a feature request to skip all GitHub workflows on
push events for bot-created branches to avoid redundant CI runs and save
resources.

## Problem

Bot-created branches (`copilot/*`, `dependabot/*`, and
`pre-commit-ci-update-config`) currently trigger workflows on both push
events and when PRs are created. This creates duplicate CI runs since
the same tests will run again when the PR is opened, wasting CI time and
resources.

## Solution

Added `branches-ignore` patterns to workflow files that have push
triggers to skip the following branch patterns:
- `copilot/**` - GitHub Copilot branches
- `dependabot/**` - Dependabot dependency update branches  
- `pre-commit-ci-update-config` - Pre-commit CI configuration update
branches

## Changes Made

Updated 8 workflow files with bot branch ignore patterns:
- `build_cc.yml`, `build_wheel.yml`, `codeql.yml`, `package_c.yml`,
`test_cc.yml`, `test_python.yml` - Added bot branch patterns to existing
`branches-ignore` lists
- `copilot-setup-steps.yml` - Added `branches-ignore` alongside existing
`paths` filter
- `mirror_gitee.yml` - Converted from array syntax to explicit push
configuration with `branches-ignore`

The `todo.yml` workflow was left unchanged since it only runs on the
`devel` branch, making bot branch exclusions unnecessary.

Example of the change:
```yaml
on:
  push:
    branches-ignore:
      - "gh-readonly-queue/**"      # existing
      - "copilot/**"                # new
      - "dependabot/**"             # new  
      - "pre-commit-ci-update-config" # new
```

## Impact

- ✅ Bot branches will skip workflows on push events but still trigger
them when PRs are created
- ✅ Normal development branches continue to trigger workflows as
expected
- ✅ Reduces unnecessary CI runs and resource usage
- ✅ Maintains full test coverage through PR-triggered workflows
- ✅ All workflow files maintain valid YAML syntax

Fixes #4915.

<!-- START COPILOT CODING AGENT TIPS -->
---

💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: njzjz <9496702+njzjz@users.noreply.github.com>

* feat: handle masked forces in test (#4893)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Added per-atom weighting for force evaluation: computes and reports
weighted MAE/RMSE alongside unweighted metrics, includes weighted
metrics in system-average summaries, logs weighted force metrics, and
safely handles zero-weight cases. Also propagates the per-atom weight
field into reporting.

- Tests
- Added end-to-end tests validating weighted vs unweighted force
MAE/RMSE and verifying evaluator outputs when using per-atom weight
masks.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* feat: add comprehensive type hints to core modules excluding backends and tests (#4936)

- [x] Add comprehensive type hints to core modules excluding backends
and tests
- [x] **Fixed type annotation issues from code review:**
  - Fixed `head` parameter type from `Any` to `str` in calculator.py
- Fixed `neighbor_list` parameter type to use proper ASE NeighborList
type annotation
  - Fixed `**kwargs` type from `object` to `Any` in deep_polar.py
- Fixed `write_model_devi_out` return type from `None` to `np.ndarray`
to match actual return value
- Fixed `get_natoms_vec` return type from `list[int]` to `np.ndarray` to
match actual return type
- Fixed `_get_natoms_2` return type from `list[int]` to `tuple[int,
np.ndarray]` to match actual return values
- Fixed `make_index` return type from `dict[str, int]` to `str` to match
actual return value
  - Added missing imports for type annotations (ASE NeighborList, Any)

**Current status:** All type annotation suggestions from code review
have been addressed. All ruff checks pass with zero violations.

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ Let Copilot coding agent [set things up for
you](https://github.com/deepmodeling/deepmd-kit/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: njzjz <9496702+njzjz@users.noreply.github.com>

* feat: support using train/valid data from input.json for dp test (#4859)

This pull request extends the testing functionality in DeepMD by
allowing users to specify training and validation data directly via
input JSON files, in addition to existing system and datafile options.
It updates the command-line interface, the main test logic, and adds
comprehensive tests to cover these new features, including support for
recursive glob patterns when selecting systems from JSON files.

### Feature enhancements to testing data sources

* The `test` function in `deepmd/entrypoints/test.py` now accepts
`train_json` and `valid_json` arguments, allowing users to specify
training or validation systems for testing via input JSON files. It
processes these files to extract system paths, including support for
recursive glob patterns. The function also raises an error if no valid
data source is specified.
[[1]](diffhunk://#diff-299c01ed4ee7d0b3f636fe4cb4f0d660a5012b7e95ca0740098b3ace617ab16eL61-R71)
[[2]](diffhunk://#diff-299c01ed4ee7d0b3f636fe4cb4f0d660a5012b7e95ca0740098b3ace617ab16eL104-R151)
* **The command-line interface in `deepmd/main.py` is updated to add
`--train-data` and `--valid-data` arguments for the test subparser,
enabling direct specification of input JSON files for training and
validation data.**

### Test coverage improvements

* New and updated tests in `source/tests/pt/test_dp_test.py` verify the
ability to run tests using input JSON files for both training and
validation data, including cases with recursive glob patterns. This
ensures robust handling of various data source configurations.
[[1]](diffhunk://#diff-ce70e95ffdb1996c7887ea3f63b54d1ae0fef98059572ad03875ca36cfef3c34L33-R35)
[[2]](diffhunk://#diff-ce70e95ffdb1996c7887ea3f63b54d1ae0fef98059572ad03875ca36cfef3c34R49-R59)
[[3]](diffhunk://#diff-ce70e95ffdb1996c7887ea3f63b54d1ae0fef98059572ad03875ca36cfef3c34R103-R116)
[[4]](diffhunk://#diff-ce70e95ffdb1996c7887ea3f63b54d1ae0fef98059572ad03875ca36cfef3c34R164-R273)
* Additional argument parser tests in
`source/tests/common/test_argument_parser.py` confirm correct parsing of
the new `--train-data` and `--valid-data` options.

### Internal code improvements

* Refactored imports and type annotations in
`deepmd/entrypoints/test.py` to support the new functionality and
improve code clarity.
[[1]](diffhunk://#diff-299c01ed4ee7d0b3f636fe4cb4f0d660a5012b7e95ca0740098b3ace617ab16eR17)
[[2]](diffhunk://#diff-299c01ed4ee7d0b3f636fe4cb4f0d660a5012b7e95ca0740098b3ace617ab16eR42-R50)
[[3]](diffhunk://#diff-299c01ed4ee7d0b3f636fe4cb4f0d660a5012b7e95ca0740098b3ace617ab16eL77-R95)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- New Features
- Added support for supplying test systems via JSON files, including
selecting training or validation data.
- Introduced CLI options --train-data and --valid-data for the test
command.
- Supports resolving relative paths from JSON and optional recursive
glob patterns.
- Changes
- Test command now requires at least one data source (JSON, data file,
or system); clearer errors when none or no systems found.
- Tests
- Expanded test coverage for JSON-driven inputs and recursive glob
patterns; refactored helpers for improved readability.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Chun Cai <amoycaic@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* feat(tf): implement change-bias command (#4927)

Implements TensorFlow support for the `dp change-bias` command with
proper checkpoint handling and variable restoration. This brings the
TensorFlow backend to feature parity with the PyTorch implementation.

## Key Features

- **Checkpoint file support**: Handles individual checkpoint files
(`.ckpt`, `.meta`, `.data`, `.index`) and frozen models (`.pb`)
- **Proper variable restoration**: Variables are correctly restored from
checkpoints using session initialization before bias modification
- **User-defined bias support**: Supports `-b/--bias-value` option with
proper validation against model type_map
- **Data-based bias calculation**: Leverages existing
`change_energy_bias_lower` functionality for automatic bias computation
- **Checkpoint preservation**: Saves modified variables to separate
checkpoint directory for continued training
- **Cross-backend consistency**: Identical CLI interface and
functionality as PyTorch backend

## Before vs After

**Variable restoration**: 
- Before: `Change energy bias of ['O', 'H'] from [0. 0.] to [calculated
values]` (variables never restored)
- After: `Change energy bias of ['O', 'H'] from [-93.57 -187.15] to
[-93.60 -187.19]` (proper restoration)

**Output**: Creates both updated checkpoint files AND frozen model for
continued training

**Documentation**: Comprehensive documentation covering both TensorFlow
and PyTorch backends with examples and backend-specific details

The implementation includes comprehensive test coverage with real model
training to validate functionality without mocks.

Fixes #4018.

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ Let Copilot coding agent [set things up for
you](https://github.com/deepmodeling/deepmd-kit/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Signed-off-by: Jinzhe Zeng <njzjz@qq.com>
Signed-off-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: njzjz <9496702+njzjz@users.noreply.github.com>
Co-authored-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* style: complete type annotation enforcement for deepmd.pt (#4943)

This PR implements comprehensive type annotation coverage for the
deepmd.pt PyTorch backend and resolves critical TorchScript compilation
errors that prevented model deployment.

## Type Annotation Enforcement

Added complete type annotations to all deepmd.pt module functions,
eliminating 7,030+ ANN violations across 107 Python files. This
provides:

- Better IDE support and code maintainability
- Consistent typing standards throughout the PyTorch backend
- Enhanced developer experience with clear function signatures

## TorchScript Compilation Fixes

Resolved multiple TorchScript compilation errors that prevented model
deployment:

```python
# Before: TorchScript compilation failed
sw.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION)  # Error on Optional[Tensor]

# After: Proper None handling
sw.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION) if sw is not None else None
```

Key fixes include:
- Added proper None checks before `.to()` calls on
`Optional[torch.Tensor]` values
- Resolved issues across all descriptor types (SE-A, SE-T, SE-T-TEBD,
DPA1, DPA2, DPA3)
- Fixed abstract method patterns that conflicted with TorchScript
compilation
- Corrected return type annotations in SpinModel to accurately reflect
Optional types

## Pre-commit Compliance

- Fixed deprecated type annotation imports (Dict→dict, Tuple→tuple)
- Resolved import ordering and undefined name issues  
- Removed unnecessary imports and improved code consistency
- All pre-commit checks now pass with zero violations

The PyTorch backend now has complete type coverage and full TorchScript
deployment compatibility, enabling production model serving scenarios.

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ Let Copilot coding agent [set things up for
you](https://github.com/deepmodeling/deepmd-kit/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Signed-off-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: njzjz <9496702+njzjz@users.noreply.github.com>
Co-authored-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>

* fix(tf): fix serialization of dipole fitting with sel_type (#4934)

Fix #3672.

Fixes backend conversion issues for dipole models when using the
`sel_type` parameter. The `dp convert-backend` command was failing due
to missing serialization support for `None` networks and incomplete
dipole fitting serialization.

- [x] Fix NetworkCollection serialization to handle `None` networks
- [x] Add missing `@variables` dictionary for DipoleFittingSeA PyTorch
compatibility
- [x] Include `sel_type` in serialized data for proper backend
conversion
- [x] Fix TF fitting deserialization to skip `None` networks
- [x] Add comprehensive tests for `sel_type` parameter
- [x] Remove duplicate test classes and merge parameterized tests
- [x] Clean up accidentally committed test output files
- [x] Refactor addi…
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.

5 participants