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 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 qadence import RX, run, PI

# 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.9882+0.0000j, 0.0000-0.1531j]])

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.8785+0.0000j, 0.0000-0.4778j],
        [0.9538+0.0000j, 0.0000-0.3006j]])

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.5500+0.0000j, 0.5257+0.0000j, 0.0000-0.4691j, 0.0000-0.4484j]])

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)
%3 cluster_559ec1fee5d0486aa382468362721754 [* 2] cluster_5d0a07efb16e44ddb57d428d3d16f84d Rotations c30b5c6539af40479cf8773fe319cc2c 0 903a942877bf483b94668b55a2a210ec RX(phi/theta) c30b5c6539af40479cf8773fe319cc2c--903a942877bf483b94668b55a2a210ec 80989f5ba95d4bf0a1e3b6d8528e5802 1 2886e0c972ee48c0a29cb59219989c6e RX(phi) 903a942877bf483b94668b55a2a210ec--2886e0c972ee48c0a29cb59219989c6e 70aa189dadd648b7922721d8c17426b1 RX(phi) 2886e0c972ee48c0a29cb59219989c6e--70aa189dadd648b7922721d8c17426b1 9477c394b8734315a7136730e7c7853b RX(phi + theta) 70aa189dadd648b7922721d8c17426b1--9477c394b8734315a7136730e7c7853b 3bfa28ca8652486bb402c9d425cf55d5 9477c394b8734315a7136730e7c7853b--3bfa28ca8652486bb402c9d425cf55d5 db77057bd4424a0d9867959168183600 3bfa28ca8652486bb402c9d425cf55d5--db77057bd4424a0d9867959168183600 39a5507ee16b4292b4731ae3cb07903f Z db77057bd4424a0d9867959168183600--39a5507ee16b4292b4731ae3cb07903f b6689e875a6e44d391e2fedd4370e10c 39a5507ee16b4292b4731ae3cb07903f--b6689e875a6e44d391e2fedd4370e10c a3da77012249468aa2f58e3feb21bc4c ae3f693ea7e24281951cd8c671605caf RY(2*theta) 80989f5ba95d4bf0a1e3b6d8528e5802--ae3f693ea7e24281951cd8c671605caf 488417e627e04fd8a8e88905947f6002 2 a0b7ced4105046368508ef9a6a27b4af RY(theta) ae3f693ea7e24281951cd8c671605caf--a0b7ced4105046368508ef9a6a27b4af 58007a42bb8644a7ac756c1781839d3b RY(theta) a0b7ced4105046368508ef9a6a27b4af--58007a42bb8644a7ac756c1781839d3b e5fe89a84e4940a9ac4a75bcb437d203 RY(theta**2) 58007a42bb8644a7ac756c1781839d3b--e5fe89a84e4940a9ac4a75bcb437d203 cdcf462c27b64d74be0cd12e676e03d6 X e5fe89a84e4940a9ac4a75bcb437d203--cdcf462c27b64d74be0cd12e676e03d6 cdcf462c27b64d74be0cd12e676e03d6--3bfa28ca8652486bb402c9d425cf55d5 b254f68dc8e84199ae94e040c29680be cdcf462c27b64d74be0cd12e676e03d6--b254f68dc8e84199ae94e040c29680be 074c27171fe14297960c6dd9c69c9caa Z b254f68dc8e84199ae94e040c29680be--074c27171fe14297960c6dd9c69c9caa 074c27171fe14297960c6dd9c69c9caa--a3da77012249468aa2f58e3feb21bc4c 9808a70884684e5b9ed5f8e24cf0c572 a07d04b8617a4b90aff20517d349eecb RZ(cos(phi)) 488417e627e04fd8a8e88905947f6002--a07d04b8617a4b90aff20517d349eecb 4a97454e94244756bd8487395f3b9dee RZ(phi) a07d04b8617a4b90aff20517d349eecb--4a97454e94244756bd8487395f3b9dee e0f361a72d3349f188bff699d61bf5d8 RZ(phi) 4a97454e94244756bd8487395f3b9dee--e0f361a72d3349f188bff699d61bf5d8 92bf9ec7494d430fbffd442c31ccb727 RZ(cos(phi)) e0f361a72d3349f188bff699d61bf5d8--92bf9ec7494d430fbffd442c31ccb727 552801dd6bcf4679a31bce0cc99e9868 92bf9ec7494d430fbffd442c31ccb727--552801dd6bcf4679a31bce0cc99e9868 cebcce79dce84d55bb0c8f761facaac1 X 552801dd6bcf4679a31bce0cc99e9868--cebcce79dce84d55bb0c8f761facaac1 cebcce79dce84d55bb0c8f761facaac1--b254f68dc8e84199ae94e040c29680be 8198f56e6200414eb15e22c3c4e44d46 Z cebcce79dce84d55bb0c8f761facaac1--8198f56e6200414eb15e22c3c4e44d46 8198f56e6200414eb15e22c3c4e44d46--9808a70884684e5b9ed5f8e24cf0c572

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 # get the number of variational parameters
vparams_values = model.vparams
num_vparams = 1
vparams_values = OrderedDict([('theta', tensor([0.2054]))])

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.9677+0.0000j, 0.1768+0.0000j, 0.0000-0.1768j, 0.0000-0.0323j],
        [0.9856+0.0000j, 0.1193+0.0000j, 0.0000-0.1193j, 0.0000-0.0144j],
        [0.8356+0.0000j, 0.3706+0.0000j, 0.0000-0.3706j, 0.0000-0.1644j]],
       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
