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.9933+0.0000j, 0.0000-0.1157j]])

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.8981+0.0000j, 0.0000-0.4398j],
        [0.9974+0.0000j, 0.0000-0.0723j]])

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.8605+0.0000j, 0.1212+0.0000j, 0.0000-0.4900j, 0.0000-0.0690j]])

Parametrized Circuits

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

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

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

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

obs = 2*kron(*map(Z, range(3)))
block = chain(block, obs)
cluster_25bd1d4c36e340e29e1b75ce633715b1 [* 2] cluster_92ef12b7c3314ba39503c6fbf3e65ad3 Rotations d155f230ae394aa78de1d75bd0ad4651 0 0113e028fdca4538a82ed763d7381ef9 RX(phi/theta) d155f230ae394aa78de1d75bd0ad4651--0113e028fdca4538a82ed763d7381ef9 dced762661414f2688c65fcef969ea3e 1 7a96d3943ebc4bb597afb384c13d022f RX(phi) 0113e028fdca4538a82ed763d7381ef9--7a96d3943ebc4bb597afb384c13d022f 677c55893d5c4d4ea845c87733ffbbe7 RX(phi) 7a96d3943ebc4bb597afb384c13d022f--677c55893d5c4d4ea845c87733ffbbe7 f2b830439f734093a0466de2e49b91ae RX(phi + theta) 677c55893d5c4d4ea845c87733ffbbe7--f2b830439f734093a0466de2e49b91ae 05ad9672ab734a55b971b80ccc412f02 f2b830439f734093a0466de2e49b91ae--05ad9672ab734a55b971b80ccc412f02 06885695c69f4fadbbfcdc54e4141ed7 05ad9672ab734a55b971b80ccc412f02--06885695c69f4fadbbfcdc54e4141ed7 cb7f7ff2de284c8fbe2d4c7f61f3aa24 Z 06885695c69f4fadbbfcdc54e4141ed7--cb7f7ff2de284c8fbe2d4c7f61f3aa24 ed6598b2b0324482b29590e19a8ff18e cb7f7ff2de284c8fbe2d4c7f61f3aa24--ed6598b2b0324482b29590e19a8ff18e 7858aa494078404fa6de9a941010fb49 d61b58713ab74befbf47fa80d191734c RY(2*theta) dced762661414f2688c65fcef969ea3e--d61b58713ab74befbf47fa80d191734c fc4abb6bfc4b418a816cf06f42d4a46d 2 8287f2b128664d25b30937c2ccce05a4 RY(theta) d61b58713ab74befbf47fa80d191734c--8287f2b128664d25b30937c2ccce05a4 6420a69db31b447280a028f532b16e86 RY(theta) 8287f2b128664d25b30937c2ccce05a4--6420a69db31b447280a028f532b16e86 92ff7140453c47738b2761df200e9e56 RY(theta**2) 6420a69db31b447280a028f532b16e86--92ff7140453c47738b2761df200e9e56 774d9cd12fff4401992803822063eb56 X 92ff7140453c47738b2761df200e9e56--774d9cd12fff4401992803822063eb56 774d9cd12fff4401992803822063eb56--05ad9672ab734a55b971b80ccc412f02 f6eb2d3368524a1e83011232b5535896 774d9cd12fff4401992803822063eb56--f6eb2d3368524a1e83011232b5535896 4eb7ca18e85f4a4ead20899a43a510df Z f6eb2d3368524a1e83011232b5535896--4eb7ca18e85f4a4ead20899a43a510df 4eb7ca18e85f4a4ead20899a43a510df--7858aa494078404fa6de9a941010fb49 3275b637f0e84a6e86429e06463975a4 d783d199f6624a7b9e4cba827dba4e6f RZ(cos(phi)) fc4abb6bfc4b418a816cf06f42d4a46d--d783d199f6624a7b9e4cba827dba4e6f d0378fe145e04362ae1325d1be12f54a RZ(phi) d783d199f6624a7b9e4cba827dba4e6f--d0378fe145e04362ae1325d1be12f54a 300b925b72d941069a858c4450617775 RZ(phi) d0378fe145e04362ae1325d1be12f54a--300b925b72d941069a858c4450617775 d3c65ff86ff04754a651907a06692d6a RZ(cos(phi)) 300b925b72d941069a858c4450617775--d3c65ff86ff04754a651907a06692d6a d0b097971b604ee496532969cebf396c d3c65ff86ff04754a651907a06692d6a--d0b097971b604ee496532969cebf396c b945bdbcdf62491fb0b2225c0724aca2 X d0b097971b604ee496532969cebf396c--b945bdbcdf62491fb0b2225c0724aca2 b945bdbcdf62491fb0b2225c0724aca2--f6eb2d3368524a1e83011232b5535896 7cc6ad3b678342e68720fbee9a579b1b Z b945bdbcdf62491fb0b2225c0724aca2--7cc6ad3b678342e68720fbee9a579b1b 7cc6ad3b678342e68720fbee9a579b1b--3275b637f0e84a6e86429e06463975a4

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

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.9741+0.0000j, 0.1588+0.0000j, 0.0000-0.1588j, 0.0000-0.0259j],
        [0.8288+0.0000j, 0.3767+0.0000j, 0.0000-0.3767j, 0.0000-0.1712j],
        [0.9161+0.0000j, 0.2772+0.0000j, 0.0000-0.2772j, 0.0000-0.0839j]],
       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
