Skip to content

Parametric programs

Qadence base Parameter type is a subtype of sympy.Symbol. There are three kinds of parameter subtypes used:

  • Fixed Parameter: A constant with a fixed, non-trainable value (e.g. \(\dfrac{\pi}{2}\)).
  • Variational Parameter: A trainable parameter which can be be optimized.
  • Feature Parameter: A non-trainable parameter which can be used to encode classical data into a quantum state.

Fixed Parameters

To pass a fixed parameter to a gate (or any parametrizable block), one can simply use either Python numeric types or wrapped in a torch.Tensor.

from torch import pi
from qadence import RX, run

# Let's use a torch type.
block = RX(0, pi)
wf = run(block)

# Let's pass a simple float.
block = RX(0, 1.)
wf = run(block)
wf = tensor([[6.1232e-17+0.j, 0.0000e+00-1.j]])
wf = tensor([[0.8776+0.0000j, 0.0000-0.4794j]])

Variational Parameters

To parametrize a block by an angle theta, either a Python string or an instance of VariationalParameter can be passed instead of a numeric type to the gate constructor:

from qadence import RX, run, VariationalParameter

block = RX(0, "theta")
# This is equivalent to:
block = RX(0, VariationalParameter("theta"))

wf = run(block)
wf = tensor([[0.9868+0.0000j, 0.0000-0.1621j]])

In the first case in the above example, theta is automatically inferred as a VariationalParameter (i.e. trainable). It is initialized to a random value for the purposes of execution. In the context of a QuantumModel, there is no need to pass a value for theta to the run method since it is stored within the underlying model parameter dictionary.

Feature Parameters

FeatureParameter types (i.e. inputs), always need to be provided with a value or a batch of values as a dictionary:

from torch import tensor
from qadence import RX, run, FeatureParameter

block = RX(0, FeatureParameter("phi"))

wf = run(block, values={"phi": tensor([1., 2.])})
wf = tensor([[0.8776+0.0000j, 0.0000-0.4794j],
        [0.5403+0.0000j, 0.0000-0.8415j]])

Now, run returns a batch of states, one for every provided angle which coincides with the value of the particular FeatureParameter.

Multiparameter Expressions

However, an angle can itself be an expression Parameter types of any kind. As such, any sympy expression expr: sympy.Basic consisting of a combination of free symbols (i.e. sympy types) and Qadence Parameter can be passed to a block, including trigonometric functions.

from torch import tensor
from qadence import RX, Parameter, run, FeatureParameter
from sympy import sin

theta, phi = Parameter("theta"), FeatureParameter("phi")
block = RX(0, sin(theta+phi))

# Remember, to run the block, only FeatureParameter values have to be provided:
values = {"phi": tensor([1.0, 2.0])}
wf = run(block, values=values)
wf = tensor([[0.8778+0.0000j, 0.0000-0.4791j],
        [0.9593+0.0000j, 0.0000-0.2825j]])

Parameters Redundancy

Parameters are uniquely defined by their name and redundancy is allowed in composite blocks to assign the same value to different blocks.

import torch
from qadence import RX, RY, run, chain, kron

block = chain(
    kron(RX(0, "phi"), RY(1, "theta")),
    kron(RX(0, "phi"), RY(1, "theta")),
)

wf = run(block)  # Same random initialization for all instances of phi and theta.
wf = tensor([[0.5086+0.0000j, 0.6844+0.0000j, 0.0000-0.3116j, 0.0000-0.4194j]])

Parametrized Circuits

Now, let's have a look at the construction of a variational ansatz which composes FeatureParameter and VariationalParameter types:

import sympy
from qadence import RX, RY, RZ, CNOT, Z, run, chain, kron, FeatureParameter, VariationalParameter

phi = FeatureParameter("phi")
theta = VariationalParameter("theta")

block = chain(
    kron(
        RX(0, phi/theta),
        RY(1, theta*2),
        RZ(2, sympy.cos(phi)),
    ),
    kron(
        RX(0, phi),
        RY(1, theta),
        RZ(2, phi),
    ),
    kron(
        RX(0, phi),
        RY(1, theta),
        RZ(2, phi),
    ),
    kron(
        RX(0, phi + theta),
        RY(1, theta**2),
        RZ(2, sympy.cos(phi)),
    ),
    chain(CNOT(0,1), CNOT(1,2))
)
block.tag = "Rotations"

obs = 2*kron(*map(Z, range(3)))
block = chain(block, obs)
cluster_a0fd417cba544b04b902d91320d4c863 [* 2] cluster_77393da18f144dec9c22b0edeecbcff1 Rotations 122788c6e55445ae8dd135ff16eda32b 0 d80c7404d9a44357952725c735a07a38 RX(phi/theta) 122788c6e55445ae8dd135ff16eda32b--d80c7404d9a44357952725c735a07a38 b3a525258c714c908c27473320ba6d07 1 3bc45c5fd0594b6d8587236c6071ba5b RX(phi) d80c7404d9a44357952725c735a07a38--3bc45c5fd0594b6d8587236c6071ba5b 06256ce6171a4c88a7fff2125fb7ba0b RX(phi) 3bc45c5fd0594b6d8587236c6071ba5b--06256ce6171a4c88a7fff2125fb7ba0b f09eed1f089b4c17b46ae173aa283a52 RX(phi + theta) 06256ce6171a4c88a7fff2125fb7ba0b--f09eed1f089b4c17b46ae173aa283a52 bfa094838e844d929b7fc17944b52529 f09eed1f089b4c17b46ae173aa283a52--bfa094838e844d929b7fc17944b52529 af07b0c681ab4f3c928e7e128233098e bfa094838e844d929b7fc17944b52529--af07b0c681ab4f3c928e7e128233098e 7ca79da0944a46cd8792d8116e4dd9b3 Z af07b0c681ab4f3c928e7e128233098e--7ca79da0944a46cd8792d8116e4dd9b3 b6ed6ecfbf9a44ca85933f290a9b581c 7ca79da0944a46cd8792d8116e4dd9b3--b6ed6ecfbf9a44ca85933f290a9b581c b5ec03ca821e443f8afea57303a2accc 0f2a9d24aaa749cbbcd9da452fafb277 RY(2*theta) b3a525258c714c908c27473320ba6d07--0f2a9d24aaa749cbbcd9da452fafb277 79de5c1e599d45818bd8d1d483d9ffe8 2 2cf4dfddc5ad4556ae96c00f8a4e08e4 RY(theta) 0f2a9d24aaa749cbbcd9da452fafb277--2cf4dfddc5ad4556ae96c00f8a4e08e4 3627fa4d7ad64c8196a0ca9000218d8b RY(theta) 2cf4dfddc5ad4556ae96c00f8a4e08e4--3627fa4d7ad64c8196a0ca9000218d8b 7006e0874ce94b9388ebc8fbba34e018 RY(theta**2) 3627fa4d7ad64c8196a0ca9000218d8b--7006e0874ce94b9388ebc8fbba34e018 01fa4d4637fb4de9981566ee8ca2f704 X 7006e0874ce94b9388ebc8fbba34e018--01fa4d4637fb4de9981566ee8ca2f704 01fa4d4637fb4de9981566ee8ca2f704--bfa094838e844d929b7fc17944b52529 e6c65b894dbe4393b3dd39a17e2db513 01fa4d4637fb4de9981566ee8ca2f704--e6c65b894dbe4393b3dd39a17e2db513 3d1ff771ff034564bab376e7e3ad8f64 Z e6c65b894dbe4393b3dd39a17e2db513--3d1ff771ff034564bab376e7e3ad8f64 3d1ff771ff034564bab376e7e3ad8f64--b5ec03ca821e443f8afea57303a2accc 1b9e3d0c07bf44f4a6446099b08befc5 e8210ba3b34a430e95814baf4de91229 RZ(cos(phi)) 79de5c1e599d45818bd8d1d483d9ffe8--e8210ba3b34a430e95814baf4de91229 dd3d97c4da96471eb965ac1511a53db3 RZ(phi) e8210ba3b34a430e95814baf4de91229--dd3d97c4da96471eb965ac1511a53db3 cd52fe6e3dba471ea726b67fba651a00 RZ(phi) dd3d97c4da96471eb965ac1511a53db3--cd52fe6e3dba471ea726b67fba651a00 f97ecb93616c4ee49996dfd9c5b7f572 RZ(cos(phi)) cd52fe6e3dba471ea726b67fba651a00--f97ecb93616c4ee49996dfd9c5b7f572 5aa7f4217ad44b06954117de2bee1306 f97ecb93616c4ee49996dfd9c5b7f572--5aa7f4217ad44b06954117de2bee1306 33683ab3bb7841beabe1dfe037c0c3c2 X 5aa7f4217ad44b06954117de2bee1306--33683ab3bb7841beabe1dfe037c0c3c2 33683ab3bb7841beabe1dfe037c0c3c2--e6c65b894dbe4393b3dd39a17e2db513 050e6ac578164d7580100cbd000e0253 Z 33683ab3bb7841beabe1dfe037c0c3c2--050e6ac578164d7580100cbd000e0253 050e6ac578164d7580100cbd000e0253--1b9e3d0c07bf44f4a6446099b08befc5

