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_fb7dcf8e60f54a7f9e7a686d5b4f4e62 25882fdc6f6a460c9f76c3347c59cdb7 0 6c74d32935404eb89fb44d89441de714 25882fdc6f6a460c9f76c3347c59cdb7--6c74d32935404eb89fb44d89441de714 4f2d91b309024d8d9f68b6fd13603b80 1 698532eac24445559904a80a7d862a6c 6c74d32935404eb89fb44d89441de714--698532eac24445559904a80a7d862a6c 996d2ad3224c49abbe6c25d6ffc107d0 f767d31c26c34b16b614946d36ea10ce AddBlock 4f2d91b309024d8d9f68b6fd13603b80--f767d31c26c34b16b614946d36ea10ce 4c1d2f68cde943c4b4f7b88ca75a5a9c 2 f767d31c26c34b16b614946d36ea10ce--996d2ad3224c49abbe6c25d6ffc107d0 ce0417223c414fa18b4cdd1cfb875820 f7454f158a83403a88c80bc4e5fb245e 4c1d2f68cde943c4b4f7b88ca75a5a9c--f7454f158a83403a88c80bc4e5fb245e 3d1f6819b5604d72be579ed3fc46b60d 3 f7454f158a83403a88c80bc4e5fb245e--ce0417223c414fa18b4cdd1cfb875820 0dbb932426e044cea8c1251e900fa4bf 29a29fa366a54c05a3825c545c426939 3d1f6819b5604d72be579ed3fc46b60d--29a29fa366a54c05a3825c545c426939 29a29fa366a54c05a3825c545c426939--0dbb932426e044cea8c1251e900fa4bf

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_e1e1072a2e19477fae7be5ddb0c29391 Tower Chebyshev FM cluster_d5b91af03cd2499d96224828217ad43c Tower Chebyshev FM e6c4c0625ac94125a0d6ad36109c3f5b 0 853b42fd184e45fc85055ff84d854f0f RX(1.0*acos(x)) e6c4c0625ac94125a0d6ad36109c3f5b--853b42fd184e45fc85055ff84d854f0f 42fa03a809124e39b2e7920448fbd562 1 4d01c2836e954e50ab329b078efe584a 853b42fd184e45fc85055ff84d854f0f--4d01c2836e954e50ab329b078efe584a 4d5dbb3d5184448d95da529d6ebec4eb fbcb73fae6d24acaaf2a4432a9311fd4 RX(2.0*acos(x)) 42fa03a809124e39b2e7920448fbd562--fbcb73fae6d24acaaf2a4432a9311fd4 6788b5c01105448195c3b549629d7614 2 fbcb73fae6d24acaaf2a4432a9311fd4--4d5dbb3d5184448d95da529d6ebec4eb 035429235ad147218c953b5aabe3c9d7 b862291e5d614f178eb853e6e2731ee6 RX(1.0*acos(2.0*y - 1.0)) 6788b5c01105448195c3b549629d7614--b862291e5d614f178eb853e6e2731ee6 13b911a39d2d402e9e58e5617c7566f3 3 b862291e5d614f178eb853e6e2731ee6--035429235ad147218c953b5aabe3c9d7 074c34994f16442a9e646a2bfe53ec31 a2993219b12d41ee9f25a2060c17b817 RX(2.0*acos(2.0*y - 1.0)) 13b911a39d2d402e9e58e5617c7566f3--a2993219b12d41ee9f25a2060c17b817 a2993219b12d41ee9f25a2060c17b817--074c34994f16442a9e646a2bfe53ec31

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 f6f99a51ae5e4fa4ba16c1301486a4d7 0 091cb528d89747b1b46a67cdde15fbf9 RX(theta₀) f6f99a51ae5e4fa4ba16c1301486a4d7--091cb528d89747b1b46a67cdde15fbf9 b7370cb556bd4b2aa72479200d5348fe 1 ef130d46024d4d05a631b5f69016d638 RY(theta₄) 091cb528d89747b1b46a67cdde15fbf9--ef130d46024d4d05a631b5f69016d638 f1c600cf9811442298baa117f975a6fd RX(theta₈) ef130d46024d4d05a631b5f69016d638--f1c600cf9811442298baa117f975a6fd 6a8292096d974db6a739f32a9dd4a02b f1c600cf9811442298baa117f975a6fd--6a8292096d974db6a739f32a9dd4a02b d75da513daa744c48676fe9e1e51e3e3 6a8292096d974db6a739f32a9dd4a02b--d75da513daa744c48676fe9e1e51e3e3 9b362479c1604b88aa340af55cc844f2 RX(theta₁₂) d75da513daa744c48676fe9e1e51e3e3--9b362479c1604b88aa340af55cc844f2 b70b1f397b7245e2aeb24cb2d99054e5 RY(theta₁₆) 9b362479c1604b88aa340af55cc844f2--b70b1f397b7245e2aeb24cb2d99054e5 2283b33f82fb44d8ba3fdca478c92eff RX(theta₂₀) b70b1f397b7245e2aeb24cb2d99054e5--2283b33f82fb44d8ba3fdca478c92eff bff3e095cdb443d5b11326d34801eb12 2283b33f82fb44d8ba3fdca478c92eff--bff3e095cdb443d5b11326d34801eb12 938229308361415cb9aac7271538b562 bff3e095cdb443d5b11326d34801eb12--938229308361415cb9aac7271538b562 5b5168b6401341b2a53506355dc8cf5b 938229308361415cb9aac7271538b562--5b5168b6401341b2a53506355dc8cf5b c7555f3b32b74aa5a8c415e03b0f2a69 ab23ba4fa445470dae03232a5030faab RX(theta₁) b7370cb556bd4b2aa72479200d5348fe--ab23ba4fa445470dae03232a5030faab 99f3d6aa2fd14c3ca1dff4cef0b0a21a 2 e8af1b511b4c43e7ab758c77f983a0fd RY(theta₅) ab23ba4fa445470dae03232a5030faab--e8af1b511b4c43e7ab758c77f983a0fd 34c2b3ad2ab94316ab4b788954cde98d RX(theta₉) e8af1b511b4c43e7ab758c77f983a0fd--34c2b3ad2ab94316ab4b788954cde98d 2032c9680d6e4e30a33792d0c20b27bc X 34c2b3ad2ab94316ab4b788954cde98d--2032c9680d6e4e30a33792d0c20b27bc 2032c9680d6e4e30a33792d0c20b27bc--6a8292096d974db6a739f32a9dd4a02b e2c508eb92a34d638e753c89cbe05e66 2032c9680d6e4e30a33792d0c20b27bc--e2c508eb92a34d638e753c89cbe05e66 e6e38c7089604369b9098a080733da8f RX(theta₁₃) e2c508eb92a34d638e753c89cbe05e66--e6e38c7089604369b9098a080733da8f 3af15ff9943f4d128b1d3c4c933b1c29 RY(theta₁₇) e6e38c7089604369b9098a080733da8f--3af15ff9943f4d128b1d3c4c933b1c29 784e04ea77294d2d87e0ee8d11d00412 RX(theta₂₁) 3af15ff9943f4d128b1d3c4c933b1c29--784e04ea77294d2d87e0ee8d11d00412 c66b1821c6434d138f31c9936056032e X 784e04ea77294d2d87e0ee8d11d00412--c66b1821c6434d138f31c9936056032e c66b1821c6434d138f31c9936056032e--bff3e095cdb443d5b11326d34801eb12 2d3326eb3ba6459b94c3967f2cb28a55 c66b1821c6434d138f31c9936056032e--2d3326eb3ba6459b94c3967f2cb28a55 2d3326eb3ba6459b94c3967f2cb28a55--c7555f3b32b74aa5a8c415e03b0f2a69 32b4eeeda86f49a3ade503bb313cacde d7037c6864284c348b06efbe2570541b RX(theta₂) 99f3d6aa2fd14c3ca1dff4cef0b0a21a--d7037c6864284c348b06efbe2570541b fdae2debc097444685efbac7533baef7 3 db67b77aa8ea4cea935e545fe30d83f3 RY(theta₆) d7037c6864284c348b06efbe2570541b--db67b77aa8ea4cea935e545fe30d83f3 e438cc6208ca4577bc4facb9e840c199 RX(theta₁₀) db67b77aa8ea4cea935e545fe30d83f3--e438cc6208ca4577bc4facb9e840c199 43b3989ea05e469ea20c53a206efea7a e438cc6208ca4577bc4facb9e840c199--43b3989ea05e469ea20c53a206efea7a d15f7ee9b8404f6ba11777afcae9926a X 43b3989ea05e469ea20c53a206efea7a--d15f7ee9b8404f6ba11777afcae9926a d15f7ee9b8404f6ba11777afcae9926a--e2c508eb92a34d638e753c89cbe05e66 e4cfb250aca74adaaaba8a0fc8e2cbb2 RX(theta₁₄) d15f7ee9b8404f6ba11777afcae9926a--e4cfb250aca74adaaaba8a0fc8e2cbb2 f45ad15f39d84bce994dcd81b065de3b RY(theta₁₈) e4cfb250aca74adaaaba8a0fc8e2cbb2--f45ad15f39d84bce994dcd81b065de3b d1fc4419bdc041899719a007f1bc7eaf RX(theta₂₂) f45ad15f39d84bce994dcd81b065de3b--d1fc4419bdc041899719a007f1bc7eaf 43ddfaa3211046478375634bf27a54fd d1fc4419bdc041899719a007f1bc7eaf--43ddfaa3211046478375634bf27a54fd 1b014d5533664710b3da728758be2203 X 43ddfaa3211046478375634bf27a54fd--1b014d5533664710b3da728758be2203 1b014d5533664710b3da728758be2203--2d3326eb3ba6459b94c3967f2cb28a55 1b014d5533664710b3da728758be2203--32b4eeeda86f49a3ade503bb313cacde b99c719733c246cb80b251153251d867 034ca272ee78443e93fc8ca172907879 RX(theta₃) fdae2debc097444685efbac7533baef7--034ca272ee78443e93fc8ca172907879 d5d0ce50147847f2af236c77df66be5a RY(theta₇) 034ca272ee78443e93fc8ca172907879--d5d0ce50147847f2af236c77df66be5a 52be90b2853341f2bcb55b0bbc6b7d0e RX(theta₁₁) d5d0ce50147847f2af236c77df66be5a--52be90b2853341f2bcb55b0bbc6b7d0e 9b2d9084663f416db1abeda6fbe1fd44 X 52be90b2853341f2bcb55b0bbc6b7d0e--9b2d9084663f416db1abeda6fbe1fd44 9b2d9084663f416db1abeda6fbe1fd44--43b3989ea05e469ea20c53a206efea7a 6da32febaae044778259ae0e3d279669 9b2d9084663f416db1abeda6fbe1fd44--6da32febaae044778259ae0e3d279669 493a297fc2fa4f14aeccb2c9a45f4471 RX(theta₁₅) 6da32febaae044778259ae0e3d279669--493a297fc2fa4f14aeccb2c9a45f4471 85429c0a455648c2984a6b4cb4936508 RY(theta₁₉) 493a297fc2fa4f14aeccb2c9a45f4471--85429c0a455648c2984a6b4cb4936508 6d1eca09c15b48adaa66f079b07dfc3e RX(theta₂₃) 85429c0a455648c2984a6b4cb4936508--6d1eca09c15b48adaa66f079b07dfc3e 92c89391861f43deb6ab94ce1922d16f X 6d1eca09c15b48adaa66f079b07dfc3e--92c89391861f43deb6ab94ce1922d16f 92c89391861f43deb6ab94ce1922d16f--43ddfaa3211046478375634bf27a54fd cd887c18fc9e4367be9de6b825c87862 92c89391861f43deb6ab94ce1922d16f--cd887c18fc9e4367be9de6b825c87862 cd887c18fc9e4367be9de6b825c87862--b99c719733c246cb80b251153251d867

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_851a213c1c144685b13c4b7775b68a09 Obs. cluster_1cb778b191c249bfbfa7aec2efc4643f cluster_18221da936bc488bab845968a6f4c1fe Tower Chebyshev FM cluster_6b1e635ae95a41f1afe3136ad7b93723 Tower Chebyshev FM cluster_cb057a6118954564a3b49f1b65548781 HEA e8250891fd31482b83c2801aad6721d1 0 b20acf4b5e6443bea2767e80f0c0debc RX(1.0*acos(x)) e8250891fd31482b83c2801aad6721d1--b20acf4b5e6443bea2767e80f0c0debc c3fc17c26442439c93c2ef19a4dd912d 1 0a3db963797d435695a65f13dd3abd6b RX(theta₀) b20acf4b5e6443bea2767e80f0c0debc--0a3db963797d435695a65f13dd3abd6b 655a6ac178524ea2b7e3bdb244d55dce RY(theta₄) 0a3db963797d435695a65f13dd3abd6b--655a6ac178524ea2b7e3bdb244d55dce 8b5e85964f9a4fa09794b5981e5f0cd9 RX(theta₈) 655a6ac178524ea2b7e3bdb244d55dce--8b5e85964f9a4fa09794b5981e5f0cd9 a64c38d1b48b439da4b6c6b1de9a85d4 8b5e85964f9a4fa09794b5981e5f0cd9--a64c38d1b48b439da4b6c6b1de9a85d4 578eea85c096445b9bfeca2096172132 a64c38d1b48b439da4b6c6b1de9a85d4--578eea85c096445b9bfeca2096172132 59712192b1b9409397628474c89c3aac RX(theta₁₂) 578eea85c096445b9bfeca2096172132--59712192b1b9409397628474c89c3aac 30dfd27d833f47729077dcde37fecf6a RY(theta₁₆) 59712192b1b9409397628474c89c3aac--30dfd27d833f47729077dcde37fecf6a 2f20d80abbde41299abe0a84a8c529da RX(theta₂₀) 30dfd27d833f47729077dcde37fecf6a--2f20d80abbde41299abe0a84a8c529da 586aa404df3e469caf2d0a280db7f5ce 2f20d80abbde41299abe0a84a8c529da--586aa404df3e469caf2d0a280db7f5ce b8953a5e33644d938c293c01075468e6 586aa404df3e469caf2d0a280db7f5ce--b8953a5e33644d938c293c01075468e6 238372cfe5e646c7a3587eecf9551251 b8953a5e33644d938c293c01075468e6--238372cfe5e646c7a3587eecf9551251 3a9cabd91b2e46a6b92e5569b471ba58 238372cfe5e646c7a3587eecf9551251--3a9cabd91b2e46a6b92e5569b471ba58 52f6cef894f54182a3d5f62cecd2c2d5 9dd7d41ab0cd41778b90d6036e63bdf8 RX(2.0*acos(x)) c3fc17c26442439c93c2ef19a4dd912d--9dd7d41ab0cd41778b90d6036e63bdf8 29c809b7cc554993ab00607ffac2f126 2 c963da8bc2e74afd8589c7698d27c592 RX(theta₁) 9dd7d41ab0cd41778b90d6036e63bdf8--c963da8bc2e74afd8589c7698d27c592 8d6f3b8cca22424f89dfd0bbbc1b6719 RY(theta₅) c963da8bc2e74afd8589c7698d27c592--8d6f3b8cca22424f89dfd0bbbc1b6719 2a0cb04179324a039e7fc8a37a7078b0 RX(theta₉) 8d6f3b8cca22424f89dfd0bbbc1b6719--2a0cb04179324a039e7fc8a37a7078b0 0915da38d80c41bc8a21c52fc110828b X 2a0cb04179324a039e7fc8a37a7078b0--0915da38d80c41bc8a21c52fc110828b 0915da38d80c41bc8a21c52fc110828b--a64c38d1b48b439da4b6c6b1de9a85d4 6078ab6c1eb74a33b4bd3ac485b4ffea 0915da38d80c41bc8a21c52fc110828b--6078ab6c1eb74a33b4bd3ac485b4ffea 4cd0707faf7e43d385dca66470381d72 RX(theta₁₃) 6078ab6c1eb74a33b4bd3ac485b4ffea--4cd0707faf7e43d385dca66470381d72 c7b71558fa8948db99b57447b5fe4de1 RY(theta₁₇) 4cd0707faf7e43d385dca66470381d72--c7b71558fa8948db99b57447b5fe4de1 e446185aa2e14918917b94d724403326 RX(theta₂₁) c7b71558fa8948db99b57447b5fe4de1--e446185aa2e14918917b94d724403326 fa2443a30ed749da9c2a6ee8687caacc X e446185aa2e14918917b94d724403326--fa2443a30ed749da9c2a6ee8687caacc fa2443a30ed749da9c2a6ee8687caacc--586aa404df3e469caf2d0a280db7f5ce d584a7024e6e4cada634121d6e535b68 fa2443a30ed749da9c2a6ee8687caacc--d584a7024e6e4cada634121d6e535b68 699ed01e28d8422c84ceb4734e21c20d AddBlock d584a7024e6e4cada634121d6e535b68--699ed01e28d8422c84ceb4734e21c20d 699ed01e28d8422c84ceb4734e21c20d--52f6cef894f54182a3d5f62cecd2c2d5 8d24c1efc1794c028ce19cd03dd08b06 50c882da7fb04c64a10df24399bf6cf0 RX(1.0*acos(2.0*y - 1.0)) 29c809b7cc554993ab00607ffac2f126--50c882da7fb04c64a10df24399bf6cf0 5ffae5eadec04752b3f8b92e8e51ebdb 3 6b03dbd71fed4936b0d29c914881d457 RX(theta₂) 50c882da7fb04c64a10df24399bf6cf0--6b03dbd71fed4936b0d29c914881d457 cc1ccf02da7f407797dcb2e48695eee4 RY(theta₆) 6b03dbd71fed4936b0d29c914881d457--cc1ccf02da7f407797dcb2e48695eee4 4bb9ecd47ae94cc2be392f33fca80bba RX(theta₁₀) cc1ccf02da7f407797dcb2e48695eee4--4bb9ecd47ae94cc2be392f33fca80bba 06319ef5b7e243d880e8a36fbf3a3f7d 4bb9ecd47ae94cc2be392f33fca80bba--06319ef5b7e243d880e8a36fbf3a3f7d 134916f03edb4bf7a7139b666009d9af X 06319ef5b7e243d880e8a36fbf3a3f7d--134916f03edb4bf7a7139b666009d9af 134916f03edb4bf7a7139b666009d9af--6078ab6c1eb74a33b4bd3ac485b4ffea da795a7ccad1409ea10356256106b30a RX(theta₁₄) 134916f03edb4bf7a7139b666009d9af--da795a7ccad1409ea10356256106b30a 962cc79334464a6cb3410d1b119feb45 RY(theta₁₈) da795a7ccad1409ea10356256106b30a--962cc79334464a6cb3410d1b119feb45 c37b325d92c340c0a993d1d78731fc4b RX(theta₂₂) 962cc79334464a6cb3410d1b119feb45--c37b325d92c340c0a993d1d78731fc4b 40f284a840534eb8a30df1a28faac7dc c37b325d92c340c0a993d1d78731fc4b--40f284a840534eb8a30df1a28faac7dc 1de84313ba7f41d6b8f7d4bd78f47084 X 40f284a840534eb8a30df1a28faac7dc--1de84313ba7f41d6b8f7d4bd78f47084 1de84313ba7f41d6b8f7d4bd78f47084--d584a7024e6e4cada634121d6e535b68 4e5034c2079646f7b6ec3fb0b41cfb66 1de84313ba7f41d6b8f7d4bd78f47084--4e5034c2079646f7b6ec3fb0b41cfb66 4e5034c2079646f7b6ec3fb0b41cfb66--8d24c1efc1794c028ce19cd03dd08b06 04ed2dd952fb436eaeba151551e57494 a73131cbf3f3494d87e2a338d06e6c17 RX(2.0*acos(2.0*y - 1.0)) 5ffae5eadec04752b3f8b92e8e51ebdb--a73131cbf3f3494d87e2a338d06e6c17 bba2be37671a402d97a657dea575b5c2 RX(theta₃) a73131cbf3f3494d87e2a338d06e6c17--bba2be37671a402d97a657dea575b5c2 0b399e6d6b2a4344a5144b1efc3f5d67 RY(theta₇) bba2be37671a402d97a657dea575b5c2--0b399e6d6b2a4344a5144b1efc3f5d67 a30e347569e54b3db8d0c889f9fea8eb RX(theta₁₁) 0b399e6d6b2a4344a5144b1efc3f5d67--a30e347569e54b3db8d0c889f9fea8eb 84c9928310e54d8aa13052a38603258f X a30e347569e54b3db8d0c889f9fea8eb--84c9928310e54d8aa13052a38603258f 84c9928310e54d8aa13052a38603258f--06319ef5b7e243d880e8a36fbf3a3f7d 36525b31d7c8427093834ba9781d9c35 84c9928310e54d8aa13052a38603258f--36525b31d7c8427093834ba9781d9c35 4bea0317d5fb44d78bb865d5e3c06fe5 RX(theta₁₅) 36525b31d7c8427093834ba9781d9c35--4bea0317d5fb44d78bb865d5e3c06fe5 13f3bc05f1e446e689a78feebb263665 RY(theta₁₉) 4bea0317d5fb44d78bb865d5e3c06fe5--13f3bc05f1e446e689a78feebb263665 8fbeb70e20434d58b5f7d20d21ce8a8c RX(theta₂₃) 13f3bc05f1e446e689a78feebb263665--8fbeb70e20434d58b5f7d20d21ce8a8c ce260220f7c947d2bb40465092bf2754 X 8fbeb70e20434d58b5f7d20d21ce8a8c--ce260220f7c947d2bb40465092bf2754 ce260220f7c947d2bb40465092bf2754--40f284a840534eb8a30df1a28faac7dc 959c048ce4c04625bd32bfcca587cb5c ce260220f7c947d2bb40465092bf2754--959c048ce4c04625bd32bfcca587cb5c 792885577d2e4792b32a59ccff966592 959c048ce4c04625bd32bfcca587cb5c--792885577d2e4792b32a59ccff966592 792885577d2e4792b32a59ccff966592--04ed2dd952fb436eaeba151551e57494