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_23c635ce8c064af79fe9aabd69989cea d8ed892cc16740ca9c775676ad5920fb 0 ed19512853b448aab00f1b58e2d175bc d8ed892cc16740ca9c775676ad5920fb--ed19512853b448aab00f1b58e2d175bc 6ba0dbf014264b439bca5484f56b2bca 1 1df0df0ac48d44318bbefc5f95ea3305 ed19512853b448aab00f1b58e2d175bc--1df0df0ac48d44318bbefc5f95ea3305 b894c0cb751c43e8beb96f3cfe3fc533 4efbaef58e9f4943b743570aab81e306 AddBlock 6ba0dbf014264b439bca5484f56b2bca--4efbaef58e9f4943b743570aab81e306 40274168da7045ad8597e726df3c8a2d 2 4efbaef58e9f4943b743570aab81e306--b894c0cb751c43e8beb96f3cfe3fc533 4fc45e4feed64a13bc6d97302940a094 a31f2f28ad6744289e735024beb766dd 40274168da7045ad8597e726df3c8a2d--a31f2f28ad6744289e735024beb766dd 3debc8c7358a48ccae15cd3b9058a519 3 a31f2f28ad6744289e735024beb766dd--4fc45e4feed64a13bc6d97302940a094 5c69e40b161b4dcabf2442af0706aabd 00e3ac6499474aadbb7edc4024a42e28 3debc8c7358a48ccae15cd3b9058a519--00e3ac6499474aadbb7edc4024a42e28 00e3ac6499474aadbb7edc4024a42e28--5c69e40b161b4dcabf2442af0706aabd

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_95f10bab328c4442827a28240ef3e9a6 Tower Chebyshev FM cluster_cf2ba0603a2a445081b9c084ea30eabb Tower Chebyshev FM f3e9a2a9dd3d41f9ad68000d1050d659 0 0335705fde79417692715ac341b0ebde RX(1.0*acos(x)) f3e9a2a9dd3d41f9ad68000d1050d659--0335705fde79417692715ac341b0ebde a1645f0e07464c988dc07c1b6a171333 1 949c66e2f8524cfc8badec9f1fc50029 0335705fde79417692715ac341b0ebde--949c66e2f8524cfc8badec9f1fc50029 6bcfab26cc3d4a49ad4cd91326bc8d83 2ab6cfad46864578a2474d70663d1a7a RX(2.0*acos(x)) a1645f0e07464c988dc07c1b6a171333--2ab6cfad46864578a2474d70663d1a7a 99b8682e3da744aabbd7e19d38ece39e 2 2ab6cfad46864578a2474d70663d1a7a--6bcfab26cc3d4a49ad4cd91326bc8d83 5bca698f6b7f4af0823d33a662a86dfb 7cd22c70d9d04f308878ca0b565f34ae RX(1.0*acos(2.0*y - 1.0)) 99b8682e3da744aabbd7e19d38ece39e--7cd22c70d9d04f308878ca0b565f34ae b5bb04ce2f70431b907b6605e04aaa7e 3 7cd22c70d9d04f308878ca0b565f34ae--5bca698f6b7f4af0823d33a662a86dfb 1dd6ccc1afab4b14abb65f56edbaa9ad eeada2c372ee43eea214958f3bdf235e RX(2.0*acos(2.0*y - 1.0)) b5bb04ce2f70431b907b6605e04aaa7e--eeada2c372ee43eea214958f3bdf235e eeada2c372ee43eea214958f3bdf235e--1dd6ccc1afab4b14abb65f56edbaa9ad

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 efafd248efcc4d719227e162ac934975 0 0e1c821b64da40c8b446c2b30f1d1a0e RX(theta₀) efafd248efcc4d719227e162ac934975--0e1c821b64da40c8b446c2b30f1d1a0e 7edd10aa64a6446dbc8c97f47354cb48 1 8bb955944db14932ba0e6d2144ab935a RY(theta₄) 0e1c821b64da40c8b446c2b30f1d1a0e--8bb955944db14932ba0e6d2144ab935a 7039b67cef394bda885743435d1ec268 RX(theta₈) 8bb955944db14932ba0e6d2144ab935a--7039b67cef394bda885743435d1ec268 2c76c54a911147b0a630d9f47a2d6730 7039b67cef394bda885743435d1ec268--2c76c54a911147b0a630d9f47a2d6730 9ad2e4782cdd4010afe14c7b505da361 2c76c54a911147b0a630d9f47a2d6730--9ad2e4782cdd4010afe14c7b505da361 8a160c0151cd4b4ca921949dae03f63e RX(theta₁₂) 9ad2e4782cdd4010afe14c7b505da361--8a160c0151cd4b4ca921949dae03f63e 7b0a4871183345a8b060c068bfab1dd5 RY(theta₁₆) 8a160c0151cd4b4ca921949dae03f63e--7b0a4871183345a8b060c068bfab1dd5 f4acabcf4e0749c596c0f742d86b3310 RX(theta₂₀) 7b0a4871183345a8b060c068bfab1dd5--f4acabcf4e0749c596c0f742d86b3310 7ef96ebbb98441719d4871d2774ba7a1 f4acabcf4e0749c596c0f742d86b3310--7ef96ebbb98441719d4871d2774ba7a1 97f4b8ecbd2c4bc491c53130437183a1 7ef96ebbb98441719d4871d2774ba7a1--97f4b8ecbd2c4bc491c53130437183a1 f3001fbadb0241bcbe592d00251b7aad 97f4b8ecbd2c4bc491c53130437183a1--f3001fbadb0241bcbe592d00251b7aad e84c073958914d4b95b572be13063cc4 f350bb0538de4e6da59f89135d47e493 RX(theta₁) 7edd10aa64a6446dbc8c97f47354cb48--f350bb0538de4e6da59f89135d47e493 a667db805b424bce93645f2095a903d1 2 6b31a9c9a8bf4fd2aa134b7b01743575 RY(theta₅) f350bb0538de4e6da59f89135d47e493--6b31a9c9a8bf4fd2aa134b7b01743575 53ed29c04e03495a9bd785311d966c6b RX(theta₉) 6b31a9c9a8bf4fd2aa134b7b01743575--53ed29c04e03495a9bd785311d966c6b 18fde677021c42c78e5d1ee32db77900 X 53ed29c04e03495a9bd785311d966c6b--18fde677021c42c78e5d1ee32db77900 18fde677021c42c78e5d1ee32db77900--2c76c54a911147b0a630d9f47a2d6730 3dbc32944ee041bebc329fc0ac712546 18fde677021c42c78e5d1ee32db77900--3dbc32944ee041bebc329fc0ac712546 2dfef6e87f514600ab552f66237b2661 RX(theta₁₃) 3dbc32944ee041bebc329fc0ac712546--2dfef6e87f514600ab552f66237b2661 99a0b71a1ad946108e0adc12aecdd967 RY(theta₁₇) 2dfef6e87f514600ab552f66237b2661--99a0b71a1ad946108e0adc12aecdd967 e9d426a710df485bbffb113d325aabec RX(theta₂₁) 99a0b71a1ad946108e0adc12aecdd967--e9d426a710df485bbffb113d325aabec 5156f87d4991412cb323fba6ef6f4304 X e9d426a710df485bbffb113d325aabec--5156f87d4991412cb323fba6ef6f4304 5156f87d4991412cb323fba6ef6f4304--7ef96ebbb98441719d4871d2774ba7a1 bfd3ba84d5684854bb161ec69361e9b5 5156f87d4991412cb323fba6ef6f4304--bfd3ba84d5684854bb161ec69361e9b5 bfd3ba84d5684854bb161ec69361e9b5--e84c073958914d4b95b572be13063cc4 e44293e6dc6b4dd791c541fdc5f949bc 09ad9d6005f34545a74361c21b6cd7fe RX(theta₂) a667db805b424bce93645f2095a903d1--09ad9d6005f34545a74361c21b6cd7fe 405ad6238c6e44efa3f75e75d6abdf86 3 c22ed985da434cc2a1e53790308d5af8 RY(theta₆) 09ad9d6005f34545a74361c21b6cd7fe--c22ed985da434cc2a1e53790308d5af8 f8db45e3d6c24ae88ddb6d0523e80b0c RX(theta₁₀) c22ed985da434cc2a1e53790308d5af8--f8db45e3d6c24ae88ddb6d0523e80b0c 636fb4951bae4de480db5ab905eacd3e f8db45e3d6c24ae88ddb6d0523e80b0c--636fb4951bae4de480db5ab905eacd3e c8026efc4a8442e4b320f4c99a0a80dc X 636fb4951bae4de480db5ab905eacd3e--c8026efc4a8442e4b320f4c99a0a80dc c8026efc4a8442e4b320f4c99a0a80dc--3dbc32944ee041bebc329fc0ac712546 6df1724ed9b148b29a3a1584da491e2e RX(theta₁₄) c8026efc4a8442e4b320f4c99a0a80dc--6df1724ed9b148b29a3a1584da491e2e c19211f94d9941e8938e9fb1097a1a8f RY(theta₁₈) 6df1724ed9b148b29a3a1584da491e2e--c19211f94d9941e8938e9fb1097a1a8f 8efb0984ff504c1cab9c68846e80c8f2 RX(theta₂₂) c19211f94d9941e8938e9fb1097a1a8f--8efb0984ff504c1cab9c68846e80c8f2 860c9cdb4f114a269177d6141eecb063 8efb0984ff504c1cab9c68846e80c8f2--860c9cdb4f114a269177d6141eecb063 5f8508e9b4b34b06841c34b8ddfab83b X 860c9cdb4f114a269177d6141eecb063--5f8508e9b4b34b06841c34b8ddfab83b 5f8508e9b4b34b06841c34b8ddfab83b--bfd3ba84d5684854bb161ec69361e9b5 5f8508e9b4b34b06841c34b8ddfab83b--e44293e6dc6b4dd791c541fdc5f949bc 1b57f1f54e06446b934bae2a79a2d828 c7e0b853221248788c8cbbbb9a5f1187 RX(theta₃) 405ad6238c6e44efa3f75e75d6abdf86--c7e0b853221248788c8cbbbb9a5f1187 9c70e1fd691c4bdc80db6ca7b3cea410 RY(theta₇) c7e0b853221248788c8cbbbb9a5f1187--9c70e1fd691c4bdc80db6ca7b3cea410 e85ea83c66584ffdb6025ceb910b7a40 RX(theta₁₁) 9c70e1fd691c4bdc80db6ca7b3cea410--e85ea83c66584ffdb6025ceb910b7a40 1ebfab5c23bd409286fb2a12c2c72edc X e85ea83c66584ffdb6025ceb910b7a40--1ebfab5c23bd409286fb2a12c2c72edc 1ebfab5c23bd409286fb2a12c2c72edc--636fb4951bae4de480db5ab905eacd3e 8e9c790bed604e6aac234f0e19cb6717 1ebfab5c23bd409286fb2a12c2c72edc--8e9c790bed604e6aac234f0e19cb6717 e812bfa5af9b4d00a2e1c5f77e1c380a RX(theta₁₅) 8e9c790bed604e6aac234f0e19cb6717--e812bfa5af9b4d00a2e1c5f77e1c380a 4c405db4be1b4b99bc90e7c0e84bd952 RY(theta₁₉) e812bfa5af9b4d00a2e1c5f77e1c380a--4c405db4be1b4b99bc90e7c0e84bd952 cf9fb840906a4a619230646132a0a28d RX(theta₂₃) 4c405db4be1b4b99bc90e7c0e84bd952--cf9fb840906a4a619230646132a0a28d 3d43af1d695d4dd48dfe7bbd5907a8cc X cf9fb840906a4a619230646132a0a28d--3d43af1d695d4dd48dfe7bbd5907a8cc 3d43af1d695d4dd48dfe7bbd5907a8cc--860c9cdb4f114a269177d6141eecb063 98c493f011434364acba6dfcc9334237 3d43af1d695d4dd48dfe7bbd5907a8cc--98c493f011434364acba6dfcc9334237 98c493f011434364acba6dfcc9334237--1b57f1f54e06446b934bae2a79a2d828

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_dedab20ae33c467f9def4466fd401a6c Obs. cluster_8cabadbfcc374f90950c689d217909c4 cluster_ba24d0dfbd5745f9a9f5efbd22a5fae2 Tower Chebyshev FM cluster_092d057b0c2142faa3e2d83460dfd6cd Tower Chebyshev FM cluster_99c349fe21634774b86c0d24f99d6a41 HEA 2a47a92dc4fd4c46b8d5d4dcbac5ad33 0 76463d0db8844a3b9fab062d6d435252 RX(1.0*acos(x)) 2a47a92dc4fd4c46b8d5d4dcbac5ad33--76463d0db8844a3b9fab062d6d435252 62a7175ed31445d1b446ab4d8e5dd735 1 b7d053193e894ba1aaebdf8910661ee6 RX(theta₀) 76463d0db8844a3b9fab062d6d435252--b7d053193e894ba1aaebdf8910661ee6 569b72f9e6794d50b97f8369c96c4231 RY(theta₄) b7d053193e894ba1aaebdf8910661ee6--569b72f9e6794d50b97f8369c96c4231 0f6aebb4eb8f41bf98acd519ab592ec8 RX(theta₈) 569b72f9e6794d50b97f8369c96c4231--0f6aebb4eb8f41bf98acd519ab592ec8 4e38f90460964ef08320c41fce6c1480 0f6aebb4eb8f41bf98acd519ab592ec8--4e38f90460964ef08320c41fce6c1480 2a17180b4c2f44308aeec2fafa17a08e 4e38f90460964ef08320c41fce6c1480--2a17180b4c2f44308aeec2fafa17a08e f76d5fb6c5ec41f79ef3f35c676c7899 RX(theta₁₂) 2a17180b4c2f44308aeec2fafa17a08e--f76d5fb6c5ec41f79ef3f35c676c7899 eab2dcb258324ecc9a28a8ed6874b24a RY(theta₁₆) f76d5fb6c5ec41f79ef3f35c676c7899--eab2dcb258324ecc9a28a8ed6874b24a 8fe5b9d8e3eb434e81f5ace10d792a37 RX(theta₂₀) eab2dcb258324ecc9a28a8ed6874b24a--8fe5b9d8e3eb434e81f5ace10d792a37 a3f3868bfe6c4f829cdf1ed3ae69c875 8fe5b9d8e3eb434e81f5ace10d792a37--a3f3868bfe6c4f829cdf1ed3ae69c875 7a98f2cbb63e46528deb07e31b9a1b82 a3f3868bfe6c4f829cdf1ed3ae69c875--7a98f2cbb63e46528deb07e31b9a1b82 4818bb9e025d4d4ca9771c933bb80079 7a98f2cbb63e46528deb07e31b9a1b82--4818bb9e025d4d4ca9771c933bb80079 f253ab14860f410e9d284f503a263167 4818bb9e025d4d4ca9771c933bb80079--f253ab14860f410e9d284f503a263167 e1e6d9e9d17a4e12890295eb5b2c680b 36af8041462147e9af00c920b6e711f6 RX(2.0*acos(x)) 62a7175ed31445d1b446ab4d8e5dd735--36af8041462147e9af00c920b6e711f6 ecb661db1e224613b7f3116ddab6b9c2 2 201b52566e3841e4825131762ac6a9eb RX(theta₁) 36af8041462147e9af00c920b6e711f6--201b52566e3841e4825131762ac6a9eb d3f370618841493f8f2ff70949144601 RY(theta₅) 201b52566e3841e4825131762ac6a9eb--d3f370618841493f8f2ff70949144601 855c361fb2fb413993092aec34e83926 RX(theta₉) d3f370618841493f8f2ff70949144601--855c361fb2fb413993092aec34e83926 a2e40cd9a40d4797ba9d3350b0d5ec6b X 855c361fb2fb413993092aec34e83926--a2e40cd9a40d4797ba9d3350b0d5ec6b a2e40cd9a40d4797ba9d3350b0d5ec6b--4e38f90460964ef08320c41fce6c1480 b069a22a84ac4d8b9e9c1fecc40be71e a2e40cd9a40d4797ba9d3350b0d5ec6b--b069a22a84ac4d8b9e9c1fecc40be71e 80fa9d5a7a694c6bacca62490d647693 RX(theta₁₃) b069a22a84ac4d8b9e9c1fecc40be71e--80fa9d5a7a694c6bacca62490d647693 bbcceede555e4309bdf0ad8b62cc7937 RY(theta₁₇) 80fa9d5a7a694c6bacca62490d647693--bbcceede555e4309bdf0ad8b62cc7937 dc5c113afc4e45b48b7904c377ebaf56 RX(theta₂₁) bbcceede555e4309bdf0ad8b62cc7937--dc5c113afc4e45b48b7904c377ebaf56 a5efe248d95a4ba6a20bf8d848680b77 X dc5c113afc4e45b48b7904c377ebaf56--a5efe248d95a4ba6a20bf8d848680b77 a5efe248d95a4ba6a20bf8d848680b77--a3f3868bfe6c4f829cdf1ed3ae69c875 dad8dce898494fc59a45dc0e55780d24 a5efe248d95a4ba6a20bf8d848680b77--dad8dce898494fc59a45dc0e55780d24 d487b11a8b1949b99597cf3e80b82783 AddBlock dad8dce898494fc59a45dc0e55780d24--d487b11a8b1949b99597cf3e80b82783 d487b11a8b1949b99597cf3e80b82783--e1e6d9e9d17a4e12890295eb5b2c680b 8a79f7338f1f43819182a92ce39bceec 4ecc164e27b9469d88f8d75afcc059b4 RX(1.0*acos(2.0*y - 1.0)) ecb661db1e224613b7f3116ddab6b9c2--4ecc164e27b9469d88f8d75afcc059b4 810f9057b24d4eb4bfe70dc2c71f372a 3 63b2f2d5c8054da5bcc795a381b48e46 RX(theta₂) 4ecc164e27b9469d88f8d75afcc059b4--63b2f2d5c8054da5bcc795a381b48e46 0cdfe880118440a1bbae5c658baa2b77 RY(theta₆) 63b2f2d5c8054da5bcc795a381b48e46--0cdfe880118440a1bbae5c658baa2b77 f39584c500704a4e85e348a8db71057e RX(theta₁₀) 0cdfe880118440a1bbae5c658baa2b77--f39584c500704a4e85e348a8db71057e 2f4fd8cb6942451eb321192d32095d0d f39584c500704a4e85e348a8db71057e--2f4fd8cb6942451eb321192d32095d0d 067699382d674f83b29c217f4fc30d45 X 2f4fd8cb6942451eb321192d32095d0d--067699382d674f83b29c217f4fc30d45 067699382d674f83b29c217f4fc30d45--b069a22a84ac4d8b9e9c1fecc40be71e a37e6671c7234af0a4679a45d9864e9a RX(theta₁₄) 067699382d674f83b29c217f4fc30d45--a37e6671c7234af0a4679a45d9864e9a 9dc83c1148b74452ba7806896d2f8dbb RY(theta₁₈) a37e6671c7234af0a4679a45d9864e9a--9dc83c1148b74452ba7806896d2f8dbb e30081adf62b4683a47ec95ba12ab32a RX(theta₂₂) 9dc83c1148b74452ba7806896d2f8dbb--e30081adf62b4683a47ec95ba12ab32a 319c9285eb2f43ca80afed38efe568d5 e30081adf62b4683a47ec95ba12ab32a--319c9285eb2f43ca80afed38efe568d5 1917d559c900491485642bd2bf864764 X 319c9285eb2f43ca80afed38efe568d5--1917d559c900491485642bd2bf864764 1917d559c900491485642bd2bf864764--dad8dce898494fc59a45dc0e55780d24 581ab27e16c748f9bff3dba2e12ad474 1917d559c900491485642bd2bf864764--581ab27e16c748f9bff3dba2e12ad474 581ab27e16c748f9bff3dba2e12ad474--8a79f7338f1f43819182a92ce39bceec ecd5dcab3fc34835a25bf361f22dd2f7 e6ddd3c93c2144048519a7d3bf0c7079 RX(2.0*acos(2.0*y - 1.0)) 810f9057b24d4eb4bfe70dc2c71f372a--e6ddd3c93c2144048519a7d3bf0c7079 b5326820c5f4434b8f5d732a6e9ab783 RX(theta₃) e6ddd3c93c2144048519a7d3bf0c7079--b5326820c5f4434b8f5d732a6e9ab783 e3b46ce383f24bbe9a72128a49849168 RY(theta₇) b5326820c5f4434b8f5d732a6e9ab783--e3b46ce383f24bbe9a72128a49849168 b12e36ee09c64049b63036b81fc887fa RX(theta₁₁) e3b46ce383f24bbe9a72128a49849168--b12e36ee09c64049b63036b81fc887fa d17e968b8b424c8389b1cfb2b005b780 X b12e36ee09c64049b63036b81fc887fa--d17e968b8b424c8389b1cfb2b005b780 d17e968b8b424c8389b1cfb2b005b780--2f4fd8cb6942451eb321192d32095d0d 2eb52263bb5f471a99516cba2f83f1c1 d17e968b8b424c8389b1cfb2b005b780--2eb52263bb5f471a99516cba2f83f1c1 e96e8b224773432b898682a5ed6bc3e4 RX(theta₁₅) 2eb52263bb5f471a99516cba2f83f1c1--e96e8b224773432b898682a5ed6bc3e4 3552e87cc68c4425917784bdd0ed9dfd RY(theta₁₉) e96e8b224773432b898682a5ed6bc3e4--3552e87cc68c4425917784bdd0ed9dfd 5f73fa13ac874bb790b29a17af4dc770 RX(theta₂₃) 3552e87cc68c4425917784bdd0ed9dfd--5f73fa13ac874bb790b29a17af4dc770 2ecba01b816b4736a4a83e5ab5aaf359 X 5f73fa13ac874bb790b29a17af4dc770--2ecba01b816b4736a4a83e5ab5aaf359 2ecba01b816b4736a4a83e5ab5aaf359--319c9285eb2f43ca80afed38efe568d5 b80da3dabda94ad486a8df4959887817 2ecba01b816b4736a4a83e5ab5aaf359--b80da3dabda94ad486a8df4959887817 7f48e5718e05426f8d33233a24fe0ff3 b80da3dabda94ad486a8df4959887817--7f48e5718e05426f8d33233a24fe0ff3 7f48e5718e05426f8d33233a24fe0ff3--ecd5dcab3fc34835a25bf361f22dd2f7