Please note the different colors for the parametrization with different types. The default palette assigns light blue for VariationalParameter, light green for FeatureParameter and shaded red for observables.

Parametrized QuantumModels

As a quick reminder: FeatureParameter are used for data input and data encoding into a quantum state. VariationalParameter are trainable parameters in a variational ansatz. When used within a QuantumModel, an abstract quantum circuit is made differentiable with respect to both variational and feature parameters which are uniquely identified by their name.

from qadence import FeatureParameter, Parameter, VariationalParameter

# Feature parameters are non-trainable parameters.
# Their primary use is input data encoding.
fp = FeatureParameter("x")
assert fp == Parameter("x", trainable=False)

# Variational parameters are trainable parameters.
# Their primary use is for optimization.
vp = VariationalParameter("y")
assert vp == Parameter("y", trainable=True)

Let's construct a parametric quantum circuit.

from qadence import QuantumCircuit, RX, RY, chain, kron

theta = VariationalParameter("theta")
phi = FeatureParameter("phi")

block = chain(
    kron(RX(0, theta), RY(1, theta)),
    kron(RX(0, phi), RY(1, phi)),
)

circuit = QuantumCircuit(2, block)
unique_params = circuit.unique_parameters
unique_params = [theta, phi]

In the circuit above, four parameters are defined but only two unique names. Therefore, there will be only one variational parameter to be optimized.

The QuantumModel class also provides convenience methods to manipulate parameters.

from qadence import QuantumModel, BackendName, DiffMode

model = QuantumModel(circuit, backend=BackendName.PYQTORCH, diff_mode=DiffMode.AD)
num_vparams = model.num_vparams
vparams_values = model.vparams
num_vparams = 1
vparams_values = OrderedDict([('theta', tensor([0.6171]))])

Only provide feature parameter values to the quantum model

In order to run the variational circuit only feature parameter values have to be provided. Variational parameters are stored in the model itself. If multiple feature parameters are present, values must be provided in batches of same length.

import torch

values = {"phi": torch.rand(3)} # theta does not appear here
wf = model.run(values)
wf = tensor([[0.5703+0.0000j, 0.4950+0.0000j, 0.0000-0.4950j, 0.0000-0.4297j],
        [0.8421+0.0000j, 0.3647+0.0000j, 0.0000-0.3647j, 0.0000-0.1579j],
        [0.8410+0.0000j, 0.3656+0.0000j, 0.0000-0.3656j, 0.0000-0.1590j]],
       grad_fn=<TBackward0>)

Standard constructors

The unique parameter identification is relevant when using built-in Qadence block constructors in the qadence.constructors module such as feature maps and hardware efficient ansatze (HEA).

from qadence import QuantumCircuit, hea

n_qubits = 4
depth = 2

