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

Add block encoding with matrix access oracles demo #943

Merged
merged 75 commits into from
Nov 27, 2023
Merged
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
dc4f974
add block encoding demo
soranjh Oct 2, 2023
5fa2126
add text for fable
soranjh Oct 2, 2023
54b109b
messy sparse block encoding section
Jaybsoni Oct 3, 2023
6a64406
add FABLE code blocks
DSGuala Oct 4, 2023
90aa2dd
add general circuit
soranjh Oct 4, 2023
feb6f3d
add general circuit
soranjh Oct 4, 2023
021873c
Edit fable code
DSGuala Oct 4, 2023
759828e
Merge branch 'add_block_encoding' of https://github.com/PennyLaneAI/q…
DSGuala Oct 4, 2023
91c2a6f
Merge branch 'master' into add_block_encoding
Jaybsoni Oct 4, 2023
6ee17ed
add better images
soranjh Oct 4, 2023
30d6919
Clean up section on block_encoding
Jaybsoni Oct 4, 2023
3353dd1
Merge branch 'add_block_encoding' of https://github.com/PennyLaneAI/q…
soranjh Oct 4, 2023
7fee215
add oracle definitions
DSGuala Oct 4, 2023
b2ec958
Merge branch 'add_block_encoding' of https://github.com/PennyLaneAI/q…
DSGuala Oct 4, 2023
fd7a6b6
Merge branch 'add_block_encoding' of https://github.com/PennyLaneAI/q…
soranjh Oct 4, 2023
faef859
edit text
soranjh Oct 4, 2023
eb6dcff
edit title
soranjh Oct 4, 2023
6115534
add demo to rst
soranjh Oct 4, 2023
6364893
add thumbnail image
soranjh Oct 5, 2023
be24402
add thumbnail image
soranjh Oct 5, 2023
6222b9f
add thumbnail image
soranjh Oct 5, 2023
c648b79
add thumbnail image
soranjh Oct 5, 2023
f1eace6
Merge branch 'master' into add_block_encoding
soranjh Oct 23, 2023
0a3a05a
modify text
soranjh Oct 23, 2023
5053a2f
modify text
soranjh Oct 27, 2023
e017d98
modify text and code
soranjh Oct 27, 2023
11f0e4c
clean up code
soranjh Oct 27, 2023
8509dd4
merge master and fix conflict
soranjh Oct 27, 2023
d27315e
correct code
soranjh Oct 27, 2023
e113836
modify print
soranjh Oct 30, 2023
13beb83
Merge branch 'master' into add_block_encoding
Jaybsoni Nov 1, 2023
a4fdd0f
Added more theory
Jaybsoni Nov 2, 2023
24709c6
Merge branch 'master' into add_block_encoding
Jaybsoni Nov 2, 2023
05ef7a8
re-word conclusion
Jaybsoni Nov 2, 2023
c291518
Apply suggestions from code review
Jaybsoni Nov 6, 2023
cd74556
Merge branch 'master' into add_block_encoding
Jaybsoni Nov 6, 2023
ff5c3f1
update text
soranjh Nov 8, 2023
3470a2a
add input args
soranjh Nov 8, 2023
6d630f1
add review comments
soranjh Nov 8, 2023
d925a4e
correct code
soranjh Nov 8, 2023
b763630
update metadata
soranjh Nov 8, 2023
1c7cbf0
update rst file
soranjh Nov 8, 2023
be74146
address review comments
Jaybsoni Nov 9, 2023
9bc5f3a
more code review comments
Jaybsoni Nov 9, 2023
4cc5d20
FABLE: change oracle signatures, allow arbitrary matrix size
DSGuala Nov 9, 2023
8e06744
Merge branch 'add_block_encoding' of https://github.com/PennyLaneAI/q…
DSGuala Nov 9, 2023
f6f17ca
update code
soranjh Nov 9, 2023
e440af5
modify code
soranjh Nov 9, 2023
5080287
update images
DSGuala Nov 10, 2023
2497e7b
fix wire labeling and make uniform
Jaybsoni Nov 10, 2023
77cf815
correct text
soranjh Nov 10, 2023
d8e390b
Merge branch 'add_block_encoding' of https://github.com/PennyLaneAI/q…
soranjh Nov 10, 2023
7f18d67
modify text and code
soranjh Nov 10, 2023
7fcf793
Update demonstrations/tutorial_block_encoding.py
Jaybsoni Nov 13, 2023
6883b07
add small corrections
soranjh Nov 13, 2023
9c77c9a
Merge branch 'add_block_encoding' of https://github.com/PennyLaneAI/q…
soranjh Nov 13, 2023
efe409a
add small corrections
soranjh Nov 13, 2023
f195407
review comments + new thumbnail
Jaybsoni Nov 16, 2023
cc1fa9e
missed rst file
Jaybsoni Nov 16, 2023
047a229
code review comments
Jaybsoni Nov 16, 2023
66db3d0
Merge branch 'master' into add_block_encoding
Jaybsoni Nov 16, 2023
564b311
changing large thumbnail path
KetpuntoG Nov 16, 2023
3e04701
empty commit to redeploy
KetpuntoG Nov 16, 2023
aadd90e
smalls modifications
KetpuntoG Nov 17, 2023
761f663
Update tutorial_block_encoding.py
KetpuntoG Nov 17, 2023
c38619d
update related demos
KetpuntoG Nov 17, 2023
988564b
remove theory
Jaybsoni Nov 17, 2023
a57dc3a
add theory
Jaybsoni Nov 21, 2023
682d80a
add anc to image
DSGuala Nov 21, 2023
b7686fc
clean up explanation
Jaybsoni Nov 23, 2023
fa49d61
Update demonstrations/tutorial_block_encoding.py
Jaybsoni Nov 23, 2023
54e9d6d
fix sentence
Jaybsoni Nov 23, 2023
4b305bb
Apply suggestions from code review
soranjh Nov 24, 2023
e5c175b
make circuit compact
soranjh Nov 24, 2023
dcb9146
Apply suggestions from code review
Jaybsoni Nov 24, 2023
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 demonstrations/block_encoding/fable_circuit.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added demonstrations/block_encoding/general_circuit.png
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
59 changes: 59 additions & 0 deletions demonstrations/tutorial_block_encoding.metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
{
"title": "Block Encodings",
"authors": [
{
"id": "soran_jahangiri"
soranjh marked this conversation as resolved.
Show resolved Hide resolved
},
{
"id": "jay_soni"
soranjh marked this conversation as resolved.
Show resolved Hide resolved
},
{
"id": "diego_guala"
soranjh marked this conversation as resolved.
Show resolved Hide resolved
}
],
"dateOfPublication": "2023-10-04T00:00:00+00:00",
"dateOfLastModification": "2023-10-04T00:00:00+00:00",
"categories": [
"Quantum Computing",
"Algorithms"
],
"tags": [],
"previewImages": [
{
"type": "thumbnail",
"uri": "/_images/thumbnail_intro_qsvt.png"
}
],
"seoDescription": "Learn about the many different methods to achieve a block-encoding for a given matrix.",
"doi": "",
"canonicalURL": "/qml/demos/tutorial_block_encoding",
"references": [
{
"id": "Daan2023",
"type": "article",
"title": "Explicit Quantum Circuits for Block Encodings of Certain Sparse Matrices.",
"authors": "Daan C., Lin L., Roel V. B, Chao Y.",
"year": "2023",
"journal": "Preprint",
"url": "https://arxiv.org/pdf/2203.10236.pdf"
},
{
"id": "McClean2018",
"type": "article",
"title": "FABLE: Fast Approximate Quantum Circuits for Block-Encodings",
"authors": "Daan C., Roel V. B.",
"year": "2022",
"journal": "arXiv",
"url": "https://arxiv.org/pdf/2205.00081.pdf"
}
],
"basedOnPapers": [],
"referencedByPapers": [],
"relatedContent": [
{
"type": "demonstration",
"id": "tutorial_local_cost_functions",
"weight": 1.0
}
]
}
316 changes: 316 additions & 0 deletions demonstrations/tutorial_block_encoding.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,316 @@
r"""

Block encoding with matrix access oracles
=========================================

.. meta::
:property="og:description": Learn how to perform block encoding
:property="og:image": https://pennylane.ai/qml/_images/thumbnail_intro_qsvt.png

.. related::
tutorial_intro_qsvt Intro to QSVT

*Author: Jay Soni, Diego Guala, Soran Jahangiri — Posted: September 29, 2023.*

Prominent quantum algorithms such as quantum phase estimation and quantum singular value
transform require encoding a non-unitary matrix in a quantum circuit. This seems problematic
soranjh marked this conversation as resolved.
Show resolved Hide resolved
because quantum computers can only perform unitary evolutions. Block encoding is a technique
that solves this problem by embedding a non-unitary operator as a sub-block of a larger unitary
matrix.
soranjh marked this conversation as resolved.
Show resolved Hide resolved

In previous demos we have discussed methods for `simulator-friendly <https://pennylane.ai/qml/demos/tutorial_intro_qsvt#transforming-matrices-encoded-in-matrices>`_
encodings and block encodings using `linear combination of unitaries (LCU) decompositions <https://pennylane.ai/qml/demos/tutorial_lcu_blockencoding>`_.
In this tutorial we explore another general block encoding method that can be very efficient for
sparse and structured matrices.

Circuits with matrix access oracles
-----------------------------------
A general circuit for block encoding an arbitrary matrix :math:`A \in \mathbb{C}^{N x N}` with :math:`N = 2^{n}`
soranjh marked this conversation as resolved.
Show resolved Hide resolved
can be constructed as shown in the figure below.

.. figure:: ../demonstrations/block_encoding/general_circuit.png
:width: 50%
soranjh marked this conversation as resolved.
Show resolved Hide resolved
:align: center

Where the :math:`H^{\otimes n}` operation is a Hadamard transformation on :math:`n` qubits. The
:math:`U_A` and :math:`U_B` operations are oracles which give us access to the elements of
the matrix we wish to block encode. The specific action of the oracles are defined below:

soranjh marked this conversation as resolved.
Show resolved Hide resolved
.. math:: U_A |i\rangle |j\rangle \ = ( A_{i, b(i,j)}|0\rangle + \sqrt{1 - |A_{i, b(i,j)}|^2}|1\rangle ) |i\rangle |j\rangle
soranjh marked this conversation as resolved.
Show resolved Hide resolved
soranjh marked this conversation as resolved.
Show resolved Hide resolved

:math:`U_A`, in the most general case, can be constructed from a sequence of uniformly
controlled rotation gates. The rotation angles are computed from the elements of the block encoded
soranjh marked this conversation as resolved.
Show resolved Hide resolved
matrix as :math:`\theta = \text{arccos}(a_{ij})`. The gate complexity of this circuit is :math:`O(N^4)`
soranjh marked this conversation as resolved.
Show resolved Hide resolved
which makes its implementation highly inefficient.

Let :math:`b(i,j)` be a function such that it takes a column index (:math:`j`) and returns the
soranjh marked this conversation as resolved.
Show resolved Hide resolved
soranjh marked this conversation as resolved.
Show resolved Hide resolved
row index for the :math:`i^{th}` non-zero entry in that column of :math:`A`. Note, if :math:`A`
is treated as completely dense (no non-zero entries), this function simply returns :math:`i`.
We use this to define the oracle :math:`U_B`:

.. math:: U_B \cdot |i\rangle|j\rangle \ = \ |i\rangle |b(i,j)\rangle
soranjh marked this conversation as resolved.
Show resolved Hide resolved

Finding an optimal quantum gates decomposition that implements :math:`U_A` and
:math:`U_B` is not always possible. We now explore two approaches for the construction of
these oracles that can be very efficient for matrices with specific sparsity and structure.

Block encoding with FABLE
-------------------------
The "Fast Approximate quantum circuits for BLock Encodings" (FABLE) technique is a general method
soranjh marked this conversation as resolved.
Show resolved Hide resolved
for block encoding dense and sparse matrices. The level of approximation in FABLE can be adjusted
to simplify the resulting circuit. For matrices with specific structures, FABLE provides an
efficient circuit without reducing accuracy.

The FABLE circuit is constructed from a set of rotation and C-NOT gates. The rotation angles,
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved
:math:`\Theta = (\theta_1, ..., \theta_n)`, are obtained from a transformation of the elements of
the block encoded matrix

.. math:: \left ( H^{\otimes 2n} P \right ) \Theta = C,

where :math:`P` is a permutation that transforms a binary ordering to the Gray code ordering,
:math:`C = (\text{arccos}(A_{00}), ..., \text{arccos}(A_{nn}))` is obtained from the matrix elements
soranjh marked this conversation as resolved.
Show resolved Hide resolved
of the matrix :math:`A`, and :math:`H` is defined as

soranjh marked this conversation as resolved.
Show resolved Hide resolved
.. math:: H = \begin{pmatrix} 1 & 1\\
1 & -1
\end{pmatrix}.

Let's now construct the FABLE block encoding circuit for a structured matrix.
"""

