Skip to content

Configuring a QNN

In qadence, the QNN is a variational quantum model that can potentially take multi-dimensional input.

The QNN class needs a circuit and a list of observables; the number of feature parameters in the input circuit determines the number of input features (i.e. the dimensionality of the classical data given as input) whereas the number of observables determines the number of outputs of the quantum neural network.

The circuit has two parts, the feature map and the ansatz. The feature map is responsible for encoding the input data into the quantum state, while the ansatz is responsible for the variational part of the model. In addition, a third part of the QNN is the observables, which is (a list of) operators that are measured at the end of the circuit.

In QML Constructors we have seen how to construct the feature map and the ansatz. In this tutorial, we will see how to do the same using configs.

One convenient way to construct these three parts of the model is to use the config classes, namely, ObservableConfig, FeatureMapConfig, AnsatzConfig. These classes allow you to specify the type of circuit and the parameters of the circuit in a structured way.

Defining the Observable

The model output is the expectation value of the defined observable(s). We use the ObservableConfig class to specify the observable.

We can specify any Hamiltonian that we want to measure at the end of the circuit. Let us say we want to measure the \(Z\) operator.

from qadence import observable_from_config, ObservableConfig, Z

observable_config = ObservableConfig(
    detuning=Z,
    scale=3.0,
    shift=-1.0,
)

observable = observable_from_config(register=4, config=observable_config)
%3 cluster_dab9dcd7f443471c88f9a2d760df01ac dc8b1f4811d946b29afac44aa03a541c 0 4b211e98187d42db993351b0a309dbb4 dc8b1f4811d946b29afac44aa03a541c--4b211e98187d42db993351b0a309dbb4 e6b198d8068845bdbdb3e82e3206d073 1 207bd17268fa4b77b375e7aac58f115c 4b211e98187d42db993351b0a309dbb4--207bd17268fa4b77b375e7aac58f115c 9e30825c95664caf8be66d37ad5b394a f995ee2c28fa473680d166641c15cb79 AddBlock e6b198d8068845bdbdb3e82e3206d073--f995ee2c28fa473680d166641c15cb79 dd30121e1987467e98d539581ce04698 2 f995ee2c28fa473680d166641c15cb79--9e30825c95664caf8be66d37ad5b394a 50dcdbaf729443c4b9b63acde2b512c5 dc517641c23e450fbc501974dd751abc dd30121e1987467e98d539581ce04698--dc517641c23e450fbc501974dd751abc 50b744749933476a84f49aa39e4bd4f4 3 dc517641c23e450fbc501974dd751abc--50dcdbaf729443c4b9b63acde2b512c5 bb4e2c09816744c2a4879efee3fa1931 8044c306810041258e0ab4a5b4017ec3 50b744749933476a84f49aa39e4bd4f4--8044c306810041258e0ab4a5b4017ec3 8044c306810041258e0ab4a5b4017ec3--bb4e2c09816744c2a4879efee3fa1931

We have specified the observable Hamiltonian to be one with \(Z\)-detuning. The result is linearly scaled by 3.0 and shifted by -1.0. These parameters can optionally also be FeatureParameter or VariationalParameter

One can also specify the observable as a list of observables, in which case the QNN will output a list of values.

For full details on the ObservableConfig class, see the API documentation.

Defining the Feature Map

Let us say we want to build a 4-qubit QNN that takes two inputs, namely, the \(x\) and the \(y\) coordinates of a point in the plane. We can use the FeatureMapConfig class to specify the feature map.

from qadence import BasisSet, chain, create_fm_blocks, FeatureMapConfig, ReuploadScaling

fm_config = FeatureMapConfig(
    num_features=2,
    inputs = ["x", "y"],
    basis_set=BasisSet.CHEBYSHEV,
    reupload_scaling=ReuploadScaling.TOWER,
    feature_range={
        "x": (-1.0, 1.0),
        "y": (0.0, 1.0),
    },
)

