Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Utilities for loading compiled guppy circuits #393

Merged
merged 9 commits into from
Jun 11, 2024

Conversation

aborgna-q
Copy link
Collaborator

@aborgna-q aborgna-q commented Jun 7, 2024

Adds a series of load_guppy_json* methods similar to load_tk1_json.
Given a hugr json and a function name it returns a Circuit for the function.

Currently this only supports guppy functions with no control flow.

Adds a test adapted from #382, with the following hugr:

graph LR
    subgraph 0 ["(0) Module"]
        direction LR
        subgraph 7 ["(7) FuncDefn"]
            direction LR
            3["(3) Input"]
            3--"0:0<br>qubit"-->8
            3--"1:1<br>qubit"-->8
            6["(6) Output"]
            subgraph 8 ["(8) CFG"]
                direction LR
                subgraph 1 ["(1) DataflowBlock"]
                    direction LR
                    4["(4) Input"]
                    4--"0:0<br>qubit"-->13
                    4--"1:0<br>qubit"-->21
                    5["(5) Output"]
                    9["(9) const:custom:f64(1.5707963267948966)"]
                    9--"0:0<br>float64"-->10
                    10["(10) LoadConstant"]
                    10--"0:1<br>float64"-->13
                    11["(11) const:custom:f64(-1.5707963267948966)"]
                    11--"0:0<br>float64"-->12
                    12["(12) LoadConstant"]
                    12--"0:2<br>float64"-->13
                    13["(13) quantum.tket2.PhasedX"]
                    13--"0:0<br>qubit"-->16
                    14["(14) const:custom:f64(3.141592653589793)"]
                    14--"0:0<br>float64"-->15
                    15["(15) LoadConstant"]
                    15--"0:1<br>float64"-->16
                    16["(16) quantum.tket2.RzF64"]
                    16--"0:0<br>qubit"-->25
                    17["(17) const:custom:f64(1.5707963267948966)"]
                    17--"0:0<br>float64"-->18
                    18["(18) LoadConstant"]
                    18--"0:1<br>float64"-->21
                    19["(19) const:custom:f64(-1.5707963267948966)"]
                    19--"0:0<br>float64"-->20
                    20["(20) LoadConstant"]
                    20--"0:2<br>float64"-->21
                    21["(21) quantum.tket2.PhasedX"]
                    21--"0:0<br>qubit"-->24
                    22["(22) const:custom:f64(3.141592653589793)"]
                    22--"0:0<br>float64"-->23
                    23["(23) LoadConstant"]
                    23--"0:1<br>float64"-->24
                    24["(24) quantum.tket2.RzF64"]
                    24--"0:1<br>qubit"-->25
                    25["(25) quantum.tket2.ZZMax"]
                    25--"0:0<br>qubit"-->26
                    25--"1:1<br>qubit"-->26
                    26["(26) MakeTuple"]
                    26--"0:0<br>[qubit, qubit]"-->27
                    27["(27) UnpackTuple"]
                    27--"0:0<br>qubit"-->28
                    27--"1:0<br>qubit"-->30
                    28["(28) quantum.tket2.Measure"]
                    28--"0:0<br>qubit"-->29
                    29["(29) quantum.tket2.QFree"]
                    30["(30) quantum.tket2.Measure"]
                    30--"0:0<br>qubit"-->31
                    30--"1:0<br>[]+[]"-->32
                    31["(31) quantum.tket2.QFree"]
                    32["(32) MakeTuple"]
                    32--"0:0<br>[[]+[]]"-->33
                    33["(33) UnpackTuple"]
                    33--"0:1<br>[]+[]"-->5
                    34["(34) Tag"]
                    34--"0:0<br>[]"-->5
                end
                1-."0:0".->2
                2["(2) ExitBlock"]
            end
            8--"0:0<br>[]+[]"-->6
        end
    end
Loading

drive-by: Drop deprecated stringreader dependency
drive-by: Bind Tk2Circuit.num_operations, used in the python test

@aborgna-q aborgna-q requested a review from mark-koch June 7, 2024 12:04
Base automatically changed from ab/rename-json-mod to main June 10, 2024 14:07
Copy link

codecov bot commented Jun 10, 2024

Codecov Report

Attention: Patch coverage is 72.00000% with 7 lines in your changes missing coverage. Please review.

Project coverage is 96.00%. Comparing base (93e611c) to head (a6d8380).

Files Patch % Lines
tket2-py/test/test_guppy.py 72.00% 7 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##             main     #393       +/-   ##
===========================================
+ Coverage   83.06%   96.00%   +12.94%     
===========================================
  Files          48       15       -33     
  Lines        5042      476     -4566     
  Branches     4591        0     -4591     
