Skip to content

Sparse parity-check matrix support for decoders#550

Merged
vedika-saravanan merged 39 commits into
NVIDIA:mainfrom
vedika-saravanan:pr-sparse-binary-matrix
Jun 5, 2026
Merged

Sparse parity-check matrix support for decoders#550
vedika-saravanan merged 39 commits into
NVIDIA:mainfrom
vedika-saravanan:pr-sparse-binary-matrix

Conversation

@vedika-saravanan

@vedika-saravanan vedika-saravanan commented May 18, 2026

Copy link
Copy Markdown
Collaborator

Continuation of #440. Closes #379.

Introduces cudaq::qec::sparse_binary_matrix (CSC/CSR, uint32_t indices) as the decoder PCM type, so large PCMs no longer have to be materialized as a dense cudaqx::tensor. The sparse path is wired through PCM generation, round slicing, decoder construction, and Python bindings. sliding_window canonicalizes once and reads H.ptr() / H.indices() directly per window.

Breaking changes

  • Decoder constructor now takes const sparse_binary_matrix &H. Dense cudaqx::tensor<uint8_t> callers still compile via implicit conversion, but the extension-point template changed — out-of-tree plugins must be recompiled.
  • generate_random_pcm throws above k_max_dense_pcm_elements (400M). Use generate_random_pcm_sparse for larger matrices.
  • single_error_lut_example now uses column qErr of H directly instead of XOR-of-other-columns (the old form was only correct when every row of H had even weight). Example plugin only; production single_error_lut was already correct.

Follow-up PRs

  • Sparse-aware PCM utilities: migrate sort_pcm_columns, simplify_pcm, reorder_pcm_columns, shuffle_pcm_columns, pcm_extend_to_n_rounds, pcm_to_sparse_, pcm_from_sparse_, and detector_error_model::canonicalize_for_rounds to sparse_binary_matrix so the full cudaqx::tensor fails to allocate large PCMs #379 scale pipeline avoids any dense cudaqx::tensor<uint8_t> allocation.
  • Docs: Sphinx entries for the new type/functions and the 400M dense cap.

Note to reviewers: Quick context on why it's larger than the ~1000-line guideline: it's a foundational type-system change rather than an additive feature. The new sparse_binary_matrix type, the decoder constructor breaking change, all the plugin updates, the sparse generator, and the Python bindings all have to land together for the #379 fix to actually be usable end-to-end. Splitting it would create intermediate states where the breaking change has landed but users still can't construct a >50k-mechanism PCM which would mean shipping the API churn without the benefit.

@copy-pr-bot

copy-pr-bot Bot commented May 18, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@vedika-saravanan vedika-saravanan force-pushed the pr-sparse-binary-matrix branch from 39255bc to 7c7cc4d Compare May 19, 2026 20:26
bmhowe23 and others added 18 commits May 19, 2026 16:50
Signed-off-by: Ben Howe <bhowe@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: Ben Howe <bhowe@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
…nitializations

Signed-off-by: Ben Howe <bhowe@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: Ben Howe <bhowe@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: Ben Howe <bhowe@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: Ben Howe <bhowe@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
I, Ben Howe <bhowe@nvidia.com>, hereby add my Signed-off-by to this commit: 9df0571

Signed-off-by: Ben Howe <bhowe@nvidia.com>
Signed-off-by: Ben Howe <bhowe@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
… DEMs.

Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Auto update to the latest CUDA-Q commit on main branch

---------

Signed-off-by: Ben Howe <bhowe@nvidia.com>
Signed-off-by: Angela Burton <angelab@nvidia.com>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Ben Howe <bhowe@nvidia.com>
Co-authored-by: Angela Burton <angelab@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
…ounds slicing, Python BYOD, dense random PCM cap).

Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
@vedika-saravanan vedika-saravanan force-pushed the pr-sparse-binary-matrix branch from 7c7cc4d to 7beef5b Compare May 19, 2026 20:55
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
@vedika-saravanan vedika-saravanan force-pushed the pr-sparse-binary-matrix branch from 341ccc5 to 1174d33 Compare May 19, 2026 21:50
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
@vedika-saravanan vedika-saravanan changed the title Pr sparse binary matrix Add sparse_binary_matrix PCM type and sparse decoder path May 20, 2026
@vedika-saravanan vedika-saravanan changed the title Add sparse_binary_matrix PCM type and sparse decoder path Sparse parity-check matrix support for decoders May 20, 2026
@vedika-saravanan vedika-saravanan added the breaking change Change breaks backwards compatibility label May 20, 2026
@vedika-saravanan vedika-saravanan self-assigned this May 20, 2026
@vedika-saravanan

vedika-saravanan commented May 26, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks, Vedika. I think these changes are looking pretty good. Could you please prepare any necessary changes to the nv-qldpc-decoder (closed source) before we merge this?

@bmhowe23, I have raised a merge request for necessary changes in nv-qldpc-decoder (219)

Comment thread libs/qec/lib/decoders/sliding_window.cpp
Comment thread libs/qec/lib/pcm_utils.cpp
Comment thread libs/qec/lib/decoders/plugins/pymatching/pymatching.cpp Outdated
Comment thread libs/qec/python/bindings/py_decoder.cpp Outdated
Comment thread libs/qec/lib/pcm_utils.cpp Outdated
Comment thread libs/qec/lib/pcm_utils.cpp Outdated
Comment thread libs/qec/lib/sparse_binary_matrix.cpp
Comment thread libs/qec/python/bindings/py_decoder.cpp Outdated
Comment thread libs/qec/lib/pcm_utils.cpp
Comment thread libs/qec/lib/sparse_binary_matrix.cpp
Comment thread libs/qec/lib/pcm_utils.cpp
Comment thread libs/qec/lib/pcm_utils.cpp
Comment thread libs/qec/lib/pcm_utils.cpp
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
Comment thread libs/qec/lib/decoders/plugins/pymatching/pymatching.cpp Outdated
Signed-off-by: vedika-saravanan <vsaravanan@nvidia.com>
@vedika-saravanan vedika-saravanan force-pushed the pr-sparse-binary-matrix branch from 6d1eb8e to 694db52 Compare June 5, 2026 14:15
Comment thread libs/qec/include/cudaq/qec/pcm_utils.h

@bmhowe23 bmhowe23 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.

@vedika-saravanan vedika-saravanan enabled auto-merge (squash) June 5, 2026 16:01
@vedika-saravanan vedika-saravanan merged commit e937431 into NVIDIA:main Jun 5, 2026
24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking change Change breaks backwards compatibility

Projects

None yet

Development

Successfully merging this pull request may close these issues.

cudaqx::tensor fails to allocate large PCMs

4 participants