Skip to content

fix(pytket-decoder): Avoid QAllocating and immediately freeing qubits#1256

Merged
aborgna-q merged 3 commits intomainfrom
ab/avoid-qalloc-qfree
Nov 13, 2025
Merged

fix(pytket-decoder): Avoid QAllocating and immediately freeing qubits#1256
aborgna-q merged 3 commits intomainfrom
ab/avoid-qalloc-qfree

Conversation

@aborgna-q
Copy link
Copy Markdown
Collaborator

@aborgna-q aborgna-q commented Nov 13, 2025

When decoding a pytket circuit, when a qubit register is not present in the region's inputs we delay QAllocating it until it is consumed.

On the other side, at the end of the decoding we insert QFrees on each qubit that didn't get consumed and is not part of the region's outputs.

When a qubit falls in both categories (i.e. it didn't get used on pytket commands and didn't appear in the input/outputs) we were allocating it when requesting the wires to QFree.

This PR adds a simple check to avoid the extra operations.

@aborgna-q aborgna-q requested a review from a team as a code owner November 13, 2025 11:30
@aborgna-q aborgna-q requested a review from acl-cqc November 13, 2025 11:30
@codecov
Copy link
Copy Markdown

codecov bot commented Nov 13, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 79.12%. Comparing base (c7bf1c2) to head (6c935bf).
⚠️ Report is 3 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1256      +/-   ##
==========================================
+ Coverage   78.96%   79.12%   +0.16%     
==========================================
  Files         160      160              
  Lines       20413    20421       +8     
  Branches    19481    19489       +8     
==========================================
+ Hits        16119    16158      +39     
+ Misses       3310     3280      -30     
+ Partials      984      983       -1     
Flag Coverage Δ
python 92.65% <ø> (ø)
qis-compiler 100.00% <ø> (ø)
rust 78.45% <100.00%> (+0.16%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

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

from tket import optimiser

# Re-export native bindings
# Re-export native bindings.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Dummy change to include this in the python changelog

@aborgna-q aborgna-q requested a review from cqc-alec November 13, 2025 14:21
@aborgna-q aborgna-q enabled auto-merge November 13, 2025 14:36
@aborgna-q aborgna-q added this pull request to the merge queue Nov 13, 2025
Merged via the queue into main with commit 228ff52 Nov 13, 2025
24 checks passed
@aborgna-q aborgna-q deleted the ab/avoid-qalloc-qfree branch November 13, 2025 14:48
This was referenced Nov 13, 2025
github-merge-queue bot pushed a commit that referenced this pull request Nov 13, 2025
🤖 I have created a release *beep* *boop*
---


##
[0.12.11](tket-py-v0.12.10...tket-py-v0.12.11)
(2025-11-13)


### Bug Fixes

* **ci:** Make wheels compatible with MacOS 15.0
(#1248)
([49c5996](49c5996))
* Don't use opgroup in pytket barrier encoding
(#1251)
([49c5996](49c5996))
* guppy_to_circuit always returns num_operations = 0
(#1200)
([49c5996](49c5996))
* **pytket-decoder:** Avoid QAllocating and immediately freeing qubits
([#1256](#1256))
([228ff52](228ff52))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: Agustín Borgna <[email protected]>
github-merge-queue bot pushed a commit that referenced this pull request Feb 3, 2026
## 🤖 New release

* `tket`: 0.16.0 -> 0.17.0 (✓ API compatible changes)
* `tket-qsystem`: 0.22.0 -> 0.23.0 (✓ API compatible changes)

<details><summary><i><b>Changelog</b></i></summary><p>

## `tket`

<blockquote>

##
[0.17.0](tket-v0.16.0...tket-v0.17.0)
- 2026-02-02

### Bug Fixes

- *(encoded-circ)* Track unsupported wires between input and output
([#1224](#1224))
- Multiple fixes to the pytket encoder
([#1226](#1226))
- Don't use opgroup in pytket barrier encoding
([#1251](#1251))
- guppy_to_circuit always returns num_operations = 0
([#1200](#1200))
- *(pytket-decoder)* Avoid QAllocating and immediately freeing qubits
([#1256](#1256))
- Encoding of opaque subgraphs with no associated qubit/bit
([#1295](#1295))
- [**breaking**] Don't rely on command params for pytket barriers
([#1298](#1298))
- Track output qubits in CircuitInfo
([#1304](#1304))
- Wrongly reused qubit IDs in pytket encoding
([#1358](#1358))

### New Features

- Deprecate local find_tuple_unpack rewrite
([#1188](#1188))
- Add CopyableExpressionAST
([#1209](#1209))
- `NormalizeGuppy` pass to simplify generated structure
([#1220](#1220))
- [**breaking**] pytket EncodedCircuit struct for in-place pytket
optimisation ([#1211](#1211))
- [**breaking**] Interval is independent of resource IDs and scope
position ([#1205](#1205))
- Don't translate usizes to pytket
([#1241](#1241))
- BorrowSquashPass to elide redundant borrow/return ops
([#1159](#1159))
- [**breaking**] Bump hugr to 0.25.0
([#1325](#1325))
- Remove order edges in NormalizeGuppy pass
([#1326](#1326))
- [**breaking**] Remove deprecated unpack tuple pass
([#1387](#1387))

### Refactor

- Remove contain_qubits, use TypeUnpacker
([#1283](#1283))
- [**breaking**] Replace Subcircuit with SiblingSubgraph
([#1288](#1288))
- *(metadata)* [**breaking**] Migrate all metadata keys onto the new
metadata traits ([#1328](#1328))
</blockquote>

## `tket-qsystem`

<blockquote>

##
[0.23.0](tket-qsystem-v0.22.0...tket-qsystem-v0.23.0)
- 2026-02-02

### Bug Fixes

- [**breaking**] Don't rely on command params for pytket barriers
([#1298](#1298))
- Wrongly reused qubit IDs in pytket encoding
([#1358](#1358))

### New Features

- `NormalizeGuppy` pass to simplify generated structure
([#1220](#1220))
- Allow running arbitrary serializable pytket passes on hugrs
([#1266](#1266))
- BorrowSquashPass to elide redundant borrow/return ops
([#1159](#1159))
- [**breaking**] Bump hugr to 0.25.0
([#1325](#1325))
- Remove order edges in NormalizeGuppy pass
([#1326](#1326))
- hide new public funcs introduced by linearization
([#1333](#1333))

### Testing

- regenerate guppy_opt examples, and count gates
([#1249](#1249))
- run pytket on guppy_opt tests, measure (very limited) success
([#1250](#1250))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).
@hugrbot hugrbot mentioned this pull request Feb 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants