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 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.9903+0.0000j, 0.0000-0.1388j]])

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.8950+0.0000j, 0.0000-0.4460j],
        [0.9960+0.0000j, 0.0000-0.0893j]])

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.7308+0.0000j, 0.6788+0.0000j, 0.0000-0.0523j, 0.0000-0.0486j]])

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_9aa7e5cbc3c442c7a073b572eb4d4460 [* 2] cluster_378cf4964662445f837893df4790c1fb Rotations df84abf7f0f94f98a91c407ac2c39b17 0 3bcd7ebc1d024ecbbbee121b6ea10bda RX(phi/theta) df84abf7f0f94f98a91c407ac2c39b17--3bcd7ebc1d024ecbbbee121b6ea10bda f3ce1eb1046e47668a5a94fd07a53c77 1 67b4fbdb84c547cfb2e54a43aa103a8c RX(phi) 3bcd7ebc1d024ecbbbee121b6ea10bda--67b4fbdb84c547cfb2e54a43aa103a8c 0470deebc089482ea8c214ddb60ee1d5 RX(phi) 67b4fbdb84c547cfb2e54a43aa103a8c--0470deebc089482ea8c214ddb60ee1d5 375485c6f9cb4b489b5fe9869f4bbf3d RX(phi + theta) 0470deebc089482ea8c214ddb60ee1d5--375485c6f9cb4b489b5fe9869f4bbf3d 02280914d36240a899d1cbad7fd7134c 375485c6f9cb4b489b5fe9869f4bbf3d--02280914d36240a899d1cbad7fd7134c 0aa3dc67ed7144329bbeac0d443cd8f8 02280914d36240a899d1cbad7fd7134c--0aa3dc67ed7144329bbeac0d443cd8f8 9d97e180fb504a7b8293da97e9986c38 Z 0aa3dc67ed7144329bbeac0d443cd8f8--9d97e180fb504a7b8293da97e9986c38 c363e1fa79b24f1cb2cce61fc2f567fc 9d97e180fb504a7b8293da97e9986c38--c363e1fa79b24f1cb2cce61fc2f567fc 040ddf7e4e1340d694c39ae3fddfe589 96fb2fc5cc3949c5966800dff5ed7a63 RY(2*theta) f3ce1eb1046e47668a5a94fd07a53c77--96fb2fc5cc3949c5966800dff5ed7a63 dd4215f55c9640e0b534c19fe7af3355 2 8907a0d298ba432fb77817a1dd7ce662 RY(theta) 96fb2fc5cc3949c5966800dff5ed7a63--8907a0d298ba432fb77817a1dd7ce662 a8774afdadd94ecb910546254ec9fb65 RY(theta) 8907a0d298ba432fb77817a1dd7ce662--a8774afdadd94ecb910546254ec9fb65 d575ba7ddf0f4695a78ba0c40edaa24a RY(theta**2) a8774afdadd94ecb910546254ec9fb65--d575ba7ddf0f4695a78ba0c40edaa24a 8fbaccfd34cb49c194645ccf9b3a9365 X d575ba7ddf0f4695a78ba0c40edaa24a--8fbaccfd34cb49c194645ccf9b3a9365 8fbaccfd34cb49c194645ccf9b3a9365--02280914d36240a899d1cbad7fd7134c ac9a4f86fefd49f1a24ab2ddffe284f2 8fbaccfd34cb49c194645ccf9b3a9365--ac9a4f86fefd49f1a24ab2ddffe284f2 3fb6e1422f814c6e8726e046712d04a5 Z ac9a4f86fefd49f1a24ab2ddffe284f2--3fb6e1422f814c6e8726e046712d04a5 3fb6e1422f814c6e8726e046712d04a5--040ddf7e4e1340d694c39ae3fddfe589 9ce444796cbe4bdaadc43862f8e706ff 328ce74e0f30427e868f8a359f3f2b18 RZ(cos(phi)) dd4215f55c9640e0b534c19fe7af3355--328ce74e0f30427e868f8a359f3f2b18 e8249fc78bbe473ba2b9852f8334e69d RZ(phi) 328ce74e0f30427e868f8a359f3f2b18--e8249fc78bbe473ba2b9852f8334e69d d2bc140fa4f24948a624a1fbdeaa824e RZ(phi) e8249fc78bbe473ba2b9852f8334e69d--d2bc140fa4f24948a624a1fbdeaa824e 686821479795441eb23b8975470a3cfa RZ(cos(phi)) d2bc140fa4f24948a624a1fbdeaa824e--686821479795441eb23b8975470a3cfa 88ac8214e5a445e790a4826f2aa1c6a6 686821479795441eb23b8975470a3cfa--88ac8214e5a445e790a4826f2aa1c6a6 3e90e5c90ae141af860831558ca34ef8 X 88ac8214e5a445e790a4826f2aa1c6a6--3e90e5c90ae141af860831558ca34ef8 3e90e5c90ae141af860831558ca34ef8--ac9a4f86fefd49f1a24ab2ddffe284f2 c72d7dcd0960404d8a79d7e67ac62052 Z 3e90e5c90ae141af860831558ca34ef8--c72d7dcd0960404d8a79d7e67ac62052 c72d7dcd0960404d8a79d7e67ac62052--9ce444796cbe4bdaadc43862f8e706ff

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

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.9868+0.0000j, 0.1142+0.0000j, 0.0000-0.1142j, 0.0000-0.0132j],
        [0.9047+0.0000j, 0.2937+0.0000j, 0.0000-0.2937j, 0.0000-0.0953j],
        [0.8202+0.0000j, 0.3840+0.0000j, 0.0000-0.3840j, 0.0000-0.1798j]],
       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 dc76db6ec219418686f3e9f833d769cb 0 1f2dc5ae6446455a89777a345c54d4a5 RX(theta₀) dc76db6ec219418686f3e9f833d769cb--1f2dc5ae6446455a89777a345c54d4a5 bbd409c1550a4ad9bc5e091dd2359159 1 477fb21f31ec4eb18bdb7694a61043a9 RY(theta₄) 1f2dc5ae6446455a89777a345c54d4a5--477fb21f31ec4eb18bdb7694a61043a9 1abc1d3bdc9b4962960bda5db8eb4f39 RX(theta₈) 477fb21f31ec4eb18bdb7694a61043a9--1abc1d3bdc9b4962960bda5db8eb4f39 6805df645eb0496aa795460abdee85da 1abc1d3bdc9b4962960bda5db8eb4f39--6805df645eb0496aa795460abdee85da f5c96a57c6a445c5a9cedb7ef55d489e 6805df645eb0496aa795460abdee85da--f5c96a57c6a445c5a9cedb7ef55d489e 06afcb57155247f786278c50145f8199 RX(theta₁₂) f5c96a57c6a445c5a9cedb7ef55d489e--06afcb57155247f786278c50145f8199 0babb7438a5c46a38235d8f4b4ae7849 RY(theta₁₆) 06afcb57155247f786278c50145f8199--0babb7438a5c46a38235d8f4b4ae7849 7179fd6275e44db38604b5d8fca32325 RX(theta₂₀) 0babb7438a5c46a38235d8f4b4ae7849--7179fd6275e44db38604b5d8fca32325 ea035ba6ea244169842642d8282c65da 7179fd6275e44db38604b5d8fca32325--ea035ba6ea244169842642d8282c65da b2102d1979894277b1619d3981c2ab93 ea035ba6ea244169842642d8282c65da--b2102d1979894277b1619d3981c2ab93 a29437c70e9741e59cf0bd2d499be90a b2102d1979894277b1619d3981c2ab93--a29437c70e9741e59cf0bd2d499be90a 6ae2eeb7f1154c008af032a449d93306 aa4626b57c2349919d8347e6f9c7e324 RX(theta₁) bbd409c1550a4ad9bc5e091dd2359159--aa4626b57c2349919d8347e6f9c7e324 49b1760fb51d41eda1c5ebc66bd68107 2 94c1d3107c5e4932bf3b6e7c039d640e RY(theta₅) aa4626b57c2349919d8347e6f9c7e324--94c1d3107c5e4932bf3b6e7c039d640e 89787966ab344e22950e6b10c1cd0c9a RX(theta₉) 94c1d3107c5e4932bf3b6e7c039d640e--89787966ab344e22950e6b10c1cd0c9a 1ed2686395254075aa3e4d64c75579d9 X 89787966ab344e22950e6b10c1cd0c9a--1ed2686395254075aa3e4d64c75579d9 1ed2686395254075aa3e4d64c75579d9--6805df645eb0496aa795460abdee85da f89a73b6d9974ee3a450cba53158e144 1ed2686395254075aa3e4d64c75579d9--f89a73b6d9974ee3a450cba53158e144 13badfda85b24f7a9b918d660f150e23 RX(theta₁₃) f89a73b6d9974ee3a450cba53158e144--13badfda85b24f7a9b918d660f150e23 7c8f1e24ee4040c3b5695cb1c0b12009 RY(theta₁₇) 13badfda85b24f7a9b918d660f150e23--7c8f1e24ee4040c3b5695cb1c0b12009 a65015a6ccda4ae9b486c53627212853 RX(theta₂₁) 7c8f1e24ee4040c3b5695cb1c0b12009--a65015a6ccda4ae9b486c53627212853 fa3f20b7c6f44c61bd882bde9914727a X a65015a6ccda4ae9b486c53627212853--fa3f20b7c6f44c61bd882bde9914727a fa3f20b7c6f44c61bd882bde9914727a--ea035ba6ea244169842642d8282c65da d891f339b84f4164abe5dc646b519dd2 fa3f20b7c6f44c61bd882bde9914727a--d891f339b84f4164abe5dc646b519dd2 d891f339b84f4164abe5dc646b519dd2--6ae2eeb7f1154c008af032a449d93306 74de9b235ed745d2b6cbf11a72e00aec 02665a1dbc1b46128291a9a390f54d09 RX(theta₂) 49b1760fb51d41eda1c5ebc66bd68107--02665a1dbc1b46128291a9a390f54d09 5b0f4a43bd974782a8a6834760d5ac78 3 b2d007ce917842f987c4a5d7ff1f6384 RY(theta₆) 02665a1dbc1b46128291a9a390f54d09--b2d007ce917842f987c4a5d7ff1f6384 02ebf66f29594d0491f45c845c1e4693 RX(theta₁₀) b2d007ce917842f987c4a5d7ff1f6384--02ebf66f29594d0491f45c845c1e4693 71ca3745c0dd4fdf84b5f0f75e21813d 02ebf66f29594d0491f45c845c1e4693--71ca3745c0dd4fdf84b5f0f75e21813d 41bbd6c180404139b929e207576baecc X 71ca3745c0dd4fdf84b5f0f75e21813d--41bbd6c180404139b929e207576baecc 41bbd6c180404139b929e207576baecc--f89a73b6d9974ee3a450cba53158e144 61e897850d9849d9b0a8e154ad4ba4c5 RX(theta₁₄) 41bbd6c180404139b929e207576baecc--61e897850d9849d9b0a8e154ad4ba4c5 9a2559c306514473b3db95b370a6e47f RY(theta₁₈) 61e897850d9849d9b0a8e154ad4ba4c5--9a2559c306514473b3db95b370a6e47f 3efde368b5074cebaa5dcab70f35b689 RX(theta₂₂) 9a2559c306514473b3db95b370a6e47f--3efde368b5074cebaa5dcab70f35b689 6890a6d9dce24ec78eb520c6e2adcbf9 3efde368b5074cebaa5dcab70f35b689--6890a6d9dce24ec78eb520c6e2adcbf9 4c34ae869d744aa5803c7e1af0a1b705 X 6890a6d9dce24ec78eb520c6e2adcbf9--4c34ae869d744aa5803c7e1af0a1b705 4c34ae869d744aa5803c7e1af0a1b705--d891f339b84f4164abe5dc646b519dd2 4c34ae869d744aa5803c7e1af0a1b705--74de9b235ed745d2b6cbf11a72e00aec 9bdcd00b86e54819b825980995360708 4879fd281ae647b29c1410ef437258a0 RX(theta₃) 5b0f4a43bd974782a8a6834760d5ac78--4879fd281ae647b29c1410ef437258a0 c7a749163cca44bc9ed6da029c79ef06 RY(theta₇) 4879fd281ae647b29c1410ef437258a0--c7a749163cca44bc9ed6da029c79ef06 77580ecc7fe64375b8765e667b158b22 RX(theta₁₁) c7a749163cca44bc9ed6da029c79ef06--77580ecc7fe64375b8765e667b158b22 7b6f31215c614cc0b4612490f7940ab7 X 77580ecc7fe64375b8765e667b158b22--7b6f31215c614cc0b4612490f7940ab7 7b6f31215c614cc0b4612490f7940ab7--71ca3745c0dd4fdf84b5f0f75e21813d fd9f44905e164372aa9caf9b98ed6d48 7b6f31215c614cc0b4612490f7940ab7--fd9f44905e164372aa9caf9b98ed6d48 d53bc3fa8d9b4e5da5604ab6ef2bf798 RX(theta₁₅) fd9f44905e164372aa9caf9b98ed6d48--d53bc3fa8d9b4e5da5604ab6ef2bf798 c9addcb944f247df8aaa35c6fc25b485 RY(theta₁₉) d53bc3fa8d9b4e5da5604ab6ef2bf798--c9addcb944f247df8aaa35c6fc25b485 09aeac1ce6af4c1ba9329bb66595a371 RX(theta₂₃) c9addcb944f247df8aaa35c6fc25b485--09aeac1ce6af4c1ba9329bb66595a371 56c95012005c4af3a124799baa3dde94 X 09aeac1ce6af4c1ba9329bb66595a371--56c95012005c4af3a124799baa3dde94 56c95012005c4af3a124799baa3dde94--6890a6d9dce24ec78eb520c6e2adcbf9 a7e3ff84458c4308a43db3baf193cf7a 56c95012005c4af3a124799baa3dde94--a7e3ff84458c4308a43db3baf193cf7a a7e3ff84458c4308a43db3baf193cf7a--9bdcd00b86e54819b825980995360708

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_053be443493843e48dc0b6cfa30978f0 HEA cluster_e9cdae40075b482292b72dab8ae51be3 HEA 8175c34943a9489482bfdec2094ab2e5 0 8cf4e0d7873b4cd1a4e80d4c1d685f1c RX(theta₀) 8175c34943a9489482bfdec2094ab2e5--8cf4e0d7873b4cd1a4e80d4c1d685f1c 50963c388a2d45a8a37195e9c44a23d5 1 b101c15148cf45aa821cbd77d9b9c998 RY(theta₄) 8cf4e0d7873b4cd1a4e80d4c1d685f1c--b101c15148cf45aa821cbd77d9b9c998 169f840298484012b376b339095432c5 RX(theta₈) b101c15148cf45aa821cbd77d9b9c998--169f840298484012b376b339095432c5 baf92e5b562a47888457cb36cd099779 169f840298484012b376b339095432c5--baf92e5b562a47888457cb36cd099779 50f29f299db64e35a8ee1039bd0a8d97 baf92e5b562a47888457cb36cd099779--50f29f299db64e35a8ee1039bd0a8d97 7fa428a83b38445b9b1972f88fae19d7 RX(theta₁₂) 50f29f299db64e35a8ee1039bd0a8d97--7fa428a83b38445b9b1972f88fae19d7 5df1ac861f2d4c9ca6d52c4ada80289b RY(theta₁₆) 7fa428a83b38445b9b1972f88fae19d7--5df1ac861f2d4c9ca6d52c4ada80289b d95291722ec842348962e1ddb1c2c741 RX(theta₂₀) 5df1ac861f2d4c9ca6d52c4ada80289b--d95291722ec842348962e1ddb1c2c741 00aa1646311a4c30871a130e270a7946 d95291722ec842348962e1ddb1c2c741--00aa1646311a4c30871a130e270a7946 7035ced06d3a41f095e0db7564a3217c 00aa1646311a4c30871a130e270a7946--7035ced06d3a41f095e0db7564a3217c 1ba92aae8e954e5f8c7ee654ed95d148 RX(theta₀) 7035ced06d3a41f095e0db7564a3217c--1ba92aae8e954e5f8c7ee654ed95d148 54469788c3f6493dab90acc74032dc59 RY(theta₄) 1ba92aae8e954e5f8c7ee654ed95d148--54469788c3f6493dab90acc74032dc59 ba4e1e4db60644fe82366b5d4c095785 RX(theta₈) 54469788c3f6493dab90acc74032dc59--ba4e1e4db60644fe82366b5d4c095785 27b1fdda4c274416a331d95dc6caedc0 ba4e1e4db60644fe82366b5d4c095785--27b1fdda4c274416a331d95dc6caedc0 c45b15a5f0d541c9bc11d86005d18d57 27b1fdda4c274416a331d95dc6caedc0--c45b15a5f0d541c9bc11d86005d18d57 a8e7ad2e48db4768be86b5be8498eeb7 RX(theta₁₂) c45b15a5f0d541c9bc11d86005d18d57--a8e7ad2e48db4768be86b5be8498eeb7 135921978d1d4c8d91d9490a3eb89241 RY(theta₁₆) a8e7ad2e48db4768be86b5be8498eeb7--135921978d1d4c8d91d9490a3eb89241 58eab06bd6054980ae049b809ca8a88b RX(theta₂₀) 135921978d1d4c8d91d9490a3eb89241--58eab06bd6054980ae049b809ca8a88b 1c14be7b28d24dda8040df74aef9c045 58eab06bd6054980ae049b809ca8a88b--1c14be7b28d24dda8040df74aef9c045 993f844c450f4f0f827df134f94037ce 1c14be7b28d24dda8040df74aef9c045--993f844c450f4f0f827df134f94037ce a0de7e0f9b464f0b87ec0b02784e070b 993f844c450f4f0f827df134f94037ce--a0de7e0f9b464f0b87ec0b02784e070b ed2c8bdbd6ac4f6cabeaaf28c72660ed 8824247294c04e77b82eb82f601ffe99 RX(theta₁) 50963c388a2d45a8a37195e9c44a23d5--8824247294c04e77b82eb82f601ffe99 1407bacc2232448b822afc647c208d1f 2 2c0216ef77424d17b70179b69c21147f RY(theta₅) 8824247294c04e77b82eb82f601ffe99--2c0216ef77424d17b70179b69c21147f d8547d6eafd644e897110ba9bff526ba RX(theta₉) 2c0216ef77424d17b70179b69c21147f--d8547d6eafd644e897110ba9bff526ba b47e1e69463840a993ab14a017974925 X d8547d6eafd644e897110ba9bff526ba--b47e1e69463840a993ab14a017974925 b47e1e69463840a993ab14a017974925--baf92e5b562a47888457cb36cd099779 a4c1050d430540b5abda81d362c7990c b47e1e69463840a993ab14a017974925--a4c1050d430540b5abda81d362c7990c e2576e760cf9454e948259ca59c85b8d RX(theta₁₃) a4c1050d430540b5abda81d362c7990c--e2576e760cf9454e948259ca59c85b8d 2c71367eb1844802914074a8b14eb631 RY(theta₁₇) e2576e760cf9454e948259ca59c85b8d--2c71367eb1844802914074a8b14eb631 7f5d0e442d24409b939a83fd93fde11d RX(theta₂₁) 2c71367eb1844802914074a8b14eb631--7f5d0e442d24409b939a83fd93fde11d 6daa4d944fe84e20b271935e2ccadeab X 7f5d0e442d24409b939a83fd93fde11d--6daa4d944fe84e20b271935e2ccadeab 6daa4d944fe84e20b271935e2ccadeab--00aa1646311a4c30871a130e270a7946 cceaf3de94884926b39cb0035cf8b71e 6daa4d944fe84e20b271935e2ccadeab--cceaf3de94884926b39cb0035cf8b71e 0467d5cbcb684c09a02e5ce9505c63d6 RX(theta₁) cceaf3de94884926b39cb0035cf8b71e--0467d5cbcb684c09a02e5ce9505c63d6 01e7c62b6ab24bd39272e4aab35d7773 RY(theta₅) 0467d5cbcb684c09a02e5ce9505c63d6--01e7c62b6ab24bd39272e4aab35d7773 cb38f4eedad945eaa1eda5359d1043b5 RX(theta₉) 01e7c62b6ab24bd39272e4aab35d7773--cb38f4eedad945eaa1eda5359d1043b5 aca0ca29c878474cb746199a48a9213f X cb38f4eedad945eaa1eda5359d1043b5--aca0ca29c878474cb746199a48a9213f aca0ca29c878474cb746199a48a9213f--27b1fdda4c274416a331d95dc6caedc0 5884b27520384884b7a2592b55a6766f aca0ca29c878474cb746199a48a9213f--5884b27520384884b7a2592b55a6766f c7f3d7aca36f46c6891662d40ae95b08 RX(theta₁₃) 5884b27520384884b7a2592b55a6766f--c7f3d7aca36f46c6891662d40ae95b08 f69de6c7772a421b8bde507a00f61cf7 RY(theta₁₇) c7f3d7aca36f46c6891662d40ae95b08--f69de6c7772a421b8bde507a00f61cf7 e320f3b9fea5485d8a3afe460f2edeb3 RX(theta₂₁) f69de6c7772a421b8bde507a00f61cf7--e320f3b9fea5485d8a3afe460f2edeb3 5a7d0d363e0e45cc86d9bc8af171f140 X e320f3b9fea5485d8a3afe460f2edeb3--5a7d0d363e0e45cc86d9bc8af171f140 5a7d0d363e0e45cc86d9bc8af171f140--1c14be7b28d24dda8040df74aef9c045 c6921ae30ac247c1adb4b7bf8c700d34 5a7d0d363e0e45cc86d9bc8af171f140--c6921ae30ac247c1adb4b7bf8c700d34 c6921ae30ac247c1adb4b7bf8c700d34--ed2c8bdbd6ac4f6cabeaaf28c72660ed 65ea8f3d345d400e8c3f855f70546ed7 a14fd72f21844f2d9a837816d326b81f RX(theta₂) 1407bacc2232448b822afc647c208d1f--a14fd72f21844f2d9a837816d326b81f a951716e9a6840e7a1b30078a675dfb4 3 b8b1c101835e4cceac522129a5021beb RY(theta₆) a14fd72f21844f2d9a837816d326b81f--b8b1c101835e4cceac522129a5021beb 4651ca6dc43e47e392da9c2917b25009 RX(theta₁₀) b8b1c101835e4cceac522129a5021beb--4651ca6dc43e47e392da9c2917b25009 3be16a1e2ff843abaa5bfd67216f5d7f 4651ca6dc43e47e392da9c2917b25009--3be16a1e2ff843abaa5bfd67216f5d7f 8faed86b9b1a488fbd38a1af15ae146d X 3be16a1e2ff843abaa5bfd67216f5d7f--8faed86b9b1a488fbd38a1af15ae146d 8faed86b9b1a488fbd38a1af15ae146d--a4c1050d430540b5abda81d362c7990c db2d8bb27cdd41339467ba3da723b7a2 RX(theta₁₄) 8faed86b9b1a488fbd38a1af15ae146d--db2d8bb27cdd41339467ba3da723b7a2 7560bbc2c6fe45ebbe6af6a73182cfdb RY(theta₁₈) db2d8bb27cdd41339467ba3da723b7a2--7560bbc2c6fe45ebbe6af6a73182cfdb 9921d4a1a5004281b8c44de12d317da9 RX(theta₂₂) 7560bbc2c6fe45ebbe6af6a73182cfdb--9921d4a1a5004281b8c44de12d317da9 ec9b0744009a4422afbc7771e41c2187 9921d4a1a5004281b8c44de12d317da9--ec9b0744009a4422afbc7771e41c2187 7c91f8d509a84cf69bfd70d19b2eed21 X ec9b0744009a4422afbc7771e41c2187--7c91f8d509a84cf69bfd70d19b2eed21 7c91f8d509a84cf69bfd70d19b2eed21--cceaf3de94884926b39cb0035cf8b71e 169ccb94a68f4701969b1582c38a84e3 RX(theta₂) 7c91f8d509a84cf69bfd70d19b2eed21--169ccb94a68f4701969b1582c38a84e3 7e6b61b04a854546b71246b6369daa9d RY(theta₆) 169ccb94a68f4701969b1582c38a84e3--7e6b61b04a854546b71246b6369daa9d c202dc3a99b54e7cba1b48c22bfa0605 RX(theta₁₀) 7e6b61b04a854546b71246b6369daa9d--c202dc3a99b54e7cba1b48c22bfa0605 6fbe1682b5a64625b7eb0332ec137c39 c202dc3a99b54e7cba1b48c22bfa0605--6fbe1682b5a64625b7eb0332ec137c39 071fa610a5574040982e5ee2fc77e9b8 X 6fbe1682b5a64625b7eb0332ec137c39--071fa610a5574040982e5ee2fc77e9b8 071fa610a5574040982e5ee2fc77e9b8--5884b27520384884b7a2592b55a6766f 144a8f39853844c8b50728da57ee6335 RX(theta₁₄) 071fa610a5574040982e5ee2fc77e9b8--144a8f39853844c8b50728da57ee6335 14af9f077012440396da2b66fcdbaa80 RY(theta₁₈) 144a8f39853844c8b50728da57ee6335--14af9f077012440396da2b66fcdbaa80 55738cf902844fbb9c77fe330236c577 RX(theta₂₂) 14af9f077012440396da2b66fcdbaa80--55738cf902844fbb9c77fe330236c577 87c6b9596c154d73a7bf8e89fc0264b2 55738cf902844fbb9c77fe330236c577--87c6b9596c154d73a7bf8e89fc0264b2 7237181572bd424283f3a7648c004ee5 X 87c6b9596c154d73a7bf8e89fc0264b2--7237181572bd424283f3a7648c004ee5 7237181572bd424283f3a7648c004ee5--c6921ae30ac247c1adb4b7bf8c700d34 7237181572bd424283f3a7648c004ee5--65ea8f3d345d400e8c3f855f70546ed7 3da82fdf129f4b5d9e2a37c973adeb97 1f301856fb03483e8852a5e9c952440a RX(theta₃) a951716e9a6840e7a1b30078a675dfb4--1f301856fb03483e8852a5e9c952440a 4ef5f8e1088c410c839a51dfa558b953 RY(theta₇) 1f301856fb03483e8852a5e9c952440a--4ef5f8e1088c410c839a51dfa558b953 38493ecbc395454ebe66356b8cb1446b RX(theta₁₁) 4ef5f8e1088c410c839a51dfa558b953--38493ecbc395454ebe66356b8cb1446b 64f8b20cf7e447fdb3fc00e95e5b0771 X 38493ecbc395454ebe66356b8cb1446b--64f8b20cf7e447fdb3fc00e95e5b0771 64f8b20cf7e447fdb3fc00e95e5b0771--3be16a1e2ff843abaa5bfd67216f5d7f d9941d5ca5f841b5bdcc0800a9a4237c 64f8b20cf7e447fdb3fc00e95e5b0771--d9941d5ca5f841b5bdcc0800a9a4237c 01f23bf082374b218182675d0ec7ce43 RX(theta₁₅) d9941d5ca5f841b5bdcc0800a9a4237c--01f23bf082374b218182675d0ec7ce43 d48766a7f864467cac5728ef8e393495 RY(theta₁₉) 01f23bf082374b218182675d0ec7ce43--d48766a7f864467cac5728ef8e393495 e301417d597e4fe4bf5abd758753da31 RX(theta₂₃) d48766a7f864467cac5728ef8e393495--e301417d597e4fe4bf5abd758753da31 0a10a88b4d824b1da707ec09033904b1 X e301417d597e4fe4bf5abd758753da31--0a10a88b4d824b1da707ec09033904b1 0a10a88b4d824b1da707ec09033904b1--ec9b0744009a4422afbc7771e41c2187 01cd1dc473eb46d1bc389fec0619445b 0a10a88b4d824b1da707ec09033904b1--01cd1dc473eb46d1bc389fec0619445b 678861f286b44fa5a761274b61911091 RX(theta₃) 01cd1dc473eb46d1bc389fec0619445b--678861f286b44fa5a761274b61911091 525a146a50d0454fa2eba4df8794e2d4 RY(theta₇) 678861f286b44fa5a761274b61911091--525a146a50d0454fa2eba4df8794e2d4 5075ab8da1a9409a94047b82e9122cb6 RX(theta₁₁) 525a146a50d0454fa2eba4df8794e2d4--5075ab8da1a9409a94047b82e9122cb6 0823553d60f9408bbaa35b10e121b6ce X 5075ab8da1a9409a94047b82e9122cb6--0823553d60f9408bbaa35b10e121b6ce 0823553d60f9408bbaa35b10e121b6ce--6fbe1682b5a64625b7eb0332ec137c39 a522f98b87f0440cb0d635510aad971c 0823553d60f9408bbaa35b10e121b6ce--a522f98b87f0440cb0d635510aad971c 1ec96c56cd5a4fb2b04142e0b3464020 RX(theta₁₅) a522f98b87f0440cb0d635510aad971c--1ec96c56cd5a4fb2b04142e0b3464020 6c50d659d81c48dcb9e4c290f035149e RY(theta₁₉) 1ec96c56cd5a4fb2b04142e0b3464020--6c50d659d81c48dcb9e4c290f035149e 5e778a5da34b41db8c1b02b0d6a8984f RX(theta₂₃) 6c50d659d81c48dcb9e4c290f035149e--5e778a5da34b41db8c1b02b0d6a8984f 2550c191ca3e42b38e66d7cdd21f19d9 X 5e778a5da34b41db8c1b02b0d6a8984f--2550c191ca3e42b38e66d7cdd21f19d9 2550c191ca3e42b38e66d7cdd21f19d9--87c6b9596c154d73a7bf8e89fc0264b2 40e288b310db43de9be0f09ffb157ade 2550c191ca3e42b38e66d7cdd21f19d9--40e288b310db43de9be0f09ffb157ade 40e288b310db43de9be0f09ffb157ade--3da82fdf129f4b5d9e2a37c973adeb97

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_f781f5d63ba040f1ac68416f7e2c1da1 HEA cluster_c2e912ff01694829bbdd790e8bed2829 HEA 38ef22e8533f41dbad3e1c2313e53d5d 0 afd4cedfcb9f4b15b87095ad037a18bb RX(p1₀) 38ef22e8533f41dbad3e1c2313e53d5d--afd4cedfcb9f4b15b87095ad037a18bb 4008d7092eb34f4fab2578cf305c27de 1 6dd572797383433e9922041d78480a50 RY(p1₄) afd4cedfcb9f4b15b87095ad037a18bb--6dd572797383433e9922041d78480a50 426465ebd27046ee8b6eb7f9b72221f3 RX(p1₈) 6dd572797383433e9922041d78480a50--426465ebd27046ee8b6eb7f9b72221f3 93d79b3244df45268b3dba0e9763e1fd 426465ebd27046ee8b6eb7f9b72221f3--93d79b3244df45268b3dba0e9763e1fd 496a98f610d541e9bde16ba9d625db5d 93d79b3244df45268b3dba0e9763e1fd--496a98f610d541e9bde16ba9d625db5d d7079b537a8f46f69474e666d2d04810 RX(p1₁₂) 496a98f610d541e9bde16ba9d625db5d--d7079b537a8f46f69474e666d2d04810 b8c467d62be04ed5ae9cb729999591c6 RY(p1₁₆) d7079b537a8f46f69474e666d2d04810--b8c467d62be04ed5ae9cb729999591c6 609f24d4debc4237a40d59572d965a16 RX(p1₂₀) b8c467d62be04ed5ae9cb729999591c6--609f24d4debc4237a40d59572d965a16 fff75b967b2f4579ac94500e89a254d1 609f24d4debc4237a40d59572d965a16--fff75b967b2f4579ac94500e89a254d1 0e8386d368514c2d8a7bc18f038c979c fff75b967b2f4579ac94500e89a254d1--0e8386d368514c2d8a7bc18f038c979c dede1728619c4d918a05d89464d161dd RX(p2₀) 0e8386d368514c2d8a7bc18f038c979c--dede1728619c4d918a05d89464d161dd 1cad34d183c94af2963a3f96a3045be1 RY(p2₄) dede1728619c4d918a05d89464d161dd--1cad34d183c94af2963a3f96a3045be1 217921fcc4804d87a08bae7e69014b77 RX(p2₈) 1cad34d183c94af2963a3f96a3045be1--217921fcc4804d87a08bae7e69014b77 42b72869a11b45ca88428f6de284dc62 217921fcc4804d87a08bae7e69014b77--42b72869a11b45ca88428f6de284dc62 898400c0adde45a49f8156fc8af3d9c4 42b72869a11b45ca88428f6de284dc62--898400c0adde45a49f8156fc8af3d9c4 d05c861d30c34dbe9093957e727f6d56 RX(p2₁₂) 898400c0adde45a49f8156fc8af3d9c4--d05c861d30c34dbe9093957e727f6d56 e1c8520619bc4e3782d48102e8883812 RY(p2₁₆) d05c861d30c34dbe9093957e727f6d56--e1c8520619bc4e3782d48102e8883812 258c38c1148d46d29f2eafafbeeb4517 RX(p2₂₀) e1c8520619bc4e3782d48102e8883812--258c38c1148d46d29f2eafafbeeb4517 fd8dc9d7020140dda166a79aff910fec 258c38c1148d46d29f2eafafbeeb4517--fd8dc9d7020140dda166a79aff910fec 65a4192367db47b9b0514b29c6f66139 fd8dc9d7020140dda166a79aff910fec--65a4192367db47b9b0514b29c6f66139 71253492466d44c49e705ab161790622 65a4192367db47b9b0514b29c6f66139--71253492466d44c49e705ab161790622 6e14cbe3473c489ea9980b3ae236fb87 fa0333e0ab5547419fc4ac387090cb40 RX(p1₁) 4008d7092eb34f4fab2578cf305c27de--fa0333e0ab5547419fc4ac387090cb40 9af881a4bdeb43ddb08dd60adc1cfc47 2 4857f1f9264c42d4a5675eca4f646284 RY(p1₅) fa0333e0ab5547419fc4ac387090cb40--4857f1f9264c42d4a5675eca4f646284 0f18ff6a27464c6d9dc0ccaa54d23c9a RX(p1₉) 4857f1f9264c42d4a5675eca4f646284--0f18ff6a27464c6d9dc0ccaa54d23c9a 73a21f2a206c4d25b9f97aae7eea0a88 X 0f18ff6a27464c6d9dc0ccaa54d23c9a--73a21f2a206c4d25b9f97aae7eea0a88 73a21f2a206c4d25b9f97aae7eea0a88--93d79b3244df45268b3dba0e9763e1fd 7946449448544a839524b9a74cfda043 73a21f2a206c4d25b9f97aae7eea0a88--7946449448544a839524b9a74cfda043 8d8a0bf333a14700aeaf87c7f8da5dd0 RX(p1₁₃) 7946449448544a839524b9a74cfda043--8d8a0bf333a14700aeaf87c7f8da5dd0 df8c894a02494ddb88c873d46b0114d4 RY(p1₁₇) 8d8a0bf333a14700aeaf87c7f8da5dd0--df8c894a02494ddb88c873d46b0114d4 98afeb59b37a41eab97143809079a14d RX(p1₂₁) df8c894a02494ddb88c873d46b0114d4--98afeb59b37a41eab97143809079a14d d80a58592cbd47669d502471d32da8c1 X 98afeb59b37a41eab97143809079a14d--d80a58592cbd47669d502471d32da8c1 d80a58592cbd47669d502471d32da8c1--fff75b967b2f4579ac94500e89a254d1 ae0a754fe29e42bd9f2a50d24e64e139 d80a58592cbd47669d502471d32da8c1--ae0a754fe29e42bd9f2a50d24e64e139 f49e0510dc2e40d7a235edac4b9f766a RX(p2₁) ae0a754fe29e42bd9f2a50d24e64e139--f49e0510dc2e40d7a235edac4b9f766a 9b17adddc4784fce92f2d26546108d65 RY(p2₅) f49e0510dc2e40d7a235edac4b9f766a--9b17adddc4784fce92f2d26546108d65 97049297d4ec4b70929a30015e4b754a RX(p2₉) 9b17adddc4784fce92f2d26546108d65--97049297d4ec4b70929a30015e4b754a 0f3f73855fa646dda53d12bd17f44ae8 X 97049297d4ec4b70929a30015e4b754a--0f3f73855fa646dda53d12bd17f44ae8 0f3f73855fa646dda53d12bd17f44ae8--42b72869a11b45ca88428f6de284dc62 5f76b822db054d88a1bb64b90a74c369 0f3f73855fa646dda53d12bd17f44ae8--5f76b822db054d88a1bb64b90a74c369 748b8be73b8543b2905865b11324a901 RX(p2₁₃) 5f76b822db054d88a1bb64b90a74c369--748b8be73b8543b2905865b11324a901 8f31ad4ffcf44fea89ad5d39316bbad1 RY(p2₁₇) 748b8be73b8543b2905865b11324a901--8f31ad4ffcf44fea89ad5d39316bbad1 97938bc12567484ea76456bce33e19cf RX(p2₂₁) 8f31ad4ffcf44fea89ad5d39316bbad1--97938bc12567484ea76456bce33e19cf 1a6fbc99012f49348a7fd58ca84ae039 X 97938bc12567484ea76456bce33e19cf--1a6fbc99012f49348a7fd58ca84ae039 1a6fbc99012f49348a7fd58ca84ae039--fd8dc9d7020140dda166a79aff910fec 757a7d9c380a405a8f40fdcf838dcad8 1a6fbc99012f49348a7fd58ca84ae039--757a7d9c380a405a8f40fdcf838dcad8 757a7d9c380a405a8f40fdcf838dcad8--6e14cbe3473c489ea9980b3ae236fb87 5951ea99116b458e8fe10b68361247bd bbb35da1e3ae4ae9bbb44e9dc47154de RX(p1₂) 9af881a4bdeb43ddb08dd60adc1cfc47--bbb35da1e3ae4ae9bbb44e9dc47154de 06a1a57ba4bf419cb921796762f9274a 3 4d14debb083e4b9890632b90b9ffacf3 RY(p1₆) bbb35da1e3ae4ae9bbb44e9dc47154de--4d14debb083e4b9890632b90b9ffacf3 fb07d40a65904d3aa774ad5c8543297d RX(p1₁₀) 4d14debb083e4b9890632b90b9ffacf3--fb07d40a65904d3aa774ad5c8543297d fc2c815f43844ee2a65f91331715ddcf fb07d40a65904d3aa774ad5c8543297d--fc2c815f43844ee2a65f91331715ddcf 9e56da7e5a6a4bc4a125b24b2a4139dd X fc2c815f43844ee2a65f91331715ddcf--9e56da7e5a6a4bc4a125b24b2a4139dd 9e56da7e5a6a4bc4a125b24b2a4139dd--7946449448544a839524b9a74cfda043 677ba165ac5c4d1e8ef5424caee571c1 RX(p1₁₄) 9e56da7e5a6a4bc4a125b24b2a4139dd--677ba165ac5c4d1e8ef5424caee571c1 6713fbdae84142f5893e1e936885d0ba RY(p1₁₈) 677ba165ac5c4d1e8ef5424caee571c1--6713fbdae84142f5893e1e936885d0ba 47b755a70be14433bf90793ab8761ec1 RX(p1₂₂) 6713fbdae84142f5893e1e936885d0ba--47b755a70be14433bf90793ab8761ec1 ed46abe8ed4d41a7a13afeccab7b7165 47b755a70be14433bf90793ab8761ec1--ed46abe8ed4d41a7a13afeccab7b7165 5e429e85c882463392c6482edf181456 X ed46abe8ed4d41a7a13afeccab7b7165--5e429e85c882463392c6482edf181456 5e429e85c882463392c6482edf181456--ae0a754fe29e42bd9f2a50d24e64e139 db6ffdd6941746b198fdd1004aa7b359 RX(p2₂) 5e429e85c882463392c6482edf181456--db6ffdd6941746b198fdd1004aa7b359 3333784745114a5fa6d1712a0e116550 RY(p2₆) db6ffdd6941746b198fdd1004aa7b359--3333784745114a5fa6d1712a0e116550 d1ad1f1cf39d475aad272bc33c1f1ac3 RX(p2₁₀) 3333784745114a5fa6d1712a0e116550--d1ad1f1cf39d475aad272bc33c1f1ac3 4d0dcc51e52848798d16563d551e3c77 d1ad1f1cf39d475aad272bc33c1f1ac3--4d0dcc51e52848798d16563d551e3c77 218c3aca295740fc8e83901a64e1c00a X 4d0dcc51e52848798d16563d551e3c77--218c3aca295740fc8e83901a64e1c00a 218c3aca295740fc8e83901a64e1c00a--5f76b822db054d88a1bb64b90a74c369 5f96dfab247f4c2eb5541dca440b6318 RX(p2₁₄) 218c3aca295740fc8e83901a64e1c00a--5f96dfab247f4c2eb5541dca440b6318 a82a421da23f464db525f8702da34c44 RY(p2₁₈) 5f96dfab247f4c2eb5541dca440b6318--a82a421da23f464db525f8702da34c44 38a53c6b1079435890ef09452a6d551b RX(p2₂₂) a82a421da23f464db525f8702da34c44--38a53c6b1079435890ef09452a6d551b d2f6d59cbb814e0797f1061a10574822 38a53c6b1079435890ef09452a6d551b--d2f6d59cbb814e0797f1061a10574822 6d8c91a1a44d41e98c0795b9231c613f X d2f6d59cbb814e0797f1061a10574822--6d8c91a1a44d41e98c0795b9231c613f 6d8c91a1a44d41e98c0795b9231c613f--757a7d9c380a405a8f40fdcf838dcad8 6d8c91a1a44d41e98c0795b9231c613f--5951ea99116b458e8fe10b68361247bd bec17f24bb464ca9aafd286531583200 eaa2e4bba4e04cd4bd20bddee47de0f2 RX(p1₃) 06a1a57ba4bf419cb921796762f9274a--eaa2e4bba4e04cd4bd20bddee47de0f2 eda650f0a5964f1db9a4d4fa1d50e25f RY(p1₇) eaa2e4bba4e04cd4bd20bddee47de0f2--eda650f0a5964f1db9a4d4fa1d50e25f 9e804ecc859642958d76cb9f85380762 RX(p1₁₁) eda650f0a5964f1db9a4d4fa1d50e25f--9e804ecc859642958d76cb9f85380762 fb7d3dec734d46bb9b9c0831f55befff X 9e804ecc859642958d76cb9f85380762--fb7d3dec734d46bb9b9c0831f55befff fb7d3dec734d46bb9b9c0831f55befff--fc2c815f43844ee2a65f91331715ddcf 6b9285a2fbfc423893d988b3818bfcc4 fb7d3dec734d46bb9b9c0831f55befff--6b9285a2fbfc423893d988b3818bfcc4 aee48ba6290a46819a4c995ee73a18df RX(p1₁₅) 6b9285a2fbfc423893d988b3818bfcc4--aee48ba6290a46819a4c995ee73a18df d376978168ea4a02998ee6efcaf3ba1d RY(p1₁₉) aee48ba6290a46819a4c995ee73a18df--d376978168ea4a02998ee6efcaf3ba1d 43520c90db1140939cfad5a24be76756 RX(p1₂₃) d376978168ea4a02998ee6efcaf3ba1d--43520c90db1140939cfad5a24be76756 a51d595a41e74b0bad1da0261c029276 X 43520c90db1140939cfad5a24be76756--a51d595a41e74b0bad1da0261c029276 a51d595a41e74b0bad1da0261c029276--ed46abe8ed4d41a7a13afeccab7b7165 3f27058d3d1948998fc6b679b26f1c7c a51d595a41e74b0bad1da0261c029276--3f27058d3d1948998fc6b679b26f1c7c da03bc3349294571b3781e045fd296cf RX(p2₃) 3f27058d3d1948998fc6b679b26f1c7c--da03bc3349294571b3781e045fd296cf 28ebbc47626a4cfdbebb5971e048243e RY(p2₇) da03bc3349294571b3781e045fd296cf--28ebbc47626a4cfdbebb5971e048243e a9091d3494364a5ba9bc374773e8abef RX(p2₁₁) 28ebbc47626a4cfdbebb5971e048243e--a9091d3494364a5ba9bc374773e8abef 0a5a17800b0c4eebaa84b205da25bf2c X a9091d3494364a5ba9bc374773e8abef--0a5a17800b0c4eebaa84b205da25bf2c 0a5a17800b0c4eebaa84b205da25bf2c--4d0dcc51e52848798d16563d551e3c77 c84100b726a8448aa0c3b4ff581918e3 0a5a17800b0c4eebaa84b205da25bf2c--c84100b726a8448aa0c3b4ff581918e3 7ecd115aa4f042b197468c4413e6e7b8 RX(p2₁₅) c84100b726a8448aa0c3b4ff581918e3--7ecd115aa4f042b197468c4413e6e7b8 a56f94090cca49c18ea69a19da68ee17 RY(p2₁₉) 7ecd115aa4f042b197468c4413e6e7b8--a56f94090cca49c18ea69a19da68ee17 4797a46d8d9940cf9df0fc71d2b6c1ac RX(p2₂₃) a56f94090cca49c18ea69a19da68ee17--4797a46d8d9940cf9df0fc71d2b6c1ac 2a60bd7635d2466d84c469f926ee8e2e X 4797a46d8d9940cf9df0fc71d2b6c1ac--2a60bd7635d2466d84c469f926ee8e2e 2a60bd7635d2466d84c469f926ee8e2e--d2f6d59cbb814e0797f1061a10574822 f75a2315ef9841e5aebe2cc3a3793cda 2a60bd7635d2466d84c469f926ee8e2e--f75a2315ef9841e5aebe2cc3a3793cda f75a2315ef9841e5aebe2cc3a3793cda--bec17f24bb464ca9aafd286531583200

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.6032])), ('theta_0', tensor([0.7060])), ('theta_1', tensor([0.8729])), ('theta_10', tensor([0.5824])), ('theta_11', tensor([0.7651])), ('theta_12', tensor([0.7259])), ('theta_13', tensor([0.8999])), ('theta_14', tensor([0.5249])), ('theta_15', tensor([0.8056])), ('theta_16', tensor([0.8753])), ('theta_17', tensor([0.9508])), ('theta_18', tensor([0.5994])), ('theta_19', tensor([0.5960])), ('theta_2', tensor([0.3586])), ('theta_20', tensor([0.0068])), ('theta_21', tensor([0.4744])), ('theta_22', tensor([0.3152])), ('theta_23', tensor([0.4480])), ('theta_3', tensor([0.7231])), ('theta_4', tensor([0.2878])), ('theta_5', tensor([0.8199])), ('theta_6', tensor([0.4943])), ('theta_7', tensor([0.6892])), ('theta_8', tensor([0.0667])), ('theta_9', tensor([0.9967]))])

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.6022])), ('theta_0', tensor([0.7070])), ('theta_1', tensor([0.8719])), ('theta_10', tensor([0.5834])), ('theta_11', tensor([0.7661])), ('theta_12', tensor([0.7269])), ('theta_13', tensor([0.9009])), ('theta_14', tensor([0.5259])), ('theta_15', tensor([0.8066])), ('theta_16', tensor([0.8763])), ('theta_17', tensor([0.9518])), ('theta_18', tensor([0.5984])), ('theta_19', tensor([0.5970])), ('theta_2', tensor([0.3596])), ('theta_20', tensor([0.0078])), ('theta_21', tensor([0.4754])), ('theta_22', tensor([0.3162])), ('theta_23', tensor([0.4490])), ('theta_3', tensor([0.7241])), ('theta_4', tensor([0.2888])), ('theta_5', tensor([0.8209])), ('theta_6', tensor([0.4953])), ('theta_7', tensor([0.6902])), ('theta_8', tensor([0.0677])), ('theta_9', tensor([0.9957]))])

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