Skip to content

feat(tf2): support DPA4 training#5749

Open
njzjz wants to merge 10 commits into
deepmodeling:masterfrom
njzjz:feat/dpa4-tf2-train
Open

feat(tf2): support DPA4 training#5749
njzjz wants to merge 10 commits into
deepmodeling:masterfrom
njzjz:feat/dpa4-tf2-train

Conversation

@njzjz

@njzjz njzjz commented Jul 7, 2026

Copy link
Copy Markdown
Member

Summary

  • Add TF2 wrappers/registrations for DPA4/SeZM descriptor and dpa4_ener fitting.
  • Route model.type: dpa4/sezm through the TF2 model factory.
  • Add TensorFlow graph-mode implementations for DPA4 scatter helpers used under training.enable_compile.
  • Normalize equivalent flattened force outputs before TF2 loss evaluation.
  • Refresh TF2 trackable list containers after conversion/deserialization so DPA4 checkpoints save correctly.
  • Enable DPA4 TF2 coverage in the existing source/tests/consistent/descriptor/test_dpa4.py and source/tests/consistent/fitting/test_dpa4_ener.py files.

Benchmark

1000-step DPA4 water benchmark, batch size 1, srun --gres=gpu:1 dp, GPU: NVIDIA GeForce RTX 5090.

Backend Command Total wall time Batch 1000 avg Notes
JAX dp --jax train input_jax.json --skip-neighbor-stat 95.860 s 0.0362 s/step Includes initial JAX compile; batch 1 avg 37.0563 s/step.
TF2 dp --tf2 train input_tf2.json --skip-neighbor-stat 164.388 s 0.0148 s/step training.enable_compile=true; includes TF/XLA/PTX compile; batch 1 avg 149.4788 s/step.

PT/pt-expt are not included in the final comparison per follow-up scope.

Validation

  • ruff format .
  • ruff check .
  • python -m py_compile deepmd/dpmodel/array_api.py deepmd/tf2/common.py deepmd/tf2/descriptor/dpa4.py deepmd/tf2/fitting/dpa4_ener.py deepmd/tf2/model/model.py deepmd/tf2/train/trainer.py source/tests/consistent/descriptor/test_dpa4.py source/tests/consistent/fitting/test_dpa4_ener.py
  • TF2 model construction and checkpoint write smoke.
  • dp --tf2 train /tmp/deepmd_dpa4_tiny_1vnghlkx/input_tf2.json --skip-neighbor-stat -o /tmp/deepmd_dpa4_tiny_1vnghlkx/out_tf2.json with training.enable_compile=true; log confirmed Compiled cluster using XLA! and saved model.ckpt.tf2/model.ckpt-1.
  • srun --gres=gpu:1 dp --tf2 train /tmp/deepmd_dpa4_bench_1000/input_tf2.json --skip-neighbor-stat -o /tmp/deepmd_dpa4_bench_1000/out_tf2.json.

Note: collecting the existing DPA4 consistent test module in this local environment segfaults while importing the existing PT DPA4/Triton path before backend-specific selection is applied, so I validated the new TF2 path with the checkpoint smoke, XLA train smoke, and benchmark above.

Summary by CodeRabbit

  • New Features
    • Expanded TensorFlow 2 (TF2) support for DPA4/SeZM descriptors and SeZM energy fitting networks, including new public TF2 exports and DPA4/SeZM-style model configuration loading.
    • Added support for additional TF2-wrapped DPA4 descriptor building blocks.
  • Bug Fixes
    • Improved indexed add/max behavior on TensorFlow backends.
    • Improved handling of DPA4 with empty edges.
    • Automatically aligns model output force shape to label force during training, when possible.
  • Tests
    • Added/extended TF2-focused unit and end-to-end consistency tests, including checkpoint/SavedModel conversion and label-shape behavior.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@dosubot dosubot Bot added the new feature label Jul 7, 2026