fm_blocks = create_fm_blocks(register=4, config=fm_config)
feature_map = chain(*fm_blocks)
%3 cluster_86db9a64edef49e0a5ba7a5e74c4577c Tower Chebyshev FM cluster_954640dec9bc4a26853e22e3a4063cd2 Tower Chebyshev FM 546952ad090849f389c933b743a748e0 0 cbf4e336cc0a4e4ab402033a9ece15db RX(1.0*acos(x)) 546952ad090849f389c933b743a748e0--cbf4e336cc0a4e4ab402033a9ece15db e8c67537afe6409f8c66e461d2aeb46c 1 59f6cbee41fc44b0a43080dee42b3b54 cbf4e336cc0a4e4ab402033a9ece15db--59f6cbee41fc44b0a43080dee42b3b54 d28ac868a90a40f6a2a3e21b02464c9a 0122aaec1543472db94c2b6d154b49e7 RX(2.0*acos(x)) e8c67537afe6409f8c66e461d2aeb46c--0122aaec1543472db94c2b6d154b49e7 71c21f17f32246498bb3e970b616a5c9 2 0122aaec1543472db94c2b6d154b49e7--d28ac868a90a40f6a2a3e21b02464c9a 9e75db0932c34da7b18079860ee11147 d954c22a7cb64e25bbd1916ade2d9446 RX(1.0*acos(2.0*y - 1.0)) 71c21f17f32246498bb3e970b616a5c9--d954c22a7cb64e25bbd1916ade2d9446 a23cc9f3b0804c9aa5d463ce8246bc3d 3 d954c22a7cb64e25bbd1916ade2d9446--9e75db0932c34da7b18079860ee11147 90fe3b6729c84090ae8ad9454d5654b3 e755aa26de7144c18c8b2be051a6928b RX(2.0*acos(2.0*y - 1.0)) a23cc9f3b0804c9aa5d463ce8246bc3d--e755aa26de7144c18c8b2be051a6928b e755aa26de7144c18c8b2be051a6928b--90fe3b6729c84090ae8ad9454d5654b3

We have specified that the feature map should take two features, and have named the FeatureParameter "x" and "y" respectively. Both these parameters are encoded using the Chebyshev basis set, and the reupload scaling is set to ReuploadScaling.TOWER. One can optionally add the basis and the reupload scaling for each parameter separately.

The feature_range parameter is a dictionary that specifies the range of values that each feature comes from. This is useful for scaling the input data to the range that the encoding function can handle. In default case, this range is mapped to the target range of the Chebyshev basis set which is \([-1, 1]\). One can also specify the target range for each feature separately.

For full details on the FeatureMapConfig class, see the API documentation.

Defining the Ansatz

The next part of the QNN is the ansatz. We use AnsatzConfig class to specify the type of ansatz.

Let us say, we want to follow this feature map with 2 layers of hardware efficient ansatz.

from qadence import AnsatzConfig, AnsatzType, create_ansatz, Strategy

ansatz_config = AnsatzConfig(
    depth=2,
    ansatz_type=AnsatzType.HEA,
    ansatz_strategy=Strategy.DIGITAL,
)

