Skip to content

feat(lmdb): support mixed-size batches and lazy label availability - #5962

Open
OutisLi wants to merge 3 commits into
deepmodeling:masterfrom
OutisLi:pr/lmdb
Open

feat(lmdb): support mixed-size batches and lazy label availability#5962
OutisLi wants to merge 3 commits into
deepmodeling:masterfrom
OutisLi:pr/lmdb

Conversation

@OutisLi

@OutisLi OutisLi commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • support LMDB batches containing frames with different atom counts, using padded rectangular batches for dense models and a flat ragged node axis for eligible graph models
  • compact phantom atoms before graph-model evaluation and make loss reductions, validation weighting, and epoch sizing use real atom counts
  • resolve label availability lazily after data requirements are registered, so required, optional, defaulted, and partially available fields are handled without an eager full-dataset scan
  • keep native-spin models on their existing rectangular public path; the ragged regression coverage uses upstream DPA1 and avoids model-specific dependencies

Testing

  • all pre-commit hooks passed for the changed files
  • 375 passed, 2 skipped, 1 deselected, and 13 subtests passed in the main targeted LMDB/PT/PT-expt/model suite
  • 15 passed in the isolated loss-reduction and decoder-pool regression suite

Summary by CodeRabbit

  • New Features

    • Added support for LMDB batches containing frames with different atom counts.
    • Added ragged-batch inference and training for supported graph models.
    • Added configurable data-source policies for optional labels and parameters.
    • Added safer handling of padded atoms across neighbor graphs and model outputs.
  • Bug Fixes

    • Improved per-atom loss normalization for uneven and padded batches.
    • Prevented padded atoms from affecting neighbor searches, metrics, or losses.
    • Improved handling of missing labels and default-valued data.
  • Documentation

    • Documented mixed-size batching, ragged data, and per-atom normalization.

@OutisLi
OutisLi marked this pull request as ready for review August 8, 2026 15:42
Copilot AI lite review requested due to automatic review settings August 8, 2026 15:42
LMDB batches previously required every frame to have the same atom count,
which can leave sparse size groups under-filled and give their frames a
disproportionate optimizer weight. Add `batch_size: "mix:N"` so frames of
different sizes can share one atom-budgeted batch.

Use two layouts according to the model contract. Eligible graph models consume
one concatenated node axis with per-frame `n_node` counts; other models retain
rectangular batches whose shorter frames are padded with `atype = -1`. Keep
native-spin models on the rectangular public path because their output
translation is spin-specific.

Exclude phantom rows from neighbor graphs and model evaluation, scatter
per-atom outputs back at the public boundary, and make losses and validation
weight only real atoms. Consolidate LMDB sampling and decoding around an
explicit batch layout so serial and worker-process decoding preserve the same
field shapes and frame order.

Cover the ragged training path with the existing DPA1 graph lower, alongside
padding, compaction, loss-reduction, sampler, and decoder regressions.
@dosubot dosubot Bot added the new feature label Aug 8, 2026

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.

Large LMDBs must not pay O(frame count) random I/O or Python-object allocation before the active training contract is known. Read metadata through sequential readahead, keep frame tables in compact NumPy arrays, and choose readahead according to the access pattern of each reader.

Defer availability resolution until requirements are registered. Probe only optional tracked fields; uniform datasets start without a full scan, while detected mixed datasets build one compact cached signature index through a sequential reader with bounded progress logging. Mandatory fields fail at decode, default-backed inputs remain available per frame, and derived fields are computed from normalized structure data.

Apply the contract consistently to statistics, samplers, full validation, and both PT training paths. Declare only active loss labels, preserve explicit values beside defaults, and gate force-derived losses by the availability of their force target.

Keep filtered frame and system indices, mixed-nloc packing, and validation views in one index domain, and retain the block-allocation and batch-layout fixes found while consolidating the data path.
@OutisLi
OutisLi marked this pull request as draft August 8, 2026 15:44
@OutisLi
OutisLi marked this pull request as ready for review August 8, 2026 15:44
@dosubot dosubot Bot added the enhancement label Aug 8, 2026
@coderabbitai

coderabbitai Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1ab16293-5fde-4554-ae82-800d146e2ca5

📥 Commits

Reviewing files that changed from the base of the PR and between a809f15 and ae387ea.

📒 Files selected for processing (2)
  • deepmd/pt/model/model/sezm_model.py
  • deepmd/pt/train/training.py