%3 6e7f701245604659920199544c8d0e4f 0 ef2bb48c6d074f8fa2672469f497fc05 RX(theta₀) 6e7f701245604659920199544c8d0e4f--ef2bb48c6d074f8fa2672469f497fc05 96b8ef4546f94302973275d3a9be5d3c 1 413efb5d8f904b319178cd5b4153f30f RY(theta₄) ef2bb48c6d074f8fa2672469f497fc05--413efb5d8f904b319178cd5b4153f30f 41d9ded83fd348809c72f29f236099f8 RX(theta₈) 413efb5d8f904b319178cd5b4153f30f--41d9ded83fd348809c72f29f236099f8 a7cddb091ac54311bf34f3fa2e449a47 41d9ded83fd348809c72f29f236099f8--a7cddb091ac54311bf34f3fa2e449a47 e21a56260b1f433ba929fe15d9ebeb5a a7cddb091ac54311bf34f3fa2e449a47--e21a56260b1f433ba929fe15d9ebeb5a 9c8caa7b27bd43dcb1470fdac9bb836a RX(theta₁₂) e21a56260b1f433ba929fe15d9ebeb5a--9c8caa7b27bd43dcb1470fdac9bb836a fcf92eea8cae4a2e9fcb555252036669 RY(theta₁₆) 9c8caa7b27bd43dcb1470fdac9bb836a--fcf92eea8cae4a2e9fcb555252036669 c37677c8cca24723aafa852b79d2b775 RX(theta₂₀) fcf92eea8cae4a2e9fcb555252036669--c37677c8cca24723aafa852b79d2b775 0df632881f9b46028f09037d9d93be8c c37677c8cca24723aafa852b79d2b775--0df632881f9b46028f09037d9d93be8c e9ab2de8bb6f488c8ccaf7949c93aa7b 0df632881f9b46028f09037d9d93be8c--e9ab2de8bb6f488c8ccaf7949c93aa7b 200cb08649204cd6a5f746596cf0c623 e9ab2de8bb6f488c8ccaf7949c93aa7b--200cb08649204cd6a5f746596cf0c623 1402c4f452904c24b7c3cecff947fe35 9c07f4e278ad44bdb1efba5fe94dea36 RX(theta₁) 96b8ef4546f94302973275d3a9be5d3c--9c07f4e278ad44bdb1efba5fe94dea36 3e326ac7b70b47a6a82195b6c2b56cd9 2 5de92e93a57b481ebde0ca97882a4f4e RY(theta₅) 9c07f4e278ad44bdb1efba5fe94dea36--5de92e93a57b481ebde0ca97882a4f4e 3eed2287badd4e4ebd050a44fc4511a4 RX(theta₉) 5de92e93a57b481ebde0ca97882a4f4e--3eed2287badd4e4ebd050a44fc4511a4 8e109500b65c48eab3b7d94f95687327 X 3eed2287badd4e4ebd050a44fc4511a4--8e109500b65c48eab3b7d94f95687327 8e109500b65c48eab3b7d94f95687327--a7cddb091ac54311bf34f3fa2e449a47 5be5165f2ac0489daeea8fee029d9fc5 8e109500b65c48eab3b7d94f95687327--5be5165f2ac0489daeea8fee029d9fc5 3b52a88ee9f24933a9401294772d4060 RX(theta₁₃) 5be5165f2ac0489daeea8fee029d9fc5--3b52a88ee9f24933a9401294772d4060 99fea065c9d14e3891915071c8cc5320 RY(theta₁₇) 3b52a88ee9f24933a9401294772d4060--99fea065c9d14e3891915071c8cc5320 b00a85210101456b86db45dffd545a9d RX(theta₂₁) 99fea065c9d14e3891915071c8cc5320--b00a85210101456b86db45dffd545a9d 635863a0c70147bda7915d5f9a5b44d5 X b00a85210101456b86db45dffd545a9d--635863a0c70147bda7915d5f9a5b44d5 635863a0c70147bda7915d5f9a5b44d5--0df632881f9b46028f09037d9d93be8c 3f06cd5adeb44bb4bc41f8fb7d2bf897 635863a0c70147bda7915d5f9a5b44d5--3f06cd5adeb44bb4bc41f8fb7d2bf897 3f06cd5adeb44bb4bc41f8fb7d2bf897--1402c4f452904c24b7c3cecff947fe35 2b1340933301473fb4cdb551f85e152b 2b7ccfbf23e14f5e8e7735808ceaea8b RX(theta₂) 3e326ac7b70b47a6a82195b6c2b56cd9--2b7ccfbf23e14f5e8e7735808ceaea8b db55188a0e48450894dbf4cf0ae5e88b 3 b729a67733164a89b4fe4045d01ef3a2 RY(theta₆) 2b7ccfbf23e14f5e8e7735808ceaea8b--b729a67733164a89b4fe4045d01ef3a2 4165d159bf5c47cf906a09cda53f274c RX(theta₁₀) b729a67733164a89b4fe4045d01ef3a2--4165d159bf5c47cf906a09cda53f274c 0977bb1f46ee41639fcaa14f83cc7b5e 4165d159bf5c47cf906a09cda53f274c--0977bb1f46ee41639fcaa14f83cc7b5e 567f0ec561a64c7a933dc5da501ccc80 X 0977bb1f46ee41639fcaa14f83cc7b5e--567f0ec561a64c7a933dc5da501ccc80 567f0ec561a64c7a933dc5da501ccc80--5be5165f2ac0489daeea8fee029d9fc5 4676c4529e7d466ebc97a2e81b0ff49b RX(theta₁₄) 567f0ec561a64c7a933dc5da501ccc80--4676c4529e7d466ebc97a2e81b0ff49b a2f584e10b714c48a42ad153db0fa4ec RY(theta₁₈) 4676c4529e7d466ebc97a2e81b0ff49b--a2f584e10b714c48a42ad153db0fa4ec 83997d6590a0428497ed88c05936f8d5 RX(theta₂₂) a2f584e10b714c48a42ad153db0fa4ec--83997d6590a0428497ed88c05936f8d5 5d12576d8f904bad9c8f44d487cd76cd 83997d6590a0428497ed88c05936f8d5--5d12576d8f904bad9c8f44d487cd76cd dcce7e69eca34140b0a1179cb446e750 X 5d12576d8f904bad9c8f44d487cd76cd--dcce7e69eca34140b0a1179cb446e750 dcce7e69eca34140b0a1179cb446e750--3f06cd5adeb44bb4bc41f8fb7d2bf897 dcce7e69eca34140b0a1179cb446e750--2b1340933301473fb4cdb551f85e152b bc506d9e86cd4a1699c5aba3d2f938f8 ef119d0cd865458ba81ee2e3c6ec6c0c RX(theta₃) db55188a0e48450894dbf4cf0ae5e88b--ef119d0cd865458ba81ee2e3c6ec6c0c ddb0d6c9a5044fd38c7230379c16b0a0 RY(theta₇) ef119d0cd865458ba81ee2e3c6ec6c0c--ddb0d6c9a5044fd38c7230379c16b0a0 d156f7f228624e7c909776b036204f1e RX(theta₁₁) ddb0d6c9a5044fd38c7230379c16b0a0--d156f7f228624e7c909776b036204f1e 559cff64e5b441079067ca6d93c934e2 X d156f7f228624e7c909776b036204f1e--559cff64e5b441079067ca6d93c934e2 559cff64e5b441079067ca6d93c934e2--0977bb1f46ee41639fcaa14f83cc7b5e 55d7da69818d480e86cfd169f653a9f3 559cff64e5b441079067ca6d93c934e2--55d7da69818d480e86cfd169f653a9f3 e83d34ea2fdb4bcda4b87fb2053fbbae RX(theta₁₅) 55d7da69818d480e86cfd169f653a9f3--e83d34ea2fdb4bcda4b87fb2053fbbae 0e707a2c9d004f27baf6dfc17da6b3e3 RY(theta₁₉) e83d34ea2fdb4bcda4b87fb2053fbbae--0e707a2c9d004f27baf6dfc17da6b3e3 ef6d50f4be6a402a83c04753c3af7bd6 RX(theta₂₃) 0e707a2c9d004f27baf6dfc17da6b3e3--ef6d50f4be6a402a83c04753c3af7bd6 25beecc1e74c4470ba84173607010cb1 X ef6d50f4be6a402a83c04753c3af7bd6--25beecc1e74c4470ba84173607010cb1 25beecc1e74c4470ba84173607010cb1--5d12576d8f904bad9c8f44d487cd76cd be85450b17e7476caa4fa3d683bcc275 25beecc1e74c4470ba84173607010cb1--be85450b17e7476caa4fa3d683bcc275 be85450b17e7476caa4fa3d683bcc275--bc506d9e86cd4a1699c5aba3d2f938f8

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
%3 cluster_c8139b7ebe1845fbb7186c3e58aebd5e HEA cluster_db294071b9754bfcbeb5943448badd0b HEA 7ce7b5e5f38848d687836dfcded9963d 0 a0222b86fd804907b2a427e0735293b7 RX(theta₀) 7ce7b5e5f38848d687836dfcded9963d--a0222b86fd804907b2a427e0735293b7 1bfcfaa0f22b498d9c280fa694999741 1 b727667de13648829d3c47921dae7683 RY(theta₄) a0222b86fd804907b2a427e0735293b7--b727667de13648829d3c47921dae7683 0098ccfbede64771b31e6a7736f797e3 RX(theta₈) b727667de13648829d3c47921dae7683--0098ccfbede64771b31e6a7736f797e3 ed9069e72edc412fb6744e22b8dc1488 0098ccfbede64771b31e6a7736f797e3--ed9069e72edc412fb6744e22b8dc1488 10fc3e41c51148bbbeb7127164453e11 ed9069e72edc412fb6744e22b8dc1488--10fc3e41c51148bbbeb7127164453e11 03b2f6b7ce6f4e178cfbcefe703c8f8f RX(theta₁₂) 10fc3e41c51148bbbeb7127164453e11--03b2f6b7ce6f4e178cfbcefe703c8f8f fde9627d9b634481ac97c626b0676b68 RY(theta₁₆) 03b2f6b7ce6f4e178cfbcefe703c8f8f--fde9627d9b634481ac97c626b0676b68 ac1223b0283d46789337b809508c52dd RX(theta₂₀) fde9627d9b634481ac97c626b0676b68--ac1223b0283d46789337b809508c52dd f0f996326eab4347aaf29d24e4e3a5a2 ac1223b0283d46789337b809508c52dd--f0f996326eab4347aaf29d24e4e3a5a2 f523257a95654228907eb9f2b8ec9159 f0f996326eab4347aaf29d24e4e3a5a2--f523257a95654228907eb9f2b8ec9159 7921c6d6e7d14610b379cdbc25e1353f RX(theta₀) f523257a95654228907eb9f2b8ec9159--7921c6d6e7d14610b379cdbc25e1353f 4fb15f384abc4901940666e7364cd738 RY(theta₄) 7921c6d6e7d14610b379cdbc25e1353f--4fb15f384abc4901940666e7364cd738 7a1b5786f8444e718620b62099b19630 RX(theta₈) 4fb15f384abc4901940666e7364cd738--7a1b5786f8444e718620b62099b19630 caedea7311c04124a28e68b4c884c3c3 7a1b5786f8444e718620b62099b19630--caedea7311c04124a28e68b4c884c3c3 3d8d01097fda48608947c6b71294e26b caedea7311c04124a28e68b4c884c3c3--3d8d01097fda48608947c6b71294e26b 9ff1a04f2afb4454b43e02eefdd578f7 RX(theta₁₂) 3d8d01097fda48608947c6b71294e26b--9ff1a04f2afb4454b43e02eefdd578f7 56b7803b3e194cef98e36b956ba011bd RY(theta₁₆) 9ff1a04f2afb4454b43e02eefdd578f7--56b7803b3e194cef98e36b956ba011bd 50717fa6cdc44a098269223f87b1b2a7 RX(theta₂₀) 56b7803b3e194cef98e36b956ba011bd--50717fa6cdc44a098269223f87b1b2a7 ea124af3bced462fa5f7c818f4d16ad7 50717fa6cdc44a098269223f87b1b2a7--ea124af3bced462fa5f7c818f4d16ad7 f1d73603239f447289c5d080c94f274a ea124af3bced462fa5f7c818f4d16ad7--f1d73603239f447289c5d080c94f274a 8651e85591014b0380f632583f04e4d6 f1d73603239f447289c5d080c94f274a--8651e85591014b0380f632583f04e4d6 2f59d1ff5a1845308310cffd03e2049c 0c70f0791c8d483080064b4c91c6a30b RX(theta₁) 1bfcfaa0f22b498d9c280fa694999741--0c70f0791c8d483080064b4c91c6a30b 5e8b265a4135447792e1d9774f7e61b7 2 9647be543b17432f9cd4377bf1faf62a RY(theta₅) 0c70f0791c8d483080064b4c91c6a30b--9647be543b17432f9cd4377bf1faf62a 2bca0506fd6247328d4121339a9baea4 RX(theta₉) 9647be543b17432f9cd4377bf1faf62a--2bca0506fd6247328d4121339a9baea4 9d3d34670c3e478bb3037266ec836f9b X 2bca0506fd6247328d4121339a9baea4--9d3d34670c3e478bb3037266ec836f9b 9d3d34670c3e478bb3037266ec836f9b--ed9069e72edc412fb6744e22b8dc1488 e5cfff0b511644afb5fadbbc8d6d1114 9d3d34670c3e478bb3037266ec836f9b--e5cfff0b511644afb5fadbbc8d6d1114 ee932b54c83b41c8bb3831cda374748a RX(theta₁₃) e5cfff0b511644afb5fadbbc8d6d1114--ee932b54c83b41c8bb3831cda374748a 0946363fd4aa42a7843eb9740eebc7f2 RY(theta₁₇) ee932b54c83b41c8bb3831cda374748a--0946363fd4aa42a7843eb9740eebc7f2 d60fcbaa2e064580863e9ad8e90286c3 RX(theta₂₁) 0946363fd4aa42a7843eb9740eebc7f2--d60fcbaa2e064580863e9ad8e90286c3 0843a93210914ef0b6480a6912d1b9ce X d60fcbaa2e064580863e9ad8e90286c3--0843a93210914ef0b6480a6912d1b9ce 0843a93210914ef0b6480a6912d1b9ce--f0f996326eab4347aaf29d24e4e3a5a2 bbce6c11d0a943bb82433e3f3751d212 0843a93210914ef0b6480a6912d1b9ce--bbce6c11d0a943bb82433e3f3751d212 815774493b3b457ba25bd92a14fc982c RX(theta₁) bbce6c11d0a943bb82433e3f3751d212--815774493b3b457ba25bd92a14fc982c 0a713a3da454449d9b5716142c923bf0 RY(theta₅) 815774493b3b457ba25bd92a14fc982c--0a713a3da454449d9b5716142c923bf0 0f70135ae10642f3a29814d738d303df RX(theta₉) 0a713a3da454449d9b5716142c923bf0--0f70135ae10642f3a29814d738d303df 35267998bbcb4ea39ba844d00b028ea0 X 0f70135ae10642f3a29814d738d303df--35267998bbcb4ea39ba844d00b028ea0 35267998bbcb4ea39ba844d00b028ea0--caedea7311c04124a28e68b4c884c3c3 8a284660216a423b836038d65ae4abe2 35267998bbcb4ea39ba844d00b028ea0--8a284660216a423b836038d65ae4abe2 c0755abbe14649f2b0694a02cb90d82a RX(theta₁₃) 8a284660216a423b836038d65ae4abe2--c0755abbe14649f2b0694a02cb90d82a d3dedbbef0924043a7381a1fdb6077c4 RY(theta₁₇) c0755abbe14649f2b0694a02cb90d82a--d3dedbbef0924043a7381a1fdb6077c4 745f510f03c84bae974d34aafad62846 RX(theta₂₁) d3dedbbef0924043a7381a1fdb6077c4--745f510f03c84bae974d34aafad62846 63ed5c075c23489aa339ab023276f73e X 745f510f03c84bae974d34aafad62846--63ed5c075c23489aa339ab023276f73e 63ed5c075c23489aa339ab023276f73e--ea124af3bced462fa5f7c818f4d16ad7 562e430ba5d648ddad29caa0d846d41a 63ed5c075c23489aa339ab023276f73e--562e430ba5d648ddad29caa0d846d41a 562e430ba5d648ddad29caa0d846d41a--2f59d1ff5a1845308310cffd03e2049c aef02ad274ad48f9b4825b836fb0c0f5 55366394078e439e8be3ef580a5ba804 RX(theta₂) 5e8b265a4135447792e1d9774f7e61b7--55366394078e439e8be3ef580a5ba804 1962874f50914503803c8c9a25aa90c1 3 7c6fb63b13e84247a49431f6eb4f1fa4 RY(theta₆) 55366394078e439e8be3ef580a5ba804--7c6fb63b13e84247a49431f6eb4f1fa4 79953dc182a241ccafbd0029a6f55560 RX(theta₁₀) 7c6fb63b13e84247a49431f6eb4f1fa4--79953dc182a241ccafbd0029a6f55560 3576bcb553704016a0c7ad5a208b2992 79953dc182a241ccafbd0029a6f55560--3576bcb553704016a0c7ad5a208b2992 b9d36adfc1934d86a593db68167f1686 X 3576bcb553704016a0c7ad5a208b2992--b9d36adfc1934d86a593db68167f1686 b9d36adfc1934d86a593db68167f1686--e5cfff0b511644afb5fadbbc8d6d1114 48aba6745e5d47e285582d3f710d0a66 RX(theta₁₄) b9d36adfc1934d86a593db68167f1686--48aba6745e5d47e285582d3f710d0a66 c05d4d09b6b74d53a8b7d2b92f2522c8 RY(theta₁₈) 48aba6745e5d47e285582d3f710d0a66--c05d4d09b6b74d53a8b7d2b92f2522c8 cabea945f1354893ad8fa4c0ee1ac10c RX(theta₂₂) c05d4d09b6b74d53a8b7d2b92f2522c8--cabea945f1354893ad8fa4c0ee1ac10c afe51805afbe4f99a254b5f008feafa6 cabea945f1354893ad8fa4c0ee1ac10c--afe51805afbe4f99a254b5f008feafa6 96facf7f20c64949bf6ea6faebee2ef5 X afe51805afbe4f99a254b5f008feafa6--96facf7f20c64949bf6ea6faebee2ef5 96facf7f20c64949bf6ea6faebee2ef5--bbce6c11d0a943bb82433e3f3751d212 8a9c10662d8c4e4c9f5d017e91f9b906 RX(theta₂) 96facf7f20c64949bf6ea6faebee2ef5--8a9c10662d8c4e4c9f5d017e91f9b906 6bf28e9fd77140dcb6f17641199f81c1 RY(theta₆) 8a9c10662d8c4e4c9f5d017e91f9b906--6bf28e9fd77140dcb6f17641199f81c1 12a65145ab9449e497d24b96a670995d RX(theta₁₀) 6bf28e9fd77140dcb6f17641199f81c1--12a65145ab9449e497d24b96a670995d f8aaa182fede4612bbe3105142b7a53e 12a65145ab9449e497d24b96a670995d--f8aaa182fede4612bbe3105142b7a53e 478e27a778c6435cae6c5c1be0c20ef0 X f8aaa182fede4612bbe3105142b7a53e--478e27a778c6435cae6c5c1be0c20ef0 478e27a778c6435cae6c5c1be0c20ef0--8a284660216a423b836038d65ae4abe2 3e17e54e7e9e4d118390b3972f02325b RX(theta₁₄) 478e27a778c6435cae6c5c1be0c20ef0--3e17e54e7e9e4d118390b3972f02325b 21d1627964f7407bb5f0bbb82bf42310 RY(theta₁₈) 3e17e54e7e9e4d118390b3972f02325b--21d1627964f7407bb5f0bbb82bf42310 d61b371cfa2142dbb123c29100cf26ab RX(theta₂₂) 21d1627964f7407bb5f0bbb82bf42310--d61b371cfa2142dbb123c29100cf26ab a6fd281cb00f4298b4a25def1cbe5dbd d61b371cfa2142dbb123c29100cf26ab--a6fd281cb00f4298b4a25def1cbe5dbd 313e27a3ddf442aa80d7d516e436a098 X a6fd281cb00f4298b4a25def1cbe5dbd--313e27a3ddf442aa80d7d516e436a098 313e27a3ddf442aa80d7d516e436a098--562e430ba5d648ddad29caa0d846d41a 313e27a3ddf442aa80d7d516e436a098--aef02ad274ad48f9b4825b836fb0c0f5 f57a8989b17749418cd17c242bb69915 847ea011d24c441c8dc4b9adb5eb75df RX(theta₃) 1962874f50914503803c8c9a25aa90c1--847ea011d24c441c8dc4b9adb5eb75df 5d06374e6d5345dc9800924cd480a138 RY(theta₇) 847ea011d24c441c8dc4b9adb5eb75df--5d06374e6d5345dc9800924cd480a138 2c178661913a40cbb55a8d46538f0982 RX(theta₁₁) 5d06374e6d5345dc9800924cd480a138--2c178661913a40cbb55a8d46538f0982 9c7ede1c1ae94cfebaf49d983da720c8 X 2c178661913a40cbb55a8d46538f0982--9c7ede1c1ae94cfebaf49d983da720c8 9c7ede1c1ae94cfebaf49d983da720c8--3576bcb553704016a0c7ad5a208b2992 f786cbb658624b288c674e05ccd8bf90 9c7ede1c1ae94cfebaf49d983da720c8--f786cbb658624b288c674e05ccd8bf90 9429a381f7384c3f9a5a7d91e898c797 RX(theta₁₅) f786cbb658624b288c674e05ccd8bf90--9429a381f7384c3f9a5a7d91e898c797 e3f440e81064469dba9d0d481b8fafe1 RY(theta₁₉) 9429a381f7384c3f9a5a7d91e898c797--e3f440e81064469dba9d0d481b8fafe1 62703112c20a4b44bde6052946c4696a RX(theta₂₃) e3f440e81064469dba9d0d481b8fafe1--62703112c20a4b44bde6052946c4696a a6cc02ac1c064eee95f1363572202e63 X 62703112c20a4b44bde6052946c4696a--a6cc02ac1c064eee95f1363572202e63 a6cc02ac1c064eee95f1363572202e63--afe51805afbe4f99a254b5f008feafa6 7264aed1ce874d57ad4dea2c13a871fe a6cc02ac1c064eee95f1363572202e63--7264aed1ce874d57ad4dea2c13a871fe 2423361eb25c455aa5a1b445d327ea52 RX(theta₃) 7264aed1ce874d57ad4dea2c13a871fe--2423361eb25c455aa5a1b445d327ea52 4f4e93649035461da1765314b9d1c939 RY(theta₇) 2423361eb25c455aa5a1b445d327ea52--4f4e93649035461da1765314b9d1c939 0757dd11df8a483b821cf73c5b2f8c75 RX(theta₁₁) 4f4e93649035461da1765314b9d1c939--0757dd11df8a483b821cf73c5b2f8c75 ff73a9a7734d4d2487cdbd04d3842b80 X 0757dd11df8a483b821cf73c5b2f8c75--ff73a9a7734d4d2487cdbd04d3842b80 ff73a9a7734d4d2487cdbd04d3842b80--f8aaa182fede4612bbe3105142b7a53e 5983a074acd6483eaa92b4f3ba6a27ca ff73a9a7734d4d2487cdbd04d3842b80--5983a074acd6483eaa92b4f3ba6a27ca 590166f457e64da4b9ecfe68b1a2169e RX(theta₁₅) 5983a074acd6483eaa92b4f3ba6a27ca--590166f457e64da4b9ecfe68b1a2169e 4bc7bf3fff764b44ab84110673fed300 RY(theta₁₉) 590166f457e64da4b9ecfe68b1a2169e--4bc7bf3fff764b44ab84110673fed300 3e8ede703fcd4d259ad16c286302a465 RX(theta₂₃) 4bc7bf3fff764b44ab84110673fed300--3e8ede703fcd4d259ad16c286302a465 073f568de5614285a1a7ff961f58cfb8 X 3e8ede703fcd4d259ad16c286302a465--073f568de5614285a1a7ff961f58cfb8 073f568de5614285a1a7ff961f58cfb8--a6fd281cb00f4298b4a25def1cbe5dbd 8fb6a0a9c0e64bde84664629fef38de3 073f568de5614285a1a7ff961f58cfb8--8fb6a0a9c0e64bde84664629fef38de3 8fb6a0a9c0e64bde84664629fef38de3--f57a8989b17749418cd17c242bb69915

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
%3 cluster_9b91e9e2b4454082bd00c374480b2c92 HEA cluster_8e34a3fe841349158e2dc59afd1c2158 HEA 8304756f566b420f914907806c688bad 0 3054d9909874442cb053ba82801441fa RX(p1₀) 8304756f566b420f914907806c688bad--3054d9909874442cb053ba82801441fa 32b05dfd07eb4856a54a9d84739408de 1 cce1f42bcae04e69aba09e11e3ef6dbd RY(p1₄) 3054d9909874442cb053ba82801441fa--cce1f42bcae04e69aba09e11e3ef6dbd 2e981a163bd747ee909ea385ff37c41f RX(p1₈) cce1f42bcae04e69aba09e11e3ef6dbd--2e981a163bd747ee909ea385ff37c41f a73a7fd1bb0c47a5b4ca739f65ceb6d0 2e981a163bd747ee909ea385ff37c41f--a73a7fd1bb0c47a5b4ca739f65ceb6d0 bcb3cc0c4d5b49de9f3f52e9358b0ca1 a73a7fd1bb0c47a5b4ca739f65ceb6d0--bcb3cc0c4d5b49de9f3f52e9358b0ca1 40e60bfb595a4dcdbc86d05add8ce069 RX(p1₁₂) bcb3cc0c4d5b49de9f3f52e9358b0ca1--40e60bfb595a4dcdbc86d05add8ce069 88613fd8d8854680a0dd2c3099388bcf RY(p1₁₆) 40e60bfb595a4dcdbc86d05add8ce069--88613fd8d8854680a0dd2c3099388bcf 3fb04fbc2643439591a515ed796e4f5b RX(p1₂₀) 88613fd8d8854680a0dd2c3099388bcf--3fb04fbc2643439591a515ed796e4f5b 2c0d89e653704b5090fc86cf0c7dd30a 3fb04fbc2643439591a515ed796e4f5b--2c0d89e653704b5090fc86cf0c7dd30a e5d2baf1d8724aec9f78c3319402a720 2c0d89e653704b5090fc86cf0c7dd30a--e5d2baf1d8724aec9f78c3319402a720 e276c25bf56f4ecd8ad59bad3d76fd10 RX(p2₀) e5d2baf1d8724aec9f78c3319402a720--e276c25bf56f4ecd8ad59bad3d76fd10 76510de484ff4d399dbe6f763d1d4b39 RY(p2₄) e276c25bf56f4ecd8ad59bad3d76fd10--76510de484ff4d399dbe6f763d1d4b39 2e660ce221c84945b47d69a766ea77cf RX(p2₈) 76510de484ff4d399dbe6f763d1d4b39--2e660ce221c84945b47d69a766ea77cf be3a824e0e23444a902946f60acecdcc 2e660ce221c84945b47d69a766ea77cf--be3a824e0e23444a902946f60acecdcc f616efdca9a24548bc0b1fcc9b389927 be3a824e0e23444a902946f60acecdcc--f616efdca9a24548bc0b1fcc9b389927 0c245e067f364b349d7237ab0b54cbcd RX(p2₁₂) f616efdca9a24548bc0b1fcc9b389927--0c245e067f364b349d7237ab0b54cbcd de40a9e0fd4c43edafe21e1981583346 RY(p2₁₆) 0c245e067f364b349d7237ab0b54cbcd--de40a9e0fd4c43edafe21e1981583346 7f0f676ab1e24ff8a1dd1a983ab57f14 RX(p2₂₀) de40a9e0fd4c43edafe21e1981583346--7f0f676ab1e24ff8a1dd1a983ab57f14 8db0461187524be9ba5edbcdc924141e 7f0f676ab1e24ff8a1dd1a983ab57f14--8db0461187524be9ba5edbcdc924141e dae82a70e50d4a5b9de30e452d5b8165 8db0461187524be9ba5edbcdc924141e--dae82a70e50d4a5b9de30e452d5b8165 78d184e4e77545ac9b50116d8da8b6b8 dae82a70e50d4a5b9de30e452d5b8165--78d184e4e77545ac9b50116d8da8b6b8 dad1326bb9d34368aed5c6e2d72c942a 16e5d9b9fce24cfe9d5a430761f5a366 RX(p1₁) 32b05dfd07eb4856a54a9d84739408de--16e5d9b9fce24cfe9d5a430761f5a366 65729cca1b894c7bb8d5d8301185bbf3 2 c4a9f3bd889e40c586e79c97f3efb485 RY(p1₅) 16e5d9b9fce24cfe9d5a430761f5a366--c4a9f3bd889e40c586e79c97f3efb485 1b9b9626d0b641eb876e3232f662068d RX(p1₉) c4a9f3bd889e40c586e79c97f3efb485--1b9b9626d0b641eb876e3232f662068d 8cb0a56304e341e483366f8383b86061 X 1b9b9626d0b641eb876e3232f662068d--8cb0a56304e341e483366f8383b86061 8cb0a56304e341e483366f8383b86061--a73a7fd1bb0c47a5b4ca739f65ceb6d0 12da4fbf66164a7daf0353edf799e49e 8cb0a56304e341e483366f8383b86061--12da4fbf66164a7daf0353edf799e49e bb43a468b2b941b8abc962024ef3130d RX(p1₁₃) 12da4fbf66164a7daf0353edf799e49e--bb43a468b2b941b8abc962024ef3130d 330b24bf1eff4756b192929e48324f64 RY(p1₁₇) bb43a468b2b941b8abc962024ef3130d--330b24bf1eff4756b192929e48324f64 651ef5d5f3f644c1a7e2b0adc171c6de RX(p1₂₁) 330b24bf1eff4756b192929e48324f64--651ef5d5f3f644c1a7e2b0adc171c6de ea2feb04fb704936ab6c06e763f93107 X 651ef5d5f3f644c1a7e2b0adc171c6de--ea2feb04fb704936ab6c06e763f93107 ea2feb04fb704936ab6c06e763f93107--2c0d89e653704b5090fc86cf0c7dd30a 66d49b58dbe94f8093254acc28a6af1a ea2feb04fb704936ab6c06e763f93107--66d49b58dbe94f8093254acc28a6af1a ad7e1523f0bf42608c310ee909dbea25 RX(p2₁) 66d49b58dbe94f8093254acc28a6af1a--ad7e1523f0bf42608c310ee909dbea25 d6585a4c9a3e446da199bf552c9a7cef RY(p2₅) ad7e1523f0bf42608c310ee909dbea25--d6585a4c9a3e446da199bf552c9a7cef ccb9fb05738444dfa6865bb760090b8d RX(p2₉) d6585a4c9a3e446da199bf552c9a7cef--ccb9fb05738444dfa6865bb760090b8d ff2c492b0629409b888d59979944ef3a X ccb9fb05738444dfa6865bb760090b8d--ff2c492b0629409b888d59979944ef3a ff2c492b0629409b888d59979944ef3a--be3a824e0e23444a902946f60acecdcc 11e7eb7ce05745eab2d27026dcfbb5dc ff2c492b0629409b888d59979944ef3a--11e7eb7ce05745eab2d27026dcfbb5dc 06dacc034ff7488b9d29c66c89fad6b7 RX(p2₁₃) 11e7eb7ce05745eab2d27026dcfbb5dc--06dacc034ff7488b9d29c66c89fad6b7 d409cdf1349a411da921ed8c7b7757f6 RY(p2₁₇) 06dacc034ff7488b9d29c66c89fad6b7--d409cdf1349a411da921ed8c7b7757f6 ff39600b18b640cc93288eefc861a17f RX(p2₂₁) d409cdf1349a411da921ed8c7b7757f6--ff39600b18b640cc93288eefc861a17f 3803ebec343c484fab3728171e8b355b X ff39600b18b640cc93288eefc861a17f--3803ebec343c484fab3728171e8b355b 3803ebec343c484fab3728171e8b355b--8db0461187524be9ba5edbcdc924141e 5818d9f7e1164e60bb87bb898fc30e59 3803ebec343c484fab3728171e8b355b--5818d9f7e1164e60bb87bb898fc30e59 5818d9f7e1164e60bb87bb898fc30e59--dad1326bb9d34368aed5c6e2d72c942a 6928dbd111dc4b128b58ced0a33a18a5 03c226385670410faf76be7d9feedb16 RX(p1₂) 65729cca1b894c7bb8d5d8301185bbf3--03c226385670410faf76be7d9feedb16 92b6feb5cdb54ad99cd05cfb6e456c21 3 a575decbcb314eb0af1032fad5ca0d46 RY(p1₆) 03c226385670410faf76be7d9feedb16--a575decbcb314eb0af1032fad5ca0d46 1752b912b4bd4ee3ba0b9f0a72484bb7 RX(p1₁₀) a575decbcb314eb0af1032fad5ca0d46--1752b912b4bd4ee3ba0b9f0a72484bb7 7de02805dc494511be3855db12afe661 1752b912b4bd4ee3ba0b9f0a72484bb7--7de02805dc494511be3855db12afe661 1dd3c6c3e27848068f8c14511dc16693 X 7de02805dc494511be3855db12afe661--1dd3c6c3e27848068f8c14511dc16693 1dd3c6c3e27848068f8c14511dc16693--12da4fbf66164a7daf0353edf799e49e db44313b97c640caa68213f4bfebc72b RX(p1₁₄) 1dd3c6c3e27848068f8c14511dc16693--db44313b97c640caa68213f4bfebc72b 877f92bfbd604c7682ee88036a910e48 RY(p1₁₈) db44313b97c640caa68213f4bfebc72b--877f92bfbd604c7682ee88036a910e48 d86c9d5933974f7092792b2e4fe6d6af RX(p1₂₂) 877f92bfbd604c7682ee88036a910e48--d86c9d5933974f7092792b2e4fe6d6af 32fe0215636a47d18559bf38db38480b d86c9d5933974f7092792b2e4fe6d6af--32fe0215636a47d18559bf38db38480b 85305cdde89d49948570ebe8af85f2e3 X 32fe0215636a47d18559bf38db38480b--85305cdde89d49948570ebe8af85f2e3 85305cdde89d49948570ebe8af85f2e3--66d49b58dbe94f8093254acc28a6af1a 4ec6878357fb41eba5252cabf7b87bfa RX(p2₂) 85305cdde89d49948570ebe8af85f2e3--4ec6878357fb41eba5252cabf7b87bfa 91f6ee77142d4a0893ee3cb599e4f406 RY(p2₆) 4ec6878357fb41eba5252cabf7b87bfa--91f6ee77142d4a0893ee3cb599e4f406 e704f7d51f6544d582e347653138f643 RX(p2₁₀) 91f6ee77142d4a0893ee3cb599e4f406--e704f7d51f6544d582e347653138f643 fe93ab4777b14802a358d968443d725e e704f7d51f6544d582e347653138f643--fe93ab4777b14802a358d968443d725e 50c575af2cae430ba65b03f6b011af6b X fe93ab4777b14802a358d968443d725e--50c575af2cae430ba65b03f6b011af6b 50c575af2cae430ba65b03f6b011af6b--11e7eb7ce05745eab2d27026dcfbb5dc 2098c58033d44d6db57c9c3c87b61dc3 RX(p2₁₄) 50c575af2cae430ba65b03f6b011af6b--2098c58033d44d6db57c9c3c87b61dc3 5c1e4b48ce124d279fb1473cb88bba61 RY(p2₁₈) 2098c58033d44d6db57c9c3c87b61dc3--5c1e4b48ce124d279fb1473cb88bba61 1bcabce3da65429a9985b11c0532324c RX(p2₂₂) 5c1e4b48ce124d279fb1473cb88bba61--1bcabce3da65429a9985b11c0532324c 6ac750e784b34903889880a920bbc8a4 1bcabce3da65429a9985b11c0532324c--6ac750e784b34903889880a920bbc8a4 972f41e353a747b2a0b4e01f3e09631e X 6ac750e784b34903889880a920bbc8a4--972f41e353a747b2a0b4e01f3e09631e 972f41e353a747b2a0b4e01f3e09631e--5818d9f7e1164e60bb87bb898fc30e59 972f41e353a747b2a0b4e01f3e09631e--6928dbd111dc4b128b58ced0a33a18a5 25a62ddf00e0433ea5f8676f8808a4b4 53053510554e45bb8f3812011426b8a6 RX(p1₃) 92b6feb5cdb54ad99cd05cfb6e456c21--53053510554e45bb8f3812011426b8a6 b2707e1f668a4cf09483377c06cc7446 RY(p1₇) 53053510554e45bb8f3812011426b8a6--b2707e1f668a4cf09483377c06cc7446 a8788bc80e984573a6f4b7a490ca8201 RX(p1₁₁) b2707e1f668a4cf09483377c06cc7446--a8788bc80e984573a6f4b7a490ca8201 54b616c3a9c146b39d3d1460ad0951bd X a8788bc80e984573a6f4b7a490ca8201--54b616c3a9c146b39d3d1460ad0951bd 54b616c3a9c146b39d3d1460ad0951bd--7de02805dc494511be3855db12afe661 29163736ecd142f19e6446acf8273c14 54b616c3a9c146b39d3d1460ad0951bd--29163736ecd142f19e6446acf8273c14 606ee81b30e945d3b13fc86e0abea0a9 RX(p1₁₅) 29163736ecd142f19e6446acf8273c14--606ee81b30e945d3b13fc86e0abea0a9 8602bd745e89401ca1aa4d7ba62923f6 RY(p1₁₉) 606ee81b30e945d3b13fc86e0abea0a9--8602bd745e89401ca1aa4d7ba62923f6 07f99fbf6f124ac8bd8b42c4f84c0f5e RX(p1₂₃) 8602bd745e89401ca1aa4d7ba62923f6--07f99fbf6f124ac8bd8b42c4f84c0f5e a7d8948050454ff7a56d908a74974824 X 07f99fbf6f124ac8bd8b42c4f84c0f5e--a7d8948050454ff7a56d908a74974824 a7d8948050454ff7a56d908a74974824--32fe0215636a47d18559bf38db38480b d8bcc79825c04efa88282f8348eb0e50 a7d8948050454ff7a56d908a74974824--d8bcc79825c04efa88282f8348eb0e50 853ba29b2ea74ad3b6422b948e48ac74 RX(p2₃) d8bcc79825c04efa88282f8348eb0e50--853ba29b2ea74ad3b6422b948e48ac74 c5ace3c659bf4f2aa1f851b01ad6a21e RY(p2₇) 853ba29b2ea74ad3b6422b948e48ac74--c5ace3c659bf4f2aa1f851b01ad6a21e 39f3ad907f904644ae7e3d2d36254572 RX(p2₁₁) c5ace3c659bf4f2aa1f851b01ad6a21e--39f3ad907f904644ae7e3d2d36254572 359509964f444ec89f70b29bd3525a42 X 39f3ad907f904644ae7e3d2d36254572--359509964f444ec89f70b29bd3525a42 359509964f444ec89f70b29bd3525a42--fe93ab4777b14802a358d968443d725e 71ccb02778a74396b62dd589efa12429 359509964f444ec89f70b29bd3525a42--71ccb02778a74396b62dd589efa12429 d25baf1d81854d5f9c9269df94c0fbde RX(p2₁₅) 71ccb02778a74396b62dd589efa12429--d25baf1d81854d5f9c9269df94c0fbde c76539bd1f384d43912538bbac54cb69 RY(p2₁₉) d25baf1d81854d5f9c9269df94c0fbde--c76539bd1f384d43912538bbac54cb69 9a2b622cf2d94af4a4cb80dd067c070e RX(p2₂₃) c76539bd1f384d43912538bbac54cb69--9a2b622cf2d94af4a4cb80dd067c070e 60f8f2feb5174757b8cdd63ccd1d4cb0 X 9a2b622cf2d94af4a4cb80dd067c070e--60f8f2feb5174757b8cdd63ccd1d4cb0 60f8f2feb5174757b8cdd63ccd1d4cb0--6ac750e784b34903889880a920bbc8a4 b8a7c0a1590647e5bc8417a0a28778d5 60f8f2feb5174757b8cdd63ccd1d4cb0--b8a7c0a1590647e5bc8417a0a28778d5 b8a7c0a1590647e5bc8417a0a28778d5--25a62ddf00e0433ea5f8676f8808a4b4

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.4060])), ('theta_0', tensor([0.7295])), ('theta_1', tensor([0.4842])), ('theta_10', tensor([0.2934])), ('theta_11', tensor([0.9087])), ('theta_12', tensor([0.5591])), ('theta_13', tensor([0.2918])), ('theta_14', tensor([0.6196])), ('theta_15', tensor([0.0873])), ('theta_16', tensor([0.7099])), ('theta_17', tensor([0.5362])), ('theta_18', tensor([0.3060])), ('theta_19', tensor([0.0122])), ('theta_2', tensor([0.4173])), ('theta_20', tensor([0.5521])), ('theta_21', tensor([0.0399])), ('theta_22', tensor([0.4448])), ('theta_23', tensor([0.8476])), ('theta_3', tensor([0.6639])), ('theta_4', tensor([0.6974])), ('theta_5', tensor([0.1438])), ('theta_6', tensor([0.6251])), ('theta_7', tensor([0.3880])), ('theta_8', tensor([0.2627])), ('theta_9', tensor([0.4693]))])

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.4050])), ('theta_0', tensor([0.7285])), ('theta_1', tensor([0.4832])), ('theta_10', tensor([0.2944])), ('theta_11', tensor([0.9097])), ('theta_12', tensor([0.5601])), ('theta_13', tensor([0.2908])), ('theta_14', tensor([0.6186])), ('theta_15', tensor([0.0883])), ('theta_16', tensor([0.7109])), ('theta_17', tensor([0.5372])), ('theta_18', tensor([0.3070])), ('theta_19', tensor([0.0112])), ('theta_2', tensor([0.4183])), ('theta_20', tensor([0.5531])), ('theta_21', tensor([0.0389])), ('theta_22', tensor([0.4438])), ('theta_23', tensor([0.8486])), ('theta_3', tensor([0.6649])), ('theta_4', tensor([0.6984])), ('theta_5', tensor([0.1448])), ('theta_6', tensor([0.6261])), ('theta_7', tensor([0.3870])), ('theta_8', tensor([0.2617])), ('theta_9', tensor([0.4683]))])

Non-unitary circuits

Qadence allows composing 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 of 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]])