hea1 = hea(n_qubits=n_qubits, depth=depth)
circuit = QuantumCircuit(n_qubits, hea1)
num_unique_parameters = circuit.num_unique_parameters
Unique parameters with a single HEA: 24
40064fe83c614848ba879b67014ef65d 0 de8cf19455bf40ac968dea7676ebbf61 RX(theta₀) 40064fe83c614848ba879b67014ef65d--de8cf19455bf40ac968dea7676ebbf61 ef7383dd20b245b0ae3faff5ce766ae5 1 04f986bad5fd46959f4fdb744141f839 RY(theta₄) de8cf19455bf40ac968dea7676ebbf61--04f986bad5fd46959f4fdb744141f839 a38695307f604dc9ad80a0c0e2fd170e RX(theta₈) 04f986bad5fd46959f4fdb744141f839--a38695307f604dc9ad80a0c0e2fd170e 2dd7d78d790b48ac8b80cec718becbae a38695307f604dc9ad80a0c0e2fd170e--2dd7d78d790b48ac8b80cec718becbae 2f9c9817f160477cbd80f852a2a2ec4c 2dd7d78d790b48ac8b80cec718becbae--2f9c9817f160477cbd80f852a2a2ec4c ae791bc92e134edfb96bcd9449bdee2f RX(theta₁₂) 2f9c9817f160477cbd80f852a2a2ec4c--ae791bc92e134edfb96bcd9449bdee2f 40e4baa9eef54f7187035d36f7556d49 RY(theta₁₆) ae791bc92e134edfb96bcd9449bdee2f--40e4baa9eef54f7187035d36f7556d49 6108757be20c48d89cb96d4046344043 RX(theta₂₀) 40e4baa9eef54f7187035d36f7556d49--6108757be20c48d89cb96d4046344043 dd4a5c8a287f4d97840675292c68dbcf 6108757be20c48d89cb96d4046344043--dd4a5c8a287f4d97840675292c68dbcf fc5e8f78f78f4b679816a7b49c194fcf dd4a5c8a287f4d97840675292c68dbcf--fc5e8f78f78f4b679816a7b49c194fcf 180a9273d083488d92b5404ad20a0a80 fc5e8f78f78f4b679816a7b49c194fcf--180a9273d083488d92b5404ad20a0a80 37cbc912d33341f4aa61ee2838e7ada6 a322c9cb1b7149029a7d1d2adb039aa3 RX(theta₁) ef7383dd20b245b0ae3faff5ce766ae5--a322c9cb1b7149029a7d1d2adb039aa3 5f0db1d6ac294bfba61d35e4668ebedb 2 8588c84eb9894503a2b132a5c0a40e83 RY(theta₅) a322c9cb1b7149029a7d1d2adb039aa3--8588c84eb9894503a2b132a5c0a40e83 cc5790d03b134030a723f8de5872a47d RX(theta₉) 8588c84eb9894503a2b132a5c0a40e83--cc5790d03b134030a723f8de5872a47d f462c4b84665475490523cc339bdd4d8 X cc5790d03b134030a723f8de5872a47d--f462c4b84665475490523cc339bdd4d8 f462c4b84665475490523cc339bdd4d8--2dd7d78d790b48ac8b80cec718becbae e85afaf65adf4d8e827a207903ae487d f462c4b84665475490523cc339bdd4d8--e85afaf65adf4d8e827a207903ae487d eaf08ebc6a1d4242943bcc5e79962d7f RX(theta₁₃) e85afaf65adf4d8e827a207903ae487d--eaf08ebc6a1d4242943bcc5e79962d7f e0ee544ca668470e92503d027599c510 RY(theta₁₇) eaf08ebc6a1d4242943bcc5e79962d7f--e0ee544ca668470e92503d027599c510 4900efdc64324dfcbdd2adc4c8510863 RX(theta₂₁) e0ee544ca668470e92503d027599c510--4900efdc64324dfcbdd2adc4c8510863 335774dd13624a998027b90297220be6 X 4900efdc64324dfcbdd2adc4c8510863--335774dd13624a998027b90297220be6 335774dd13624a998027b90297220be6--dd4a5c8a287f4d97840675292c68dbcf 5ba4e5de261849e9aec2f3cbdb74b7dc 335774dd13624a998027b90297220be6--5ba4e5de261849e9aec2f3cbdb74b7dc 5ba4e5de261849e9aec2f3cbdb74b7dc--37cbc912d33341f4aa61ee2838e7ada6 c330d4b706fd48a3ac0fb70f3de9309b 5800eaf8cca94079b097e06ab4d08710 RX(theta₂) 5f0db1d6ac294bfba61d35e4668ebedb--5800eaf8cca94079b097e06ab4d08710 dd39536b4dfa4c14a8f916a585e87347 3 e16ebd402e1a4e1daa382e35fb4bf490 RY(theta₆) 5800eaf8cca94079b097e06ab4d08710--e16ebd402e1a4e1daa382e35fb4bf490 7f0fec33dbc74a3e90214525450a1a13 RX(theta₁₀) e16ebd402e1a4e1daa382e35fb4bf490--7f0fec33dbc74a3e90214525450a1a13 2383f370bd4c460e805a0f15d3e40ddf 7f0fec33dbc74a3e90214525450a1a13--2383f370bd4c460e805a0f15d3e40ddf 2ca3da113e754b999e6a5757152fc0e1 X 2383f370bd4c460e805a0f15d3e40ddf--2ca3da113e754b999e6a5757152fc0e1 2ca3da113e754b999e6a5757152fc0e1--e85afaf65adf4d8e827a207903ae487d 8e9a3a772d01439980eca4a3e3d50c9e RX(theta₁₄) 2ca3da113e754b999e6a5757152fc0e1--8e9a3a772d01439980eca4a3e3d50c9e f0f01d107b3243e18511339f00d52f77 RY(theta₁₈) 8e9a3a772d01439980eca4a3e3d50c9e--f0f01d107b3243e18511339f00d52f77 15e119da84844057b0c585fc4008f44a RX(theta₂₂) f0f01d107b3243e18511339f00d52f77--15e119da84844057b0c585fc4008f44a 36e622588075437da361c18e4e4049be 15e119da84844057b0c585fc4008f44a--36e622588075437da361c18e4e4049be dbbe301c642f444aa3d7887968c14619 X 36e622588075437da361c18e4e4049be--dbbe301c642f444aa3d7887968c14619 dbbe301c642f444aa3d7887968c14619--5ba4e5de261849e9aec2f3cbdb74b7dc dbbe301c642f444aa3d7887968c14619--c330d4b706fd48a3ac0fb70f3de9309b 36016e5c60c241b8bd88c2c719eefd94 038d58ec013d47208e97c1447760d77a RX(theta₃) dd39536b4dfa4c14a8f916a585e87347--038d58ec013d47208e97c1447760d77a f9e98a8b4b0d40258ee1fba2e972ac81 RY(theta₇) 038d58ec013d47208e97c1447760d77a--f9e98a8b4b0d40258ee1fba2e972ac81 27ec8aa42ef14a1693fa42f854f8f9d8 RX(theta₁₁) f9e98a8b4b0d40258ee1fba2e972ac81--27ec8aa42ef14a1693fa42f854f8f9d8 e02e7218674841c0bc94cdda646cbede X 27ec8aa42ef14a1693fa42f854f8f9d8--e02e7218674841c0bc94cdda646cbede e02e7218674841c0bc94cdda646cbede--2383f370bd4c460e805a0f15d3e40ddf 1ca887d7d0b845bfb2b3b6a5c06f96a6 e02e7218674841c0bc94cdda646cbede--1ca887d7d0b845bfb2b3b6a5c06f96a6 1998449c53624ca7b57d01d0e9e677ad RX(theta₁₅) 1ca887d7d0b845bfb2b3b6a5c06f96a6--1998449c53624ca7b57d01d0e9e677ad 1ea1f4f6f8a24c2cb6f3fcc3723ae1c3 RY(theta₁₉) 1998449c53624ca7b57d01d0e9e677ad--1ea1f4f6f8a24c2cb6f3fcc3723ae1c3 9d526491d6794267b197ed60d8de97c8 RX(theta₂₃) 1ea1f4f6f8a24c2cb6f3fcc3723ae1c3--9d526491d6794267b197ed60d8de97c8 87259ebe915f4828ab37ea23749dbcde X 9d526491d6794267b197ed60d8de97c8--87259ebe915f4828ab37ea23749dbcde 87259ebe915f4828ab37ea23749dbcde--36e622588075437da361c18e4e4049be e4baeb05a30d4375b7cd855fc5723c19 87259ebe915f4828ab37ea23749dbcde--e4baeb05a30d4375b7cd855fc5723c19 e4baeb05a30d4375b7cd855fc5723c19--36016e5c60c241b8bd88c2c719eefd94

A new circuit can be created by adding another identical HEA. As expected, the number of unique parameters is the same.

hea2 = hea(n_qubits=n_qubits, depth=depth)