import pennylane as qml
from pennylane.templates.state_preparations.mottonen import compute_theta, gray_code
from pennylane import numpy as np
soranjh marked this conversation as resolved.
Show resolved Hide resolved

A = np.array([[-0.51192128, -0.51192128, 0.6237114 , 0.6237114 ],
[ 0.97041007, 0.97041007, 0.99999329, 0.99999329],
[ 0.82429855, 0.82429855, 0.98175843, 0.98175843],
[ 0.99675093, 0.99675093, 0.83514837, 0.83514837]])

##############################################################################
# We now compute the rotation angles and obtain the control wires for the C-NOT gates.

alphas = 2 * np.arccos(A).flatten()
soranjh marked this conversation as resolved.
Show resolved Hide resolved
soranjh marked this conversation as resolved.
Show resolved Hide resolved
thetas = compute_theta(alphas)

code = gray_code(len(A))
n_selections = len(code)

control_wires = [
int(np.log2(int(code[i], 2) ^ int(code[(i + 1) % n_selections], 2)))
soranjh marked this conversation as resolved.
Show resolved Hide resolved
for i in range(n_selections)
]

##############################################################################
# We construct the :math:`U_A` and :math:`U_B` oracles as well as an operator representing the
# tensor product of Hadamard gates.

def UA():
for idx in range(len(thetas)):
qml.RY(thetas[idx],wires=4)
qml.CNOT(wires=[control_wires[idx],4])