===========================================
- Hits         4188      457     -3731     
+ Misses        658       19      -639     
+ Partials      196        0      -196     
Flag Coverage Δ
python 96.00% <72.00%> (-1.34%) ⬇️
rust ?

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.

tket2/src/serialize/guppy.rs Outdated Show resolved Hide resolved
test_files/guppy_hugr.json Outdated Show resolved Hide resolved
@aborgna-q aborgna-q added this pull request to the merge queue Jun 11, 2024
Merged via the queue into main with commit 028779a Jun 11, 2024
15 of 16 checks passed
@aborgna-q aborgna-q deleted the ab/guppy-deserialize branch June 11, 2024 08:33
github-merge-queue bot pushed a commit that referenced this pull request Jun 11, 2024
## 🤖 New release
* `tket2`: 0.1.0-alpha.1 -> 0.1.0-alpha.2

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

<blockquote>

##
[0.1.0-alpha.2](tket2-v0.1.0-alpha.1...tket2-v0.1.0-alpha.2)
- 2024-06-11

### Bug Fixes
- Commands iterator ignoring the hierarchy.
([#381](#381))

### New Features
- Replace `Circuit::num_gates` with `num_operations`
([#384](#384))
- Utilities for loading compiled guppy circuits
([#393](#393))

### Refactor
- [**breaking**] Replace Circuit trait with a struct
([#370](#370))
- [**breaking**] Rename `tket2::json` into `tket2::serialize::pytket`
([#392](#392))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/MarcoIeni/release-plz/).
github-merge-queue bot pushed a commit that referenced this pull request Jun 28, 2024
🤖 I have created a release *beep* *boop*
---


## 0.1.0 (2024-06-28)


### ⚠ BREAKING CHANGES

* require `hugr-0.5.0`
* Replaced `tket2.circuit.OpConvertError` with
`tket2.circuit.TK1ConvertError` in the python lib.
* Moved `tket2::json` to `tket2::serialize::pytket`
* Replaced the `Circuit` trait with a wrapper struct.
* This is a breaking change to the compiled rewriter serialisation
format.

### Features

* Add a "progress timeout" to badger
([#259](#259))
([556cf64](556cf64))
* Add missing typing hints
([#352](#352))
([4990613](4990613))
* bindings for circuit cost and hash
([#252](#252))
([85ce5f9](85ce5f9))
* drop pyo3 core dep ([#355](#355))
([9f7d415](9f7d415))
* EccRewriter bindings
([#251](#251))
([97e2e0a](97e2e0a))
* guppy → pytket conversion
([#407](#407))
([8c5a487](8c5a487))
* Implement `PyErr` conversion locally in `tket2-py`
([#258](#258))
([3e1a68d](3e1a68d))
* init tket2-hseries ([#368](#368))
([61e7535](61e7535))
* pauli propagation use case example
([#333](#333))
([f46973c](f46973c))
* **py:** Allow using `Tk2Op`s in the builder
([#436](#436))
([aed8651](aed8651))
* Support any ops in portmatching
([#293](#293))
([6b05a05](6b05a05))
* **tket2-py:** Bind the `lower_to_pytket` pass in python
([#439](#439))
([8208324](8208324))
* Use tket1 and tket2 circuits interchangeably everywhere
([#243](#243))
([eac7acf](eac7acf))
* Utilities for loading compiled guppy circuits
([#393](#393))
([028779a](028779a))


### Bug Fixes

* failed importlib import
([#254](#254))
([b077660](b077660))
* induced cycles in depth optimisation
([#264](#264))
([68c9ff2](68c9ff2)),
closes [#253](#253)
* Make native py modules behave like python's
([#212](#212))
([4220038](4220038)),
closes [#209](#209)
* pytest failing to find `tket2` in CI
([#367](#367))
([a9df8e6](a9df8e6))
* **tket2-py:** Replace `with_hugr` helpers with `with_circ`, keeping
the circuit parent. ([#438](#438))
([b77b3cb](b77b3cb))


### Documentation

* Add some example notebooks for the python package.
([#443](#443))
([4ed276c](4ed276c)),
closes [#434](#434)
* Update tket2-py readme
([6c8f18a](6c8f18a))


### Code Refactoring

* Rename `tket2::json` into `tket2::serialize::pytket`
([#392](#392))
([93e611c](93e611c))
* Replace Circuit trait with a struct
([#370](#370))
([ec5dd22](ec5dd22))
* Simplify tket1 conversion errors
([#408](#408))
([b0b8aff](b0b8aff))

---
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: Agustin Borgna <agustin.borgna@quantinuum.com>
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.

Circuit Iterator showing a command as taking in the same linear unit twice?
2 participants