@github-actions github-actions Bot added the Python label Jul 7, 2026
Comment thread deepmd/tf2/descriptor/dpa4.py Fixed
Comment thread deepmd/tf2/descriptor/dpa4.py Fixed
Comment thread deepmd/tf2/fitting/dpa4_ener.py Fixed
@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR adds TF2 support for DPA4/SeZM descriptors and fitting networks, registers model and component aliases, adapts PT checkpoints, extends TensorFlow-backed array operations, normalizes force shapes, and adds backend and training tests.

Changes

TF2 DPA4/SeZM integration

Layer / File(s) Summary
TensorFlow-backed indexed array operations
deepmd/dpmodel/array_api.py
Uses TensorFlow scatter and segment reductions for ndtensorflow indexed updates.
DPModel DPA4 behavior and trainability
deepmd/dpmodel/descriptor/..., deepmd/dpmodel/fitting/dpa4_ener.py
Supports empty-edge block execution, dynamic shape validation, and per-layer GLU trainability serialization.
TF2 managed variable storage
deepmd/tf2/common.py
Stores managed arrays as TensorFlow variables and refreshes trackable lists after initialization and deserialization.
TF2 DPA4 descriptor adapters
deepmd/tf2/descriptor/...
Adds wrappers, parameter promotion, mappings, runtime validation, deserialization, and exports.
TF2 SeZM fitting adapters
deepmd/tf2/fitting/...
Adds fitting wrappers, registrations, trainability preservation, and public exports.
Model routing and checkpoint conversion
deepmd/tf2/model/...
Normalizes DPA4/SeZM configurations and adapts PT checkpoints for TF2 deserialization.
Trainer force-shape normalization
deepmd/tf2/train/trainer.py
Matches force output shapes to labels using static and runtime checks.
Validation coverage
source/tests/consistent/..., source/tests/tf2/...
Adds backend, tracking, conversion, model-factory, optimizer, retracing, and training tests.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

Suggested reviewers: OutisLi, iProzd

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

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

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

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
deepmd/tf2/common.py (1)

362-387: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

__getattribute__ allocates a new set on every attribute access.

This override intercepts every attribute read on the module, and for each read it calls _tf2_array_variable_attr_names() / _tf2_array_variable_list_attr_names(), both of which materialize a fresh set(...) from the class-level tuple. On hot descriptor/fitting paths this adds a per-access allocation. Consider a cheaper membership check against the raw tuple (or a cached frozenset) to avoid rebuilding the set on every access.

♻️ Cheaper membership check
         def __getattribute__(self, name: str) -> Any:
             if not name.startswith("_tf2_"):
-                array_attrs = object.__getattribute__(
-                    self,
-                    "_tf2_array_variable_attr_names",
-                )()
-                if name in array_attrs:
+                if name in object.__getattribute__(
+                    self, "_tf2_array_variable_attrs", ()
+                ):
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deepmd/tf2/common.py` around lines 362 - 387, The __getattribute__ override
in common.py is doing extra work on every attribute read by calling
_tf2_array_variable_attr_names() and _tf2_array_variable_list_attr_names(),
which rebuild sets repeatedly. Update __getattribute__ to use a cheaper
membership path for the array/list attribute names, such as checking the
underlying tuple directly or reusing a cached frozenset, while keeping the
existing storage-name lookup and to_tensorflow_array conversion behavior
unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@deepmd/dpmodel/array_api.py`:
- Around line 285-296: The TensorFlow branch in array_api.py is overwriting
prefilled -inf entries because tf.maximum(x_tensor, reduced) replaces
empty-segment sentinels with dtype minimum values. Update the
unsorted-segment-max handling in this branch so empty segments remain -inf,
matching the behavior expected by segment.py and the other backends; use the
existing x_tensor, indices_tensor, values_tensor, and reduced flow, but avoid
applying a blanket maximum that changes sentinel slots.

In `@deepmd/tf2/train/trainer.py`:
- Around line 1490-1493: The shape-iteration guard in the trainer’s
rank-checking helper only handles TypeError, but tf.TensorShape(None) can also
raise ValueError during tracing. Update the try/except around iter(shape) to
return None for both exception types in the same helper path so unknown-rank
shapes are handled safely.