def UB():
qml.SWAP(wires=[0,2])
qml.SWAP(wires=[1,3])

def HN():
qml.Hadamard(wires=2)
qml.Hadamard(wires=3)

##############################################################################
# We construct the circuit using these oracles and draw it.

dev = qml.device('default.qubit', wires=5)
@qml.qnode(dev)
def circuit():
HN()
UA()
UB()
HN()
return qml.state()

print(qml.draw(circuit)())
soranjh marked this conversation as resolved.
Show resolved Hide resolved

##############################################################################
# We compute the matrix representation of the circuit and print its top-left block to compare it
# with the original matrix.

print(f"Original matrix:\n{A}", "\n")
M = len(A) * qml.matrix(circuit,wire_order=[0,1,2,3,4][::-1])()[0:len(A),0:len(A)]
soranjh marked this conversation as resolved.
Show resolved Hide resolved
print(f"Block-encoded matrix:\n{M}", "\n")

##############################################################################
# You can easily confirm that the circuit block encodes the original matrix defined above.
#
# The interesting point about the FABLE method is that we can eliminate those rotation gates that
# have an angle smaller than a defined threshold. This leaves a sequence of C-NOT gates that in
# most cases cancel each other out. You can confirm that two C-NOT gates applied to the same wires
# cancel each other. Let's now remove all the rotation gates that have an angle smaller than
# :math:`0.01` and draw the circuit.