7d79c9b93d7d404a9daf8dc84245af85 0 22a0609602244c2bafa3a98153d9a886 RX(theta₀) 7d79c9b93d7d404a9daf8dc84245af85--22a0609602244c2bafa3a98153d9a886 dcba6d9a96744cf3a5410a05a4b6a924 1 c2bc96a5e0404a78b4431155a8258ba6 RY(theta₄) 22a0609602244c2bafa3a98153d9a886--c2bc96a5e0404a78b4431155a8258ba6 c1389282acb44ab9943d5debb5b97d03 RX(theta₈) c2bc96a5e0404a78b4431155a8258ba6--c1389282acb44ab9943d5debb5b97d03 c81eba7caaa541d6932ab380fb056e93 c1389282acb44ab9943d5debb5b97d03--c81eba7caaa541d6932ab380fb056e93 485a5ee87b724047a5d5db892bda6163 c81eba7caaa541d6932ab380fb056e93--485a5ee87b724047a5d5db892bda6163 c2316d6409a84beaa17dd23f8e5635a4 RX(theta₁₂) 485a5ee87b724047a5d5db892bda6163--c2316d6409a84beaa17dd23f8e5635a4 b1f0ebe60ba642c0849e6ac1ce7f8998 RY(theta₁₆) c2316d6409a84beaa17dd23f8e5635a4--b1f0ebe60ba642c0849e6ac1ce7f8998 667eb665f5894c258953b70f78135cd4 RX(theta₂₀) b1f0ebe60ba642c0849e6ac1ce7f8998--667eb665f5894c258953b70f78135cd4 1ae0d39a51ed443d838b912fdbce4dba 667eb665f5894c258953b70f78135cd4--1ae0d39a51ed443d838b912fdbce4dba 9ed5361365a44bf0b8078f253ee5728c 1ae0d39a51ed443d838b912fdbce4dba--9ed5361365a44bf0b8078f253ee5728c d80f8ad22fae4022a6002e8f9b20d2fd 9ed5361365a44bf0b8078f253ee5728c--d80f8ad22fae4022a6002e8f9b20d2fd 931281d576b44407aab377d6c1968add 6e920bcd6f5243edb5bc349ee47d7936 RX(theta₁) dcba6d9a96744cf3a5410a05a4b6a924--6e920bcd6f5243edb5bc349ee47d7936 bdac247370644483be6e4b2d60925292 2 953afd795e524bf699fdfffd00a3a53b RY(theta₅) 6e920bcd6f5243edb5bc349ee47d7936--953afd795e524bf699fdfffd00a3a53b 9b997193d4664217b9e523d588460f2c RX(theta₉) 953afd795e524bf699fdfffd00a3a53b--9b997193d4664217b9e523d588460f2c 499153adcbaf4c99a4ae7323dad56090 X 9b997193d4664217b9e523d588460f2c--499153adcbaf4c99a4ae7323dad56090 499153adcbaf4c99a4ae7323dad56090--c81eba7caaa541d6932ab380fb056e93 c65284dfbf5d492a9b6eec25b0e172ed 499153adcbaf4c99a4ae7323dad56090--c65284dfbf5d492a9b6eec25b0e172ed 88acd53489c549c19b044b9572e0e802 RX(theta₁₃) c65284dfbf5d492a9b6eec25b0e172ed--88acd53489c549c19b044b9572e0e802 0ecbb6715cd2484a8a20a039b1b492bd RY(theta₁₇) 88acd53489c549c19b044b9572e0e802--0ecbb6715cd2484a8a20a039b1b492bd 07bb1d83f91645ce96ebe97ebbf64432 RX(theta₂₁) 0ecbb6715cd2484a8a20a039b1b492bd--07bb1d83f91645ce96ebe97ebbf64432 7b7875292b4b454691ee50672888c4f4 X 07bb1d83f91645ce96ebe97ebbf64432--7b7875292b4b454691ee50672888c4f4 7b7875292b4b454691ee50672888c4f4--1ae0d39a51ed443d838b912fdbce4dba 6a524ad5601144d0983a3a9ed0e69d60 7b7875292b4b454691ee50672888c4f4--6a524ad5601144d0983a3a9ed0e69d60 6a524ad5601144d0983a3a9ed0e69d60--931281d576b44407aab377d6c1968add e9668c077e754ba1965b732ae39d3e79 932acdff15a247de8e68cd2e91e8c5cd RX(theta₂) bdac247370644483be6e4b2d60925292--932acdff15a247de8e68cd2e91e8c5cd 602a4de734684274a35fd46db7807e40 3 015bdfcedd5c4f01bb9c6614c51502bc RY(theta₆) 932acdff15a247de8e68cd2e91e8c5cd--015bdfcedd5c4f01bb9c6614c51502bc 5a52d0dbc9f044bf9d6809248d865b53 RX(theta₁₀) 015bdfcedd5c4f01bb9c6614c51502bc--5a52d0dbc9f044bf9d6809248d865b53 5752590129ac43f4a662bb719481287e 5a52d0dbc9f044bf9d6809248d865b53--5752590129ac43f4a662bb719481287e 3ec2600b525d48aaa11229f2db1f45d2 X 5752590129ac43f4a662bb719481287e--3ec2600b525d48aaa11229f2db1f45d2 3ec2600b525d48aaa11229f2db1f45d2--c65284dfbf5d492a9b6eec25b0e172ed daf259a9a552448b99431e66ebd29144 RX(theta₁₄) 3ec2600b525d48aaa11229f2db1f45d2--daf259a9a552448b99431e66ebd29144 9f04bcd33593485794d946f444838b1f RY(theta₁₈) daf259a9a552448b99431e66ebd29144--9f04bcd33593485794d946f444838b1f 24af917f6fd148c2bf569cd283629bf8 RX(theta₂₂) 9f04bcd33593485794d946f444838b1f--24af917f6fd148c2bf569cd283629bf8 040f74bd0cac422ca969d4ea8d26e29a 24af917f6fd148c2bf569cd283629bf8--040f74bd0cac422ca969d4ea8d26e29a 55e3dc17d5974974a1afd021187647f9 X 040f74bd0cac422ca969d4ea8d26e29a--55e3dc17d5974974a1afd021187647f9 55e3dc17d5974974a1afd021187647f9--6a524ad5601144d0983a3a9ed0e69d60 55e3dc17d5974974a1afd021187647f9--e9668c077e754ba1965b732ae39d3e79 3319f15cdaa54d86829428a8430b1bcc 5daf1ccd1437465791d7a2210f4efe10 RX(theta₃) 602a4de734684274a35fd46db7807e40--5daf1ccd1437465791d7a2210f4efe10 af3abc3e554a4e08b7b7f596f928a09f RY(theta₇) 5daf1ccd1437465791d7a2210f4efe10--af3abc3e554a4e08b7b7f596f928a09f a640ce7bc98a4b81beb5284b987a88f0 RX(theta₁₁) af3abc3e554a4e08b7b7f596f928a09f--a640ce7bc98a4b81beb5284b987a88f0 77d2067af05441b88836a0d46aa4e318 X a640ce7bc98a4b81beb5284b987a88f0--77d2067af05441b88836a0d46aa4e318 77d2067af05441b88836a0d46aa4e318--5752590129ac43f4a662bb719481287e 1eb36673496c46fd8c1a8b4df7b8066a 77d2067af05441b88836a0d46aa4e318--1eb36673496c46fd8c1a8b4df7b8066a 4e35c136a06d4377a01480c9dff4b48c RX(theta₁₅) 1eb36673496c46fd8c1a8b4df7b8066a--4e35c136a06d4377a01480c9dff4b48c 71e4704f1cce4dcaa6a3186f2d3d0362 RY(theta₁₉) 4e35c136a06d4377a01480c9dff4b48c--71e4704f1cce4dcaa6a3186f2d3d0362 8d535361aa034419a69ba44584eec789 RX(theta₂₃) 71e4704f1cce4dcaa6a3186f2d3d0362--8d535361aa034419a69ba44584eec789 e2a9f9f288124dfc8522b00873f2f877 X 8d535361aa034419a69ba44584eec789--e2a9f9f288124dfc8522b00873f2f877 e2a9f9f288124dfc8522b00873f2f877--040f74bd0cac422ca969d4ea8d26e29a 771571c332be43ef9d1d3ff17e0a8816 e2a9f9f288124dfc8522b00873f2f877--771571c332be43ef9d1d3ff17e0a8816 771571c332be43ef9d1d3ff17e0a8816--3319f15cdaa54d86829428a8430b1bcc

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

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

circuit = QuantumCircuit(n_qubits, hea1, hea2)
num_unique_params_two_heas = circuit.num_unique_parameters
Unique parameters with two stacked HEAs: 24
cluster_4fc893fd704743eab92a2d066bd9e682 HEA cluster_ce767151ff6245adbe431ee597ea165d HEA 458f02583de04453a2ccdb0d378452be 0 2d2507987e784b30b1cffc5b4c883232 RX(theta₀) 458f02583de04453a2ccdb0d378452be--2d2507987e784b30b1cffc5b4c883232 2b96305c32a6466286a5f74368347825 1 a675650959a54a2193e2c601adeb79cd RY(theta₄) 2d2507987e784b30b1cffc5b4c883232--a675650959a54a2193e2c601adeb79cd 8b571f3baf1b4873bb9cba736b8474ad RX(theta₈) a675650959a54a2193e2c601adeb79cd--8b571f3baf1b4873bb9cba736b8474ad 90ff5ff135b14327830e301f1f2f1aa3 8b571f3baf1b4873bb9cba736b8474ad--90ff5ff135b14327830e301f1f2f1aa3 196cf51f5d1946308223ce3bf3536ef6 90ff5ff135b14327830e301f1f2f1aa3--196cf51f5d1946308223ce3bf3536ef6 4c340d44741349d39c06482d480fb8bf RX(theta₁₂) 196cf51f5d1946308223ce3bf3536ef6--4c340d44741349d39c06482d480fb8bf 5392eb8363bd41b298cd3843bb64df76 RY(theta₁₆) 4c340d44741349d39c06482d480fb8bf--5392eb8363bd41b298cd3843bb64df76 f14e115e7e154a2b8ce9c69fac5d63f7 RX(theta₂₀) 5392eb8363bd41b298cd3843bb64df76--f14e115e7e154a2b8ce9c69fac5d63f7 2d50da6c803648ac8e5a87c780fe48ce f14e115e7e154a2b8ce9c69fac5d63f7--2d50da6c803648ac8e5a87c780fe48ce e830295e86dc43d18fe9f7ec8a3b5835 2d50da6c803648ac8e5a87c780fe48ce--e830295e86dc43d18fe9f7ec8a3b5835 eae88a6b8e29416198c24805ffbe8ce6 RX(theta₀) e830295e86dc43d18fe9f7ec8a3b5835--eae88a6b8e29416198c24805ffbe8ce6 24b13eabd89d46fdb08b453b30ca30ec RY(theta₄) eae88a6b8e29416198c24805ffbe8ce6--24b13eabd89d46fdb08b453b30ca30ec f59fd3c40593422c92f1b06179848f6a RX(theta₈) 24b13eabd89d46fdb08b453b30ca30ec--f59fd3c40593422c92f1b06179848f6a 67bbc9e40de041dea6262c3d1f7bf00a f59fd3c40593422c92f1b06179848f6a--67bbc9e40de041dea6262c3d1f7bf00a e2a5e86905224f468f62a9672eb2556d 67bbc9e40de041dea6262c3d1f7bf00a--e2a5e86905224f468f62a9672eb2556d 2e7957573f13488394fda8e1c90b94f6 RX(theta₁₂) e2a5e86905224f468f62a9672eb2556d--2e7957573f13488394fda8e1c90b94f6 11692fdf8d2f4566b255770bb2b6c6dd RY(theta₁₆) 2e7957573f13488394fda8e1c90b94f6--11692fdf8d2f4566b255770bb2b6c6dd 3746329ca8b344828e09f77d5d55c8a3 RX(theta₂₀) 11692fdf8d2f4566b255770bb2b6c6dd--3746329ca8b344828e09f77d5d55c8a3 7fab2a18f0aa455689344feb6a790259 3746329ca8b344828e09f77d5d55c8a3--7fab2a18f0aa455689344feb6a790259 ce99524f014642cf95cf36a11423e034 7fab2a18f0aa455689344feb6a790259--ce99524f014642cf95cf36a11423e034 b91d42d0f9ac4a04aff10b86d64022cd ce99524f014642cf95cf36a11423e034--b91d42d0f9ac4a04aff10b86d64022cd 9883b66612ba4fcc8c4441ff5cf6821d 1bcaaf0085b343bbaa0a355adab0b6ca RX(theta₁) 2b96305c32a6466286a5f74368347825--1bcaaf0085b343bbaa0a355adab0b6ca 333f5e2dc57849e6b908c4f5e35120d0 2 fc2b320cda8448779c937e99a811da12 RY(theta₅) 1bcaaf0085b343bbaa0a355adab0b6ca--fc2b320cda8448779c937e99a811da12 8213c186b83846c8ac8b767e4ef226aa RX(theta₉) fc2b320cda8448779c937e99a811da12--8213c186b83846c8ac8b767e4ef226aa 4ea6bca103184eeeab470278879b0d0e X 8213c186b83846c8ac8b767e4ef226aa--4ea6bca103184eeeab470278879b0d0e 4ea6bca103184eeeab470278879b0d0e--90ff5ff135b14327830e301f1f2f1aa3 2e8ff725f38044648bbf0c6024175fc3 4ea6bca103184eeeab470278879b0d0e--2e8ff725f38044648bbf0c6024175fc3 8a25bb7382834d1b89dd5a4b9cbf358e RX(theta₁₃) 2e8ff725f38044648bbf0c6024175fc3--8a25bb7382834d1b89dd5a4b9cbf358e 7688e3d6edb043e7b9ff9da86dea0829 RY(theta₁₇) 8a25bb7382834d1b89dd5a4b9cbf358e--7688e3d6edb043e7b9ff9da86dea0829 425ed1d74db140319ef1e046033be089 RX(theta₂₁) 7688e3d6edb043e7b9ff9da86dea0829--425ed1d74db140319ef1e046033be089 9a97480d1c344152945ba058d7aaca86 X 425ed1d74db140319ef1e046033be089--9a97480d1c344152945ba058d7aaca86 9a97480d1c344152945ba058d7aaca86--2d50da6c803648ac8e5a87c780fe48ce 6c0bf16889cd46d5bdfa8ce0fecd69f8 9a97480d1c344152945ba058d7aaca86--6c0bf16889cd46d5bdfa8ce0fecd69f8 28495d6eb6d64b3c916bd67e91207008 RX(theta₁) 6c0bf16889cd46d5bdfa8ce0fecd69f8--28495d6eb6d64b3c916bd67e91207008 2e3d140f098d4c9b984b1790bd84cb52 RY(theta₅) 28495d6eb6d64b3c916bd67e91207008--2e3d140f098d4c9b984b1790bd84cb52 4d05f2119523409c98821e2075bf5b83 RX(theta₉) 2e3d140f098d4c9b984b1790bd84cb52--4d05f2119523409c98821e2075bf5b83 5c20aa05028349b393b4f483e6f7645b X 4d05f2119523409c98821e2075bf5b83--5c20aa05028349b393b4f483e6f7645b 5c20aa05028349b393b4f483e6f7645b--67bbc9e40de041dea6262c3d1f7bf00a a945bde31df24de39a0ccf5ffb8a98e0 5c20aa05028349b393b4f483e6f7645b--a945bde31df24de39a0ccf5ffb8a98e0 568c9b7645034d7fa9c43666822e1ac2 RX(theta₁₃) a945bde31df24de39a0ccf5ffb8a98e0--568c9b7645034d7fa9c43666822e1ac2 99b8b6eea1e2432f867081ba478c873a RY(theta₁₇) 568c9b7645034d7fa9c43666822e1ac2--99b8b6eea1e2432f867081ba478c873a 033b36491dc744b697c1328873b7f13c RX(theta₂₁) 99b8b6eea1e2432f867081ba478c873a--033b36491dc744b697c1328873b7f13c 43b242ebfb094a9eb1b234302b804fe4 X 033b36491dc744b697c1328873b7f13c--43b242ebfb094a9eb1b234302b804fe4 43b242ebfb094a9eb1b234302b804fe4--7fab2a18f0aa455689344feb6a790259 1aa948ef0470419ba6baf077b8f269c0 43b242ebfb094a9eb1b234302b804fe4--1aa948ef0470419ba6baf077b8f269c0 1aa948ef0470419ba6baf077b8f269c0--9883b66612ba4fcc8c4441ff5cf6821d 8b94e483bfc844b8b14925a7c5163763 45ebca45398443f8a3e6294971a1f831 RX(theta₂) 333f5e2dc57849e6b908c4f5e35120d0--45ebca45398443f8a3e6294971a1f831 9c6e11fb9e6d4b6299738254d7115f4e 3 bbed973a448245f6abdaa2817f65d2ea RY(theta₆) 45ebca45398443f8a3e6294971a1f831--bbed973a448245f6abdaa2817f65d2ea 351daf3f1631464ca7b62ac31cf28252 RX(theta₁₀) bbed973a448245f6abdaa2817f65d2ea--351daf3f1631464ca7b62ac31cf28252 d43315ab53084ec9973ba38f11f16fe7 351daf3f1631464ca7b62ac31cf28252--d43315ab53084ec9973ba38f11f16fe7 60a18ec75ea44de68a6214ac44a650e9 X d43315ab53084ec9973ba38f11f16fe7--60a18ec75ea44de68a6214ac44a650e9 60a18ec75ea44de68a6214ac44a650e9--2e8ff725f38044648bbf0c6024175fc3 edffb138e55943869351f8d780f7e57c RX(theta₁₄) 60a18ec75ea44de68a6214ac44a650e9--edffb138e55943869351f8d780f7e57c 231f531073b2416e81e6259097328377 RY(theta₁₈) edffb138e55943869351f8d780f7e57c--231f531073b2416e81e6259097328377 82b14d95906245c3a4e80b774af3aabf RX(theta₂₂) 231f531073b2416e81e6259097328377--82b14d95906245c3a4e80b774af3aabf fc6d6ec61dc54914b30d902878c00a8c 82b14d95906245c3a4e80b774af3aabf--fc6d6ec61dc54914b30d902878c00a8c 02570a2964694b5cadf7131212adf135 X fc6d6ec61dc54914b30d902878c00a8c--02570a2964694b5cadf7131212adf135 02570a2964694b5cadf7131212adf135--6c0bf16889cd46d5bdfa8ce0fecd69f8 35b57368ce0c4360be8a3fd0705428eb RX(theta₂) 02570a2964694b5cadf7131212adf135--35b57368ce0c4360be8a3fd0705428eb b1736ae3cc1748f3abf168a6ef780978 RY(theta₆) 35b57368ce0c4360be8a3fd0705428eb--b1736ae3cc1748f3abf168a6ef780978 d235ae1dc57f4a52a5b935ee002235e9 RX(theta₁₀) b1736ae3cc1748f3abf168a6ef780978--d235ae1dc57f4a52a5b935ee002235e9 a482f23ad9b945cdbc1d66b1c14e8a4e d235ae1dc57f4a52a5b935ee002235e9--a482f23ad9b945cdbc1d66b1c14e8a4e 54679484a0c44f3f8d2df55d437e657b X a482f23ad9b945cdbc1d66b1c14e8a4e--54679484a0c44f3f8d2df55d437e657b 54679484a0c44f3f8d2df55d437e657b--a945bde31df24de39a0ccf5ffb8a98e0 b6e7359a2b0949158b0a4d16e4ec1092 RX(theta₁₄) 54679484a0c44f3f8d2df55d437e657b--b6e7359a2b0949158b0a4d16e4ec1092 2174aad388434fec8159504799e854c1 RY(theta₁₈) b6e7359a2b0949158b0a4d16e4ec1092--2174aad388434fec8159504799e854c1 8d6ff181de70409eaffb2b12942c88b6 RX(theta₂₂) 2174aad388434fec8159504799e854c1--8d6ff181de70409eaffb2b12942c88b6 6218cd6c5a384f0cae2de2587725ae70 8d6ff181de70409eaffb2b12942c88b6--6218cd6c5a384f0cae2de2587725ae70 304aa69823af44f4aa25bc08628d9a1b X 6218cd6c5a384f0cae2de2587725ae70--304aa69823af44f4aa25bc08628d9a1b 304aa69823af44f4aa25bc08628d9a1b--1aa948ef0470419ba6baf077b8f269c0 304aa69823af44f4aa25bc08628d9a1b--8b94e483bfc844b8b14925a7c5163763 a492c3c085814bd69717407009da601a 468bc7fd24864add860d8afc736eed1d RX(theta₃) 9c6e11fb9e6d4b6299738254d7115f4e--468bc7fd24864add860d8afc736eed1d 718036b21bd84a2e9752dbf5a68e568e RY(theta₇) 468bc7fd24864add860d8afc736eed1d--718036b21bd84a2e9752dbf5a68e568e 7c74f58d21254179939b64980d5a811a RX(theta₁₁) 718036b21bd84a2e9752dbf5a68e568e--7c74f58d21254179939b64980d5a811a 165c65f3fa6b4bb386c68fd9a5035ae5 X 7c74f58d21254179939b64980d5a811a--165c65f3fa6b4bb386c68fd9a5035ae5 165c65f3fa6b4bb386c68fd9a5035ae5--d43315ab53084ec9973ba38f11f16fe7 f0bf6c4995494a7199e794d31834742b 165c65f3fa6b4bb386c68fd9a5035ae5--f0bf6c4995494a7199e794d31834742b e788e72c06364140a2146fc976a0b4bb RX(theta₁₅) f0bf6c4995494a7199e794d31834742b--e788e72c06364140a2146fc976a0b4bb de51e61205be4ca194dd1ce81687b6d2 RY(theta₁₉) e788e72c06364140a2146fc976a0b4bb--de51e61205be4ca194dd1ce81687b6d2 f0871531c1054e3fbb13dc83561c90bc RX(theta₂₃) de51e61205be4ca194dd1ce81687b6d2--f0871531c1054e3fbb13dc83561c90bc 0283459606ba4c64b41968798a6735df X f0871531c1054e3fbb13dc83561c90bc--0283459606ba4c64b41968798a6735df 0283459606ba4c64b41968798a6735df--fc6d6ec61dc54914b30d902878c00a8c 92444c4fb42f443c8fc80aa5ea3d1b5c 0283459606ba4c64b41968798a6735df--92444c4fb42f443c8fc80aa5ea3d1b5c 263086ebd2aa428391e52ddd141d4a29 RX(theta₃) 92444c4fb42f443c8fc80aa5ea3d1b5c--263086ebd2aa428391e52ddd141d4a29 6d669583cd5646de9cfb20f6d2a3e9da RY(theta₇) 263086ebd2aa428391e52ddd141d4a29--6d669583cd5646de9cfb20f6d2a3e9da 0012c9047f4c4486b933c88d290d6a6d RX(theta₁₁) 6d669583cd5646de9cfb20f6d2a3e9da--0012c9047f4c4486b933c88d290d6a6d ab55974b3aef40cca526f3824356b8f8 X 0012c9047f4c4486b933c88d290d6a6d--ab55974b3aef40cca526f3824356b8f8 ab55974b3aef40cca526f3824356b8f8--a482f23ad9b945cdbc1d66b1c14e8a4e 462c6db0f9464898824f93121d097322 ab55974b3aef40cca526f3824356b8f8--462c6db0f9464898824f93121d097322 705579b5307a471aab741ecf3af58623 RX(theta₁₅) 462c6db0f9464898824f93121d097322--705579b5307a471aab741ecf3af58623 875462be9ae74a7583e5fc74dcaf4f20 RY(theta₁₉) 705579b5307a471aab741ecf3af58623--875462be9ae74a7583e5fc74dcaf4f20 727076747e584f82aa4afff23c01ba89 RX(theta₂₃) 875462be9ae74a7583e5fc74dcaf4f20--727076747e584f82aa4afff23c01ba89 513ae743a59a452dbf63b7358c41c457 X 727076747e584f82aa4afff23c01ba89--513ae743a59a452dbf63b7358c41c457 513ae743a59a452dbf63b7358c41c457--6218cd6c5a384f0cae2de2587725ae70 6a6ac970341a46ebb449abf2b3815f5c 513ae743a59a452dbf63b7358c41c457--6a6ac970341a46ebb449abf2b3815f5c 6a6ac970341a46ebb449abf2b3815f5c--a492c3c085814bd69717407009da601a