circuit = QuantumCircuit(n_qubits, hea1, hea2)
num_unique_params_two_heas = circuit.num_unique_parameters
Unique parameters with two stacked HEAs: 24
cluster_95153c2b861b46bda5be5cb55f930eef HEA cluster_49fb79a993b04b7484224bd6ead2d48c HEA 3bc17c99ad864cf89e9d787df8689d61 0 5c645eec5ce34e0b8a3ced3985d6f36c RX(theta₀) 3bc17c99ad864cf89e9d787df8689d61--5c645eec5ce34e0b8a3ced3985d6f36c e6f91d17d3c541108b36b06a04e541b9 1 564d7ae9514d43df95d70678a6647d5f RY(theta₄) 5c645eec5ce34e0b8a3ced3985d6f36c--564d7ae9514d43df95d70678a6647d5f f68e955e0dab4944ba0ecea3ccdddde8 RX(theta₈) 564d7ae9514d43df95d70678a6647d5f--f68e955e0dab4944ba0ecea3ccdddde8 fcc03071e28f4326b45c0c1a13744028 f68e955e0dab4944ba0ecea3ccdddde8--fcc03071e28f4326b45c0c1a13744028 bf70afcb82b147dc8d14caad534fe94d fcc03071e28f4326b45c0c1a13744028--bf70afcb82b147dc8d14caad534fe94d 93bbffb183714e388afa39b895728d4a RX(theta₁₂) bf70afcb82b147dc8d14caad534fe94d--93bbffb183714e388afa39b895728d4a 9f13e10da63648f098380ef7ee7eca36 RY(theta₁₆) 93bbffb183714e388afa39b895728d4a--9f13e10da63648f098380ef7ee7eca36 82d7254ea7894fad9537bc625215fcc8 RX(theta₂₀) 9f13e10da63648f098380ef7ee7eca36--82d7254ea7894fad9537bc625215fcc8 b3688aaf0ae145a4b756965894f3c3a3 82d7254ea7894fad9537bc625215fcc8--b3688aaf0ae145a4b756965894f3c3a3 386a1830cbec4a68a9afca3489736988 b3688aaf0ae145a4b756965894f3c3a3--386a1830cbec4a68a9afca3489736988 f1900cc85324406584fd54f8d68fd614 RX(theta₀) 386a1830cbec4a68a9afca3489736988--f1900cc85324406584fd54f8d68fd614 ba03607a1b76445bb948aec2e2667429 RY(theta₄) f1900cc85324406584fd54f8d68fd614--ba03607a1b76445bb948aec2e2667429 317902a2d4dc40af8972ac0963256317 RX(theta₈) ba03607a1b76445bb948aec2e2667429--317902a2d4dc40af8972ac0963256317 2dd7087cb3a1445ba505c419354e527e 317902a2d4dc40af8972ac0963256317--2dd7087cb3a1445ba505c419354e527e 9d2f573aee0643e0a3cd9d6282854121 2dd7087cb3a1445ba505c419354e527e--9d2f573aee0643e0a3cd9d6282854121 d4504706f8b249eca697acae6522fb51 RX(theta₁₂) 9d2f573aee0643e0a3cd9d6282854121--d4504706f8b249eca697acae6522fb51 e801b320eb9a41bc97549ab51a29059d RY(theta₁₆) d4504706f8b249eca697acae6522fb51--e801b320eb9a41bc97549ab51a29059d b5ab997aba214bc6a0c4a5b25c2d0112 RX(theta₂₀) e801b320eb9a41bc97549ab51a29059d--b5ab997aba214bc6a0c4a5b25c2d0112 a03f3873e7f34ae3816a24c7e0d9334c b5ab997aba214bc6a0c4a5b25c2d0112--a03f3873e7f34ae3816a24c7e0d9334c c3ed02400aec4c0cac7220bc94b0ea74 a03f3873e7f34ae3816a24c7e0d9334c--c3ed02400aec4c0cac7220bc94b0ea74 72a09ab10be845dd8c1ce72ae583f4f1 c3ed02400aec4c0cac7220bc94b0ea74--72a09ab10be845dd8c1ce72ae583f4f1 fb59098fe1d24bbfafa6cf86b96e16b2 596390c7c13b4f1aa144d9170f800bf2 RX(theta₁) e6f91d17d3c541108b36b06a04e541b9--596390c7c13b4f1aa144d9170f800bf2 9a3299ec0b7b47eebf99c16c36d2185a 2 0ef87d98beef4b9eb7a2bd72333f99ba RY(theta₅) 596390c7c13b4f1aa144d9170f800bf2--0ef87d98beef4b9eb7a2bd72333f99ba 63bb7a8c6f384d94a072ed07a2a9059b RX(theta₉) 0ef87d98beef4b9eb7a2bd72333f99ba--63bb7a8c6f384d94a072ed07a2a9059b 6fd54082c6364c21927af3ef0716ded2 X 63bb7a8c6f384d94a072ed07a2a9059b--6fd54082c6364c21927af3ef0716ded2 6fd54082c6364c21927af3ef0716ded2--fcc03071e28f4326b45c0c1a13744028 3f50092da8544a9d95562505b27d27a5 6fd54082c6364c21927af3ef0716ded2--3f50092da8544a9d95562505b27d27a5 1cc93ff363914470b2da7dd6bb0ac28f RX(theta₁₃) 3f50092da8544a9d95562505b27d27a5--1cc93ff363914470b2da7dd6bb0ac28f c9b37f3b123248388b8339bca1bd9b3a RY(theta₁₇) 1cc93ff363914470b2da7dd6bb0ac28f--c9b37f3b123248388b8339bca1bd9b3a f2279dbd8aa74da4b19b5cab972dce20 RX(theta₂₁) c9b37f3b123248388b8339bca1bd9b3a--f2279dbd8aa74da4b19b5cab972dce20 d6a1e2fc9dde4c0583dc2a1e6e14e293 X f2279dbd8aa74da4b19b5cab972dce20--d6a1e2fc9dde4c0583dc2a1e6e14e293 d6a1e2fc9dde4c0583dc2a1e6e14e293--b3688aaf0ae145a4b756965894f3c3a3 6d460aacb57e409bbb6141280b28a829 d6a1e2fc9dde4c0583dc2a1e6e14e293--6d460aacb57e409bbb6141280b28a829 b1c7ec608102417b913bdc687a47a899 RX(theta₁) 6d460aacb57e409bbb6141280b28a829--b1c7ec608102417b913bdc687a47a899 fccd4d7041e44ad7aa80a5be1966ab4d RY(theta₅) b1c7ec608102417b913bdc687a47a899--fccd4d7041e44ad7aa80a5be1966ab4d ac83ef20847549f68b20532af37d7019 RX(theta₉) fccd4d7041e44ad7aa80a5be1966ab4d--ac83ef20847549f68b20532af37d7019 a5e4ce8f0648493695c993c7f4c1d332 X ac83ef20847549f68b20532af37d7019--a5e4ce8f0648493695c993c7f4c1d332 a5e4ce8f0648493695c993c7f4c1d332--2dd7087cb3a1445ba505c419354e527e f6cdab083b2b4748b7311e7ab680789c a5e4ce8f0648493695c993c7f4c1d332--f6cdab083b2b4748b7311e7ab680789c d99d40ccf1f5430aad7fdda5183cfae0 RX(theta₁₃) f6cdab083b2b4748b7311e7ab680789c--d99d40ccf1f5430aad7fdda5183cfae0 991b3e5ae0524f60adcab2d251b2b36c RY(theta₁₇) d99d40ccf1f5430aad7fdda5183cfae0--991b3e5ae0524f60adcab2d251b2b36c 30f97845a1d24c9b84f42e38fb8d1097 RX(theta₂₁) 991b3e5ae0524f60adcab2d251b2b36c--30f97845a1d24c9b84f42e38fb8d1097 5a7cdd8695b14397be480669a2364e6b X 30f97845a1d24c9b84f42e38fb8d1097--5a7cdd8695b14397be480669a2364e6b 5a7cdd8695b14397be480669a2364e6b--a03f3873e7f34ae3816a24c7e0d9334c 40311c199a0b4f1da834fe418759a589 5a7cdd8695b14397be480669a2364e6b--40311c199a0b4f1da834fe418759a589 40311c199a0b4f1da834fe418759a589--fb59098fe1d24bbfafa6cf86b96e16b2 9b31ed0d61f34b0e9b15f3aed3d4d085 f3f7563593ba412db77a1749f6111672 RX(theta₂) 9a3299ec0b7b47eebf99c16c36d2185a--f3f7563593ba412db77a1749f6111672 8ed889e811094e59a2d06844c8337514 3 d9acafbda4d94c3c89c817e011702e1a RY(theta₆) f3f7563593ba412db77a1749f6111672--d9acafbda4d94c3c89c817e011702e1a 7b5b9c2517d94072994bb95b81bf8a3d RX(theta₁₀) d9acafbda4d94c3c89c817e011702e1a--7b5b9c2517d94072994bb95b81bf8a3d 1c25bfc4b27b4c4ea6dd16df1d6146b8 7b5b9c2517d94072994bb95b81bf8a3d--1c25bfc4b27b4c4ea6dd16df1d6146b8 87f4f42c481246e2a00726878f2796d7 X 1c25bfc4b27b4c4ea6dd16df1d6146b8--87f4f42c481246e2a00726878f2796d7 87f4f42c481246e2a00726878f2796d7--3f50092da8544a9d95562505b27d27a5 3e1ab9773ddf4290bc50fed2f810a838 RX(theta₁₄) 87f4f42c481246e2a00726878f2796d7--3e1ab9773ddf4290bc50fed2f810a838 8cbcf0e0ba22447289df142726fef018 RY(theta₁₈) 3e1ab9773ddf4290bc50fed2f810a838--8cbcf0e0ba22447289df142726fef018 204838d99276461ba6816989cc1782dd RX(theta₂₂) 8cbcf0e0ba22447289df142726fef018--204838d99276461ba6816989cc1782dd 2e65187255c34a9892ef3b86994eca7b 204838d99276461ba6816989cc1782dd--2e65187255c34a9892ef3b86994eca7b 2d9d19c8365948c89e0ce15870eba5a2 X 2e65187255c34a9892ef3b86994eca7b--2d9d19c8365948c89e0ce15870eba5a2 2d9d19c8365948c89e0ce15870eba5a2--6d460aacb57e409bbb6141280b28a829 ae1bb22ff61c4227b2b5b4d994617cce RX(theta₂) 2d9d19c8365948c89e0ce15870eba5a2--ae1bb22ff61c4227b2b5b4d994617cce 86463c75c622457eb6e2043529530b7c RY(theta₆) ae1bb22ff61c4227b2b5b4d994617cce--86463c75c622457eb6e2043529530b7c 2e2d3a3e6aae40348553b9a9e9a93e45 RX(theta₁₀) 86463c75c622457eb6e2043529530b7c--2e2d3a3e6aae40348553b9a9e9a93e45 ce6e68b270094d9abded47b5dfbbd723 2e2d3a3e6aae40348553b9a9e9a93e45--ce6e68b270094d9abded47b5dfbbd723 b1e20e998c904d0893ad256291bc6ea0 X ce6e68b270094d9abded47b5dfbbd723--b1e20e998c904d0893ad256291bc6ea0 b1e20e998c904d0893ad256291bc6ea0--f6cdab083b2b4748b7311e7ab680789c 97859ecce0ab47caa9c3a34f19de3154 RX(theta₁₄) b1e20e998c904d0893ad256291bc6ea0--97859ecce0ab47caa9c3a34f19de3154 9651057832774f3f8f688fc099f63fde RY(theta₁₈) 97859ecce0ab47caa9c3a34f19de3154--9651057832774f3f8f688fc099f63fde 66ab41a69a294bf8b2b7a1959c0eecd5 RX(theta₂₂) 9651057832774f3f8f688fc099f63fde--66ab41a69a294bf8b2b7a1959c0eecd5 b5d47d1ebf124e6d805300d51f65199a 66ab41a69a294bf8b2b7a1959c0eecd5--b5d47d1ebf124e6d805300d51f65199a 0f537a0751bc4f14b58e0c383670ac49 X b5d47d1ebf124e6d805300d51f65199a--0f537a0751bc4f14b58e0c383670ac49 0f537a0751bc4f14b58e0c383670ac49--40311c199a0b4f1da834fe418759a589 0f537a0751bc4f14b58e0c383670ac49--9b31ed0d61f34b0e9b15f3aed3d4d085 1064786be802491891b68a851a14bd56 c9008882d717406a9b29e899ab621627 RX(theta₃) 8ed889e811094e59a2d06844c8337514--c9008882d717406a9b29e899ab621627 9ab2773eba2945488e6a35404bd692e0 RY(theta₇) c9008882d717406a9b29e899ab621627--9ab2773eba2945488e6a35404bd692e0 d1be630f37714eec8ed4db123ae1b862 RX(theta₁₁) 9ab2773eba2945488e6a35404bd692e0--d1be630f37714eec8ed4db123ae1b862 75f7857c9a054429b7595ea19869ad0f X d1be630f37714eec8ed4db123ae1b862--75f7857c9a054429b7595ea19869ad0f 75f7857c9a054429b7595ea19869ad0f--1c25bfc4b27b4c4ea6dd16df1d6146b8 6b6ec2a0ac6e4cf4a7765df2780853e7 75f7857c9a054429b7595ea19869ad0f--6b6ec2a0ac6e4cf4a7765df2780853e7 2e41d5ed20a24e95ae16c41dafc4f01c RX(theta₁₅) 6b6ec2a0ac6e4cf4a7765df2780853e7--2e41d5ed20a24e95ae16c41dafc4f01c 2e2d042ff9784ceba87766e25c298d31 RY(theta₁₉) 2e41d5ed20a24e95ae16c41dafc4f01c--2e2d042ff9784ceba87766e25c298d31 81f8f34353cc4428a419aed7a06f91ea RX(theta₂₃) 2e2d042ff9784ceba87766e25c298d31--81f8f34353cc4428a419aed7a06f91ea 57e9a0269acd4f3ca091a15a416eb769 X 81f8f34353cc4428a419aed7a06f91ea--57e9a0269acd4f3ca091a15a416eb769 57e9a0269acd4f3ca091a15a416eb769--2e65187255c34a9892ef3b86994eca7b 23465dc3c9af4a6bbafbcb0afcc8f8f4 57e9a0269acd4f3ca091a15a416eb769--23465dc3c9af4a6bbafbcb0afcc8f8f4 d65ac21e13b34506af791f17f103d58f RX(theta₃) 23465dc3c9af4a6bbafbcb0afcc8f8f4--d65ac21e13b34506af791f17f103d58f 7adf2a76f6ee49f89bfc38e04fc518f1 RY(theta₇) d65ac21e13b34506af791f17f103d58f--7adf2a76f6ee49f89bfc38e04fc518f1 264d1e7500914710ad959ba664f8f011 RX(theta₁₁) 7adf2a76f6ee49f89bfc38e04fc518f1--264d1e7500914710ad959ba664f8f011 e660de90f0334cfab8346d35e0913b31 X 264d1e7500914710ad959ba664f8f011--e660de90f0334cfab8346d35e0913b31 e660de90f0334cfab8346d35e0913b31--ce6e68b270094d9abded47b5dfbbd723 00eaa7b2d7da4129b10570cd5220dff9 e660de90f0334cfab8346d35e0913b31--00eaa7b2d7da4129b10570cd5220dff9 6910a0660dc846939d501a80347eb498 RX(theta₁₅) 00eaa7b2d7da4129b10570cd5220dff9--6910a0660dc846939d501a80347eb498 7f6a8f218750482195da8c3cbf7e5a4e RY(theta₁₉) 6910a0660dc846939d501a80347eb498--7f6a8f218750482195da8c3cbf7e5a4e 3a4676269b52459db0b64500e8e53442 RX(theta₂₃) 7f6a8f218750482195da8c3cbf7e5a4e--3a4676269b52459db0b64500e8e53442 db98c4087c4b465ba32c3f1228be35ea X 3a4676269b52459db0b64500e8e53442--db98c4087c4b465ba32c3f1228be35ea db98c4087c4b465ba32c3f1228be35ea--b5d47d1ebf124e6d805300d51f65199a dec0fd548840490e9d399f39f14f1495 db98c4087c4b465ba32c3f1228be35ea--dec0fd548840490e9d399f39f14f1495 dec0fd548840490e9d399f39f14f1495--1064786be802491891b68a851a14bd56