tolerance= 0.01

def UA():
for idx in range(len(thetas)):
if abs(thetas[idx])>tolerance:
qml.RY(thetas[idx],wires=4)
qml.CNOT(wires=[control_wires[idx],4])

print(qml.draw(circuit)())
soranjh marked this conversation as resolved.
Show resolved Hide resolved

##############################################################################
# Compressing the circuit by removing some of the rotations is an approximation. We can now see how
# good this approximation is in the case of our example.
soranjh marked this conversation as resolved.
Show resolved Hide resolved

def UA():
nots=[]
for idx in range(len(thetas)):
if abs(thetas[idx]) > tolerance:
for cidx in nots:
qml.CNOT(wires=[cidx,4])
qml.RY(thetas[idx],wires=4)
nots=[]
if control_wires[idx] in nots:
del(nots[nots.index(control_wires[idx])])
else:
nots.append(control_wires[idx])
qml.CNOT(nots+[4])
soranjh marked this conversation as resolved.
Show resolved Hide resolved

print(qml.draw(circuit)())
soranjh marked this conversation as resolved.
Show resolved Hide resolved

print(f"Original matrix:\n{A}", "\n")
M = len(A) * qml.matrix(circuit,wire_order=[0,1,2,3,4][::-1])()[0:len(A),0:len(A)]
Copy link
Contributor