Avoid non-unique names by prefixing

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

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

circuit = QuantumCircuit(n_qubits, hea1, hea2)
n_params_two_heas = circuit.num_unique_parameters
Unique parameters with two stacked HEAs: 48
cluster_21f32c9f94cd4e0c83e3d9370a523c43 HEA cluster_f896c0172c904a0eb07d90955f0a3b99 HEA fca6c0d9175545b8a7b72e269d942014 0 1a8f485ef30c455795676c5a8cbcd4ed RX(p1₀) fca6c0d9175545b8a7b72e269d942014--1a8f485ef30c455795676c5a8cbcd4ed 4f97b7b74e3f4dff9f5ad455d999c1cc 1 4635600dc82d4d27a93dcf0569f9695b RY(p1₄) 1a8f485ef30c455795676c5a8cbcd4ed--4635600dc82d4d27a93dcf0569f9695b e788832a00a145a7a7203a1c0b14f3e2 RX(p1₈) 4635600dc82d4d27a93dcf0569f9695b--e788832a00a145a7a7203a1c0b14f3e2 86f70e1c2b5f40eda2d41596775b19b1 e788832a00a145a7a7203a1c0b14f3e2--86f70e1c2b5f40eda2d41596775b19b1 42964429c10a43b7b362717d1707b740 86f70e1c2b5f40eda2d41596775b19b1--42964429c10a43b7b362717d1707b740 5fa55a8f981b46d482445257f2a370d6 RX(p1₁₂) 42964429c10a43b7b362717d1707b740--5fa55a8f981b46d482445257f2a370d6 cd783534fb084c048207832da6741f15 RY(p1₁₆) 5fa55a8f981b46d482445257f2a370d6--cd783534fb084c048207832da6741f15 7b45e4d97be64bd49cf65027ab656ef0 RX(p1₂₀) cd783534fb084c048207832da6741f15--7b45e4d97be64bd49cf65027ab656ef0 c50fdde4ab8b4f7f9b6ad3d8705455f6 7b45e4d97be64bd49cf65027ab656ef0--c50fdde4ab8b4f7f9b6ad3d8705455f6 017701b2d4c04702a898687efe765981 c50fdde4ab8b4f7f9b6ad3d8705455f6--017701b2d4c04702a898687efe765981 1c790891bf7d4e929e18ce0e88187d6e RX(p2₀) 017701b2d4c04702a898687efe765981--1c790891bf7d4e929e18ce0e88187d6e eefd91329df24f06987ba45cda280d3e RY(p2₄) 1c790891bf7d4e929e18ce0e88187d6e--eefd91329df24f06987ba45cda280d3e 6f6fc087d75549e59d12e81008931535 RX(p2₈) eefd91329df24f06987ba45cda280d3e--6f6fc087d75549e59d12e81008931535 218bdf17aaeb44be99e554160983a20d 6f6fc087d75549e59d12e81008931535--218bdf17aaeb44be99e554160983a20d e832cebc27d04f9c81311e23cb093443 218bdf17aaeb44be99e554160983a20d--e832cebc27d04f9c81311e23cb093443 022a67790c1241b6bbbdbc6bee3942d1 RX(p2₁₂) e832cebc27d04f9c81311e23cb093443--022a67790c1241b6bbbdbc6bee3942d1 10e809013f334c8d86c3602d343b3720 RY(p2₁₆) 022a67790c1241b6bbbdbc6bee3942d1--10e809013f334c8d86c3602d343b3720 ddf885b4e7c44c60be71e85c74875e6f RX(p2₂₀) 10e809013f334c8d86c3602d343b3720--ddf885b4e7c44c60be71e85c74875e6f fff0d8cf66b444f8b872a1559fb3bdf1 ddf885b4e7c44c60be71e85c74875e6f--fff0d8cf66b444f8b872a1559fb3bdf1 ff2bf515807d4d68807b2fb32273d3cb fff0d8cf66b444f8b872a1559fb3bdf1--ff2bf515807d4d68807b2fb32273d3cb ea95d19edb3f48cc9f1602b27a513088 ff2bf515807d4d68807b2fb32273d3cb--ea95d19edb3f48cc9f1602b27a513088 015f68effd414f67a412a9e9efb9a463 8e6743229c57415da9f25bf48ef8dce4 RX(p1₁) 4f97b7b74e3f4dff9f5ad455d999c1cc--8e6743229c57415da9f25bf48ef8dce4 8e6ab565a8324561a645cef738f8246a 2 0a791f3be67f4b7ea8c6456a5466e452 RY(p1₅) 8e6743229c57415da9f25bf48ef8dce4--0a791f3be67f4b7ea8c6456a5466e452 691c62c43b9c489c8c1811827c58adda RX(p1₉) 0a791f3be67f4b7ea8c6456a5466e452--691c62c43b9c489c8c1811827c58adda 0f9100f2e00946fb89f7a312ecb486b7 X 691c62c43b9c489c8c1811827c58adda--0f9100f2e00946fb89f7a312ecb486b7 0f9100f2e00946fb89f7a312ecb486b7--86f70e1c2b5f40eda2d41596775b19b1 7512ac80c63c44b9acb5f3d98f68b058 0f9100f2e00946fb89f7a312ecb486b7--7512ac80c63c44b9acb5f3d98f68b058 e3dc8be83f404300ae3a48798fcb5958 RX(p1₁₃) 7512ac80c63c44b9acb5f3d98f68b058--e3dc8be83f404300ae3a48798fcb5958 2023b9bdffd94f8493930587be11eed9 RY(p1₁₇) e3dc8be83f404300ae3a48798fcb5958--2023b9bdffd94f8493930587be11eed9 38dff85ecd9f45b58c06c0d045b1f34f RX(p1₂₁) 2023b9bdffd94f8493930587be11eed9--38dff85ecd9f45b58c06c0d045b1f34f 9c59477cccf84cdabf107bbc3b5c9a01 X 38dff85ecd9f45b58c06c0d045b1f34f--9c59477cccf84cdabf107bbc3b5c9a01 9c59477cccf84cdabf107bbc3b5c9a01--c50fdde4ab8b4f7f9b6ad3d8705455f6 bc5a48223767419cb1cab791cc31185f 9c59477cccf84cdabf107bbc3b5c9a01--bc5a48223767419cb1cab791cc31185f 491f83e8f89d4e429a62fd07cb43e6df RX(p2₁) bc5a48223767419cb1cab791cc31185f--491f83e8f89d4e429a62fd07cb43e6df 1391fd34102d420f93db31000d93b96f RY(p2₅) 491f83e8f89d4e429a62fd07cb43e6df--1391fd34102d420f93db31000d93b96f 400033b4d1d5451dbd790eaa8c2b34af RX(p2₉) 1391fd34102d420f93db31000d93b96f--400033b4d1d5451dbd790eaa8c2b34af 70b8b01d4e9c4b9aad6cb8f5920e5ba9 X 400033b4d1d5451dbd790eaa8c2b34af--70b8b01d4e9c4b9aad6cb8f5920e5ba9 70b8b01d4e9c4b9aad6cb8f5920e5ba9--218bdf17aaeb44be99e554160983a20d cd9a0da40415408c8f3cb7bb4c713467 70b8b01d4e9c4b9aad6cb8f5920e5ba9--cd9a0da40415408c8f3cb7bb4c713467 b0c138736fc5415f9a9a31d7bfbff069 RX(p2₁₃) cd9a0da40415408c8f3cb7bb4c713467--b0c138736fc5415f9a9a31d7bfbff069 2c34d36ee7a64572889bfc59e7d13af0 RY(p2₁₇) b0c138736fc5415f9a9a31d7bfbff069--2c34d36ee7a64572889bfc59e7d13af0 0b7772e335f04f41804f7b76bcc9999f RX(p2₂₁) 2c34d36ee7a64572889bfc59e7d13af0--0b7772e335f04f41804f7b76bcc9999f d7160f36cd3e466db38dfd23e650ea5f X 0b7772e335f04f41804f7b76bcc9999f--d7160f36cd3e466db38dfd23e650ea5f d7160f36cd3e466db38dfd23e650ea5f--fff0d8cf66b444f8b872a1559fb3bdf1 7e025c2a89e54e13a71b751f3320b71f d7160f36cd3e466db38dfd23e650ea5f--7e025c2a89e54e13a71b751f3320b71f 7e025c2a89e54e13a71b751f3320b71f--015f68effd414f67a412a9e9efb9a463 d44426e9f73f4d8bad68625b89cf646b 12543e895dcd4e29a8b7d525205472b0 RX(p1₂) 8e6ab565a8324561a645cef738f8246a--12543e895dcd4e29a8b7d525205472b0 3cf511aa70ce46b3ad260bfad7623bb1 3 89bc647f37e94dc486420f4b0970720c RY(p1₆) 12543e895dcd4e29a8b7d525205472b0--89bc647f37e94dc486420f4b0970720c 0d2f331788624d659c2e09c424a003f2 RX(p1₁₀) 89bc647f37e94dc486420f4b0970720c--0d2f331788624d659c2e09c424a003f2 62896e4f289049d394033f30228669d0 0d2f331788624d659c2e09c424a003f2--62896e4f289049d394033f30228669d0 044e3e80400e48998c8ce3c13cf38361 X 62896e4f289049d394033f30228669d0--044e3e80400e48998c8ce3c13cf38361 044e3e80400e48998c8ce3c13cf38361--7512ac80c63c44b9acb5f3d98f68b058 0a4825f8d0f14fb48d569755b327def8 RX(p1₁₄) 044e3e80400e48998c8ce3c13cf38361--0a4825f8d0f14fb48d569755b327def8 c4ebd850d75f446daa6bb8b92acdef3b RY(p1₁₈) 0a4825f8d0f14fb48d569755b327def8--c4ebd850d75f446daa6bb8b92acdef3b bb4e66eb86e14a3887ae3930ac97e3cf RX(p1₂₂) c4ebd850d75f446daa6bb8b92acdef3b--bb4e66eb86e14a3887ae3930ac97e3cf 28189d5f46b24944953cc1afa9f1d2ff bb4e66eb86e14a3887ae3930ac97e3cf--28189d5f46b24944953cc1afa9f1d2ff 28e071a2ef41456f8bc5a1ae8a3b6114 X 28189d5f46b24944953cc1afa9f1d2ff--28e071a2ef41456f8bc5a1ae8a3b6114 28e071a2ef41456f8bc5a1ae8a3b6114--bc5a48223767419cb1cab791cc31185f 5b23c17a309844cebe4842ad565dfc51 RX(p2₂) 28e071a2ef41456f8bc5a1ae8a3b6114--5b23c17a309844cebe4842ad565dfc51 10840953724243babc8937da339ce457 RY(p2₆) 5b23c17a309844cebe4842ad565dfc51--10840953724243babc8937da339ce457 4f6e817248e4468692c69df44a5fc1c1 RX(p2₁₀) 10840953724243babc8937da339ce457--4f6e817248e4468692c69df44a5fc1c1 976be0b88f2f46ada0f7b25856b84f5c 4f6e817248e4468692c69df44a5fc1c1--976be0b88f2f46ada0f7b25856b84f5c 8d6a7722904c4a8797fb3f96b0a7ee80 X 976be0b88f2f46ada0f7b25856b84f5c--8d6a7722904c4a8797fb3f96b0a7ee80 8d6a7722904c4a8797fb3f96b0a7ee80--cd9a0da40415408c8f3cb7bb4c713467 bf19b5e89bfc44bc97ed084ac2aff031 RX(p2₁₄) 8d6a7722904c4a8797fb3f96b0a7ee80--bf19b5e89bfc44bc97ed084ac2aff031 edc1950c99424423bba9944182499cc1 RY(p2₁₈) bf19b5e89bfc44bc97ed084ac2aff031--edc1950c99424423bba9944182499cc1 ae80834ece0841d28880281fa365822d RX(p2₂₂) edc1950c99424423bba9944182499cc1--ae80834ece0841d28880281fa365822d ffbc80f06afd479da2d82013e66fa3cf ae80834ece0841d28880281fa365822d--ffbc80f06afd479da2d82013e66fa3cf fcfcd54062dd4f3287636644d5304fea X ffbc80f06afd479da2d82013e66fa3cf--fcfcd54062dd4f3287636644d5304fea fcfcd54062dd4f3287636644d5304fea--7e025c2a89e54e13a71b751f3320b71f fcfcd54062dd4f3287636644d5304fea--d44426e9f73f4d8bad68625b89cf646b f5d2958d971045fbac6b9a6b5529d218 da3ff19fecd34581a1fe6db5ce6ef106 RX(p1₃) 3cf511aa70ce46b3ad260bfad7623bb1--da3ff19fecd34581a1fe6db5ce6ef106 86b9699df9c54352a1e17eb634d3267f RY(p1₇) da3ff19fecd34581a1fe6db5ce6ef106--86b9699df9c54352a1e17eb634d3267f 827c048020134a40a7744ce73e0ed778 RX(p1₁₁) 86b9699df9c54352a1e17eb634d3267f--827c048020134a40a7744ce73e0ed778 0dd23a04e20b45d68ff123df5e42017c X 827c048020134a40a7744ce73e0ed778--0dd23a04e20b45d68ff123df5e42017c 0dd23a04e20b45d68ff123df5e42017c--62896e4f289049d394033f30228669d0 653fbcfe7f854848818896df56cf1bfd 0dd23a04e20b45d68ff123df5e42017c--653fbcfe7f854848818896df56cf1bfd 43629b9ab572477b968793501abe3cc4 RX(p1₁₅) 653fbcfe7f854848818896df56cf1bfd--43629b9ab572477b968793501abe3cc4 a485c2d6d32c4467845afcde551ac90b RY(p1₁₉) 43629b9ab572477b968793501abe3cc4--a485c2d6d32c4467845afcde551ac90b f79d993645e2407aa003faa153e0efb6 RX(p1₂₃) a485c2d6d32c4467845afcde551ac90b--f79d993645e2407aa003faa153e0efb6 1e696bbf4a3f498faa308ba186e611d4 X f79d993645e2407aa003faa153e0efb6--1e696bbf4a3f498faa308ba186e611d4 1e696bbf4a3f498faa308ba186e611d4--28189d5f46b24944953cc1afa9f1d2ff 25949a531ff04202b8fb4e1dd1bb99e0 1e696bbf4a3f498faa308ba186e611d4--25949a531ff04202b8fb4e1dd1bb99e0 5f68208ff4f54003bf2b9766078a11db RX(p2₃) 25949a531ff04202b8fb4e1dd1bb99e0--5f68208ff4f54003bf2b9766078a11db 790927182e3b4fa1943a766f5a62da50 RY(p2₇) 5f68208ff4f54003bf2b9766078a11db--790927182e3b4fa1943a766f5a62da50 0012a634d899486a815618e8aa00c382 RX(p2₁₁) 790927182e3b4fa1943a766f5a62da50--0012a634d899486a815618e8aa00c382 df2ec0bffd904473ac60f74c313bfe88 X 0012a634d899486a815618e8aa00c382--df2ec0bffd904473ac60f74c313bfe88 df2ec0bffd904473ac60f74c313bfe88--976be0b88f2f46ada0f7b25856b84f5c 316e4d3890bb4bd298183642df7b5e3d df2ec0bffd904473ac60f74c313bfe88--316e4d3890bb4bd298183642df7b5e3d 0a3e8ca69c534444ae7f92555f656bea RX(p2₁₅) 316e4d3890bb4bd298183642df7b5e3d--0a3e8ca69c534444ae7f92555f656bea 529bae1b2152417e82af68b0628fd4d3 RY(p2₁₉) 0a3e8ca69c534444ae7f92555f656bea--529bae1b2152417e82af68b0628fd4d3 11a0686e5183499db7c5336573595b52 RX(p2₂₃) 529bae1b2152417e82af68b0628fd4d3--11a0686e5183499db7c5336573595b52 e7b0e11fa0824f7caf86604e2b91bf48 X 11a0686e5183499db7c5336573595b52--e7b0e11fa0824f7caf86604e2b91bf48 e7b0e11fa0824f7caf86604e2b91bf48--ffbc80f06afd479da2d82013e66fa3cf fab904ab4f564496bb9f3ad672b33000 e7b0e11fa0824f7caf86604e2b91bf48--fab904ab4f564496bb9f3ad672b33000 fab904ab4f564496bb9f3ad672b33000--f5d2958d971045fbac6b9a6b5529d218

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.3895])), ('theta_0', tensor([0.4551])), ('theta_1', tensor([0.7825])), ('theta_10', tensor([0.1377])), ('theta_11', tensor([0.7968])), ('theta_12', tensor([0.6814])), ('theta_13', tensor([0.4033])), ('theta_14', tensor([0.0888])), ('theta_15', tensor([0.6925])), ('theta_16', tensor([0.4299])), ('theta_17', tensor([0.5076])), ('theta_18', tensor([0.4307])), ('theta_19', tensor([0.2949])), ('theta_2', tensor([0.3586])), ('theta_20', tensor([0.6062])), ('theta_21', tensor([0.2323])), ('theta_22', tensor([0.2774])), ('theta_23', tensor([0.5284])), ('theta_3', tensor([0.7807])), ('theta_4', tensor([0.7496])), ('theta_5', tensor([0.9792])), ('theta_6', tensor([0.6042])), ('theta_7', tensor([0.6899])), ('theta_8', tensor([0.2853])), ('theta_9', tensor([0.9198]))])

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.3885])), ('theta_0', tensor([0.4541])), ('theta_1', tensor([0.7835])), ('theta_10', tensor([0.1387])), ('theta_11', tensor([0.7958])), ('theta_12', tensor([0.6804])), ('theta_13', tensor([0.4043])), ('theta_14', tensor([0.0898])), ('theta_15', tensor([0.6915])), ('theta_16', tensor([0.4289])), ('theta_17', tensor([0.5086])), ('theta_18', tensor([0.4297])), ('theta_19', tensor([0.2959])), ('theta_2', tensor([0.3596])), ('theta_20', tensor([0.6052])), ('theta_21', tensor([0.2333])), ('theta_22', tensor([0.2784])), ('theta_23', tensor([0.5274])), ('theta_3', tensor([0.7797])), ('theta_4', tensor([0.7486])), ('theta_5', tensor([0.9782])), ('theta_6', tensor([0.6052])), ('theta_7', tensor([0.6909])), ('theta_8', tensor([0.2843])), ('theta_9', tensor([0.9208]))])

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