Avoid non-unique names by prefixing

A parameter prefix for each HEA can be passed as follows:

hea1 = hea(n_qubits=n_qubits, depth=depth, param_prefix="p1")
hea2 = hea(n_qubits=n_qubits, depth=depth, param_prefix="p2")

circuit = QuantumCircuit(n_qubits, hea1, hea2)
n_params_two_heas = circuit.num_unique_parameters
Unique parameters with two stacked HEAs: 48
cluster_b31f9a59ad434d55bac7dc5a968e1f50 HEA cluster_21f8553b18524861b83e7094526ff38e HEA 7432f23cc8b14b3d82e91ed1e100a584 0 aab85de29a6d4d80b1c32299d06366c6 RX(p1₀) 7432f23cc8b14b3d82e91ed1e100a584--aab85de29a6d4d80b1c32299d06366c6 ec21582d30484cd39cacd91af72b43fb 1 697a14e1c3854aaf9e62629d3b42d1b2 RY(p1₄) aab85de29a6d4d80b1c32299d06366c6--697a14e1c3854aaf9e62629d3b42d1b2 837c76e9c62e4ee7a8a36441d7b89f8d RX(p1₈) 697a14e1c3854aaf9e62629d3b42d1b2--837c76e9c62e4ee7a8a36441d7b89f8d f09aefc5452c4ec19eec503c58ba4aff 837c76e9c62e4ee7a8a36441d7b89f8d--f09aefc5452c4ec19eec503c58ba4aff 0b01f29aa5a2433c9ed8cebe6df6505d f09aefc5452c4ec19eec503c58ba4aff--0b01f29aa5a2433c9ed8cebe6df6505d d831465cbafa4eb0aca5093ab0ebff50 RX(p1₁₂) 0b01f29aa5a2433c9ed8cebe6df6505d--d831465cbafa4eb0aca5093ab0ebff50 b8d6bd9a25a0438986fdd3afb4d9de5d RY(p1₁₆) d831465cbafa4eb0aca5093ab0ebff50--b8d6bd9a25a0438986fdd3afb4d9de5d 0d1d81fe2486434ca97e633ae42962c0 RX(p1₂₀) b8d6bd9a25a0438986fdd3afb4d9de5d--0d1d81fe2486434ca97e633ae42962c0 97f76af6281244eabd618b39935c4d67 0d1d81fe2486434ca97e633ae42962c0--97f76af6281244eabd618b39935c4d67 03c078d6b07f4bff8670e8a797ecd981 97f76af6281244eabd618b39935c4d67--03c078d6b07f4bff8670e8a797ecd981 bcdc82b5393549c7bd0c1fd341976cf1 RX(p2₀) 03c078d6b07f4bff8670e8a797ecd981--bcdc82b5393549c7bd0c1fd341976cf1 1c229291387641c297ca883f4fe24086 RY(p2₄) bcdc82b5393549c7bd0c1fd341976cf1--1c229291387641c297ca883f4fe24086 e6775f59f8b44c87ad47bae43417563a RX(p2₈) 1c229291387641c297ca883f4fe24086--e6775f59f8b44c87ad47bae43417563a 9ce8cd3335c24b24a3cfe873ab195f8e e6775f59f8b44c87ad47bae43417563a--9ce8cd3335c24b24a3cfe873ab195f8e f62ea63a604e49fa8aba1f23266707ab 9ce8cd3335c24b24a3cfe873ab195f8e--f62ea63a604e49fa8aba1f23266707ab 9e7ae1fd64784590955e4e435e266fdc RX(p2₁₂) f62ea63a604e49fa8aba1f23266707ab--9e7ae1fd64784590955e4e435e266fdc 93c1d3461c2b4693aeaa85862fb29523 RY(p2₁₆) 9e7ae1fd64784590955e4e435e266fdc--93c1d3461c2b4693aeaa85862fb29523 87a6125ae692409084059025e82ee6f4 RX(p2₂₀) 93c1d3461c2b4693aeaa85862fb29523--87a6125ae692409084059025e82ee6f4 e35308919ce14ce6bdb6743e31915355 87a6125ae692409084059025e82ee6f4--e35308919ce14ce6bdb6743e31915355 d9640938ff9d4b8b825c5cc05fb4f920 e35308919ce14ce6bdb6743e31915355--d9640938ff9d4b8b825c5cc05fb4f920 3a193ccd047d49f6b68cc8e7e8d15e75 d9640938ff9d4b8b825c5cc05fb4f920--3a193ccd047d49f6b68cc8e7e8d15e75 925d551066304ca8be178268b1a20b1b b6c4a0336eac430ab6150d786ed22415 RX(p1₁) ec21582d30484cd39cacd91af72b43fb--b6c4a0336eac430ab6150d786ed22415 2b134d50948e49fa8e64cf077bec859a 2 5c8c42364a344ced879e588d3f677c26 RY(p1₅) b6c4a0336eac430ab6150d786ed22415--5c8c42364a344ced879e588d3f677c26 7942bf64725a46e09ef6bb2d4829114f RX(p1₉) 5c8c42364a344ced879e588d3f677c26--7942bf64725a46e09ef6bb2d4829114f 2c2863af1a7a416896e4a6ed47c79eb1 X 7942bf64725a46e09ef6bb2d4829114f--2c2863af1a7a416896e4a6ed47c79eb1 2c2863af1a7a416896e4a6ed47c79eb1--f09aefc5452c4ec19eec503c58ba4aff b8343ea6237e4f268f2eebb01af7dbe4 2c2863af1a7a416896e4a6ed47c79eb1--b8343ea6237e4f268f2eebb01af7dbe4 5bcaa0f604f845dda27d83a9f0a5198b RX(p1₁₃) b8343ea6237e4f268f2eebb01af7dbe4--5bcaa0f604f845dda27d83a9f0a5198b 980a68c7726b47958ff937e59269c5c1 RY(p1₁₇) 5bcaa0f604f845dda27d83a9f0a5198b--980a68c7726b47958ff937e59269c5c1 4ddde7fb11494023a56da6eedcb413e9 RX(p1₂₁) 980a68c7726b47958ff937e59269c5c1--4ddde7fb11494023a56da6eedcb413e9 72a585aeddb2471b80f01b11f44ab1d9 X 4ddde7fb11494023a56da6eedcb413e9--72a585aeddb2471b80f01b11f44ab1d9 72a585aeddb2471b80f01b11f44ab1d9--97f76af6281244eabd618b39935c4d67 57e446dcf3ac4b709f0fe72e699fe38b 72a585aeddb2471b80f01b11f44ab1d9--57e446dcf3ac4b709f0fe72e699fe38b 935d4a5e315643c386c3259e0a1e1eef RX(p2₁) 57e446dcf3ac4b709f0fe72e699fe38b--935d4a5e315643c386c3259e0a1e1eef b018a283964c40c2bc9e24f35740f79d RY(p2₅) 935d4a5e315643c386c3259e0a1e1eef--b018a283964c40c2bc9e24f35740f79d e36cd17f83c64a6a89589ba4aaf9eecc RX(p2₉) b018a283964c40c2bc9e24f35740f79d--e36cd17f83c64a6a89589ba4aaf9eecc bfbc2373801642adada240bc95f43c2e X e36cd17f83c64a6a89589ba4aaf9eecc--bfbc2373801642adada240bc95f43c2e bfbc2373801642adada240bc95f43c2e--9ce8cd3335c24b24a3cfe873ab195f8e 17bec047795b4cf2905f189718648992 bfbc2373801642adada240bc95f43c2e--17bec047795b4cf2905f189718648992 24cc5831405b47e190ed194eaf16537a RX(p2₁₃) 17bec047795b4cf2905f189718648992--24cc5831405b47e190ed194eaf16537a 031b0dba59184cf994751a4680655648 RY(p2₁₇) 24cc5831405b47e190ed194eaf16537a--031b0dba59184cf994751a4680655648 0918ab9e6fb84a50ba3ef7412384ed5b RX(p2₂₁) 031b0dba59184cf994751a4680655648--0918ab9e6fb84a50ba3ef7412384ed5b 61278b5f09564f86a28237eaa71ee335 X 0918ab9e6fb84a50ba3ef7412384ed5b--61278b5f09564f86a28237eaa71ee335 61278b5f09564f86a28237eaa71ee335--e35308919ce14ce6bdb6743e31915355 69aa1f0ac86d4710a2f91f661f01dd4d 61278b5f09564f86a28237eaa71ee335--69aa1f0ac86d4710a2f91f661f01dd4d 69aa1f0ac86d4710a2f91f661f01dd4d--925d551066304ca8be178268b1a20b1b 4f73e79e917c44cd8ff0150b63f2e2e9 7c5aaa214a7f4de198d00350501f01cb RX(p1₂) 2b134d50948e49fa8e64cf077bec859a--7c5aaa214a7f4de198d00350501f01cb e8aeb321f394414da1242e8d1b4c8da4 3 6c07a188eb704cc99f3dd85e6b479447 RY(p1₆) 7c5aaa214a7f4de198d00350501f01cb--6c07a188eb704cc99f3dd85e6b479447 27e98d9f9bed4a4ca5727d8e735ea34b RX(p1₁₀) 6c07a188eb704cc99f3dd85e6b479447--27e98d9f9bed4a4ca5727d8e735ea34b 608671f067004c2396efc6f86a045a9f 27e98d9f9bed4a4ca5727d8e735ea34b--608671f067004c2396efc6f86a045a9f 3b3a25cd6c9f4744b92d814213d5d5f8 X 608671f067004c2396efc6f86a045a9f--3b3a25cd6c9f4744b92d814213d5d5f8 3b3a25cd6c9f4744b92d814213d5d5f8--b8343ea6237e4f268f2eebb01af7dbe4 bd2a5cd54d5e48a1967d6094f5a30daa RX(p1₁₄) 3b3a25cd6c9f4744b92d814213d5d5f8--bd2a5cd54d5e48a1967d6094f5a30daa ec2e6cba937447c8a887f309e35ff4ab RY(p1₁₈) bd2a5cd54d5e48a1967d6094f5a30daa--ec2e6cba937447c8a887f309e35ff4ab 1139f72872814986ae0790355de9564c RX(p1₂₂) ec2e6cba937447c8a887f309e35ff4ab--1139f72872814986ae0790355de9564c e1f990a703884ddebf563b9e36bb2d5c 1139f72872814986ae0790355de9564c--e1f990a703884ddebf563b9e36bb2d5c 69a1725dbe054855a2a339fe74b27102 X e1f990a703884ddebf563b9e36bb2d5c--69a1725dbe054855a2a339fe74b27102 69a1725dbe054855a2a339fe74b27102--57e446dcf3ac4b709f0fe72e699fe38b 96ebe9a2a0554e339c76232d15b4af7e RX(p2₂) 69a1725dbe054855a2a339fe74b27102--96ebe9a2a0554e339c76232d15b4af7e 8cd96a4868954cd6b0de8e2b065ea651 RY(p2₆) 96ebe9a2a0554e339c76232d15b4af7e--8cd96a4868954cd6b0de8e2b065ea651 fa9484571c08472cb200cd4ec3103644 RX(p2₁₀) 8cd96a4868954cd6b0de8e2b065ea651--fa9484571c08472cb200cd4ec3103644 12f829010a9048dc839012f99a09e3af fa9484571c08472cb200cd4ec3103644--12f829010a9048dc839012f99a09e3af 1435cebe2c4c444cb20be840c33168ea X 12f829010a9048dc839012f99a09e3af--1435cebe2c4c444cb20be840c33168ea 1435cebe2c4c444cb20be840c33168ea--17bec047795b4cf2905f189718648992 33e390b0e49844a7808c4ddb9be377c5 RX(p2₁₄) 1435cebe2c4c444cb20be840c33168ea--33e390b0e49844a7808c4ddb9be377c5 44487d2bf3654470ae73113fae57e39b RY(p2₁₈) 33e390b0e49844a7808c4ddb9be377c5--44487d2bf3654470ae73113fae57e39b 2d96c3a8905340659c8d0b0160647264 RX(p2₂₂) 44487d2bf3654470ae73113fae57e39b--2d96c3a8905340659c8d0b0160647264 3fe56973a6cf41f1807595c9053184d9 2d96c3a8905340659c8d0b0160647264--3fe56973a6cf41f1807595c9053184d9 2345c2c1ae6d46c6ab5a5b05694b705b X 3fe56973a6cf41f1807595c9053184d9--2345c2c1ae6d46c6ab5a5b05694b705b 2345c2c1ae6d46c6ab5a5b05694b705b--69aa1f0ac86d4710a2f91f661f01dd4d 2345c2c1ae6d46c6ab5a5b05694b705b--4f73e79e917c44cd8ff0150b63f2e2e9 61e062c5cd5f4b18ae21566c021884f4 faf7bf392fe247048f38b750a0d8413d RX(p1₃) e8aeb321f394414da1242e8d1b4c8da4--faf7bf392fe247048f38b750a0d8413d a8fea432e6a84988a117de027d0a451a RY(p1₇) faf7bf392fe247048f38b750a0d8413d--a8fea432e6a84988a117de027d0a451a c75fbb7e58b64625aecb7d27ad6e04eb RX(p1₁₁) a8fea432e6a84988a117de027d0a451a--c75fbb7e58b64625aecb7d27ad6e04eb cf895d2008ff42dbb42fcda96fe7fc3c X c75fbb7e58b64625aecb7d27ad6e04eb--cf895d2008ff42dbb42fcda96fe7fc3c cf895d2008ff42dbb42fcda96fe7fc3c--608671f067004c2396efc6f86a045a9f fbff1b06974142b484457281a14b6b2a cf895d2008ff42dbb42fcda96fe7fc3c--fbff1b06974142b484457281a14b6b2a eb0493ffdaea46ae9712aa6f98b46ffb RX(p1₁₅) fbff1b06974142b484457281a14b6b2a--eb0493ffdaea46ae9712aa6f98b46ffb b93184331ebd42e6a6720df7e2d98595 RY(p1₁₉) eb0493ffdaea46ae9712aa6f98b46ffb--b93184331ebd42e6a6720df7e2d98595 5ecad5a2a80b49b5bd409ec5ae502d22 RX(p1₂₃) b93184331ebd42e6a6720df7e2d98595--5ecad5a2a80b49b5bd409ec5ae502d22 8672618615a749ebaa8961d7b16a06f5 X 5ecad5a2a80b49b5bd409ec5ae502d22--8672618615a749ebaa8961d7b16a06f5 8672618615a749ebaa8961d7b16a06f5--e1f990a703884ddebf563b9e36bb2d5c 69704e23e4a04fad96771b07c714ff03 8672618615a749ebaa8961d7b16a06f5--69704e23e4a04fad96771b07c714ff03 24a5aa4cc6ae4192b281ccf1e1e3a701 RX(p2₃) 69704e23e4a04fad96771b07c714ff03--24a5aa4cc6ae4192b281ccf1e1e3a701 9db7bcaa42ea48d29c70350ae8567806 RY(p2₇) 24a5aa4cc6ae4192b281ccf1e1e3a701--9db7bcaa42ea48d29c70350ae8567806 4ba2a781cf7749c3ae26626ba77bf313 RX(p2₁₁) 9db7bcaa42ea48d29c70350ae8567806--4ba2a781cf7749c3ae26626ba77bf313 51a402fada64427f8a66c7c31b7fa91a X 4ba2a781cf7749c3ae26626ba77bf313--51a402fada64427f8a66c7c31b7fa91a 51a402fada64427f8a66c7c31b7fa91a--12f829010a9048dc839012f99a09e3af 8a626c40021c4755997fcfc9716368b7 51a402fada64427f8a66c7c31b7fa91a--8a626c40021c4755997fcfc9716368b7 e6877d65efa145beb98166362f4b01c8 RX(p2₁₅) 8a626c40021c4755997fcfc9716368b7--e6877d65efa145beb98166362f4b01c8 f30ee2f0fea44227a5326855127818df RY(p2₁₉) e6877d65efa145beb98166362f4b01c8--f30ee2f0fea44227a5326855127818df d15a4f393f8f4c28b49951eaf789a0d1 RX(p2₂₃) f30ee2f0fea44227a5326855127818df--d15a4f393f8f4c28b49951eaf789a0d1 fec250c2575147d3aa53b2d852dee462 X d15a4f393f8f4c28b49951eaf789a0d1--fec250c2575147d3aa53b2d852dee462 fec250c2575147d3aa53b2d852dee462--3fe56973a6cf41f1807595c9053184d9 868eeb59133d4cfca0e7389049fbf1e8 fec250c2575147d3aa53b2d852dee462--868eeb59133d4cfca0e7389049fbf1e8 868eeb59133d4cfca0e7389049fbf1e8--61e062c5cd5f4b18ae21566c021884f4