---

Nitpick comments:
In `@deepmd/tf2/common.py`:
- Around line 362-387: The __getattribute__ override in common.py is doing extra
work on every attribute read by calling _tf2_array_variable_attr_names() and
_tf2_array_variable_list_attr_names(), which rebuild sets repeatedly. Update
__getattribute__ to use a cheaper membership path for the array/list attribute
names, such as checking the underlying tuple directly or reusing a cached
frozenset, while keeping the existing storage-name lookup and
to_tensorflow_array conversion behavior unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 76f9add6-fdb8-4b7b-8908-ab6d1ed973d8

📥 Commits

Reviewing files that changed from the base of the PR and between 1cd6556 and 6194ff6.

📒 Files selected for processing (11)
  • deepmd/dpmodel/array_api.py
  • deepmd/tf2/common.py
  • deepmd/tf2/descriptor/__init__.py
  • deepmd/tf2/descriptor/dpa4.py
  • deepmd/tf2/fitting/__init__.py
  • deepmd/tf2/fitting/dpa4_ener.py
  • deepmd/tf2/model/ener_model.py
  • deepmd/tf2/model/model.py
  • deepmd/tf2/train/trainer.py
  • source/tests/consistent/descriptor/test_dpa4.py
  • source/tests/consistent/fitting/test_dpa4_ener.py

Comment thread deepmd/dpmodel/array_api.py Outdated
Comment thread deepmd/tf2/train/trainer.py
@codecov

codecov Bot commented Jul 7, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 87.78947% with 58 lines in your changes missing coverage. Please review.
✅ Project coverage is 79.61%. Comparing base (0c5a914) to head (c86e4b8).
⚠️ Report is 1 commits behind head on master.

Files with missing lines Patch % Lines
deepmd/tf2/model/base_model.py 29.16% 34 Missing ⚠️
deepmd/dpmodel/descriptor/dpa4_nn/so2.py 77.77% 6 Missing ⚠️
deepmd/tf2/common.py 94.44% 6 Missing ⚠️
deepmd/tf2/descriptor/dpa4.py 96.93% 5 Missing ⚠️
deepmd/tf2/train/trainer.py 87.80% 5 Missing ⚠️
deepmd/dpmodel/fitting/dpa4_ener.py 80.00% 1 Missing ⚠️
deepmd/pt/model/task/sezm_ener.py 80.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #5749      +/-   ##
==========================================
- Coverage   79.69%   79.61%   -0.09%     
==========================================
  Files        1020     1022       +2     
  Lines      116359   116820     +461     
  Branches     4303     4307       +4     
==========================================
+ Hits        92736    93006     +270     
- Misses      22076    22272     +196     
+ Partials     1547     1542       -5     

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

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
deepmd/tf2/descriptor/se_atten_v2.py (1)

17-21: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Remove the extra refresh call here. TF2Module already refreshes _refresh_tf2_trackable_lists() for deepmd.tf2.descriptor.se_atten_v2, so this second call is redundant and can be dropped.

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

