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)
%3 cluster_3c5e75af79104f4495fd58af67fea9c9 [* 2] cluster_fbeab31c0a7f4653933e3a75d8788f42 Rotations 4c3b1faed7a04006bc41ad274c1d288f 0 cd5dbc03701f40f69d490130f086d207 RX(phi/theta) 4c3b1faed7a04006bc41ad274c1d288f--cd5dbc03701f40f69d490130f086d207 536328e8616b4c5e86f89bafad5ae88c 1 a3e18faa1ac442f3b478231f09dcead0 RX(phi) cd5dbc03701f40f69d490130f086d207--a3e18faa1ac442f3b478231f09dcead0 3d6c3a9470214f14be484aa8c3088811 RX(phi) a3e18faa1ac442f3b478231f09dcead0--3d6c3a9470214f14be484aa8c3088811 e8e56acc2e6844a1b49ecf0ca2e7a2aa RX(phi + theta) 3d6c3a9470214f14be484aa8c3088811--e8e56acc2e6844a1b49ecf0ca2e7a2aa db76e3f505364aa695a2c09c28e5830e e8e56acc2e6844a1b49ecf0ca2e7a2aa--db76e3f505364aa695a2c09c28e5830e 5840c0c6d82346f2bf4deea5bad7d741 db76e3f505364aa695a2c09c28e5830e--5840c0c6d82346f2bf4deea5bad7d741 5def77dbbad5447ba74ceffa15f0d16d Z 5840c0c6d82346f2bf4deea5bad7d741--5def77dbbad5447ba74ceffa15f0d16d e407cb0a515840d5a1e2404c1dcabf1d 5def77dbbad5447ba74ceffa15f0d16d--e407cb0a515840d5a1e2404c1dcabf1d e723bb5efb5448b0aba170bb2cbc118f da641cb82fd342b79eecb07552fea009 RY(2*theta) 536328e8616b4c5e86f89bafad5ae88c--da641cb82fd342b79eecb07552fea009 b6c09429215f4886965d950c50f3bc54 2 8134599c2607424c991f5cc8f7456a13 RY(theta) da641cb82fd342b79eecb07552fea009--8134599c2607424c991f5cc8f7456a13 3368053f6c0f4037a4fcae01cde0adea RY(theta) 8134599c2607424c991f5cc8f7456a13--3368053f6c0f4037a4fcae01cde0adea 441bcb76640e4e149f437084878caacb RY(theta**2) 3368053f6c0f4037a4fcae01cde0adea--441bcb76640e4e149f437084878caacb 39711d1b96574e3ca67f2430e5d89c7f X 441bcb76640e4e149f437084878caacb--39711d1b96574e3ca67f2430e5d89c7f 39711d1b96574e3ca67f2430e5d89c7f--db76e3f505364aa695a2c09c28e5830e 0bc2b3cbce5c496f8b88f9f37071ae88 39711d1b96574e3ca67f2430e5d89c7f--0bc2b3cbce5c496f8b88f9f37071ae88 6ac1115d7db645a1862eb516922ab2d3 Z 0bc2b3cbce5c496f8b88f9f37071ae88--6ac1115d7db645a1862eb516922ab2d3 6ac1115d7db645a1862eb516922ab2d3--e723bb5efb5448b0aba170bb2cbc118f 5d81a45f5fa54efc95d0c9566b457ae6 d173aca830bb4c999b57fb03275dd4b4 RZ(cos(phi)) b6c09429215f4886965d950c50f3bc54--d173aca830bb4c999b57fb03275dd4b4 8a272059e8204fe99c6d2bfb22fc6e33 RZ(phi) d173aca830bb4c999b57fb03275dd4b4--8a272059e8204fe99c6d2bfb22fc6e33 f20223985bda44e091e6d04f3d5fcc8f RZ(phi) 8a272059e8204fe99c6d2bfb22fc6e33--f20223985bda44e091e6d04f3d5fcc8f 2b564444296540ebbf1d4e15c64e596f RZ(cos(phi)) f20223985bda44e091e6d04f3d5fcc8f--2b564444296540ebbf1d4e15c64e596f bbfec804cf204f32a1b09ce7ee22b217 2b564444296540ebbf1d4e15c64e596f--bbfec804cf204f32a1b09ce7ee22b217 a60eea8e73e94bb8b8edd8f8c8d949c8 X bbfec804cf204f32a1b09ce7ee22b217--a60eea8e73e94bb8b8edd8f8c8d949c8 a60eea8e73e94bb8b8edd8f8c8d949c8--0bc2b3cbce5c496f8b88f9f37071ae88 5e78f40098934be5ab981e8aad6033f6 Z a60eea8e73e94bb8b8edd8f8c8d949c8--5e78f40098934be5ab981e8aad6033f6 5e78f40098934be5ab981e8aad6033f6--5d81a45f5fa54efc95d0c9566b457ae6

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
%3 78ccbe4ff072491fa979d887b052bb40 0 f8c997b9ae884fdd9f7f4b778a3f5b8c RX(theta₀) 78ccbe4ff072491fa979d887b052bb40--f8c997b9ae884fdd9f7f4b778a3f5b8c 7432f4e2a5084693a63b9177d30f6140 1 5d0d9db17d684b9cb5fa4cc1f97529a0 RY(theta₄) f8c997b9ae884fdd9f7f4b778a3f5b8c--5d0d9db17d684b9cb5fa4cc1f97529a0 782a577918df460ba0d6a02192bbc28f RX(theta₈) 5d0d9db17d684b9cb5fa4cc1f97529a0--782a577918df460ba0d6a02192bbc28f 36f354060b7e4486976335d00b42c034 782a577918df460ba0d6a02192bbc28f--36f354060b7e4486976335d00b42c034 4b0e194d2da943539f54d5b53ba0a86b 36f354060b7e4486976335d00b42c034--4b0e194d2da943539f54d5b53ba0a86b 81331c25fcf343c3996c677e7bf4a312 RX(theta₁₂) 4b0e194d2da943539f54d5b53ba0a86b--81331c25fcf343c3996c677e7bf4a312 6885b52d997344049a4a917bc11bb682 RY(theta₁₆) 81331c25fcf343c3996c677e7bf4a312--6885b52d997344049a4a917bc11bb682 6d29168f978146b397bbf7b63beed8f2 RX(theta₂₀) 6885b52d997344049a4a917bc11bb682--6d29168f978146b397bbf7b63beed8f2 f6d3c93916b04458894012ffd6b134f1 6d29168f978146b397bbf7b63beed8f2--f6d3c93916b04458894012ffd6b134f1 04f84e21891f423faa7546e09bdec101 f6d3c93916b04458894012ffd6b134f1--04f84e21891f423faa7546e09bdec101 0bc6fea1b7b3480d9ea10d8dcf7d55df 04f84e21891f423faa7546e09bdec101--0bc6fea1b7b3480d9ea10d8dcf7d55df b44f9fc7baf54fd8a8d42b5f708b06f1 f928b90f29424e0da6ae41d7b3ca56a5 RX(theta₁) 7432f4e2a5084693a63b9177d30f6140--f928b90f29424e0da6ae41d7b3ca56a5 290c553a1e2a4c309dbafcc54639ad25 2 93cee0a3f61b4d048c2e1c131c270621 RY(theta₅) f928b90f29424e0da6ae41d7b3ca56a5--93cee0a3f61b4d048c2e1c131c270621 85235df40f964184a3ca32172fbc2652 RX(theta₉) 93cee0a3f61b4d048c2e1c131c270621--85235df40f964184a3ca32172fbc2652 6b6c3de2dbc648b2a845d1a30a4a1b1a X 85235df40f964184a3ca32172fbc2652--6b6c3de2dbc648b2a845d1a30a4a1b1a 6b6c3de2dbc648b2a845d1a30a4a1b1a--36f354060b7e4486976335d00b42c034 34e8174119f241cda85ff646b27ae3f4 6b6c3de2dbc648b2a845d1a30a4a1b1a--34e8174119f241cda85ff646b27ae3f4 d1ca3c88478f47aca8b047958ff57cfe RX(theta₁₃) 34e8174119f241cda85ff646b27ae3f4--d1ca3c88478f47aca8b047958ff57cfe 636a0fe93e114224a910ef7a50a9ec95 RY(theta₁₇) d1ca3c88478f47aca8b047958ff57cfe--636a0fe93e114224a910ef7a50a9ec95 68d71b5d36c34d67b3b0039f7b9cac77 RX(theta₂₁) 636a0fe93e114224a910ef7a50a9ec95--68d71b5d36c34d67b3b0039f7b9cac77 fe712e475c804729922e3e8a15228be4 X 68d71b5d36c34d67b3b0039f7b9cac77--fe712e475c804729922e3e8a15228be4 fe712e475c804729922e3e8a15228be4--f6d3c93916b04458894012ffd6b134f1 05530519e5814151835a0d7ad9e204ff fe712e475c804729922e3e8a15228be4--05530519e5814151835a0d7ad9e204ff 05530519e5814151835a0d7ad9e204ff--b44f9fc7baf54fd8a8d42b5f708b06f1 69c771dfa7864e0bb791cd9dd786582b ee6fab71d5494fe58219843a6173d1f0 RX(theta₂) 290c553a1e2a4c309dbafcc54639ad25--ee6fab71d5494fe58219843a6173d1f0 650c9f9804594bc3a10729b947e3bbf6 3 31b3ee0e49364abb9306ad313fb568ba RY(theta₆) ee6fab71d5494fe58219843a6173d1f0--31b3ee0e49364abb9306ad313fb568ba 1c387c6bfd774cfd97fc445b737eb920 RX(theta₁₀) 31b3ee0e49364abb9306ad313fb568ba--1c387c6bfd774cfd97fc445b737eb920 297e746ed06b41708db7847d6dc93f4e 1c387c6bfd774cfd97fc445b737eb920--297e746ed06b41708db7847d6dc93f4e f96919dc353041d2b5e1d5d2bc4bfea3 X 297e746ed06b41708db7847d6dc93f4e--f96919dc353041d2b5e1d5d2bc4bfea3 f96919dc353041d2b5e1d5d2bc4bfea3--34e8174119f241cda85ff646b27ae3f4 1e971d49962549b4ada86156979df7ea RX(theta₁₄) f96919dc353041d2b5e1d5d2bc4bfea3--1e971d49962549b4ada86156979df7ea 616ed4212f044d12ac820ea250dce051 RY(theta₁₈) 1e971d49962549b4ada86156979df7ea--616ed4212f044d12ac820ea250dce051 d9cf7e2483774f299e30e9db66a341bf RX(theta₂₂) 616ed4212f044d12ac820ea250dce051--d9cf7e2483774f299e30e9db66a341bf 684bc1b782284773903477de13f58373 d9cf7e2483774f299e30e9db66a341bf--684bc1b782284773903477de13f58373 c5370c3dce5c409fbd7b88473bf353fc X 684bc1b782284773903477de13f58373--c5370c3dce5c409fbd7b88473bf353fc c5370c3dce5c409fbd7b88473bf353fc--05530519e5814151835a0d7ad9e204ff c5370c3dce5c409fbd7b88473bf353fc--69c771dfa7864e0bb791cd9dd786582b c54398777bf046c1ae1c5b9a2666b7d3 dc3a2631e0d54c06b4f225917cdbfd10 RX(theta₃) 650c9f9804594bc3a10729b947e3bbf6--dc3a2631e0d54c06b4f225917cdbfd10 c4c182f5a71341cfa9e308757dadea8e RY(theta₇) dc3a2631e0d54c06b4f225917cdbfd10--c4c182f5a71341cfa9e308757dadea8e d12b62576afb4da08cd4bba7f093fdf6 RX(theta₁₁) c4c182f5a71341cfa9e308757dadea8e--d12b62576afb4da08cd4bba7f093fdf6 cd12bda1966a468d9cd7a34c977ab14f X d12b62576afb4da08cd4bba7f093fdf6--cd12bda1966a468d9cd7a34c977ab14f cd12bda1966a468d9cd7a34c977ab14f--297e746ed06b41708db7847d6dc93f4e df805adbf177446f9b2db00755e5827c cd12bda1966a468d9cd7a34c977ab14f--df805adbf177446f9b2db00755e5827c 1dbaa73e765d42ffb3af3db94136a8c2 RX(theta₁₅) df805adbf177446f9b2db00755e5827c--1dbaa73e765d42ffb3af3db94136a8c2 d9d186afaf0b4899b41082e2d7b48997 RY(theta₁₉) 1dbaa73e765d42ffb3af3db94136a8c2--d9d186afaf0b4899b41082e2d7b48997 96087c78fd644f748aa75ac26e9a607a RX(theta₂₃) d9d186afaf0b4899b41082e2d7b48997--96087c78fd644f748aa75ac26e9a607a 171e59adf31a4dfca260a70b10fe5fca X 96087c78fd644f748aa75ac26e9a607a--171e59adf31a4dfca260a70b10fe5fca 171e59adf31a4dfca260a70b10fe5fca--684bc1b782284773903477de13f58373 1edaa45bc5df4db1b54ff75ee359c692 171e59adf31a4dfca260a70b10fe5fca--1edaa45bc5df4db1b54ff75ee359c692 1edaa45bc5df4db1b54ff75ee359c692--c54398777bf046c1ae1c5b9a2666b7d3

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_c1a7faa4f72546cfb204ea55812b98e0 HEA cluster_f8ed389815a74ea190a459b3ec2c779f HEA 867e9e0d34484ae295701942ef2c8f75 0 78fadf8e0a3d4ca7b935ef1b2ead3cce RX(theta₀) 867e9e0d34484ae295701942ef2c8f75--78fadf8e0a3d4ca7b935ef1b2ead3cce 75b00bd9a26e43efa39cfd68c05e01c2 1 f0ae3420bff2417684b40a0df4f3a28e RY(theta₄) 78fadf8e0a3d4ca7b935ef1b2ead3cce--f0ae3420bff2417684b40a0df4f3a28e 11103260d16e4bfa8b93c89a2de37b85 RX(theta₈) f0ae3420bff2417684b40a0df4f3a28e--11103260d16e4bfa8b93c89a2de37b85 9ffe669e25824cfba0be2fe3a5ff21d9 11103260d16e4bfa8b93c89a2de37b85--9ffe669e25824cfba0be2fe3a5ff21d9 177198df786644a5bdc79c3a5a3e2160 9ffe669e25824cfba0be2fe3a5ff21d9--177198df786644a5bdc79c3a5a3e2160 1ac9033d930041ae8a718d41edf000a0 RX(theta₁₂) 177198df786644a5bdc79c3a5a3e2160--1ac9033d930041ae8a718d41edf000a0 55c00bad361d4e8fb2d36d075c40760f RY(theta₁₆) 1ac9033d930041ae8a718d41edf000a0--55c00bad361d4e8fb2d36d075c40760f 862cb538f5f648cabb389680717e8fb2 RX(theta₂₀) 55c00bad361d4e8fb2d36d075c40760f--862cb538f5f648cabb389680717e8fb2 6c9e0bd995204242ad3ce01e61e4cf3d 862cb538f5f648cabb389680717e8fb2--6c9e0bd995204242ad3ce01e61e4cf3d 9d9ff0a61bb941b9bbdfd8e9a71ad2ec 6c9e0bd995204242ad3ce01e61e4cf3d--9d9ff0a61bb941b9bbdfd8e9a71ad2ec b763578e244d46e0923cc5d1ae52ab96 RX(theta₀) 9d9ff0a61bb941b9bbdfd8e9a71ad2ec--b763578e244d46e0923cc5d1ae52ab96 6fc16c167cac48eebf50f270f57b9b2a RY(theta₄) b763578e244d46e0923cc5d1ae52ab96--6fc16c167cac48eebf50f270f57b9b2a bf4d57c903604c4dbb4c21d67b05eaa5 RX(theta₈) 6fc16c167cac48eebf50f270f57b9b2a--bf4d57c903604c4dbb4c21d67b05eaa5 fef3fa7dd7bd4750a1c577f0cad35f2d bf4d57c903604c4dbb4c21d67b05eaa5--fef3fa7dd7bd4750a1c577f0cad35f2d 064d860fb42d49b3960a3bc3b4783b26 fef3fa7dd7bd4750a1c577f0cad35f2d--064d860fb42d49b3960a3bc3b4783b26 4e18131924934d479edade30aa000f87 RX(theta₁₂) 064d860fb42d49b3960a3bc3b4783b26--4e18131924934d479edade30aa000f87 f51dbf9b821646e68d66d0a352da1fa5 RY(theta₁₆) 4e18131924934d479edade30aa000f87--f51dbf9b821646e68d66d0a352da1fa5 cbbba78178ce412686736cd94dd00c9b RX(theta₂₀) f51dbf9b821646e68d66d0a352da1fa5--cbbba78178ce412686736cd94dd00c9b b6a32a5260dc4aeca968573b0b12d736 cbbba78178ce412686736cd94dd00c9b--b6a32a5260dc4aeca968573b0b12d736 a42f9bcd30d248f392dfa9c563c6f420 b6a32a5260dc4aeca968573b0b12d736--a42f9bcd30d248f392dfa9c563c6f420 8ad30cd83b4045459484cb6c8eb2dd75 a42f9bcd30d248f392dfa9c563c6f420--8ad30cd83b4045459484cb6c8eb2dd75 49c583a311714c078a4075dbb4f4fc01 8ec93071b4c94ebfbec2a9dd78fdaf0c RX(theta₁) 75b00bd9a26e43efa39cfd68c05e01c2--8ec93071b4c94ebfbec2a9dd78fdaf0c 87cd731babcd47d19029eff75b6b3d60 2 c823cbc3c0e2447ea6655ee56c86ad00 RY(theta₅) 8ec93071b4c94ebfbec2a9dd78fdaf0c--c823cbc3c0e2447ea6655ee56c86ad00 b64de5dddb0149dd9383a9bd87bf1591 RX(theta₉) c823cbc3c0e2447ea6655ee56c86ad00--b64de5dddb0149dd9383a9bd87bf1591 a0eeb32cb5904a999c5803a76a939394 X b64de5dddb0149dd9383a9bd87bf1591--a0eeb32cb5904a999c5803a76a939394 a0eeb32cb5904a999c5803a76a939394--9ffe669e25824cfba0be2fe3a5ff21d9 b109a7073987413dbf8ab60cd4128176 a0eeb32cb5904a999c5803a76a939394--b109a7073987413dbf8ab60cd4128176 1b58a9b8d7a04d879810212aaf6fbde9 RX(theta₁₃) b109a7073987413dbf8ab60cd4128176--1b58a9b8d7a04d879810212aaf6fbde9 50878e743f52480aa4d50ba4d6529446 RY(theta₁₇) 1b58a9b8d7a04d879810212aaf6fbde9--50878e743f52480aa4d50ba4d6529446 a2ae3461fc894863b8b82a112944cc64 RX(theta₂₁) 50878e743f52480aa4d50ba4d6529446--a2ae3461fc894863b8b82a112944cc64 9e2edd776da142d78484994cb756370f X a2ae3461fc894863b8b82a112944cc64--9e2edd776da142d78484994cb756370f 9e2edd776da142d78484994cb756370f--6c9e0bd995204242ad3ce01e61e4cf3d 01385c7c5d664f64bec04066fe20ed37 9e2edd776da142d78484994cb756370f--01385c7c5d664f64bec04066fe20ed37 94b552ceb2e94d39a2a6f01084223258 RX(theta₁) 01385c7c5d664f64bec04066fe20ed37--94b552ceb2e94d39a2a6f01084223258 7f6d0b845e56451a9870da1caac36d6f RY(theta₅) 94b552ceb2e94d39a2a6f01084223258--7f6d0b845e56451a9870da1caac36d6f 24239b493a394f30ba2a4771c1eb7652 RX(theta₉) 7f6d0b845e56451a9870da1caac36d6f--24239b493a394f30ba2a4771c1eb7652 73b330b092a7433598af2e91c1ae186a X 24239b493a394f30ba2a4771c1eb7652--73b330b092a7433598af2e91c1ae186a 73b330b092a7433598af2e91c1ae186a--fef3fa7dd7bd4750a1c577f0cad35f2d bac3a0774f744b3d9a24f1aa6fbb85f0 73b330b092a7433598af2e91c1ae186a--bac3a0774f744b3d9a24f1aa6fbb85f0 5b0283f79c4a4429bb7821be83c861a1 RX(theta₁₃) bac3a0774f744b3d9a24f1aa6fbb85f0--5b0283f79c4a4429bb7821be83c861a1 9f35f8b4906542fea5d336cdf8b55635 RY(theta₁₇) 5b0283f79c4a4429bb7821be83c861a1--9f35f8b4906542fea5d336cdf8b55635 316faba629974b68b63616c2f1eb954d RX(theta₂₁) 9f35f8b4906542fea5d336cdf8b55635--316faba629974b68b63616c2f1eb954d bebe18b985ff433ab9ab18b5f0b594fe X 316faba629974b68b63616c2f1eb954d--bebe18b985ff433ab9ab18b5f0b594fe bebe18b985ff433ab9ab18b5f0b594fe--b6a32a5260dc4aeca968573b0b12d736 52f6e7c495a04f64b3ccbc897a6e095c bebe18b985ff433ab9ab18b5f0b594fe--52f6e7c495a04f64b3ccbc897a6e095c 52f6e7c495a04f64b3ccbc897a6e095c--49c583a311714c078a4075dbb4f4fc01 1fb9357890074fbc81038e932dda074c 23b9f0291ca348dca083c015ef77b2e9 RX(theta₂) 87cd731babcd47d19029eff75b6b3d60--23b9f0291ca348dca083c015ef77b2e9 18d86baf14e749e29a4906c4e6360e80 3 4cc140180f1b4cd6a49b531d9eb2707d RY(theta₆) 23b9f0291ca348dca083c015ef77b2e9--4cc140180f1b4cd6a49b531d9eb2707d 452a3595d6e743ffb3b8630316ecef1e RX(theta₁₀) 4cc140180f1b4cd6a49b531d9eb2707d--452a3595d6e743ffb3b8630316ecef1e 5cbdd43c52b347209c90a236587b2175 452a3595d6e743ffb3b8630316ecef1e--5cbdd43c52b347209c90a236587b2175 38c6559eda4a442b965ec9e51e135af0 X 5cbdd43c52b347209c90a236587b2175--38c6559eda4a442b965ec9e51e135af0 38c6559eda4a442b965ec9e51e135af0--b109a7073987413dbf8ab60cd4128176 9e2125a2cf294b6598411be6b6585f26 RX(theta₁₄) 38c6559eda4a442b965ec9e51e135af0--9e2125a2cf294b6598411be6b6585f26 b4afdcdc82c247cb9843b52b50749f6d RY(theta₁₈) 9e2125a2cf294b6598411be6b6585f26--b4afdcdc82c247cb9843b52b50749f6d 5e126b408e8f4b63a787694cd2710c13 RX(theta₂₂) b4afdcdc82c247cb9843b52b50749f6d--5e126b408e8f4b63a787694cd2710c13 d341850780464cd88040e53b397c24eb 5e126b408e8f4b63a787694cd2710c13--d341850780464cd88040e53b397c24eb c77092c2e7b147aab9f325b300dcb49d X d341850780464cd88040e53b397c24eb--c77092c2e7b147aab9f325b300dcb49d c77092c2e7b147aab9f325b300dcb49d--01385c7c5d664f64bec04066fe20ed37 7d7200c2548c4a658781015ad645d3b1 RX(theta₂) c77092c2e7b147aab9f325b300dcb49d--7d7200c2548c4a658781015ad645d3b1 4854de072ee24dfa9c6820b5e519bb3a RY(theta₆) 7d7200c2548c4a658781015ad645d3b1--4854de072ee24dfa9c6820b5e519bb3a ad47fe46d46343e0971083c866392ced RX(theta₁₀) 4854de072ee24dfa9c6820b5e519bb3a--ad47fe46d46343e0971083c866392ced 2813caf35c964c91852504bc2db82be6 ad47fe46d46343e0971083c866392ced--2813caf35c964c91852504bc2db82be6 075a1bd3a38242f0aa5b6f7a783a6891 X 2813caf35c964c91852504bc2db82be6--075a1bd3a38242f0aa5b6f7a783a6891 075a1bd3a38242f0aa5b6f7a783a6891--bac3a0774f744b3d9a24f1aa6fbb85f0 3487466e766749e6a7845381afc2f7f1 RX(theta₁₄) 075a1bd3a38242f0aa5b6f7a783a6891--3487466e766749e6a7845381afc2f7f1 ad6757ac3a8342a5bb7484792ee9ab77 RY(theta₁₈) 3487466e766749e6a7845381afc2f7f1--ad6757ac3a8342a5bb7484792ee9ab77 84ad92fef686450b8ea05713a5c62d56 RX(theta₂₂) ad6757ac3a8342a5bb7484792ee9ab77--84ad92fef686450b8ea05713a5c62d56 368a165986ec424784173bd94e444032 84ad92fef686450b8ea05713a5c62d56--368a165986ec424784173bd94e444032 cc9d9a8caff745d6b2c332ef2ff3b448 X 368a165986ec424784173bd94e444032--cc9d9a8caff745d6b2c332ef2ff3b448 cc9d9a8caff745d6b2c332ef2ff3b448--52f6e7c495a04f64b3ccbc897a6e095c cc9d9a8caff745d6b2c332ef2ff3b448--1fb9357890074fbc81038e932dda074c aaa812e5b02046e6be28da91b6f43daf d5f28a921e8749768c2e520bb97a75b6 RX(theta₃) 18d86baf14e749e29a4906c4e6360e80--d5f28a921e8749768c2e520bb97a75b6 aba78a0c3f5940c1b24e96eeb837daf6 RY(theta₇) d5f28a921e8749768c2e520bb97a75b6--aba78a0c3f5940c1b24e96eeb837daf6 b582b62a7d2a4705be32df9b302740ff RX(theta₁₁) aba78a0c3f5940c1b24e96eeb837daf6--b582b62a7d2a4705be32df9b302740ff f6114daf53154befadb79be8eb465cb5 X b582b62a7d2a4705be32df9b302740ff--f6114daf53154befadb79be8eb465cb5 f6114daf53154befadb79be8eb465cb5--5cbdd43c52b347209c90a236587b2175 a863de42c98047f18836277fdcc1db39 f6114daf53154befadb79be8eb465cb5--a863de42c98047f18836277fdcc1db39 741c82a7ddbe48daade6f8220c601bc4 RX(theta₁₅) a863de42c98047f18836277fdcc1db39--741c82a7ddbe48daade6f8220c601bc4 f99f12399a4c421289729f94c9e608de RY(theta₁₉) 741c82a7ddbe48daade6f8220c601bc4--f99f12399a4c421289729f94c9e608de 0e9abcb4deaa415d81439aff2e78ff36 RX(theta₂₃) f99f12399a4c421289729f94c9e608de--0e9abcb4deaa415d81439aff2e78ff36 a5a34fb83cbe4449b3aa8ab4b38267df X 0e9abcb4deaa415d81439aff2e78ff36--a5a34fb83cbe4449b3aa8ab4b38267df a5a34fb83cbe4449b3aa8ab4b38267df--d341850780464cd88040e53b397c24eb abc87fa8470343d59dd39937f5cb1355 a5a34fb83cbe4449b3aa8ab4b38267df--abc87fa8470343d59dd39937f5cb1355 ebbfebeca9b54a01b7ac0fc808667574 RX(theta₃) abc87fa8470343d59dd39937f5cb1355--ebbfebeca9b54a01b7ac0fc808667574 b144b38c29984d3987a722aa5f6b7410 RY(theta₇) ebbfebeca9b54a01b7ac0fc808667574--b144b38c29984d3987a722aa5f6b7410 9b7cfe5081b4474a82c70602e86c31f5 RX(theta₁₁) b144b38c29984d3987a722aa5f6b7410--9b7cfe5081b4474a82c70602e86c31f5 5ec51fbb1c7e40dbabd067d95e0b8f6a X 9b7cfe5081b4474a82c70602e86c31f5--5ec51fbb1c7e40dbabd067d95e0b8f6a 5ec51fbb1c7e40dbabd067d95e0b8f6a--2813caf35c964c91852504bc2db82be6 e441cb737b6e415fbd43ed2238ef67b2 5ec51fbb1c7e40dbabd067d95e0b8f6a--e441cb737b6e415fbd43ed2238ef67b2 b3909253576447c3b3fb33980b16bb46 RX(theta₁₅) e441cb737b6e415fbd43ed2238ef67b2--b3909253576447c3b3fb33980b16bb46 47c24dc45bd948a2a53bf19011251304 RY(theta₁₉) b3909253576447c3b3fb33980b16bb46--47c24dc45bd948a2a53bf19011251304 12588b0f08be4d2ea8ea780defdecf8b RX(theta₂₃) 47c24dc45bd948a2a53bf19011251304--12588b0f08be4d2ea8ea780defdecf8b 12ee81c629e745c8b95fb1d9d302b59f X 12588b0f08be4d2ea8ea780defdecf8b--12ee81c629e745c8b95fb1d9d302b59f 12ee81c629e745c8b95fb1d9d302b59f--368a165986ec424784173bd94e444032 4b53c0b4e9da43dda5681cc1d40596c5 12ee81c629e745c8b95fb1d9d302b59f--4b53c0b4e9da43dda5681cc1d40596c5 4b53c0b4e9da43dda5681cc1d40596c5--aaa812e5b02046e6be28da91b6f43daf

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_28f31e5609844e37936ab6ca5cd3ce74 HEA cluster_054739ee7ad645dc962ffb578404ec18 HEA dc4c9fa7da0c4244abc9bba882766432 0 1083afa40a4449959f007a0412ddd1e4 RX(p1₀) dc4c9fa7da0c4244abc9bba882766432--1083afa40a4449959f007a0412ddd1e4 9425e0c7bd7b4e868d62d2ec43f19868 1 a4a51281418d4f778cb0be4546f99c02 RY(p1₄) 1083afa40a4449959f007a0412ddd1e4--a4a51281418d4f778cb0be4546f99c02 c1dbb765d4e44bfea2cd60cd3835e25d RX(p1₈) a4a51281418d4f778cb0be4546f99c02--c1dbb765d4e44bfea2cd60cd3835e25d da2c335c159b4b27a80cc20d9ecf782a c1dbb765d4e44bfea2cd60cd3835e25d--da2c335c159b4b27a80cc20d9ecf782a 3fa0b7798f3345729d98acaeae7345d7 da2c335c159b4b27a80cc20d9ecf782a--3fa0b7798f3345729d98acaeae7345d7 4f74e8cee7ca43a694e7d4d6540d5424 RX(p1₁₂) 3fa0b7798f3345729d98acaeae7345d7--4f74e8cee7ca43a694e7d4d6540d5424 4bc72f6d1e48416f88f8ed04b9e1dd0c RY(p1₁₆) 4f74e8cee7ca43a694e7d4d6540d5424--4bc72f6d1e48416f88f8ed04b9e1dd0c d0818cd3e7024a2fbbd998b7e75e2e7d RX(p1₂₀) 4bc72f6d1e48416f88f8ed04b9e1dd0c--d0818cd3e7024a2fbbd998b7e75e2e7d ba75e27a29a14f68932e4f27688e7c7a d0818cd3e7024a2fbbd998b7e75e2e7d--ba75e27a29a14f68932e4f27688e7c7a 9b00d7e4af9446978129ea5afe0e2ac5 ba75e27a29a14f68932e4f27688e7c7a--9b00d7e4af9446978129ea5afe0e2ac5 3eddee841fb24f60b4a7a45288104964 RX(p2₀) 9b00d7e4af9446978129ea5afe0e2ac5--3eddee841fb24f60b4a7a45288104964 24bb6701f2684ddbbeb9d9b5d926079a RY(p2₄) 3eddee841fb24f60b4a7a45288104964--24bb6701f2684ddbbeb9d9b5d926079a 20bf3cb7693b49289b075950a6575103 RX(p2₈) 24bb6701f2684ddbbeb9d9b5d926079a--20bf3cb7693b49289b075950a6575103 81cbc1e00b57438b89220002b263b988 20bf3cb7693b49289b075950a6575103--81cbc1e00b57438b89220002b263b988 bd51e959c35d45eb92955ea2a7398a6d 81cbc1e00b57438b89220002b263b988--bd51e959c35d45eb92955ea2a7398a6d ea275d375bac4414892d74263b85b329 RX(p2₁₂) bd51e959c35d45eb92955ea2a7398a6d--ea275d375bac4414892d74263b85b329 e7298177a53d4704b2d1d9a9eac4a228 RY(p2₁₆) ea275d375bac4414892d74263b85b329--e7298177a53d4704b2d1d9a9eac4a228 2b755f54705b4e10bfc88528346b42b4 RX(p2₂₀) e7298177a53d4704b2d1d9a9eac4a228--2b755f54705b4e10bfc88528346b42b4 bced6b45374f465390b3bdd193a23714 2b755f54705b4e10bfc88528346b42b4--bced6b45374f465390b3bdd193a23714 0c392da75c564cb289ca09f1be843ecb bced6b45374f465390b3bdd193a23714--0c392da75c564cb289ca09f1be843ecb ddb1ac28251c4542884c03aa7b1238a3 0c392da75c564cb289ca09f1be843ecb--ddb1ac28251c4542884c03aa7b1238a3 a01e51abb39c48f2bd194921df858c4e 3f717a2e519a4a9ea833293531cff8ee RX(p1₁) 9425e0c7bd7b4e868d62d2ec43f19868--3f717a2e519a4a9ea833293531cff8ee a9c1e1e6a031407f8539da36a282859a 2 d56b9145a34348e083e74cca05608845 RY(p1₅) 3f717a2e519a4a9ea833293531cff8ee--d56b9145a34348e083e74cca05608845 4e7edeace4af42b194c99905f27ae950 RX(p1₉) d56b9145a34348e083e74cca05608845--4e7edeace4af42b194c99905f27ae950 de9caa4e44d44335846f9ed3d0d8fbdc X 4e7edeace4af42b194c99905f27ae950--de9caa4e44d44335846f9ed3d0d8fbdc de9caa4e44d44335846f9ed3d0d8fbdc--da2c335c159b4b27a80cc20d9ecf782a 4c63579cc4254841a39e1d582d99d7c6 de9caa4e44d44335846f9ed3d0d8fbdc--4c63579cc4254841a39e1d582d99d7c6 a5741bcea78c486bbecf3a9760ba2297 RX(p1₁₃) 4c63579cc4254841a39e1d582d99d7c6--a5741bcea78c486bbecf3a9760ba2297 803d0025ffa34a76ab576d278469a9ce RY(p1₁₇) a5741bcea78c486bbecf3a9760ba2297--803d0025ffa34a76ab576d278469a9ce 6d78c0f42a9345f992b4132b4a669433 RX(p1₂₁) 803d0025ffa34a76ab576d278469a9ce--6d78c0f42a9345f992b4132b4a669433 44309d13d0a843ab869df202004cf2ff X 6d78c0f42a9345f992b4132b4a669433--44309d13d0a843ab869df202004cf2ff 44309d13d0a843ab869df202004cf2ff--ba75e27a29a14f68932e4f27688e7c7a 05e78b3f3ce041d4b14b7bed55855ba0 44309d13d0a843ab869df202004cf2ff--05e78b3f3ce041d4b14b7bed55855ba0 ccd9ff295ae24b47a53cd2180f6ad3fb RX(p2₁) 05e78b3f3ce041d4b14b7bed55855ba0--ccd9ff295ae24b47a53cd2180f6ad3fb 0ddc5927723b43d0a017b5b59c2d0dc1 RY(p2₅) ccd9ff295ae24b47a53cd2180f6ad3fb--0ddc5927723b43d0a017b5b59c2d0dc1 926b4496bdfc48c09a65982d7630b925 RX(p2₉) 0ddc5927723b43d0a017b5b59c2d0dc1--926b4496bdfc48c09a65982d7630b925 ae6f985fa7624750a0832e41b7592ba0 X 926b4496bdfc48c09a65982d7630b925--ae6f985fa7624750a0832e41b7592ba0 ae6f985fa7624750a0832e41b7592ba0--81cbc1e00b57438b89220002b263b988 d25e4a004e2d469896f082ab814d5f1b ae6f985fa7624750a0832e41b7592ba0--d25e4a004e2d469896f082ab814d5f1b bcbca67f2c31408ea0d62f81824a51fa RX(p2₁₃) d25e4a004e2d469896f082ab814d5f1b--bcbca67f2c31408ea0d62f81824a51fa 1171efcfbe0944aca6703d1586fe7bcf RY(p2₁₇) bcbca67f2c31408ea0d62f81824a51fa--1171efcfbe0944aca6703d1586fe7bcf 6d7eed4cece34dd2a27f8ab4319f143f RX(p2₂₁) 1171efcfbe0944aca6703d1586fe7bcf--6d7eed4cece34dd2a27f8ab4319f143f 5f4ccc8e19204e50a39bad0c745db7fa X 6d7eed4cece34dd2a27f8ab4319f143f--5f4ccc8e19204e50a39bad0c745db7fa 5f4ccc8e19204e50a39bad0c745db7fa--bced6b45374f465390b3bdd193a23714 585a362e6fb44965932b6604a3ad34c4 5f4ccc8e19204e50a39bad0c745db7fa--585a362e6fb44965932b6604a3ad34c4 585a362e6fb44965932b6604a3ad34c4--a01e51abb39c48f2bd194921df858c4e 344bc19e28c7470682ce8add79139a2d 68fd42cc4b504c2a8b96a2d1c17ae90c RX(p1₂) a9c1e1e6a031407f8539da36a282859a--68fd42cc4b504c2a8b96a2d1c17ae90c 9009f27c35714aa39cd27bab6c7fd0f1 3 a4f008af8027457f8f5dbcd448f38122 RY(p1₆) 68fd42cc4b504c2a8b96a2d1c17ae90c--a4f008af8027457f8f5dbcd448f38122 188af2ca8ee14181a0420b0f550ff36f RX(p1₁₀) a4f008af8027457f8f5dbcd448f38122--188af2ca8ee14181a0420b0f550ff36f eb72661b670e415881a7fa99f2e6a567 188af2ca8ee14181a0420b0f550ff36f--eb72661b670e415881a7fa99f2e6a567 4b76a2a3c6c548a7bfb0bfff92b25ec3 X eb72661b670e415881a7fa99f2e6a567--4b76a2a3c6c548a7bfb0bfff92b25ec3 4b76a2a3c6c548a7bfb0bfff92b25ec3--4c63579cc4254841a39e1d582d99d7c6 e480f9e5d22e440a88f554a56210347f RX(p1₁₄) 4b76a2a3c6c548a7bfb0bfff92b25ec3--e480f9e5d22e440a88f554a56210347f 9a568d21f0e74f4489e04733f123f26b RY(p1₁₈) e480f9e5d22e440a88f554a56210347f--9a568d21f0e74f4489e04733f123f26b 0d823681473a47638967f74b2281a167 RX(p1₂₂) 9a568d21f0e74f4489e04733f123f26b--0d823681473a47638967f74b2281a167 6d0fb181377e469892e2bd40008903c2 0d823681473a47638967f74b2281a167--6d0fb181377e469892e2bd40008903c2 ccde59b54887429280669bc05369bb21 X 6d0fb181377e469892e2bd40008903c2--ccde59b54887429280669bc05369bb21 ccde59b54887429280669bc05369bb21--05e78b3f3ce041d4b14b7bed55855ba0 8b485b3a1be34d95865f8cb70de75194 RX(p2₂) ccde59b54887429280669bc05369bb21--8b485b3a1be34d95865f8cb70de75194 ee102f91b9564476b8aea00fbbba0581 RY(p2₆) 8b485b3a1be34d95865f8cb70de75194--ee102f91b9564476b8aea00fbbba0581 2cfc3c70170441d297e25ae567330e2d RX(p2₁₀) ee102f91b9564476b8aea00fbbba0581--2cfc3c70170441d297e25ae567330e2d a7fb9fb0bfd9428cb640209146dd0db3 2cfc3c70170441d297e25ae567330e2d--a7fb9fb0bfd9428cb640209146dd0db3 0e98f758202d4d3494902d919c4c86d0 X a7fb9fb0bfd9428cb640209146dd0db3--0e98f758202d4d3494902d919c4c86d0 0e98f758202d4d3494902d919c4c86d0--d25e4a004e2d469896f082ab814d5f1b 2678325a5b4c44d8b6420ed50d7b9dce RX(p2₁₄) 0e98f758202d4d3494902d919c4c86d0--2678325a5b4c44d8b6420ed50d7b9dce dbe0769cc2f94062a1d22cfb155557cb RY(p2₁₈) 2678325a5b4c44d8b6420ed50d7b9dce--dbe0769cc2f94062a1d22cfb155557cb a22ec04d2fad4a44a0f3f3ac244dea4c RX(p2₂₂) dbe0769cc2f94062a1d22cfb155557cb--a22ec04d2fad4a44a0f3f3ac244dea4c c1207884ded44249874c801df4baaa16 a22ec04d2fad4a44a0f3f3ac244dea4c--c1207884ded44249874c801df4baaa16 ba9ee60d96164f2b952d233cf33d827a X c1207884ded44249874c801df4baaa16--ba9ee60d96164f2b952d233cf33d827a ba9ee60d96164f2b952d233cf33d827a--585a362e6fb44965932b6604a3ad34c4 ba9ee60d96164f2b952d233cf33d827a--344bc19e28c7470682ce8add79139a2d 92ece065b9454acea027484a54392d98 35007b8f49dd45aa95289bfdbf9c296c RX(p1₃) 9009f27c35714aa39cd27bab6c7fd0f1--35007b8f49dd45aa95289bfdbf9c296c 78c757730d3446d5be7720af140c7b5e RY(p1₇) 35007b8f49dd45aa95289bfdbf9c296c--78c757730d3446d5be7720af140c7b5e bc8b907581504cfa9bddd850271bce18 RX(p1₁₁) 78c757730d3446d5be7720af140c7b5e--bc8b907581504cfa9bddd850271bce18 1559714596c643bd899df09e9e437926 X bc8b907581504cfa9bddd850271bce18--1559714596c643bd899df09e9e437926 1559714596c643bd899df09e9e437926--eb72661b670e415881a7fa99f2e6a567 bb017b3669094ceaa9fa817d03616d15 1559714596c643bd899df09e9e437926--bb017b3669094ceaa9fa817d03616d15 ba200b87cf6445b2935307a0d574e97a RX(p1₁₅) bb017b3669094ceaa9fa817d03616d15--ba200b87cf6445b2935307a0d574e97a f34e1d04d6a64bfaa95881b31ce994e7 RY(p1₁₉) ba200b87cf6445b2935307a0d574e97a--f34e1d04d6a64bfaa95881b31ce994e7 069e79b384674cf3ab646a16ef423ec9 RX(p1₂₃) f34e1d04d6a64bfaa95881b31ce994e7--069e79b384674cf3ab646a16ef423ec9 94c0536499d94b42933acbc2b524c8f9 X 069e79b384674cf3ab646a16ef423ec9--94c0536499d94b42933acbc2b524c8f9 94c0536499d94b42933acbc2b524c8f9--6d0fb181377e469892e2bd40008903c2 cf63ac783e8b46c0a82eda7829b3d20c 94c0536499d94b42933acbc2b524c8f9--cf63ac783e8b46c0a82eda7829b3d20c 09b363e6da1e440caee6182f87cf84a5 RX(p2₃) cf63ac783e8b46c0a82eda7829b3d20c--09b363e6da1e440caee6182f87cf84a5 2b1ab8d000c646de989dfd042c903802 RY(p2₇) 09b363e6da1e440caee6182f87cf84a5--2b1ab8d000c646de989dfd042c903802 fb1155e5cd88451a81cf2e2ec2fae07c RX(p2₁₁) 2b1ab8d000c646de989dfd042c903802--fb1155e5cd88451a81cf2e2ec2fae07c e5e7e498e85745dab67f9378ac8be531 X fb1155e5cd88451a81cf2e2ec2fae07c--e5e7e498e85745dab67f9378ac8be531 e5e7e498e85745dab67f9378ac8be531--a7fb9fb0bfd9428cb640209146dd0db3 d5fd5d6f270745a5bfeb25469452a1f4 e5e7e498e85745dab67f9378ac8be531--d5fd5d6f270745a5bfeb25469452a1f4 554e0fc13be646499b6302525b8d57c4 RX(p2₁₅) d5fd5d6f270745a5bfeb25469452a1f4--554e0fc13be646499b6302525b8d57c4 71a0da834768451e9afaa439e9878f62 RY(p2₁₉) 554e0fc13be646499b6302525b8d57c4--71a0da834768451e9afaa439e9878f62 1bd3fcc8b1534dfcb7481960afe850d3 RX(p2₂₃) 71a0da834768451e9afaa439e9878f62--1bd3fcc8b1534dfcb7481960afe850d3 f7eaf4c4ae0144bc844c83d74a1e3bc5 X 1bd3fcc8b1534dfcb7481960afe850d3--f7eaf4c4ae0144bc844c83d74a1e3bc5 f7eaf4c4ae0144bc844c83d74a1e3bc5--c1207884ded44249874c801df4baaa16 94df4382f3064e5da2b530700b6dccaa f7eaf4c4ae0144bc844c83d74a1e3bc5--94df4382f3064e5da2b530700b6dccaa 94df4382f3064e5da2b530700b6dccaa--92ece065b9454acea027484a54392d98

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]])