Choose a reason for hiding this comment

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

In this case is len(A) because there are len(A) entries other than 0? or will it always be len(A)?

soranjh marked this conversation as resolved.
Show resolved Hide resolved
print(f"Block-encoded matrix:\n{M}", "\n")

##############################################################################
soranjh marked this conversation as resolved.
Show resolved Hide resolved
# You can see that the compressed circuit is equivalent to the original circuit. This happens
# because our original matrix is highly structured and many of the rotation angles are zero.
# However, this is not always true for an arbitrary matrix. Can you construct another matrix that
# allows a significant compression of the block encoding circuit without affecting the accuracy?
#
# Block-encoding sparse matrices
# ------------------------------
# The quantum circuit for the oracle :math:`U_A`, presented above, accesses every entry of
# :math:`A` and thus requires :math:`~ O(N^2)` gates to implement the oracle ([#fable]_). In the
# special cases where :math:`A` is structured and sparse, we can generate a more efficient quantum
# circuit representation for :math:`U_A` and :math:`U_B`. Let's look at an example.
#
# Consider the sparse matrix given by:
#
# .. math:: A = \begin{bmatrix}
# \alpha & \gamma & 0 & \dots & \beta\\
# \beta & \alpha & \gamma & \ddots & 0 \\
# 0 & \beta & \alpha & \gamma \ddots & 0\\
# 0 & \ddots & \beta & \alpha & \gamma\\
# \gamma & 0 & \dots & \beta & \alpha \\
# \end{bmatrix},
#
# where :math:`\alpha`, :math:`\beta` and :math:`\gamma` are real numbers. The following code block
# prepares the matrix representation of :math:`A` for an :math:`8 \times 8` sparse matrix.

alpha, beta, gamma = 0.1, 0.6, 0.3

A = np.array([[alpha, gamma, 0, 0, 0, 0, 0, beta],
[ beta, alpha, gamma, 0, 0, 0, 0, 0],
[ 0, beta, alpha, gamma, 0, 0, 0, 0],
[ 0, 0, beta, alpha, gamma, 0, 0, 0],
[ 0, 0, 0, beta, alpha, gamma, 0, 0],
[ 0, 0, 0, 0, beta, alpha, gamma, 0],
[ 0, 0, 0, 0, 0, beta, alpha, gamma],
[gamma, 0, 0, 0, 0, 0, beta, alpha]])

print(f"Original A:\n{A}", "\n")

##############################################################################
# The :math:`U_A` oracle for this matrix is constructed from controlled rotation gates, similar to
# the FABLE circuit.

def UA(ancilla, wire_l, theta):
qml.ctrl(qml.RY, control=wire_l, control_values=[0, 0])(theta[0], wires=ancilla)
qml.ctrl(qml.RY, control=wire_l, control_values=[1, 0])(theta[1], wires=ancilla)
qml.ctrl(qml.RY, control=wire_l, control_values=[0, 1])(theta[2], wires=ancilla)
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved

##############################################################################
# The :math:`U_B` oracle is defined in terms of the so-called "Left" and "Right" shift operators
# ([#sparse]_).
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved

def shift_op(s_wires, shift="Left"):
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved
control_values = [1, 1] if shift == "Left" else [0, 0]
qml.ctrl(qml.PauliX, control=s_wires[:2], control_values=control_values)(wires=s_wires[2])
qml.ctrl(qml.PauliX, control=s_wires[0], control_values=control_values[0])(wires=s_wires[1])
qml.PauliX(s_wires[0])


def UB(wires_l, wires_j):
qml.ctrl(shift_op, control=wires_l[0])(wires_j, shift="Left")
qml.ctrl(shift_op, control=wires_l[1])(wires_j, shift="Right")
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved

##############################################################################
# We now construct our circuit to block encode the sparse matrix.

dev = qml.device("default.qubit", wires=["ancilla", "l1", "l0", "j2", "j1", "j0"])
soranjh marked this conversation as resolved.
Show resolved Hide resolved
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved

@qml.qnode(dev)
def complete_circuit(theta):
for w in ["l0", "l1"]: # hadamard transform over |l> register
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved
qml.Hadamard(w)

UA("ancilla", ["l0", "l1"], theta)

UB(["l0", "l1"], ["j0", "j1", "j2"])
soranjh marked this conversation as resolved.
Show resolved Hide resolved
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved

for w in ["l0", "l1"]: # hadamard transform over |l> register
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved
qml.Hadamard(w)

return qml.state()

s = 4 # normalization constant
theta = 2 * np.arccos(np.array([alpha - 1, beta, gamma]))

print("Quantum Circuit:")
print(qml.draw(complete_circuit)(theta), "\n")

print("BlockEncoded Mat:")
mat = qml.matrix(complete_circuit)(theta).real[:8, :8] * s
print(mat, "\n")

##############################################################################
# You can confirm that the circuit block encodes the original sparse matrix defined above.
#
# Summary and conclusions
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved
# -----------------------
# Block encoding is a powerful technique in quantum computing that allows us to implement a non-unitary
# operation in a quantum circuit by embedding the operation in a larger unitary gate.
# In this demo, we reviewed two important block encoding methods with code examples using PennyLane.
# The block encoding functionality provided in PennyLane allows you to explore and benchmark several
# block encoding approaches for a desired problem. The efficiency of the block encoding methods
# typically depends on the sparsity and structure of the original matrix. We hope that you can use
# these tips and tricks to find a more efficient block encoding your matrix!
Jaybsoni marked this conversation as resolved.
Show resolved Hide resolved
#
# References
# ----------
#
# .. [#fable]
#
# Daan Camps, Roel Van Beeumen,
# "FABLE: fast approximate quantum circuits for block-encodings",
# `arXiv:2205.00081 <https://arxiv.org/abs/2205.00081>`__, 2022
#
#
# .. [#sparse]
#
# Daan Camps, Lin Lin, Roel Van Beeumen, Chao Yang,
# "Explicit quantum circuits for block encodings of certain sparse matrices",
# `arXiv:2203.10236 <https://arxiv.org/abs/2203.10236>`__, 2022
#
#

##############################################################################
# About the author
# ----------------
# .. include:: ../_static/authors/jay_soni.txt
#
# .. include:: ../_static/authors/diego_guala.txt
#
# .. include:: ../_static/authors/soran_jahangiri.txt
9 changes: 7 additions & 2 deletions demos_quantum-computing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,12 @@ such as benchmarking and characterizing quantum processors.
:description: :doc:`demos/tutorial_lcu_blockencoding`
:tags: quantumcomputing LCU algorithms qsvt

.. gallery-item::
:tooltip: Block Encoding
:figure: demonstrations/block_encoding/fable_circuit.png
:description: :doc:`demos/tutorial_block_encoding`
:tags: quantumcomputing qsvt optimization

.. gallery-item::
:tooltip: Running pulse programs on OQC Lucy
:figure: demonstrations/oqc_pulse/thumbnail_oqc_pulse.png
Expand Down Expand Up @@ -218,6 +224,5 @@ such as benchmarking and characterizing quantum processors.
demos/tutorial_grovers_algorithm
demos/tutorial_apply_qsvt
demos/tutorial_lcu_blockencoding
demos/tutorial_block_encoding
demos/oqc_pulse