Skip to content

Commit 6daa744

Browse files
committed
v0.6.6: fix critical import crash (dead OpenCLBatchDecoder ref), update docs
Root cause: __init__.py unconditionally referenced _native_module.OpenCLBatchDecoder via a leftover unguarded line, crashing import on every published wheel (all wheels are built without the opencl feature). The correctly-guarded OpenCLBatchDecoder access already existed later in the file; removed the dead duplicate. Verified by building with the exact CI feature flags (--no-default-features --features cuda) and importing cleanly in a fresh venv against the built wheel. v0.6.5 on PyPI is broken and immutable; this ships v0.6.6 as the fix. Also updates README/PYPI_README/CHANGELOG/citation blocks to 0.6.6 and documents the new decoder-family rows (LERBenchmark, HybridDecoder, SlidingWindowDecoder, StreamingDecoder, NeuralPredecoder, GNNPredecoder, GNNTrainer, LookupTableDecoder).
1 parent b7dd6c8 commit 6daa744

9 files changed

Lines changed: 26 additions & 9 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ environment so report figures trace back to a specific build.
77

88
## [Unreleased]
99

10+
## [0.6.6] - 2026-07-12
11+
12+
### Fixed
13+
- **Critical: package import broken on every published v0.6.5 wheel.** `python/qector_decoder_v3/__init__.py` had a leftover, unguarded `_RustOpenCLBatchDecoder = _native_module.OpenCLBatchDecoder` line (a duplicate of the properly try/except-guarded assignment later in the file). Since the public CI release wheels are built with `--no-default-features --features cuda` (no `opencl` feature), the compiled module never has this attribute, so `import qector_decoder_v3` raised `AttributeError` immediately on a completely clean install. This was masked in local development because default-feature builds include `opencl`. Root cause found and reproduced by testing a fresh `pip install qector-decoder-v3==0.6.5` in an isolated venv and by rebuilding locally with the exact CI feature flags. Fixed by removing the dead duplicate line; verified the corrected package imports cleanly under the exact CI build configuration in a clean venv, with `cuda_is_available()` / `opencl_is_available()` correctly returning `False` rather than crashing.
14+
- **v0.6.5 is not usable and should not be installed** — use v0.6.6 or later.
15+
1016
## [0.6.5] - 2026-07-10
1117

1218
### Fixed

CITATION.cff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ authors:
66
- family-names: Lessard
77
given-names: Guillaume
88
affiliation: iD01t Productions
9-
version: 0.6.5
9+
version: 0.6.6
1010
date-released: 2026-07-10
1111
url: https://www.qector.store
1212
repository-code: https://github.com/GuillaumeLessard/qector-decoder

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "qector_decoder_v3"
3-
version = "0.6.5"
3+
version = "0.6.6"
44
edition = "2021"
55
authors = ["Guillaume Lessard / iD01t Productions <guiliguili2705@gmail.com>"]
66
description = "Source-available Rust QEC decoder core (Union-Find, exact polynomial MWPM/Blossom, Sparse Blossom, BP-OSD) with CPU/CUDA/OpenCL batch decoding and PyO3 bindings"

PYPI_README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,12 @@ Do this before making any hardware-specific performance claim.
173173

174174
---
175175

176+
## v0.6.6 — critical fix, upgrade immediately if on v0.6.5
177+
178+
**v0.6.5 fails to import at all** (`AttributeError` on `OpenCLBatchDecoder`) on every published wheel, because the release build (`--no-default-features --features cuda`) never compiles in OpenCL support, and `__init__.py` had a leftover unguarded reference to it. Fixed in v0.6.6 by removing the dead line; the properly-guarded assignment further down in the file (which already existed) now runs as intended. Verified against a clean install of the exact CI-built wheel.
179+
180+
---
181+
176182
## v0.6.5 Highlights
177183

178184
| Fix | Description |
@@ -224,7 +230,7 @@ Contact:
224230
author = {Guillaume Lessard},
225231
title = {{QECTOR Decoder v3}: Rust/Python Quantum Error Correction Decoding Platform},
226232
year = {2026},
227-
version = {0.6.5},
233+
version = {0.6.6},
228234
url = {https://www.qector.store},
229235
note = {Source-available. Commercial license required for commercial use.}
230236
}

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,12 @@ See the public API regression coverage in [python/tests](python/tests) before bu
195195

196196
---
197197

198+
## New in v0.6.6 — critical fix, upgrade immediately if on v0.6.5
199+
200+
**v0.6.5 fails to import at all** (`AttributeError` on `OpenCLBatchDecoder`) on every published wheel, because the release build (`--no-default-features --features cuda`) never compiles in OpenCL support, and `__init__.py` had a leftover unguarded reference to it. Fixed in v0.6.6 by removing the dead line. Verified against a clean install of the exact CI-built wheel.
201+
202+
---
203+
198204
## New in v0.6.5
199205