ansatz = create_ansatz(register=4, config=ansatz_config)
%3 3d99f06aebb8466fa717d560250ae6ce 0 1734e24ca45541feb926612f4457e219 RX(theta₀) 3d99f06aebb8466fa717d560250ae6ce--1734e24ca45541feb926612f4457e219 88eed6a60ff7485d9706dce1c866c6ca 1 bf34d2a368f240d4891c10244a0e1db3 RY(theta₄) 1734e24ca45541feb926612f4457e219--bf34d2a368f240d4891c10244a0e1db3 8b9d2c1bf0454a3e912a7b57b481eaa4 RX(theta₈) bf34d2a368f240d4891c10244a0e1db3--8b9d2c1bf0454a3e912a7b57b481eaa4 141b9c62dde148e6bf02117f3f705a3a 8b9d2c1bf0454a3e912a7b57b481eaa4--141b9c62dde148e6bf02117f3f705a3a f3d5f595c2a942eaaaef1935d76c55e3 141b9c62dde148e6bf02117f3f705a3a--f3d5f595c2a942eaaaef1935d76c55e3 23542abe87424e458325abf82550721f RX(theta₁₂) f3d5f595c2a942eaaaef1935d76c55e3--23542abe87424e458325abf82550721f 7d4fe90a6b614c92bdbe4945c129d54a RY(theta₁₆) 23542abe87424e458325abf82550721f--7d4fe90a6b614c92bdbe4945c129d54a b6e9e9f119da450f98a70aac54633ecf RX(theta₂₀) 7d4fe90a6b614c92bdbe4945c129d54a--b6e9e9f119da450f98a70aac54633ecf 856d1b25409441409592bfe111673bd3 b6e9e9f119da450f98a70aac54633ecf--856d1b25409441409592bfe111673bd3 6f0ef3b1d84a44339eb84ddedf8c2040 856d1b25409441409592bfe111673bd3--6f0ef3b1d84a44339eb84ddedf8c2040 82451ed1afa74cc3b81b66d0f584a189 6f0ef3b1d84a44339eb84ddedf8c2040--82451ed1afa74cc3b81b66d0f584a189 b55c9c46faa04d77add91c85b4c1b5b9 5ebeaff21dac409bb47a1aaf4272cd16 RX(theta₁) 88eed6a60ff7485d9706dce1c866c6ca--5ebeaff21dac409bb47a1aaf4272cd16 b06b638592f747ad89e79696bafcc161 2 837d8d0b51ff4f1fb77efe482be4271c RY(theta₅) 5ebeaff21dac409bb47a1aaf4272cd16--837d8d0b51ff4f1fb77efe482be4271c 7688d196df2f48138630b46dc538b138 RX(theta₉) 837d8d0b51ff4f1fb77efe482be4271c--7688d196df2f48138630b46dc538b138 2261ac89a6c9492cb9ada4fc88fe61a6 X 7688d196df2f48138630b46dc538b138--2261ac89a6c9492cb9ada4fc88fe61a6 2261ac89a6c9492cb9ada4fc88fe61a6--141b9c62dde148e6bf02117f3f705a3a 9b46df0c7ba7475097f516300cd1ada8 2261ac89a6c9492cb9ada4fc88fe61a6--9b46df0c7ba7475097f516300cd1ada8 a6dc889590b243308c8acefa76c18912 RX(theta₁₃) 9b46df0c7ba7475097f516300cd1ada8--a6dc889590b243308c8acefa76c18912 1a616cd7e0004eaa96f520e876bfa77e RY(theta₁₇) a6dc889590b243308c8acefa76c18912--1a616cd7e0004eaa96f520e876bfa77e 1ddd9f3c0909463ab68bce306d0cd2ef RX(theta₂₁) 1a616cd7e0004eaa96f520e876bfa77e--1ddd9f3c0909463ab68bce306d0cd2ef 9b31d2446ac0493181c7dbad8d5d1268 X 1ddd9f3c0909463ab68bce306d0cd2ef--9b31d2446ac0493181c7dbad8d5d1268 9b31d2446ac0493181c7dbad8d5d1268--856d1b25409441409592bfe111673bd3 d9081bb481c54110bd9a114d4b06b445 9b31d2446ac0493181c7dbad8d5d1268--d9081bb481c54110bd9a114d4b06b445 d9081bb481c54110bd9a114d4b06b445--b55c9c46faa04d77add91c85b4c1b5b9 85a7103674004e17b0ad5bb37e6e35d7 406927909c0d4075968464360e7a452e RX(theta₂) b06b638592f747ad89e79696bafcc161--406927909c0d4075968464360e7a452e 469f4a67649040bc81761cbaa37761d5 3 64e06ac0abad4dc08d00866d58774cf1 RY(theta₆) 406927909c0d4075968464360e7a452e--64e06ac0abad4dc08d00866d58774cf1 8a11be122fba44c6b47903ea0da72c94 RX(theta₁₀) 64e06ac0abad4dc08d00866d58774cf1--8a11be122fba44c6b47903ea0da72c94 d212f3d712ee40ff9c5dd1018247905b 8a11be122fba44c6b47903ea0da72c94--d212f3d712ee40ff9c5dd1018247905b af2db88087da4b268b4dca60f89a6898 X d212f3d712ee40ff9c5dd1018247905b--af2db88087da4b268b4dca60f89a6898 af2db88087da4b268b4dca60f89a6898--9b46df0c7ba7475097f516300cd1ada8 3e89f58654884c34857f693265794dcd RX(theta₁₄) af2db88087da4b268b4dca60f89a6898--3e89f58654884c34857f693265794dcd 1bc8acc3727b4990b4680b5592e426bd RY(theta₁₈) 3e89f58654884c34857f693265794dcd--1bc8acc3727b4990b4680b5592e426bd 68dd45b6524748f7bc15df05cab88c75 RX(theta₂₂) 1bc8acc3727b4990b4680b5592e426bd--68dd45b6524748f7bc15df05cab88c75 b9713a9f39ab4b769a5b03520cbd3511 68dd45b6524748f7bc15df05cab88c75--b9713a9f39ab4b769a5b03520cbd3511 0838caeb24bf434584365475b8efe680 X b9713a9f39ab4b769a5b03520cbd3511--0838caeb24bf434584365475b8efe680 0838caeb24bf434584365475b8efe680--d9081bb481c54110bd9a114d4b06b445 0838caeb24bf434584365475b8efe680--85a7103674004e17b0ad5bb37e6e35d7 55708194e2984cee90ba570a09a1c08d 396bd1c374b749bd8c0dd33707eb9a23 RX(theta₃) 469f4a67649040bc81761cbaa37761d5--396bd1c374b749bd8c0dd33707eb9a23 2ded23e72e7140f9b25a16d8e553b4ae RY(theta₇) 396bd1c374b749bd8c0dd33707eb9a23--2ded23e72e7140f9b25a16d8e553b4ae 0bd81140c063485e807481ecd8e40374 RX(theta₁₁) 2ded23e72e7140f9b25a16d8e553b4ae--0bd81140c063485e807481ecd8e40374 9a773419790b4fb48fdbe28e96b51604 X 0bd81140c063485e807481ecd8e40374--9a773419790b4fb48fdbe28e96b51604 9a773419790b4fb48fdbe28e96b51604--d212f3d712ee40ff9c5dd1018247905b 9d52bad1fd9845feaaac43b42eaa31f0 9a773419790b4fb48fdbe28e96b51604--9d52bad1fd9845feaaac43b42eaa31f0 258547f386c94be793be047c8ea68f1d RX(theta₁₅) 9d52bad1fd9845feaaac43b42eaa31f0--258547f386c94be793be047c8ea68f1d 7f36cc266909468bbc53f21c48b83f5f RY(theta₁₉) 258547f386c94be793be047c8ea68f1d--7f36cc266909468bbc53f21c48b83f5f 6ead6ecea45e4c0d9a1af451a832ef4d RX(theta₂₃) 7f36cc266909468bbc53f21c48b83f5f--6ead6ecea45e4c0d9a1af451a832ef4d 35efbbea752644f2aee9c2938117326b X 6ead6ecea45e4c0d9a1af451a832ef4d--35efbbea752644f2aee9c2938117326b 35efbbea752644f2aee9c2938117326b--b9713a9f39ab4b769a5b03520cbd3511 4dbf7aa142da4847b586b7d93473fb2a 35efbbea752644f2aee9c2938117326b--4dbf7aa142da4847b586b7d93473fb2a 4dbf7aa142da4847b586b7d93473fb2a--55708194e2984cee90ba570a09a1c08d

