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

ZNE demo using catalyst #1207

Open
wants to merge 56 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
e00303d
Stub for ZNE Catalyst tutorial
cosenal Aug 22, 2024
1db073f
add description of protocol
natestemen Sep 5, 2024
9038c94
flush out initial workflow; lead into comparison
natestemen Sep 6, 2024
faa3c18
Suggestions from @vprusso
natestemen Sep 7, 2024
771d508
Add tutorial (#1075)
minhtriet Aug 28, 2024
25e95e1
fix-tutorial-vqe-vqd-metadata (#1200)
ashishks0522 Aug 28, 2024
1a2ccf1
Fixing incorrect title of Demo in metadata file. (#1197)
ikurecic Aug 28, 2024
7d91d08
sc-70154-update-qml-readme-to-highlight-image-standards (#1184)
ashishks0522 Aug 29, 2024
645e763
Landscape of qem techniques in pennylane
cosenal Sep 7, 2024
bfefdf5
Merge branch 'master' into zne-catalyst-tutorial
cosenal Sep 9, 2024
af5773b
example with mirror circuits
cosenal Sep 9, 2024
b6aa337
zne in non-catalyst pennylane
cosenal Sep 9, 2024
6fd8aa4
measure running time
cosenal Sep 18, 2024
231c26e
better explanations
cosenal Sep 19, 2024
dea771a
Merge branch 'master' into zne-catalyst-tutorial
cosenal Sep 19, 2024
2e64d80
reformat demo with black
cosenal Sep 19, 2024
5d44c20
lock poetry file
cosenal Sep 19, 2024
297bee1
opencl in github build
cosenal Sep 19, 2024
292d20f
Merge branch 'master' into zne-catalyst-tutorial
cosenal Sep 23, 2024
6ff56aa
disable opencl on qrack device
cosenal Sep 24, 2024
b9478dc
Merge branch 'zne-catalyst-tutorial' of https://github.com/unitaryfun…
cosenal Sep 24, 2024
149dddd
update torch dependency options on mac
cosenal Sep 24, 2024
f7e1e90
resolve conflicts
cosenal Sep 24, 2024
a352984
bump qrack
cosenal Sep 26, 2024
9236c62
update poetry lock
cosenal Sep 26, 2024
e2233ff
bump qrack again
cosenal Sep 26, 2024
bc929d8
new day, new run
cosenal Sep 27, 2024
f595a35
Merge branch 'master' into zne-catalyst-tutorial
cosenal Sep 30, 2024
7cb3206
pin pyqrack version
cosenal Sep 30, 2024
c6f704e
Update demonstrations/tutorial_zne_catalyst.py
cosenal Oct 3, 2024
b5e4158
Update demonstrations/tutorial_zne_catalyst.py
cosenal Oct 3, 2024
09c2728
Apply suggestions from Josh's code review
cosenal Oct 3, 2024
84ee6fe
Merge branch 'master' into zne-catalyst-tutorial
cosenal Oct 3, 2024
e5359ad
add myself as an author
cosenal Oct 3, 2024
19db775
fix bio
cosenal Oct 3, 2024
14d83a3
Numeric noise constructor param. for Qrack
WrathfulSpatula Oct 5, 2024
3e5eb5e
Fix poetry.lock
WrathfulSpatula Oct 5, 2024
0fc80c4
Merge branch 'master' into zne-catalyst-tutorial
cosenal Oct 7, 2024
dbc7c19
address more review comments
cosenal Oct 7, 2024
ed564f4
Merge branch 'master' into zne-catalyst-tutorial
ikurecic Oct 9, 2024
f6d2aa7
adding thumbnail images
ikurecic Oct 9, 2024
4e5c221
Apply suggestions from Ivana's code review
cosenal Oct 9, 2024
7db6373
correct thumbnails
ikurecic Oct 9, 2024
aa2e265
address more reviewers comments
cosenal Oct 9, 2024
65cb5a2
migrate info to pennylane.ai
natestemen Oct 9, 2024
da89e5d
Apply suggestions from code review
cosenal Oct 10, 2024
2cb1176
clarify some sentences
cosenal Oct 10, 2024
bc166cf
addressing more review comments
cosenal Oct 10, 2024
17735ba
one-shot mode for ZNE tutorial noisy device
WrathfulSpatula Oct 28, 2024
aad4b47
Merge branch 'master' into zne-catalyst-tutorial
ikurecic Nov 6, 2024
527e9be
poetry lock hash
ikurecic Nov 6, 2024
34c11a4
Merge branch 'master' into zne-catalyst-tutorial
ikurecic Nov 7, 2024
c3ad24f
poetry
ikurecic Nov 7, 2024
e9711ac
Apply suggestions from code review
ikurecic Nov 7, 2024
e016da8
Merge branch 'master' into zne-catalyst-tutorial
ikurecic Nov 7, 2024
02f9541
poetry
ikurecic Nov 7, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added _static/authors/nate_stemen.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions _static/authors/nate_stemen.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.. bio:: Nate Stemen
:photo: ../_static/authors/nate_stemen.png

Nate Stemen is a technical staff member at Unitary Fund, leading the development of Mitiq, a quantum error mitigation library. He earned a master’s degree from the University of Waterloo, where he focused on quantum circuit compilation. He is passionate about advancing effective education in quantum computing.
52 changes: 52 additions & 0 deletions demonstrations/tutorial_zne_catalyst.metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{
"title": "Digital Zero-Noise Extrapolation with Catalyst",
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
"title": "Digital Zero-Noise Extrapolation with Catalyst",
"title": "Digital zero-noise extrapolation with Catalyst",

"authors": [
{
"id": "nate_stemen",
"affiliation": "Unitary Fund"
}
],
"dateOfPublication": "2024-09-09T00:00:00+00:00",
"dateOfLastModification": "2024-09-09T00:00:00+00:00",
Comment on lines +11 to +12
Copy link
Contributor

Choose a reason for hiding this comment

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

tk

"categories": [
"Algorithms",
"Quantum Computing",
"How-to"
cosenal marked this conversation as resolved.
Show resolved Hide resolved
],
"tags": [],
"previewImages": [
{
"type": "thumbnail",
"uri": "/_static/demo_thumbnails/regular_demo_thumbnails/thumbnail_qrack_catalyst_integration.png"
},
{
"type": "large_thumbnail",
"uri": "/_static/demo_thumbnails/large_demo_thumbnails/thumbnail_large_qrack_catalyst_integration.png"
}
],
Copy link
Contributor

Choose a reason for hiding this comment

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

tk

"seoDescription": "Digital Zero-Noise Extrapolation with Catalyst",
cosenal marked this conversation as resolved.
Show resolved Hide resolved
"doi": "",
"canonicalURL": "/qml/demos/tutorial_zne_catalyst",
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
"canonicalURL": "/qml/demos/tutorial_zne_catalyst",

Removing due to today's repository update.

"references": [
{
"id": "DZNEpaper",
"type": "preprint",
"title": "Digital zero noise extrapolation for quantum error mitigation",
"authors": "Tudor Giurgica-Tiron, Yousef Hindy, Ryan LaRose, Andrea Mari, and William J. Zeng",
"year": "2020",
"publisher": "",
"journal": "",
"doi": "10.48550/arXiv.2005.10921",
"url": "https://arxiv.org/abs/2005.10921v2"
}
],
"basedOnPapers": [],
"referencedByPapers": [],
"relatedContent": [
{
"type": "demonstration",
"id": "tutorial_error_mitigation",
"weight": 1.0
}
]
Copy link
Contributor

Choose a reason for hiding this comment

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

Maybe this one could be a nice addition to the list of related content?
Also, this one?

}
160 changes: 160 additions & 0 deletions demonstrations/tutorial_zne_catalyst.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
r"""
Digital Zero-Noise Extrapolation with Catalyst
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
Digital Zero-Noise Extrapolation with Catalyst
Digital zero-noise extrapolation with Catalyst

==============================================

In this tutorial, you will learn how to use Zero-Noise Extrapolation (ZNE) in combination with
Catalyst. We'll demonstrate how to generate noise-scaled circuits, execute them on a noisy quantum
simulator, and use extrapolation techniques to estimate the zero-noise result, all while
leveraging just-in-time (JIT) compilation through
`Catalyst <https://docs.pennylane.ai/projects/catalyst/en/stable/index.html>`_.

What is ZNE
cosenal marked this conversation as resolved.
Show resolved Hide resolved
-----------

Zero-Noise Extrapolation (ZNE) is a technique used to mitigate the effect of noise on quantum
computations. First introduced in [#temme2017zne]_, it helps improve the accuracy of quantum
results by running circuits at varying noise levels and extrapolating back to a hypothetical
zero-noise case. While this tutorial won't delve into the theory behind ZNE in detail, lets first
review what happens when using the protocol in practice.

Copy link
Contributor

Choose a reason for hiding this comment

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

I think this is a great way to explain the steps, but I'm a bit confused by how these three stages related to the following sections. Could we maybe align those two a bit better? Even if you just refer to specific stages within the text/code, that would already be valuable.

Stage 1: Generating Noise-Scaled Circuits
cosenal marked this conversation as resolved.
Show resolved Hide resolved
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For ZNE to work, we need to generate circuits with **increased** noise. Currently, ZNE in Catalyst
supports two methods for generating noise-scaled circuits:

1. **Global folding**: If a circuit implements a global unitary :math:`U`, global folding applies
:math:`U(U^\dagger U)^n` for some integer :math:`n`,
effectively scaling the noise in the entire circuit.
2. **Local folding**: Individual gates are repeated (or folded) in contrast with the entire
circuit.

Stage 2: Running the circuits
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Once noise-scaled circuits are created, they need to be run! These can be executed on either real
quantum hardware or a noisy quantum simulator. In this tutorial, we'll use the
`Qrack quantum simulator <https://qrack.readthedocs.io/>`_, which implements a noise model
compatible with Catalyst.

Stage 3: Combining the results
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

After executing the noise-scaled circuits, we perform an extrapolation to estimate the zero-noise
limit---the result we would expect in a noise-free scenario. Catalyst provides two methods for
perfoming this extrapolation:

1. **Polynomial extrapolation**, and
2. **Exponential extrapolation**.


Using ZNE in Catalyst
---------------------
cosenal marked this conversation as resolved.
Show resolved Hide resolved

Let's see what this workflow looks like using Catalyst.
To get things started we'll need two ingredients:

1. an example quantum circuit to run
2. a way to execute circuits

The circuits we use here will be ..., and the method of execution will be a noisy simulation
Copy link

Choose a reason for hiding this comment

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

The circuits we use here will be ..., . Is the ellipsis a placeholder for types of circuits used?

Copy link
Author

Choose a reason for hiding this comment

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

Yup exactly! @cosenal is going to fill in some of the code, and I wasn't sure what he was changing the circuits too :)

available through Qrack. The underlying noise model of this simulation is that of depolarizing
noise.

"""

import os

import jax

import pennylane as qml
from pennylane import numpy as np
from catalyst import qjit, mitigate_with_zne


qubits = 2
NOISE_LEVEL = 0.1
os.environ["QRACK_GATE_DEPOLARIZATION"] = str(NOISE_LEVEL)
dev = qml.device("qrack.simulator", qubits, isNoisy=True)


@qml.qnode(dev)
def circuit():
qml.Hadamard(wires=0)
qml.CNOT(wires=[0, 1])
return qml.expval(qml.PauliZ(wires=0))


##############################################################################
# With a circuit and simulator defined, we can begin to define some of the necessary parameters
# for ZNE. In particular we will need to specify
natestemen marked this conversation as resolved.
Show resolved Hide resolved
#
# 1. The noise scaling factors (i.e. how much to increase the depth of the circuit)
# 2. The _method_ for scaling this noise up (in Catalyst there are two options: `global` and
# `local`)
# 3. The extrapolation technique to use to estimate the ideal value (available in Catalyst are
# polynomial, and exponential extrapolation).
#
# We'll define the scale factors as a `jax.numpy.array` where the scale factors must be odd
# integers.

scale_factors = jax.numpy.array([1, 3, 5])

##############################################################################
# Next we'll choose a method for scaling the noise. This needs to be defined as a python string.
natestemen marked this conversation as resolved.
Show resolved Hide resolved

folding_method = "local"

##############################################################################
# Finally, we'll choose the extrapolation technique. Both exponential and polynoamial extrapolation
# is available in the `pennylane.transforms` module. Both of these functions can be passed directly
# into `mitigate_with_zne`!

from pennylane.transforms import exponential_extrapolate, poly_extrapolate

extrapolation_method = exponential_extrapolate

##############################################################################
# We're now ready to run our example using ZNE with Catalyst! Putting these all together we're able
# to define a very simple `QNode`!


@qjit
def mitigated_circuit():
return mitigate_with_zne(
circuit,
scale_factors=scale_factors,
extrapolate=extrapolation_method,
folding=folding_method,
)()


print(circuit())
print(mitigated_circuit())

##############################################################################
# But there's still a big unanswered question! _If I can do this all in PennyLane, what is Catalyst
Copy link

Choose a reason for hiding this comment

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

This is actually a great question and one that took me a while to thoroughly understand and appreciate!

# offering here?_ That's a **great** question! In order to explore the difference we'll need to
# explore what happens when `catalyst.qjit` is, and is not, used!
# ...


##############################################################################
#
# References
# ----------
#
# .. [#temme2017zne] K. Temme, S. Bravyi, J. M. Gambetta
# `"Error Mitigation for Short-Depth Quantum Circuits" <https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.119.180509>`_,
# Phys. Rev. Lett. 119, 180509 (2017).
#
# .. [#DZNEpaper]
# Tudor Giurgica-Tiron, Yousef Hindy, Ryan LaRose, Andrea Mari, and William J. Zeng
# "Digital zero noise extrapolation for quantum error mitigation"
# `arXiv:2005.10921v2 <https://arxiv.org/abs/2005.10921v2>`__, 2020.
#

##############################################################################
# About the author
# ----------------
# .. include:: ../_static/authors/nate_stemen.txt
Loading