🚧 Files skipped from review as they are similar to previous changes (2)
  • deepmd/pt/train/training.py
  • deepmd/pt/model/model/sezm_model.py

📝 Walkthrough

Walkthrough

This PR adds mixed-atom-count LMDB batching, ragged graph execution, phantom-node filtering, source-policy metadata, and pooled per-atom loss reductions across DPModel and PyTorch paths.

Changes

Mixed-NLOC and ragged execution

Layer / File(s) Summary
Loss requirements and pooled reductions
deepmd/dpmodel/loss/*, deepmd/pt/loss/*
Losses use conditional requirements, per-frame node counts, pooled masked reductions, and real-atom normalization.
Node counts and graph compaction
deepmd/dpmodel/utils/neighbor_graph/*, deepmd/pt_expt/utils/*
Neighbor graphs accept per-frame node counts, exclude phantom atoms, and compact or expand node axes.
LMDB mixed-NLOC batching
deepmd/pt/utils/lmdb_dataset.py, deepmd/pt_expt/utils/lmdb_dataset.py, deepmd/pt/train/training.py
LMDB loading uses shared samplers and supports mixed-NLOC padded or ragged batches.
Ragged model paths
deepmd/pt_expt/model/*, deepmd/pt_expt/train/*, deepmd/dpmodel/model/make_model.py
Graph models expose ragged forwarding, compact padded nodes, and restore rectangular outputs.
Source policies and validation
deepmd/utils/data.py, deepmd/utils/argcheck.py, source/tests/*, doc/*
Data requirements identify tracked, default, or derived sources. Tests and documentation cover mixed-NLOC behavior, padding, and loss normalization.

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

Possibly related PRs

Suggested reviewers: iprozd, wanghan-iapcm, njzjz

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 65.82% 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 PR's main changes: mixed-size LMDB batches and lazy label availability.
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.

Comment thread source/tests/common/dpmodel/test_lmdb_data.py

@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: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
deepmd/pt/train/training.py (1)

292-328: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Non-distributed LMDB sampler drops the configured seed.

The distributed branch passes seed=_training_params.get("seed") to DistributedLmdbBatchSampler at Line 312. The non-distributed branch does not pass a seed to LmdbBatchSampler at Line 316. LmdbBatchSampler accepts an optional seed and falls back to OS entropy when it is None, so single-process training with a configured training.seed produces a different batch shuffle on every run, while multi-rank training stays reproducible. Pass the same seed to both samplers.

🐛 Proposed fix to pass the configured seed to the non-distributed sampler
                 else:
                     _inner_sampler = LmdbBatchSampler(
                         _data._reader,
                         shuffle=True,
+                        seed=_training_params.get("seed"),
                         block_targets=_block_targets,
                     )
🤖 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/pt/train/training.py` around lines 292 - 328, Pass the configured
training seed from _training_params.get("seed") to the non-distributed
LmdbBatchSampler construction, matching the existing DistributedLmdbBatchSampler
branch while preserving the current sampler options.
deepmd/pt_expt/train/wrapper.py (1)

223-238: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Remove the unsafe ragged-spin dispatch risk.

_forward_without_loss passes input_dict directly to model.forward_ragged() when n_node is set. forward_ragged does not accept spin or **kwargs, but input_dict can include spin for spin-capable models. Add a local guard or dispatch path so a ragged input for a spin model fails explicitly instead of as TypeError: forward_ragged() got an unexpected keyword argument 'spin'.

🤖 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/pt_expt/train/wrapper.py` around lines 223 - 238, Update
_forward_without_loss so ragged inputs with spin are detected before calling
model.forward_ragged; explicitly reject this combination with a clear supported
error, while preserving the existing forward_ragged dispatch for ragged inputs
without spin and the regular model call for non-ragged inputs.
🧹 Nitpick comments (4)
deepmd/pt_expt/train/training.py (1)

1704-1708: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Pass the normalized per-task data maps instead of the raw constructor arguments.

_configure_batch_layout re-implements the dict-or-bare dispatch that _as_task_map already performed at lines 1593-1602. self.training_data_by_task and self.validation_data_by_task are keyed by self.model_keys and are available at this point. Using them removes the second normalization path and lets _configure_batch_layout drop its isinstance(data_map, dict) branch.

♻️ Proposed change
-        self._configure_batch_layout(training_data, validation_data)
+        self._configure_batch_layout(
+            self.training_data_by_task, self.validation_data_by_task
+        )
🤖 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/pt_expt/train/training.py` around lines 1704 - 1708, Update the call
to _configure_batch_layout in the training initialization flow to pass
self.training_data_by_task and self.validation_data_by_task instead of the raw
training_data and validation_data constructor arguments. Then simplify
_configure_batch_layout to consume these normalized per-task maps directly and
remove its redundant isinstance(data_map, dict) dispatch.
deepmd/utils/data.py (1)

1226-1232: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Derive the allowed values from the alias.

The literal set duplicates DataRequirementSourcePolicy. A future value added to the alias would pass type checking but fail at runtime. Use typing.get_args so one declaration governs both.

♻️ Proposed refactor
-        if source_policy not in {"tracked", "default", "derived"}:
+        if source_policy not in get_args(DataRequirementSourcePolicy):
             raise ValueError(
                 "source_policy must be 'tracked', 'default', or 'derived', "
                 f"got {source_policy!r}"
             )

Add the import next to Literal:

from typing import (
    Literal,
    get_args,
)
🤖 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/utils/data.py` around lines 1226 - 1232, Update the validation in the
function containing source_policy to derive allowed values with
typing.get_args(DataRequirementSourcePolicy) instead of duplicating the literal
set, and import get_args alongside Literal. Preserve the existing ValueError and
message behavior for invalid values.
source/tests/pt/test_loss_default_pf.py (1)

232-236: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Derive the leading dimension of drdq from the label batch.

The test hard-codes a batch dimension of 1. self.label_with_pref["force"] carries the batch size of the loaded water system. The mismatch is harmless today, because find_force = 0.0 suppresses the generalized-force branch before drdq is used. If that gating changes, the test would fail for a shape reason instead of the reason it checks.

♻️ Proposed refactor
         label["drdq"] = torch.ones(
-            (1, self.nloc * 3 * numb_generalized_coord),
+            (label["force"].shape[0], self.nloc * 3 * numb_generalized_coord),
             dtype=label["force"].dtype,
             device=label["force"].device,
         )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@source/tests/pt/test_loss_default_pf.py` around lines 232 - 236, Update the
drdq initialization in the relevant test setup to derive its leading dimension
from self.label_with_pref["force"] rather than hard-coding 1, while preserving
the existing coordinate dimension, dtype, and device.
source/tests/pt_expt/utils/test_nv_matrix_decode.py (1)

171-182: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Rounded floats make set equality brittle.

_graph_edges rounds each edge_vec component to 8 decimals and puts the result in a set. Two builders that produce values differing by less than 1e-8 still land in different sets when a value sits on a rounding boundary, for example 1.234567895. Set membership gives no tolerance.

Key the comparison on the integer endpoints only, then compare the matched vectors with np.testing.assert_allclose.

♻️ Proposed refactor
-def _graph_edges(graph) -> set:
-    """Edges as (src, dst, rounded edge_vec), so two builders can be compared."""
-    keep = graph.edge_mask
-    return {
-        (int(s), int(d), *(round(float(x), 8) for x in v))
-        for s, d, v in zip(
-            graph.edge_index[0][keep],
-            graph.edge_index[1][keep],
-            graph.edge_vec[keep],
-            strict=True,
-        )
-    }
+def _graph_edges(graph) -> dict:
+    """Edge vectors keyed by (src, dst), so two builders can be compared."""
+    keep = graph.edge_mask
+    return {
+        (int(s), int(d)): np.asarray(v, dtype=np.float64)
+        for s, d, v in zip(
+            graph.edge_index[0][keep],
+            graph.edge_index[1][keep],
+            graph.edge_vec[keep],
+            strict=True,
+        )
+    }
+
+
+def _assert_same_edges(actual, expected) -> None:
+    assert set(actual) == set(expected)
+    for key, vector in expected.items():
+        np.testing.assert_allclose(actual[key], vector, atol=1e-10)

Then call _assert_same_edges(_graph_edges(nv), _graph_edges(dense)) at line 222.

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

In `@source/tests/pt_expt/utils/test_nv_matrix_decode.py` around lines 171 - 182,
Update _graph_edges to key edges by integer (src, dst) endpoints while retaining
each edge vector without rounding, and add or update _assert_same_edges to match
endpoint keys and compare corresponding vectors with np.testing.assert_allclose.
Replace the comparison near the indicated call site with
_assert_same_edges(_graph_edges(nv), _graph_edges(dense)), preserving detection
of missing or extra endpoint pairs.
🤖 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/pt_expt/model/make_model.py`:
- Around line 892-910: Update the graph Hessian path around
_cal_hessian_ext_graph and _WrapperForwardEnergyGraph to use the same compacted
node set as the forward branch. Pass the compacted coordinates, atom types,
batch metadata, and parameters—or apply the equivalent valid-node mask when
rebuilding each frame—so phantom padded nodes are excluded from Hessian graph
construction.

In `@deepmd/pt_expt/utils/graph_builder.py`:
- Around line 11-13: Remove the module-scope PHANTOM_ATOM_TYPE import from
graph_builder.py and relocate the constant to a lightweight dependency-free
module, then update graph_builder references to use that module. Ensure the
graph-building path no longer imports deepmd.dpmodel.utils.lmdb_data or its
lmdb/msgpack dependencies.

In `@deepmd/pt/model/model/sezm_model.py`:
- Around line 3277-3279: Update _make_inter_potential_edge_mask to accept and
use the already-computed real_atom mask from core_compute instead of
re-sanitizing descriptor_atype. Pass real_atom at the core_compute call site,
preserve the existing atom-exclusion logic, and ensure phantom atoms remain
excluded even when edge builders include them.

In `@source/tests/pt_expt/test_lmdb_training.py`:
- Line 851: Rename the keyword-only compile parameter in _run to enable_compile,
then update its call site and the assignment to
config["training"]["enable_compile"] to use the new name while preserving the
existing behavior.

---

Outside diff comments:
In `@deepmd/pt_expt/train/wrapper.py`:
- Around line 223-238: Update _forward_without_loss so ragged inputs with spin
are detected before calling model.forward_ragged; explicitly reject this
combination with a clear supported error, while preserving the existing
forward_ragged dispatch for ragged inputs without spin and the regular model
call for non-ragged inputs.

In `@deepmd/pt/train/training.py`:
- Around line 292-328: Pass the configured training seed from
_training_params.get("seed") to the non-distributed LmdbBatchSampler
construction, matching the existing DistributedLmdbBatchSampler branch while
preserving the current sampler options.

---

Nitpick comments:
In `@deepmd/pt_expt/train/training.py`:
- Around line 1704-1708: Update the call to _configure_batch_layout in the
training initialization flow to pass self.training_data_by_task and
self.validation_data_by_task instead of the raw training_data and
validation_data constructor arguments. Then simplify _configure_batch_layout to
consume these normalized per-task maps directly and remove its redundant
isinstance(data_map, dict) dispatch.

In `@deepmd/utils/data.py`:
- Around line 1226-1232: Update the validation in the function containing
source_policy to derive allowed values with
typing.get_args(DataRequirementSourcePolicy) instead of duplicating the literal
set, and import get_args alongside Literal. Preserve the existing ValueError and
message behavior for invalid values.

In `@source/tests/pt_expt/utils/test_nv_matrix_decode.py`:
- Around line 171-182: Update _graph_edges to key edges by integer (src, dst)
endpoints while retaining each edge vector without rounding, and add or update
_assert_same_edges to match endpoint keys and compare corresponding vectors with
np.testing.assert_allclose. Replace the comparison near the indicated call site
with _assert_same_edges(_graph_edges(nv), _graph_edges(dense)), preserving
detection of missing or extra endpoint pairs.

In `@source/tests/pt/test_loss_default_pf.py`:
- Around line 232-236: Update the drdq initialization in the relevant test setup
to derive its leading dimension from self.label_with_pref["force"] rather than
hard-coding 1, while preserving the existing coordinate dimension, dtype, and
device.
🪄 Autofix

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 Plus

Run ID: 70419c7e-1272-4870-b2b2-4070566e7cf3

📥 Commits

Reviewing files that changed from the base of the PR and between bc902da and a809f15.

📒 Files selected for processing (53)
  • deepmd/dpmodel/loss/dos.py
  • deepmd/dpmodel/loss/ener.py
  • deepmd/dpmodel/loss/ener_spin.py
  • deepmd/dpmodel/loss/reduction.py
  • deepmd/dpmodel/loss/tensor.py
  • deepmd/dpmodel/model/make_model.py
  • deepmd/dpmodel/utils/__init__.py
  • deepmd/dpmodel/utils/batch.py
  • deepmd/dpmodel/utils/lmdb_data.py
  • deepmd/dpmodel/utils/neighbor_graph/__init__.py
  • deepmd/dpmodel/utils/neighbor_graph/ase_builder.py
  • deepmd/dpmodel/utils/neighbor_graph/from_ijs.py
  • deepmd/dpmodel/utils/neighbor_graph/graph.py
  • deepmd/pt/loss/dens.py
  • deepmd/pt/loss/dos.py
  • deepmd/pt/loss/ener.py
  • deepmd/pt/loss/tensor.py
  • deepmd/pt/model/model/sezm_model.py
  • deepmd/pt/model/model/sezm_native_spin_model.py
  • deepmd/pt/train/training.py
  • deepmd/pt/utils/lmdb_dataset.py
  • deepmd/pt/utils/nv_nlist.py
  • deepmd/pt_expt/model/ener_model.py
  • deepmd/pt_expt/model/make_model.py
  • deepmd/pt_expt/train/training.py
  • deepmd/pt_expt/train/validation.py
  • deepmd/pt_expt/train/wrapper.py
  • deepmd/pt_expt/utils/edge_schema.py
  • deepmd/pt_expt/utils/graph_builder.py
  • deepmd/pt_expt/utils/lmdb_dataset.py
  • deepmd/pt_expt/utils/nv_graph_builder.py
  • deepmd/pt_expt/utils/vesin_graph_builder.py
  • deepmd/pt_expt/utils/vesin_neighbor_list.py
  • deepmd/utils/argcheck.py
  • deepmd/utils/data.py
  • deepmd/utils/data_system.py
  • doc/data/system.md
  • doc/train/training-advanced.md
  • source/tests/common/dpmodel/test_from_ijs.py
  • source/tests/common/dpmodel/test_graph_ragged.py
  • source/tests/common/dpmodel/test_lmdb_data.py
  • source/tests/common/dpmodel/test_loss_ener.py
  • source/tests/common/dpmodel/test_loss_padding.py
  • source/tests/common/dpmodel/test_loss_reduction.py
  • source/tests/consistent/test_lmdb_data.py
  • source/tests/pt/model/test_sezm_model.py
  • source/tests/pt/test_lmdb_dataloader.py
  • source/tests/pt/test_loss_default_pf.py
  • source/tests/pt/test_loss_padding.py
  • source/tests/pt_expt/model/test_dpa4_native_spin.py
  • source/tests/pt_expt/test_lmdb_training.py
  • source/tests/pt_expt/test_training.py
  • source/tests/pt_expt/utils/test_nv_matrix_decode.py

Comment thread deepmd/pt_expt/model/make_model.py
Comment thread deepmd/pt_expt/utils/graph_builder.py
Comment thread deepmd/pt/model/model/sezm_model.py Outdated
Comment thread source/tests/pt_expt/test_lmdb_training.py
@codecov

codecov Bot commented Aug 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.80982% with 43 lines in your changes missing coverage. Please review.
✅ Project coverage is 79.44%. Comparing base (bc902da) to head (ae387ea).

Files with missing lines Patch % Lines
deepmd/pt_expt/utils/nv_graph_builder.py 15.78% 16 Missing ⚠️
deepmd/pt/utils/lmdb_dataset.py 81.48% 5 Missing ⚠️
deepmd/pt/loss/dens.py 75.00% 4 Missing ⚠️
deepmd/pt/utils/nv_nlist.py 0.00% 4 Missing ⚠️
deepmd/dpmodel/utils/neighbor_graph/graph.py 88.46% 3 Missing ⚠️
deepmd/pt_expt/train/training.py 92.10% 3 Missing ⚠️
deepmd/pt_expt/model/make_model.py 89.47% 2 Missing ⚠️
deepmd/utils/data.py 66.66% 2 Missing ⚠️
deepmd/dpmodel/loss/ener.py 98.57% 1 Missing ⚠️
deepmd/pt/train/training.py 75.00% 1 Missing ⚠️
... and 2 more
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #5962      +/-   ##
==========================================
- Coverage   79.60%   79.44%   -0.17%     
==========================================
  Files        1085     1085              
  Lines      126405   126846     +441     
  Branches     4598     4598              
==========================================
+ Hits       100631   100770     +139     
- Misses      24120    24424     +304     
+ Partials     1654     1652       -2     

☔ 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.

@iProzd iProzd added the P1 Required for DPA4/DPA4C release readiness. label Aug 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Docs enhancement new feature P1 Required for DPA4/DPA4C release readiness. Python

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

4 participants