In `@deepmd/tf2/descriptor/se_atten_v2.py` around lines 17 - 21, The
DescrptSeAttenV2.deserialize method is calling _refresh_tf2_trackable_lists()
twice because TF2Module already performs that refresh for
deepmd.tf2.descriptor.se_atten_v2. Remove the explicit refresh call from
DescrptSeAttenV2.deserialize and keep the deserialization flow limited to
delegating to DescrptSeAttenV2DP.deserialize.__func__(cls, data) and returning
the object.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@deepmd/tf2/descriptor/se_atten_v2.py`:
- Around line 17-21: The DescrptSeAttenV2.deserialize method is calling
_refresh_tf2_trackable_lists() twice because TF2Module already performs that
refresh for deepmd.tf2.descriptor.se_atten_v2. Remove the explicit refresh call
from DescrptSeAttenV2.deserialize and keep the deserialization flow limited to
delegating to DescrptSeAttenV2DP.deserialize.__func__(cls, data) and returning
the object.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: e4a0ef32-c262-4207-8de7-5e2559fd9048

📥 Commits

Reviewing files that changed from the base of the PR and between 6194ff6 and 789aa79.

📒 Files selected for processing (6)
  • deepmd/dpmodel/array_api.py
  • deepmd/tf2/common.py
  • deepmd/tf2/descriptor/se_atten_v2.py
  • deepmd/tf2/train/trainer.py
  • source/tests/consistent/descriptor/test_dpa4.py
  • source/tests/consistent/fitting/test_dpa4_ener.py
🚧 Files skipped from review as they are similar to previous changes (3)
  • deepmd/tf2/train/trainer.py
  • source/tests/consistent/descriptor/test_dpa4.py
  • deepmd/tf2/common.py

@njzjz

njzjz commented Jul 8, 2026

Copy link
Copy Markdown
Member Author

Pushed follow-ups 789aa79ca and 8136fb11 for the TF2 CI/review feedback.\n\nChanges kept:\n- Preserve empty-segment -inf values in the TensorFlow branch of xp_maximum_at.\n- Treat unknown-rank tf.TensorShape(None) as non-static by catching ValueError.\n- Avoid per-access set allocation in TF2Module.__getattribute__.\n- Route TF2 se_atten_v2 deserialization through the se_atten_v2 serializer path instead of DPA1.\n\nI then reverted the extra source/tests/consistent changes in 8136fb11, per request.\n\nLocal validation:\n- TF2 smoke for se_atten_v2 serialize/deserialize passed.\n- TensorFlow xp_maximum_at 1D and 2D empty-segment checks passed.\n- DPTrainer._static_shape(tf.TensorShape(None)) returns None.\n- ruff format . && ruff check . passed.\n\nCI is rerunning.

Comment thread deepmd/tf2/descriptor/dpa4.py
Comment thread deepmd/tf2/common.py
Coding-Agent: Codex
Codex-Version: codex-cli 0.144.1
Model: gpt-5.6-sol
Reasoning-Effort: xhigh
@njzjz

njzjz commented Jul 11, 2026

Copy link
Copy Markdown
Member Author

Pushed follow-up commit 4328329 for the remaining review feedback.

Changes:

  • Promote optional cross-grid FrameContract/FrameExpand weights and FFN LayerScale leaves to tracked, trainable TensorFlow variables.
  • Remove the redundant imports reported by CodeQL.
  • Remove the duplicate DescrptSeAttenV2 refresh call; the tf2_module deserialize wrapper already performs it.
  • Normalize explicit null descriptor/fitting blocks and add focused factory, trackable round-trip, and force-shape tests.

Validation:

  • Focused TF2 tests: 14 passed.
  • DPA4 fitting consistency: 28 passed, 36 skipped.
  • ruff format . and ruff check . passed.

Coding agent: Codex
Codex version: codex-cli 0.144.1
Model: gpt-5.6-sol
Reasoning effort: xhigh

@OutisLi OutisLi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Requesting changes for the dynamic-shape DPA4 force-loss correctness issue described inline.

Comment thread deepmd/tf2/train/trainer.py Outdated

@OutisLi OutisLi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Adding the approved graph-safety correctness finding.

Comment thread deepmd/tf2/descriptor/dpa4.py

@OutisLi OutisLi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Adding the approved fitting-trainability correctness finding.

Comment thread deepmd/tf2/fitting/dpa4_ener.py

@OutisLi OutisLi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Adding the approved frozen-descriptor tracking correctness finding.

Comment thread deepmd/tf2/descriptor/dpa4.py Outdated

@OutisLi OutisLi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Adding the approved normalized-exclusion routing correctness finding.

Comment thread deepmd/tf2/model/model.py Outdated

@OutisLi OutisLi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Adding the approved default-random-gamma training semantics finding.

Comment thread deepmd/tf2/descriptor/dpa4.py

@OutisLi OutisLi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Adding the approved DPA4 property-fitting factory compatibility finding.

Comment thread deepmd/tf2/model/model.py Outdated

@OutisLi OutisLi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Adding the approved DPA4 parameter-promotion resident-memory finding.

Comment thread deepmd/tf2/common.py

@OutisLi OutisLi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Adding the approved PT DPA4 .pt to TF2 conversion integration finding.

Comment thread deepmd/tf2/model/ener_model.py
Make DPA4 dynamic-shape training graph-safe, preserve frozen state, and support the schema-approved factory and PT conversion paths.

Coding-Agent: Codex
Codex-Version: codex-cli 0.144.1
Model: gpt-5.6-sol
Reasoning-Effort: xhigh

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@deepmd/dpmodel/descriptor/dpa4_nn/so2.py`:
- Around line 747-762: Update the shape validation around the visible
x_local/radial_feat checks and _project_radial() to use runtime shape values
rather than assuming concrete symbolic rank metadata. Explicitly reject inputs
with rank below 3 before indexing dimensions, compare dimensions through runtime
shape handling, and reshape radial_feat using its runtime batch dimension or -1.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 741870f5-a817-453c-80e8-1695eec6fccb

