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_6ba35e62834448d68033fe5f24571aa2 ae74d46656744077a8777fa69a91b340 0 e44ee7bd7d4243cca204eec77dd7b486 ae74d46656744077a8777fa69a91b340--e44ee7bd7d4243cca204eec77dd7b486 72d9eb980aad4b5f964edf24232a2478 1 e765c4300a4a4404be64c4aced8d7604 e44ee7bd7d4243cca204eec77dd7b486--e765c4300a4a4404be64c4aced8d7604 4e0d1e2671b04b43883d8dd5c218be89 d2a55c5c7a694e1685e83c624249596e AddBlock 72d9eb980aad4b5f964edf24232a2478--d2a55c5c7a694e1685e83c624249596e f857ec3991fa4042955ae2ff5ab89e44 2 d2a55c5c7a694e1685e83c624249596e--4e0d1e2671b04b43883d8dd5c218be89 2b7887a3d87f445d9a95c042ec3ca7a7 631bb7aad46e40eb84ff1dd99de9e0e7 f857ec3991fa4042955ae2ff5ab89e44--631bb7aad46e40eb84ff1dd99de9e0e7 3ad46ae0ee2746d88357b578e178333e 3 631bb7aad46e40eb84ff1dd99de9e0e7--2b7887a3d87f445d9a95c042ec3ca7a7 7be2bbd543fe4a13b3233015714eb8a7 5480f040c39c470fb72b2cafb4e4c2f2 3ad46ae0ee2746d88357b578e178333e--5480f040c39c470fb72b2cafb4e4c2f2 5480f040c39c470fb72b2cafb4e4c2f2--7be2bbd543fe4a13b3233015714eb8a7

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_ad7fd5b424304a9d9a3853fe954f8aaa Tower Chebyshev FM cluster_c0d7afd99d9b4da5896ca4124695806a Tower Chebyshev FM fe1273aec74f404bae81fe3912692e9c 0 1782efc829e34536a7808ce8a5871f78 RX(1.0*acos(x)) fe1273aec74f404bae81fe3912692e9c--1782efc829e34536a7808ce8a5871f78 2e2a7afc95fa4fc7bea457e8bad479fd 1 03abb7d2b08e40cdbbb93d359d744ed0 1782efc829e34536a7808ce8a5871f78--03abb7d2b08e40cdbbb93d359d744ed0 3ada0f98e9e546a8a497ae5a23662418 395e765988c54622b9510367c2ac5ad7 RX(2.0*acos(x)) 2e2a7afc95fa4fc7bea457e8bad479fd--395e765988c54622b9510367c2ac5ad7 dc0ae46d2d294635a3ee35825607f217 2 395e765988c54622b9510367c2ac5ad7--3ada0f98e9e546a8a497ae5a23662418 59d46a48e50f42c48f1787b1eebb0581 b9ded512ba914563bbc33ff428224120 RX(1.0*acos(2.0*y - 1.0)) dc0ae46d2d294635a3ee35825607f217--b9ded512ba914563bbc33ff428224120 c6da6128635e4ca49cbdcb0d3c918e4a 3 b9ded512ba914563bbc33ff428224120--59d46a48e50f42c48f1787b1eebb0581 9068317caaf9452593bd35bd48eefd9d 71c1ab31631d48d9bd14405800195d51 RX(2.0*acos(2.0*y - 1.0)) c6da6128635e4ca49cbdcb0d3c918e4a--71c1ab31631d48d9bd14405800195d51 71c1ab31631d48d9bd14405800195d51--9068317caaf9452593bd35bd48eefd9d

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 b6600e821a03415482c4a0f4b812f219 0 40c6701f7b1a46e1b8f125d48ac86908 RX(theta₀) b6600e821a03415482c4a0f4b812f219--40c6701f7b1a46e1b8f125d48ac86908 151bf087984a47edb530d1f723360448 1 079ee660597b4fd29648c6bc16893916 RY(theta₄) 40c6701f7b1a46e1b8f125d48ac86908--079ee660597b4fd29648c6bc16893916 3bd5090b54d34b159e9523a65dff04c6 RX(theta₈) 079ee660597b4fd29648c6bc16893916--3bd5090b54d34b159e9523a65dff04c6 6566fc671c014e89a4456b39c9c0b7da 3bd5090b54d34b159e9523a65dff04c6--6566fc671c014e89a4456b39c9c0b7da 9b1b2c3cf07f45fb8626bc0c8e8f3b60 6566fc671c014e89a4456b39c9c0b7da--9b1b2c3cf07f45fb8626bc0c8e8f3b60 5b5fb6f4749f45c39f410a1663738f36 RX(theta₁₂) 9b1b2c3cf07f45fb8626bc0c8e8f3b60--5b5fb6f4749f45c39f410a1663738f36 b209d79e5dd5482ca641c81892d656ba RY(theta₁₆) 5b5fb6f4749f45c39f410a1663738f36--b209d79e5dd5482ca641c81892d656ba c50a9aaf7bd0499ca23216a8eb5e4901 RX(theta₂₀) b209d79e5dd5482ca641c81892d656ba--c50a9aaf7bd0499ca23216a8eb5e4901 3bcd7646881b41b7b318ba324f87b341 c50a9aaf7bd0499ca23216a8eb5e4901--3bcd7646881b41b7b318ba324f87b341 17e39f22f27e4c1babe23d31ee6c6237 3bcd7646881b41b7b318ba324f87b341--17e39f22f27e4c1babe23d31ee6c6237 a7950cda8f624c6dba138b6ab12c933c 17e39f22f27e4c1babe23d31ee6c6237--a7950cda8f624c6dba138b6ab12c933c 1ca970a824bf4bb58f786e585a2bad5f a97d87225eb144a2b6a803e429e5d44f RX(theta₁) 151bf087984a47edb530d1f723360448--a97d87225eb144a2b6a803e429e5d44f f5719ecb86c04d16a00d5ebf1210e960 2 6fa6d914bfa046dfb63ae75c1eec265b RY(theta₅) a97d87225eb144a2b6a803e429e5d44f--6fa6d914bfa046dfb63ae75c1eec265b 5882c518b9c8454b9dbeebec3ecf2f25 RX(theta₉) 6fa6d914bfa046dfb63ae75c1eec265b--5882c518b9c8454b9dbeebec3ecf2f25 61a07d8b7f1b4792a45f530ba465bc91 X 5882c518b9c8454b9dbeebec3ecf2f25--61a07d8b7f1b4792a45f530ba465bc91 61a07d8b7f1b4792a45f530ba465bc91--6566fc671c014e89a4456b39c9c0b7da edf6d904bba24b219bd077ae07c43bbf 61a07d8b7f1b4792a45f530ba465bc91--edf6d904bba24b219bd077ae07c43bbf 1847c3b40db34d6884a638da7d5585e0 RX(theta₁₃) edf6d904bba24b219bd077ae07c43bbf--1847c3b40db34d6884a638da7d5585e0 8480651a600c4537bcab852844e8f4fd RY(theta₁₇) 1847c3b40db34d6884a638da7d5585e0--8480651a600c4537bcab852844e8f4fd 07522f233e7d4972aa60449214bfbb54 RX(theta₂₁) 8480651a600c4537bcab852844e8f4fd--07522f233e7d4972aa60449214bfbb54 41a3170238994e74adf45dfd689ad507 X 07522f233e7d4972aa60449214bfbb54--41a3170238994e74adf45dfd689ad507 41a3170238994e74adf45dfd689ad507--3bcd7646881b41b7b318ba324f87b341 7c647e2391c448539518fe4dd86fb2a1 41a3170238994e74adf45dfd689ad507--7c647e2391c448539518fe4dd86fb2a1 7c647e2391c448539518fe4dd86fb2a1--1ca970a824bf4bb58f786e585a2bad5f 211681124f224aa9b31fb90052a7135f fc6183601edb42419d2fece16bdc442e RX(theta₂) f5719ecb86c04d16a00d5ebf1210e960--fc6183601edb42419d2fece16bdc442e 3d57a192cd8b4ea39ef529ee37d1610e 3 9602eabeab4a4f4999c136ec62d1c8e7 RY(theta₆) fc6183601edb42419d2fece16bdc442e--9602eabeab4a4f4999c136ec62d1c8e7 15af336d580544f9b74edff8845de6a9 RX(theta₁₀) 9602eabeab4a4f4999c136ec62d1c8e7--15af336d580544f9b74edff8845de6a9 5bc6898ba8bc4562abc5b07ab8ab54eb 15af336d580544f9b74edff8845de6a9--5bc6898ba8bc4562abc5b07ab8ab54eb 0100b634b958465dbb9ecb89d505c118 X 5bc6898ba8bc4562abc5b07ab8ab54eb--0100b634b958465dbb9ecb89d505c118 0100b634b958465dbb9ecb89d505c118--edf6d904bba24b219bd077ae07c43bbf 6b46e123ef6745b6b9128f55d52dfd55 RX(theta₁₄) 0100b634b958465dbb9ecb89d505c118--6b46e123ef6745b6b9128f55d52dfd55 283ddb02a7ed4fc3a7259e582b1c1a54 RY(theta₁₈) 6b46e123ef6745b6b9128f55d52dfd55--283ddb02a7ed4fc3a7259e582b1c1a54 8cdc41e1cc6a4f9c8f47c04c8ea6be75 RX(theta₂₂) 283ddb02a7ed4fc3a7259e582b1c1a54--8cdc41e1cc6a4f9c8f47c04c8ea6be75 42f16eb7634b414f8cbde9d073cb0db1 8cdc41e1cc6a4f9c8f47c04c8ea6be75--42f16eb7634b414f8cbde9d073cb0db1 6853c6fcd11e4524ada992f6d9532889 X 42f16eb7634b414f8cbde9d073cb0db1--6853c6fcd11e4524ada992f6d9532889 6853c6fcd11e4524ada992f6d9532889--7c647e2391c448539518fe4dd86fb2a1 6853c6fcd11e4524ada992f6d9532889--211681124f224aa9b31fb90052a7135f 0f888d9237d24bd0b92bf25b41e46f82 5009f533fc7e426cba79a27f67a6dfd6 RX(theta₃) 3d57a192cd8b4ea39ef529ee37d1610e--5009f533fc7e426cba79a27f67a6dfd6 5c839e272a1b4f1fb7c3e9ef2645844e RY(theta₇) 5009f533fc7e426cba79a27f67a6dfd6--5c839e272a1b4f1fb7c3e9ef2645844e 75edd8799b504efe9ade02d66038ec01 RX(theta₁₁) 5c839e272a1b4f1fb7c3e9ef2645844e--75edd8799b504efe9ade02d66038ec01 67193d9ffd8148708424b97ad345a0d3 X 75edd8799b504efe9ade02d66038ec01--67193d9ffd8148708424b97ad345a0d3 67193d9ffd8148708424b97ad345a0d3--5bc6898ba8bc4562abc5b07ab8ab54eb 90cf4522001e4c72acb2258506c102f0 67193d9ffd8148708424b97ad345a0d3--90cf4522001e4c72acb2258506c102f0 6a5294dd175647a4bbabc8e13a6aa824 RX(theta₁₅) 90cf4522001e4c72acb2258506c102f0--6a5294dd175647a4bbabc8e13a6aa824 01475c352df04097a1d5145058c675de RY(theta₁₉) 6a5294dd175647a4bbabc8e13a6aa824--01475c352df04097a1d5145058c675de 91bfb46308154d808ecb121a627a73ff RX(theta₂₃) 01475c352df04097a1d5145058c675de--91bfb46308154d808ecb121a627a73ff 8080d3c9f2a0462287971a91700a02c5 X 91bfb46308154d808ecb121a627a73ff--8080d3c9f2a0462287971a91700a02c5 8080d3c9f2a0462287971a91700a02c5--42f16eb7634b414f8cbde9d073cb0db1 582c40f32e3742c0afd286984323b5e4 8080d3c9f2a0462287971a91700a02c5--582c40f32e3742c0afd286984323b5e4 582c40f32e3742c0afd286984323b5e4--0f888d9237d24bd0b92bf25b41e46f82

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_291db4558f8349f3b350eb358e0097ce Obs. cluster_e8b2b2a7b5334068869041970455ca22 cluster_dc1205c6873544729f9911fa7b8c14fb Tower Chebyshev FM cluster_61c62f7446ef43898ecf88496e24f257 Tower Chebyshev FM cluster_ab3287f022744540a2cc4aef5f9d0be8 HEA a338535e28974c2fbc4b6b7fed5b89b1 0 d415b05418c740c1ba30476d1fdf891e RX(1.0*acos(x)) a338535e28974c2fbc4b6b7fed5b89b1--d415b05418c740c1ba30476d1fdf891e b6e920e207b9474e9f52c1b62bea0b40 1 f07a80705afe4568998319371e1573d9 RX(theta₀) d415b05418c740c1ba30476d1fdf891e--f07a80705afe4568998319371e1573d9 ded851a953624236a4fbe5f9c7b944f2 RY(theta₄) f07a80705afe4568998319371e1573d9--ded851a953624236a4fbe5f9c7b944f2 1b54f79f81534b4e9e2bddd081ba30ff RX(theta₈) ded851a953624236a4fbe5f9c7b944f2--1b54f79f81534b4e9e2bddd081ba30ff 547b52f2569b4c79989211fb6f4f7525 1b54f79f81534b4e9e2bddd081ba30ff--547b52f2569b4c79989211fb6f4f7525 0e4ca826786f423da5a54e84848248ab 547b52f2569b4c79989211fb6f4f7525--0e4ca826786f423da5a54e84848248ab f03f1e9de4634ab6a20d6cf5c33885df RX(theta₁₂) 0e4ca826786f423da5a54e84848248ab--f03f1e9de4634ab6a20d6cf5c33885df 6ba5edf75c0940679916ba48871e29d6 RY(theta₁₆) f03f1e9de4634ab6a20d6cf5c33885df--6ba5edf75c0940679916ba48871e29d6 ff32fb4862f04777b6975981d37f22ed RX(theta₂₀) 6ba5edf75c0940679916ba48871e29d6--ff32fb4862f04777b6975981d37f22ed 5b63806a09e04df8886d4762c1a370cd ff32fb4862f04777b6975981d37f22ed--5b63806a09e04df8886d4762c1a370cd 204d6b7cee7943fa824b90e0ea6e3869 5b63806a09e04df8886d4762c1a370cd--204d6b7cee7943fa824b90e0ea6e3869 a310ff044a494362812a77147cacc4c6 204d6b7cee7943fa824b90e0ea6e3869--a310ff044a494362812a77147cacc4c6 7ea57c4a0e0d4175b83278d761108f0c a310ff044a494362812a77147cacc4c6--7ea57c4a0e0d4175b83278d761108f0c 5277a7b0d4344ce2ab11ff0841430cf9 a6e9a4da8fda4b01929cbb845f4244f0 RX(2.0*acos(x)) b6e920e207b9474e9f52c1b62bea0b40--a6e9a4da8fda4b01929cbb845f4244f0 0a7b8ad2801046a0b33b0641124da2fc 2 0e340a3541644d3f8e492c425834a5db RX(theta₁) a6e9a4da8fda4b01929cbb845f4244f0--0e340a3541644d3f8e492c425834a5db 574ef38834954b679395ff2069c7739f RY(theta₅) 0e340a3541644d3f8e492c425834a5db--574ef38834954b679395ff2069c7739f 287167b841c540bda44fe8cd53c9628a RX(theta₉) 574ef38834954b679395ff2069c7739f--287167b841c540bda44fe8cd53c9628a ee73bd186d684b3c889415a482f8c471 X 287167b841c540bda44fe8cd53c9628a--ee73bd186d684b3c889415a482f8c471 ee73bd186d684b3c889415a482f8c471--547b52f2569b4c79989211fb6f4f7525 2b34a67257ba418181d7371ee6d2f523 ee73bd186d684b3c889415a482f8c471--2b34a67257ba418181d7371ee6d2f523 535c49f5eef64d69a73b8be090d3ea3c RX(theta₁₃) 2b34a67257ba418181d7371ee6d2f523--535c49f5eef64d69a73b8be090d3ea3c 43e11326e50e43b4bbb0fcbf3c13530c RY(theta₁₇) 535c49f5eef64d69a73b8be090d3ea3c--43e11326e50e43b4bbb0fcbf3c13530c 1175fbbdda7e4573ae9ee28a08aaba74 RX(theta₂₁) 43e11326e50e43b4bbb0fcbf3c13530c--1175fbbdda7e4573ae9ee28a08aaba74 4dab667d241f4ddfb8dee02514cfe54b X 1175fbbdda7e4573ae9ee28a08aaba74--4dab667d241f4ddfb8dee02514cfe54b 4dab667d241f4ddfb8dee02514cfe54b--5b63806a09e04df8886d4762c1a370cd 0b856ef387e1460384542c9e26517fc2 4dab667d241f4ddfb8dee02514cfe54b--0b856ef387e1460384542c9e26517fc2 2001d193a0ad4b07939126e9ddfc0096 AddBlock 0b856ef387e1460384542c9e26517fc2--2001d193a0ad4b07939126e9ddfc0096 2001d193a0ad4b07939126e9ddfc0096--5277a7b0d4344ce2ab11ff0841430cf9 aac4e0a007074e679d4435c39bbfe5ff 63137f8a7b8c43b9820bf574e0802772 RX(1.0*acos(2.0*y - 1.0)) 0a7b8ad2801046a0b33b0641124da2fc--63137f8a7b8c43b9820bf574e0802772 df54bfbd614648ff8c1c736f1c6d9af3 3 86b9a42fa7624f8fa4899ac0d9351608 RX(theta₂) 63137f8a7b8c43b9820bf574e0802772--86b9a42fa7624f8fa4899ac0d9351608 e1377d596b334fd3abde4c87b873ddfe RY(theta₆) 86b9a42fa7624f8fa4899ac0d9351608--e1377d596b334fd3abde4c87b873ddfe 4efac4fbbbf44f84b721e09a849606af RX(theta₁₀) e1377d596b334fd3abde4c87b873ddfe--4efac4fbbbf44f84b721e09a849606af 4f12826cf72e49c4ac1e758254ed4727 4efac4fbbbf44f84b721e09a849606af--4f12826cf72e49c4ac1e758254ed4727 26c4bc71fd574f33b3e73850036cab4b X 4f12826cf72e49c4ac1e758254ed4727--26c4bc71fd574f33b3e73850036cab4b 26c4bc71fd574f33b3e73850036cab4b--2b34a67257ba418181d7371ee6d2f523 eaf7be6642be43eaa5f24819d3795ec3 RX(theta₁₄) 26c4bc71fd574f33b3e73850036cab4b--eaf7be6642be43eaa5f24819d3795ec3 d6440681db4346b1b03692b044b434ba RY(theta₁₈) eaf7be6642be43eaa5f24819d3795ec3--d6440681db4346b1b03692b044b434ba ad4995bb84fd4cb58f5e3ede6213db40 RX(theta₂₂) d6440681db4346b1b03692b044b434ba--ad4995bb84fd4cb58f5e3ede6213db40 a7a8a8ae7a0a4fb0a65cd4143e7118f7 ad4995bb84fd4cb58f5e3ede6213db40--a7a8a8ae7a0a4fb0a65cd4143e7118f7 30abc3303a5449e18c404ddd8d73fbfd X a7a8a8ae7a0a4fb0a65cd4143e7118f7--30abc3303a5449e18c404ddd8d73fbfd 30abc3303a5449e18c404ddd8d73fbfd--0b856ef387e1460384542c9e26517fc2 d6cc80fe807543a19d7c66bc39bf15d8 30abc3303a5449e18c404ddd8d73fbfd--d6cc80fe807543a19d7c66bc39bf15d8 d6cc80fe807543a19d7c66bc39bf15d8--aac4e0a007074e679d4435c39bbfe5ff 794181c1dfa34f38818cba30433b66eb 42d05efd22bd45e59aeea5a0198a6a80 RX(2.0*acos(2.0*y - 1.0)) df54bfbd614648ff8c1c736f1c6d9af3--42d05efd22bd45e59aeea5a0198a6a80 a7eca2d5015a4188a521d9f72ab28988 RX(theta₃) 42d05efd22bd45e59aeea5a0198a6a80--a7eca2d5015a4188a521d9f72ab28988 c045e68c8cf0420a89ed2480f8395882 RY(theta₇) a7eca2d5015a4188a521d9f72ab28988--c045e68c8cf0420a89ed2480f8395882 05ca72c20f3b4cc4a480277636210dd5 RX(theta₁₁) c045e68c8cf0420a89ed2480f8395882--05ca72c20f3b4cc4a480277636210dd5 7a746dd9cccf43a2866be62375ce20fb X 05ca72c20f3b4cc4a480277636210dd5--7a746dd9cccf43a2866be62375ce20fb 7a746dd9cccf43a2866be62375ce20fb--4f12826cf72e49c4ac1e758254ed4727 57161c56e1e242228d19a6cdacf87519 7a746dd9cccf43a2866be62375ce20fb--57161c56e1e242228d19a6cdacf87519 290429a2bca34239b5db7ae640aba082 RX(theta₁₅) 57161c56e1e242228d19a6cdacf87519--290429a2bca34239b5db7ae640aba082 5163830c0be24113bdbb27108f8e9428 RY(theta₁₉) 290429a2bca34239b5db7ae640aba082--5163830c0be24113bdbb27108f8e9428 22b9c382e31f469083365639210c9636 RX(theta₂₃) 5163830c0be24113bdbb27108f8e9428--22b9c382e31f469083365639210c9636 a29cf36d96024f9b94c39feefa5e4fef X 22b9c382e31f469083365639210c9636--a29cf36d96024f9b94c39feefa5e4fef a29cf36d96024f9b94c39feefa5e4fef--a7a8a8ae7a0a4fb0a65cd4143e7118f7 5d89ce8b74144c5bbd3dd69611486e86 a29cf36d96024f9b94c39feefa5e4fef--5d89ce8b74144c5bbd3dd69611486e86 f2ef88bb6f3e43d987bf301f09e325fa 5d89ce8b74144c5bbd3dd69611486e86--f2ef88bb6f3e43d987bf301f09e325fa f2ef88bb6f3e43d987bf301f09e325fa--794181c1dfa34f38818cba30433b66eb