We have specified that the ansatz should have a depth of 2, and the ansatz type is "hea" (Hardware Efficient Ansatz). The ansatz strategy is set to "digital", which means digital gates are being used. One could alternatively use "analog" or "rydberg" as the ansatz strategy.

For full details on the AnsatzConfig class, see the API documentation.

Defining the QNN from the Configs

To build the QNN, we can now use the QNN class as a QuantumModel subtype. In addition to the feature map, ansatz and the observable configs, we can also specify options such as the backend, diff_mode, etc. For full details on the QNN class, see the API documentation or the documentation on the config constructor here.

from qadence import BackendName, DiffMode, QNN

qnn = QNN.from_configs(
    register=4,
    obs_config=observable_config,
    fm_config=fm_config,
    ansatz_config=ansatz_config,
    backend=BackendName.PYQTORCH,
    diff_mode=DiffMode.AD,
)
%3 cluster_2ae0c25c5fb649ffa9b1940ea8acf5c4 Obs. cluster_dba5fe2a99bc4cef8466a1674fbc1c36 cluster_11ecd2d0998547f2b322b6d573f5cd46 Tower Chebyshev FM cluster_52cf9fcf61b1438e9edde97ad8edec59 Tower Chebyshev FM cluster_9e71fd3da567471cb69148cb2f889eb5 HEA 96ad845ffec54681abe90a7f296eeb19 0 062dfc2e5f73465484e5506cd406f56b RX(1.0*acos(x)) 96ad845ffec54681abe90a7f296eeb19--062dfc2e5f73465484e5506cd406f56b 878a0656d0f648d691728d20fadac2d3 1 0a05c1a3505b48a8b3e6f2a41e176685 RX(theta₀) 062dfc2e5f73465484e5506cd406f56b--0a05c1a3505b48a8b3e6f2a41e176685 671d473fb20e4b3bae5eb8e19c87f4aa RY(theta₄) 0a05c1a3505b48a8b3e6f2a41e176685--671d473fb20e4b3bae5eb8e19c87f4aa 829cce0c3545494b9c17bfe84cb15954 RX(theta₈) 671d473fb20e4b3bae5eb8e19c87f4aa--829cce0c3545494b9c17bfe84cb15954 761ff8ae43ce4c92a6d9f07c38b47476 829cce0c3545494b9c17bfe84cb15954--761ff8ae43ce4c92a6d9f07c38b47476 9f26b74b324347e98840ac647614350d 761ff8ae43ce4c92a6d9f07c38b47476--9f26b74b324347e98840ac647614350d 5a137f26bc024615aff618b5d02456c3 RX(theta₁₂) 9f26b74b324347e98840ac647614350d--5a137f26bc024615aff618b5d02456c3 b94f8e69096e40cbbdc809810893ca2d RY(theta₁₆) 5a137f26bc024615aff618b5d02456c3--b94f8e69096e40cbbdc809810893ca2d 531e12201a4a4474a080ae9ff2592d25 RX(theta₂₀) b94f8e69096e40cbbdc809810893ca2d--531e12201a4a4474a080ae9ff2592d25 0217b02ec06244abafdd5a3c5d085e7a 531e12201a4a4474a080ae9ff2592d25--0217b02ec06244abafdd5a3c5d085e7a fddb9358ea9a4edea1b90cca3a95e30a 0217b02ec06244abafdd5a3c5d085e7a--fddb9358ea9a4edea1b90cca3a95e30a 72cf8f56476c4c7a9bf67e4d70f9c3ef fddb9358ea9a4edea1b90cca3a95e30a--72cf8f56476c4c7a9bf67e4d70f9c3ef bc6b03faeac74e3d9c5ec0737956d6bc 72cf8f56476c4c7a9bf67e4d70f9c3ef--bc6b03faeac74e3d9c5ec0737956d6bc 04e68e2a54cd43b88be77467fe37b48a b3c6db2a8368400590407155d685dcdb RX(2.0*acos(x)) 878a0656d0f648d691728d20fadac2d3--b3c6db2a8368400590407155d685dcdb c190d2c7c74b47b8bc20783ff5c66ac3 2 a7560d9b163843ccb4e03a62d0f88f47 RX(theta₁) b3c6db2a8368400590407155d685dcdb--a7560d9b163843ccb4e03a62d0f88f47 2c5181f09be744ac9c015c08ae0a9e5d RY(theta₅) a7560d9b163843ccb4e03a62d0f88f47--2c5181f09be744ac9c015c08ae0a9e5d 7ebc8ba4aa154d7d895dfda02589de6f RX(theta₉) 2c5181f09be744ac9c015c08ae0a9e5d--7ebc8ba4aa154d7d895dfda02589de6f e907e95c82ae4d19929b3a56d7468c3e X 7ebc8ba4aa154d7d895dfda02589de6f--e907e95c82ae4d19929b3a56d7468c3e e907e95c82ae4d19929b3a56d7468c3e--761ff8ae43ce4c92a6d9f07c38b47476 127ff6836eb64f69a2b40ed871712a1f e907e95c82ae4d19929b3a56d7468c3e--127ff6836eb64f69a2b40ed871712a1f 1cd6e9c47d934b399c2a97a095f95ca3 RX(theta₁₃) 127ff6836eb64f69a2b40ed871712a1f--1cd6e9c47d934b399c2a97a095f95ca3 832e788024a94fb6acd7cbea3fb6b18f RY(theta₁₇) 1cd6e9c47d934b399c2a97a095f95ca3--832e788024a94fb6acd7cbea3fb6b18f 2c31d69c2da8449e9a2e11758f14a7a3 RX(theta₂₁) 832e788024a94fb6acd7cbea3fb6b18f--2c31d69c2da8449e9a2e11758f14a7a3 7a7dda2cde9f4cfebdafe32d9ac15be5 X 2c31d69c2da8449e9a2e11758f14a7a3--7a7dda2cde9f4cfebdafe32d9ac15be5 7a7dda2cde9f4cfebdafe32d9ac15be5--0217b02ec06244abafdd5a3c5d085e7a 9ed51fe90de241f8bdd1f1b3dc65b0f2 7a7dda2cde9f4cfebdafe32d9ac15be5--9ed51fe90de241f8bdd1f1b3dc65b0f2 95d9163657554f438c13b5806596b1bc AddBlock 9ed51fe90de241f8bdd1f1b3dc65b0f2--95d9163657554f438c13b5806596b1bc 95d9163657554f438c13b5806596b1bc--04e68e2a54cd43b88be77467fe37b48a a0461be0e1cc499da4b762d586a21b24 d62fca460d9f44f0a932643654ebe0c2 RX(1.0*acos(2.0*y - 1.0)) c190d2c7c74b47b8bc20783ff5c66ac3--d62fca460d9f44f0a932643654ebe0c2 01270aa2b2994aa5b52f85593871b24a 3 e4ee6d3f492c4ad99b72a10e96027c7a RX(theta₂) d62fca460d9f44f0a932643654ebe0c2--e4ee6d3f492c4ad99b72a10e96027c7a 98fd911ac9bc4e4d905ce20ce99f5ef2 RY(theta₆) e4ee6d3f492c4ad99b72a10e96027c7a--98fd911ac9bc4e4d905ce20ce99f5ef2 dc2adaaaeb064596939d9dabe57f4b11 RX(theta₁₀) 98fd911ac9bc4e4d905ce20ce99f5ef2--dc2adaaaeb064596939d9dabe57f4b11 5b3ee4b1f0bb4ffd88065759c8ab0a2f dc2adaaaeb064596939d9dabe57f4b11--5b3ee4b1f0bb4ffd88065759c8ab0a2f 07378070713c4feab26a9f337c1b79d1 X 5b3ee4b1f0bb4ffd88065759c8ab0a2f--07378070713c4feab26a9f337c1b79d1 07378070713c4feab26a9f337c1b79d1--127ff6836eb64f69a2b40ed871712a1f 6244c6da2bfd4c44b038f39820db1944 RX(theta₁₄) 07378070713c4feab26a9f337c1b79d1--6244c6da2bfd4c44b038f39820db1944 84e623e23f4c4799991557bcd61f27e5 RY(theta₁₈) 6244c6da2bfd4c44b038f39820db1944--84e623e23f4c4799991557bcd61f27e5 a38f3fcd775743d0aa9f432dcfb13df4 RX(theta₂₂) 84e623e23f4c4799991557bcd61f27e5--a38f3fcd775743d0aa9f432dcfb13df4 689a7454516540eba0b175ab0f82b1ea a38f3fcd775743d0aa9f432dcfb13df4--689a7454516540eba0b175ab0f82b1ea eca17e29323b41d4a006a7ae0e36a4db X 689a7454516540eba0b175ab0f82b1ea--eca17e29323b41d4a006a7ae0e36a4db eca17e29323b41d4a006a7ae0e36a4db--9ed51fe90de241f8bdd1f1b3dc65b0f2 e394118c7ed74e7f938c5ba46ac5daaf eca17e29323b41d4a006a7ae0e36a4db--e394118c7ed74e7f938c5ba46ac5daaf e394118c7ed74e7f938c5ba46ac5daaf--a0461be0e1cc499da4b762d586a21b24 364ff7b1e1494fe18cc2d6e5967b5cda a160ffb5df7c428f86fb9f44c1e4649d RX(2.0*acos(2.0*y - 1.0)) 01270aa2b2994aa5b52f85593871b24a--a160ffb5df7c428f86fb9f44c1e4649d 218dfa10b88d48ee8a12817870ad3b21 RX(theta₃) a160ffb5df7c428f86fb9f44c1e4649d--218dfa10b88d48ee8a12817870ad3b21 de5a519bbdf248acbb451dc8ca0b75a4 RY(theta₇) 218dfa10b88d48ee8a12817870ad3b21--de5a519bbdf248acbb451dc8ca0b75a4 455b7067e3cc431fb4d4d397578678bf RX(theta₁₁) de5a519bbdf248acbb451dc8ca0b75a4--455b7067e3cc431fb4d4d397578678bf 09594b7bc784416384b3b933def751df X 455b7067e3cc431fb4d4d397578678bf--09594b7bc784416384b3b933def751df 09594b7bc784416384b3b933def751df--5b3ee4b1f0bb4ffd88065759c8ab0a2f 99b31a8ac3ab426c95a6cb8504e0dd88 09594b7bc784416384b3b933def751df--99b31a8ac3ab426c95a6cb8504e0dd88 959087d27b3c4321bcd05ba96c5d22f3 RX(theta₁₅) 99b31a8ac3ab426c95a6cb8504e0dd88--959087d27b3c4321bcd05ba96c5d22f3 26872e37c4374f80ac6be270e347437f RY(theta₁₉) 959087d27b3c4321bcd05ba96c5d22f3--26872e37c4374f80ac6be270e347437f 4b35d136a72b45f1add453e4fc13707d RX(theta₂₃) 26872e37c4374f80ac6be270e347437f--4b35d136a72b45f1add453e4fc13707d db13b598629744b9984c15fee21d6e31 X 4b35d136a72b45f1add453e4fc13707d--db13b598629744b9984c15fee21d6e31 db13b598629744b9984c15fee21d6e31--689a7454516540eba0b175ab0f82b1ea a208f5c55887419089584be67d6557e3 db13b598629744b9984c15fee21d6e31--a208f5c55887419089584be67d6557e3 232aa790f07c46298b4e387e89ae5712 a208f5c55887419089584be67d6557e3--232aa790f07c46298b4e387e89ae5712 232aa790f07c46298b4e387e89ae5712--364ff7b1e1494fe18cc2d6e5967b5cda