📥 Commits

Reviewing files that changed from the base of the PR and between 8136fb1 and aa1ed89.

📒 Files selected for processing (14)
  • deepmd/dpmodel/descriptor/dpa4.py
  • deepmd/dpmodel/descriptor/dpa4_nn/so2.py
  • deepmd/dpmodel/fitting/dpa4_ener.py
  • deepmd/tf2/common.py
  • deepmd/tf2/descriptor/dpa4.py
  • deepmd/tf2/descriptor/se_atten_v2.py
  • deepmd/tf2/fitting/dpa4_ener.py
  • deepmd/tf2/model/base_model.py
  • deepmd/tf2/model/model.py
  • deepmd/tf2/train/trainer.py
  • source/tests/tf2/test_dpa4.py
  • source/tests/tf2/test_dpa4_conversion.py
  • source/tests/tf2/test_model_factory.py
  • source/tests/tf2/test_training.py
💤 Files with no reviewable changes (1)
  • deepmd/tf2/fitting/dpa4_ener.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • deepmd/tf2/common.py

Comment thread deepmd/dpmodel/descriptor/dpa4_nn/so2.py
njzjz-bot and others added 3 commits July 12, 2026 20:07
Validate mixer ranks and dimensions at runtime, propagate the proven rank into ndtensorflow, and avoid static batch dimensions in reshapes.

Coding-Agent: Codex
Codex-Version: codex-cli 0.144.1
Model: gpt-5.6-sol
Reasoning-Effort: xhigh
Resolve DPA4 TF2 training conflicts while retaining the latest Array API Strict coverage from master.

Coding-Agent: Codex
Codex-Version: codex-cli 0.144.1
Model: gpt-5.6-sol
Reasoning-Effort: xhigh
@njzjz-bot

njzjz-bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Resolved the merge conflicts with the latest master and pushed merge commit a6e0e1c. pre-commit.ci subsequently applied its automatic formatting fix in 198a832.

The resolution retains the TF2 DPA4 coverage from this PR together with the latest Array API Strict coverage from master.

Validation:

  • Focused TF2/DPA4 suite: 54 passed, 224 deselected.
  • ruff check . passed.
  • ruff format . reported no local changes before the merge commit.
  • No unresolved review threads remain.

Coding agent: Codex
Codex version: codex-cli 0.144.1
Model: gpt-5.6-sol
Reasoning effort: xhigh

class DynamicRadialDegreeMixer(DynamicRadialDegreeMixerDP):
"""TF2 mixer with runtime shape checks for generalized edge counts."""

def call(self, x_local: Any, radial_feat: Any) -> Any:
Coding-Agent: Codex
Codex-Version: codex-cli 0.144.1
Model: gpt-5.6-sol
Reasoning-Effort: xhigh
Coding-Agent: Codex
Codex-Version: codex-cli 0.144.1
Model: gpt-5.6-sol
Reasoning-Effort: xhigh
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.

6 participants