The hea function will be further explored in the QML Constructors tutorial.

Parametric observables

In Qadence, one can define quantum observables with classical optimizable parameters to improve the convergence of QML calculations. This is particularly useful for differentiable quantum circuits.

from qadence import VariationalParameter, Z, add, tag

s = VariationalParameter("s")
observable = add(s * Z(i) for i in range(n_qubits))

Now, a quantum model can be created with the parametric observable. The observable variational parameters are included among the model ones.

from qadence import QuantumModel, QuantumCircuit

circuit = QuantumCircuit(n_qubits, hea(n_qubits, depth))
model = QuantumModel(circuit, observable=observable)
Variational parameters = OrderedDict([('s', tensor([0.9406])), ('theta_0', tensor([0.7951])), ('theta_1', tensor([0.3345])), ('theta_10', tensor([0.8927])), ('theta_11', tensor([0.3210])), ('theta_12', tensor([0.3358])), ('theta_13', tensor([0.6445])), ('theta_14', tensor([0.1183])), ('theta_15', tensor([0.8274])), ('theta_16', tensor([0.6881])), ('theta_17', tensor([0.5928])), ('theta_18', tensor([0.2551])), ('theta_19', tensor([0.3500])), ('theta_2', tensor([0.3125])), ('theta_20', tensor([0.5327])), ('theta_21', tensor([0.0981])), ('theta_22', tensor([0.1385])), ('theta_23', tensor([0.6408])), ('theta_3', tensor([0.4979])), ('theta_4', tensor([0.4264])), ('theta_5', tensor([0.5154])), ('theta_6', tensor([0.6589])), ('theta_7', tensor([0.1994])), ('theta_8', tensor([0.9758])), ('theta_9', tensor([0.9689]))])