200206
| Fix | Description |
@@ -448,7 +454,7 @@ See [LICENSE](LICENSE) for the repository terms and contact the commercial team
448454
author = {Guillaume Lessard},
449455
title = {{QECTOR Decoder v3}: Rust/Python Quantum Error Correction Decoding Platform},
450456
year = {2026},
451-
version = {0.6.5},
457+
version = {0.6.6},
452458
url = {https://www.qector.store},
453459
note = {Source-available. Commercial license required for commercial use.}
454460
}

codemeta.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"@context":"https://doi.org/10.5063/schema/codemeta-2.0","@type":"SoftwareSourceCode","name":"QECTOR Decoder v3","version":"0.6.5","description":"Source-available Rust and Python quantum error correction decoder package for QEC research, PyMatching-compatible validation, belief-matching, BP-OSD and qLDPC workflows, CPU/GPU batch decoding, and reproducible benchmark evidence.","codeRepository":"https://github.com/GuillaumeLessard/qector-decoder","url":"https://www.qector.store","downloadUrl":"https://pypi.org/project/qector-decoder-v3/","identifier":"https://doi.org/10.5281/zenodo.20825980","license":"https://www.qector.store/license.html","programmingLanguage":["Python","Rust"],"runtimePlatform":["CPython 3.9","CPython 3.10","CPython 3.11","CPython 3.12","CPython 3.13","Linux x86_64","Windows x64","macOS arm64"],"keywords":["quantum error correction","QEC","quantum computing","quantum decoder","MWPM","PyMatching","Stim","Sinter","LDPC","qLDPC","BP-OSD","belief matching","union find decoder","surface code","Rust","Python","PyO3","maturin","QECTOR"],"author":{"@type":"Person","givenName":"Guillaume","familyName":"Lessard","affiliation":"iD01t Productions"},"publisher":{"@type":"Organization","name":"iD01t Productions"}}
1+
{"@context":"https://doi.org/10.5063/schema/codemeta-2.0","@type":"SoftwareSourceCode","name":"QECTOR Decoder v3","version":"0.6.6","description":"Source-available Rust and Python quantum error correction decoder package for QEC research, PyMatching-compatible validation, belief-matching, BP-OSD and qLDPC workflows, CPU/GPU batch decoding, and reproducible benchmark evidence.","codeRepository":"https://github.com/GuillaumeLessard/qector-decoder","url":"https://www.qector.store","downloadUrl":"https://pypi.org/project/qector-decoder-v3/","identifier":"https://doi.org/10.5281/zenodo.20825980","license":"https://www.qector.store/license.html","programmingLanguage":["Python","Rust"],"runtimePlatform":["CPython 3.9","CPython 3.10","CPython 3.11","CPython 3.12","CPython 3.13","Linux x86_64","Windows x64","macOS arm64"],"keywords":["quantum error correction","QEC","quantum computing","quantum decoder","MWPM","PyMatching","Stim","Sinter","LDPC","qLDPC","BP-OSD","belief matching","union find decoder","surface code","Rust","Python","PyO3","maturin","QECTOR"],"author":{"@type":"Person","givenName":"Guillaume","familyName":"Lessard","affiliation":"iD01t Productions"},"publisher":{"@type":"Organization","name":"iD01t Productions"}}

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "maturin"
44

55
[project]
66
name = "qector-decoder-v3"
7-
version = "0.6.5"
7+
version = "0.6.6"
88
description = "Source-available Rust/Python QEC R&D platform: PyMatching-compatible validation, belief-matching, BP-OSD (LDPC/qLDPC), CPU/GPU batch decoding, and artifact-hashed benchmark evidence"
99
readme = {file = "PYPI_README.md", content-type = "text/markdown"}
1010
requires-python = ">=3.9"

python/qector_decoder_v3/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ def _load_native_module():
2121
_RustStreamingDecoder = _native_module.StreamingDecoder
2222
_RustBatchDecoder = _native_module.BatchDecoder
2323
_RustCPUBatchDecoder = _native_module.CPUBatchDecoder
24-
_RustOpenCLBatchDecoder = _native_module.OpenCLBatchDecoder
2524
_RustBenchmarkSuite = _native_module.BenchmarkSuite
2625
_RustLookupTableDecoder = _native_module.LookupTableDecoder
2726
_RustBPOSDDecoder = _native_module.BPOSDDecoder
@@ -99,7 +98,7 @@ def _rust_opencl_is_available():
9998
# wheel). We never overwrite a real compiled ``__version__`` with it — doing so
10099
# would falsely claim a version the loaded binary is not — so after a version bump
101100
# ``__version__`` keeps reporting the *built* value until the Rust wheel is rebuilt.
102-
__fallback_version__ = "0.6.5"
101+
__fallback_version__ = "0.6.6"
103102

104103
try:
105104
__version__ = _native_module.__version__

0 commit comments

Comments
 (0)