One optimization step (forward and backward pass) can be performed using built-in torch functionalities. Variational parameters can be checked to have been updated accordingly:

import torch

mse_loss = torch.nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters())

# Compute forward & backward pass
optimizer.zero_grad()
loss = mse_loss(model.expectation({}), torch.zeros(1))
loss.backward()

# Update the parameters and check the parameters.
optimizer.step()
Variational parameters = OrderedDict([('s', tensor([0.9396])), ('theta_0', tensor([0.7941])), ('theta_1', tensor([0.3335])), ('theta_10', tensor([0.8937])), ('theta_11', tensor([0.3200])), ('theta_12', tensor([0.3348])), ('theta_13', tensor([0.6435])), ('theta_14', tensor([0.1193])), ('theta_15', tensor([0.8264])), ('theta_16', tensor([0.6891])), ('theta_17', tensor([0.5918])), ('theta_18', tensor([0.2561])), ('theta_19', tensor([0.3510])), ('theta_2', tensor([0.3135])), ('theta_20', tensor([0.5317])), ('theta_21', tensor([0.0971])), ('theta_22', tensor([0.1395])), ('theta_23', tensor([0.6398])), ('theta_3', tensor([0.4969])), ('theta_4', tensor([0.4254])), ('theta_5', tensor([0.5144])), ('theta_6', tensor([0.6579])), ('theta_7', tensor([0.2004])), ('theta_8', tensor([0.9748])), ('theta_9', tensor([0.9679]))])

Non-unitary circuits

Qadence allows to compose with non-unitary blocks. Here is an example of a non-unitary block as a sum of Pauli operators with complex coefficients.

Currently, only the PyQTorch backend fully supports execution with non-unitary circuits.

from qadence import QuantumModel, QuantumCircuit, Z, X
c1 = 2.0
c2 = 2.0 + 2.0j

block = c1 * Z(0) + c2 * X(1) + c1 * c2 * (Z(2) + X(3))
circuit = QuantumCircuit(4, block)

model = QuantumModel(circuit)  # BackendName.PYQTORCH and DiffMode.AD by default.
wf = tensor([[6.+4.j, 4.+4.j, 0.+0.j, 0.+0.j, 2.+2.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,
         0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j]])