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_c1ec82fcc86f465189ebea5ced0c55c9 ffeeb6bec4ba4415bbf1c133ff633ff5 0 55079d03caba45198647f63d0c77c263 ffeeb6bec4ba4415bbf1c133ff633ff5--55079d03caba45198647f63d0c77c263 f1b251b71f854523b3654da965ddea51 1 7363f721c3484a848904727a400faba3 55079d03caba45198647f63d0c77c263--7363f721c3484a848904727a400faba3 1887758f172f4fe58f28a5171836c708 4a3a158e9c9f4140918502a5da44cb29 AddBlock f1b251b71f854523b3654da965ddea51--4a3a158e9c9f4140918502a5da44cb29 2c808ca94570412ba79da19bd011e7fa 2 4a3a158e9c9f4140918502a5da44cb29--1887758f172f4fe58f28a5171836c708 77ad8cdade4c4073b217459d28323b52 fae3db09f3a848f8984bc3b23190d82e 2c808ca94570412ba79da19bd011e7fa--fae3db09f3a848f8984bc3b23190d82e 7404f27d7de14477ac1cc6f62d21f78d 3 fae3db09f3a848f8984bc3b23190d82e--77ad8cdade4c4073b217459d28323b52 1da5a10b0bda45c6bf4f6bf96a3a2b5f 033dbd2a8d38483cb0e2335d5a175908 7404f27d7de14477ac1cc6f62d21f78d--033dbd2a8d38483cb0e2335d5a175908 033dbd2a8d38483cb0e2335d5a175908--1da5a10b0bda45c6bf4f6bf96a3a2b5f

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_d0e91c4d52f64a229993c78bc3f8802e Tower Chebyshev FM cluster_337b62a949e54f41844fe3872366f38a Tower Chebyshev FM 4b5e974a5c644e71a2c8b62801646b8d 0 acf1d752623a48d2aeec371fde7f92a5 RX(1.0*acos(x)) 4b5e974a5c644e71a2c8b62801646b8d--acf1d752623a48d2aeec371fde7f92a5 bb9b36a993f1476fa92ce6a8d77cac0d 1 6d00a515abc94143a283ccbf6564beb3 acf1d752623a48d2aeec371fde7f92a5--6d00a515abc94143a283ccbf6564beb3 436e0ae011214c9582d3bd3f95992c9d 3145e7b9decd4200b809f9eaf0550e35 RX(2.0*acos(x)) bb9b36a993f1476fa92ce6a8d77cac0d--3145e7b9decd4200b809f9eaf0550e35 7669983db1364a6ca7bec3cbc4da1bb7 2 3145e7b9decd4200b809f9eaf0550e35--436e0ae011214c9582d3bd3f95992c9d b5ef2904713742f49e16af843c7e9a42 fe616d312c51473bbe8218d9eb304c70 RX(1.0*acos(2.0*y - 1.0)) 7669983db1364a6ca7bec3cbc4da1bb7--fe616d312c51473bbe8218d9eb304c70 a25fdd61353e4cf4a21747708e8441fa 3 fe616d312c51473bbe8218d9eb304c70--b5ef2904713742f49e16af843c7e9a42 e8d633397da74104840ef4adf8c88e3f 8367f23bc8614421ba54429b94eb8d9b RX(2.0*acos(2.0*y - 1.0)) a25fdd61353e4cf4a21747708e8441fa--8367f23bc8614421ba54429b94eb8d9b 8367f23bc8614421ba54429b94eb8d9b--e8d633397da74104840ef4adf8c88e3f

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 c4ef82016a704010bd1ca5ae73cbc991 0 74c7d82ead02418d9089a87226f0dfc5 RX(theta₀) c4ef82016a704010bd1ca5ae73cbc991--74c7d82ead02418d9089a87226f0dfc5 23e6d46741d14285bd603c0023726b0f 1 0982461b460f4f2fa1f02c1416a94b8b RY(theta₄) 74c7d82ead02418d9089a87226f0dfc5--0982461b460f4f2fa1f02c1416a94b8b f7a5219314cf4c3aba5620306cfcfdc0 RX(theta₈) 0982461b460f4f2fa1f02c1416a94b8b--f7a5219314cf4c3aba5620306cfcfdc0 7687adff4ab84c4ea47d5dee5303f937 f7a5219314cf4c3aba5620306cfcfdc0--7687adff4ab84c4ea47d5dee5303f937 3da08587825d49b492e3014dca4977a4 7687adff4ab84c4ea47d5dee5303f937--3da08587825d49b492e3014dca4977a4 179b7948194b49788d36effa45a157e5 RX(theta₁₂) 3da08587825d49b492e3014dca4977a4--179b7948194b49788d36effa45a157e5 a48c59bce08046bdae051eb3e972448b RY(theta₁₆) 179b7948194b49788d36effa45a157e5--a48c59bce08046bdae051eb3e972448b f2ad1d23fe2943489278fcc41ab5a2ec RX(theta₂₀) a48c59bce08046bdae051eb3e972448b--f2ad1d23fe2943489278fcc41ab5a2ec cb2de95ba6ad49fbb84c9a555e4c4bde f2ad1d23fe2943489278fcc41ab5a2ec--cb2de95ba6ad49fbb84c9a555e4c4bde 81b34b93c2ba400aa811cc64388f4013 cb2de95ba6ad49fbb84c9a555e4c4bde--81b34b93c2ba400aa811cc64388f4013 7c09fae1f746455f940552925e2712fe 81b34b93c2ba400aa811cc64388f4013--7c09fae1f746455f940552925e2712fe 758972f2064f448d80cf3409fc95ed9b e21a88472a364007a72afaab29f3207e RX(theta₁) 23e6d46741d14285bd603c0023726b0f--e21a88472a364007a72afaab29f3207e 495171bf620e4ab09fb07095fccc8310 2 c24362a64f6c4591b661d6cabb025f67 RY(theta₅) e21a88472a364007a72afaab29f3207e--c24362a64f6c4591b661d6cabb025f67 9ca7b788adf2407385be5d4afc3747b0 RX(theta₉) c24362a64f6c4591b661d6cabb025f67--9ca7b788adf2407385be5d4afc3747b0 f726a626c34a4d21bc1151d0691fd288 X 9ca7b788adf2407385be5d4afc3747b0--f726a626c34a4d21bc1151d0691fd288 f726a626c34a4d21bc1151d0691fd288--7687adff4ab84c4ea47d5dee5303f937 ae5b8eae61ef45fd9c3b29c817684bbe f726a626c34a4d21bc1151d0691fd288--ae5b8eae61ef45fd9c3b29c817684bbe 4924c1613f004f7f8e53a2a30df336af RX(theta₁₃) ae5b8eae61ef45fd9c3b29c817684bbe--4924c1613f004f7f8e53a2a30df336af 1486632794a340ebbbfc692636e9e251 RY(theta₁₇) 4924c1613f004f7f8e53a2a30df336af--1486632794a340ebbbfc692636e9e251 e6775dddfba941bf96e5fdab8fefc512 RX(theta₂₁) 1486632794a340ebbbfc692636e9e251--e6775dddfba941bf96e5fdab8fefc512 37de672d72864ff8a1fca6960c503507 X e6775dddfba941bf96e5fdab8fefc512--37de672d72864ff8a1fca6960c503507 37de672d72864ff8a1fca6960c503507--cb2de95ba6ad49fbb84c9a555e4c4bde 7bc0823017374c9a8fc8107a4b640f65 37de672d72864ff8a1fca6960c503507--7bc0823017374c9a8fc8107a4b640f65 7bc0823017374c9a8fc8107a4b640f65--758972f2064f448d80cf3409fc95ed9b b581fd0c1251463d99d40bab11c124fc bf9a33f949f442ff95f520c653d8a212 RX(theta₂) 495171bf620e4ab09fb07095fccc8310--bf9a33f949f442ff95f520c653d8a212 1f983ec7f9b841b4b801190937ab9664 3 2c25ea67a2e548c6af27c471eaeb1f6b RY(theta₆) bf9a33f949f442ff95f520c653d8a212--2c25ea67a2e548c6af27c471eaeb1f6b 16d97bbbc855468dba003a055f566765 RX(theta₁₀) 2c25ea67a2e548c6af27c471eaeb1f6b--16d97bbbc855468dba003a055f566765 e6de68b38f824cd88174a0c66089f6d8 16d97bbbc855468dba003a055f566765--e6de68b38f824cd88174a0c66089f6d8 5b88ec20971e4a459e4e4926a4ab346c X e6de68b38f824cd88174a0c66089f6d8--5b88ec20971e4a459e4e4926a4ab346c 5b88ec20971e4a459e4e4926a4ab346c--ae5b8eae61ef45fd9c3b29c817684bbe 7e4119e60afd49b895fcac9911961c18 RX(theta₁₄) 5b88ec20971e4a459e4e4926a4ab346c--7e4119e60afd49b895fcac9911961c18 f40a106d66e843adb57895da591e4b75 RY(theta₁₈) 7e4119e60afd49b895fcac9911961c18--f40a106d66e843adb57895da591e4b75 32b913ab21f84ea3863b9edd9b1bcfb8 RX(theta₂₂) f40a106d66e843adb57895da591e4b75--32b913ab21f84ea3863b9edd9b1bcfb8 b256d86f5c6b4b49a2d6312014511442 32b913ab21f84ea3863b9edd9b1bcfb8--b256d86f5c6b4b49a2d6312014511442 b4880f88c35c41ccb896215413850773 X b256d86f5c6b4b49a2d6312014511442--b4880f88c35c41ccb896215413850773 b4880f88c35c41ccb896215413850773--7bc0823017374c9a8fc8107a4b640f65 b4880f88c35c41ccb896215413850773--b581fd0c1251463d99d40bab11c124fc d1385e7bee974644b442d621bce3fc69 a3d171e7f4fc43d6864de1e1930b7b2a RX(theta₃) 1f983ec7f9b841b4b801190937ab9664--a3d171e7f4fc43d6864de1e1930b7b2a 69bb6fb5c66946168e78bb78a80cc158 RY(theta₇) a3d171e7f4fc43d6864de1e1930b7b2a--69bb6fb5c66946168e78bb78a80cc158 975a1218617d4100a2d81b7c277d28c2 RX(theta₁₁) 69bb6fb5c66946168e78bb78a80cc158--975a1218617d4100a2d81b7c277d28c2 6a75c4ec18e243a7af70f3aa84e2515e X 975a1218617d4100a2d81b7c277d28c2--6a75c4ec18e243a7af70f3aa84e2515e 6a75c4ec18e243a7af70f3aa84e2515e--e6de68b38f824cd88174a0c66089f6d8 39b8c6e654fa4e0da89cd90682e4f15e 6a75c4ec18e243a7af70f3aa84e2515e--39b8c6e654fa4e0da89cd90682e4f15e 9b68c8f4d94f4e25809236eaa30a49f9 RX(theta₁₅) 39b8c6e654fa4e0da89cd90682e4f15e--9b68c8f4d94f4e25809236eaa30a49f9 3ca1b67ad78a4f2f98c5d51c4b9d221d RY(theta₁₉) 9b68c8f4d94f4e25809236eaa30a49f9--3ca1b67ad78a4f2f98c5d51c4b9d221d df34927a2cef450188bf9be7d27e19d0 RX(theta₂₃) 3ca1b67ad78a4f2f98c5d51c4b9d221d--df34927a2cef450188bf9be7d27e19d0 5884af6b97f64ec9843e562f9f7f3fca X df34927a2cef450188bf9be7d27e19d0--5884af6b97f64ec9843e562f9f7f3fca 5884af6b97f64ec9843e562f9f7f3fca--b256d86f5c6b4b49a2d6312014511442 61f41d586de04bd1838ebf02ab62c117 5884af6b97f64ec9843e562f9f7f3fca--61f41d586de04bd1838ebf02ab62c117 61f41d586de04bd1838ebf02ab62c117--d1385e7bee974644b442d621bce3fc69

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_ae483346c7e649068a1583bfe7a7a3d7 Obs. cluster_28bf3b24a3a1474d859352ede17ba327 cluster_78caaaf669394773865bb622ca95d180 Tower Chebyshev FM cluster_063acf492a3b429f90fb8e71907b0d7c Tower Chebyshev FM cluster_ee817ad07aa243489210356510482a37 HEA 903cb19ab0334b89a59078db721aaad5 0 dd35440b45d04c7691e04f55c1af05ad RX(1.0*acos(x)) 903cb19ab0334b89a59078db721aaad5--dd35440b45d04c7691e04f55c1af05ad 7ca5ec157c6d464faf9304febeaf525b 1 4b6e589dad37408fa18b7c8c217fafc2 RX(theta₀) dd35440b45d04c7691e04f55c1af05ad--4b6e589dad37408fa18b7c8c217fafc2 2d1f74200f4b4cfc85c72ef4ed755eb5 RY(theta₄) 4b6e589dad37408fa18b7c8c217fafc2--2d1f74200f4b4cfc85c72ef4ed755eb5 44eb49d44f0b4ba7bd121aefdf8eb5ef RX(theta₈) 2d1f74200f4b4cfc85c72ef4ed755eb5--44eb49d44f0b4ba7bd121aefdf8eb5ef 3980669eb56a4da2bd824a71c6d6d65a 44eb49d44f0b4ba7bd121aefdf8eb5ef--3980669eb56a4da2bd824a71c6d6d65a 0580a8f299304c01add3731aabf105af 3980669eb56a4da2bd824a71c6d6d65a--0580a8f299304c01add3731aabf105af 26aa101f67284630bdd4622e5e8712e6 RX(theta₁₂) 0580a8f299304c01add3731aabf105af--26aa101f67284630bdd4622e5e8712e6 faf8e30ad29540e2a50564f153cba31d RY(theta₁₆) 26aa101f67284630bdd4622e5e8712e6--faf8e30ad29540e2a50564f153cba31d 0d3753bdadde48c5bad3f0bca8da6fce RX(theta₂₀) faf8e30ad29540e2a50564f153cba31d--0d3753bdadde48c5bad3f0bca8da6fce a41911278b42494cb55b4b745d0d06d3 0d3753bdadde48c5bad3f0bca8da6fce--a41911278b42494cb55b4b745d0d06d3 fe7cab1097d545c7ac06641f2a2053bc a41911278b42494cb55b4b745d0d06d3--fe7cab1097d545c7ac06641f2a2053bc 925915a2d82a42319ea48adba34557a8 fe7cab1097d545c7ac06641f2a2053bc--925915a2d82a42319ea48adba34557a8 54f72f10fb0841e9acc9ed3f41e4e19d 925915a2d82a42319ea48adba34557a8--54f72f10fb0841e9acc9ed3f41e4e19d 7fb686a356154a399677d62f6acacbf2 7d0e85cef8be47b89d11712ff8d6ebe7 RX(2.0*acos(x)) 7ca5ec157c6d464faf9304febeaf525b--7d0e85cef8be47b89d11712ff8d6ebe7 fcde79a9e0634c5ba56c2d4e93a79976 2 9324c00a22134c7595deacb380f7b4b9 RX(theta₁) 7d0e85cef8be47b89d11712ff8d6ebe7--9324c00a22134c7595deacb380f7b4b9 762b31f4ff8f4032907af56765593ef0 RY(theta₅) 9324c00a22134c7595deacb380f7b4b9--762b31f4ff8f4032907af56765593ef0 f6d72c77303e4d48affcbfe8f5f35cae RX(theta₉) 762b31f4ff8f4032907af56765593ef0--f6d72c77303e4d48affcbfe8f5f35cae 1cf7a93106f54f359bda46edceba20d1 X f6d72c77303e4d48affcbfe8f5f35cae--1cf7a93106f54f359bda46edceba20d1 1cf7a93106f54f359bda46edceba20d1--3980669eb56a4da2bd824a71c6d6d65a 7b4df0beb4954fd481b4feb160eebca6 1cf7a93106f54f359bda46edceba20d1--7b4df0beb4954fd481b4feb160eebca6 125d9609133f426f821197213bf1e299 RX(theta₁₃) 7b4df0beb4954fd481b4feb160eebca6--125d9609133f426f821197213bf1e299 dce5fa45c00a474ca686903972820b94 RY(theta₁₇) 125d9609133f426f821197213bf1e299--dce5fa45c00a474ca686903972820b94 37e491d95f6c44d7973eff6887b00b51 RX(theta₂₁) dce5fa45c00a474ca686903972820b94--37e491d95f6c44d7973eff6887b00b51 8f979bff3562421e9e4ebed6df6d5aad X 37e491d95f6c44d7973eff6887b00b51--8f979bff3562421e9e4ebed6df6d5aad 8f979bff3562421e9e4ebed6df6d5aad--a41911278b42494cb55b4b745d0d06d3 c24293f254ff4878913b89b20c26554a 8f979bff3562421e9e4ebed6df6d5aad--c24293f254ff4878913b89b20c26554a 3b8ef85f7afc4d609f1ee4de02c16b50 AddBlock c24293f254ff4878913b89b20c26554a--3b8ef85f7afc4d609f1ee4de02c16b50 3b8ef85f7afc4d609f1ee4de02c16b50--7fb686a356154a399677d62f6acacbf2 12c2cea404d4485da72f7c005c2ef86f f5e46390657b49c48ccedb4130f8bf05 RX(1.0*acos(2.0*y - 1.0)) fcde79a9e0634c5ba56c2d4e93a79976--f5e46390657b49c48ccedb4130f8bf05 c12670f580114f3c84f327f05cd043a5 3 ca594d71249b4accb629d622d384b3f4 RX(theta₂) f5e46390657b49c48ccedb4130f8bf05--ca594d71249b4accb629d622d384b3f4 fb2242007759454c83a2f5c91f5de3d7 RY(theta₆) ca594d71249b4accb629d622d384b3f4--fb2242007759454c83a2f5c91f5de3d7 a0569d4d70dd412a97238037fe52c8fe RX(theta₁₀) fb2242007759454c83a2f5c91f5de3d7--a0569d4d70dd412a97238037fe52c8fe 4d1537ad14614a4ca9a60d95206f76c0 a0569d4d70dd412a97238037fe52c8fe--4d1537ad14614a4ca9a60d95206f76c0 d70d8b9d9b964136803bab279bcdab55 X 4d1537ad14614a4ca9a60d95206f76c0--d70d8b9d9b964136803bab279bcdab55 d70d8b9d9b964136803bab279bcdab55--7b4df0beb4954fd481b4feb160eebca6 95615046e603486fafc6f6a32160b6b1 RX(theta₁₄) d70d8b9d9b964136803bab279bcdab55--95615046e603486fafc6f6a32160b6b1 74e0c8652a7c483eb7d62df411e768f9 RY(theta₁₈) 95615046e603486fafc6f6a32160b6b1--74e0c8652a7c483eb7d62df411e768f9 bdd3c117f52e409f95b9c231031f2c9f RX(theta₂₂) 74e0c8652a7c483eb7d62df411e768f9--bdd3c117f52e409f95b9c231031f2c9f 8fcbd58cfc2045858c0e9ae024305bf8 bdd3c117f52e409f95b9c231031f2c9f--8fcbd58cfc2045858c0e9ae024305bf8 a9c157ac582e46248acccb210809bc19 X 8fcbd58cfc2045858c0e9ae024305bf8--a9c157ac582e46248acccb210809bc19 a9c157ac582e46248acccb210809bc19--c24293f254ff4878913b89b20c26554a 74c126f1f3c54e41a8aacc771a512d77 a9c157ac582e46248acccb210809bc19--74c126f1f3c54e41a8aacc771a512d77 74c126f1f3c54e41a8aacc771a512d77--12c2cea404d4485da72f7c005c2ef86f b51d6b58aee24859a5f0bcf4c08fd998 b5cc317eb2a840d58f04a7ff19e9e27b RX(2.0*acos(2.0*y - 1.0)) c12670f580114f3c84f327f05cd043a5--b5cc317eb2a840d58f04a7ff19e9e27b ae5a373f63564f95ad56d8eb92e5cac1 RX(theta₃) b5cc317eb2a840d58f04a7ff19e9e27b--ae5a373f63564f95ad56d8eb92e5cac1 09098619b0f34134b2532903d4a7252b RY(theta₇) ae5a373f63564f95ad56d8eb92e5cac1--09098619b0f34134b2532903d4a7252b 35674a765fea484898cded616dd6a471 RX(theta₁₁) 09098619b0f34134b2532903d4a7252b--35674a765fea484898cded616dd6a471 f2b4976b584b48f596cceade1aedd956 X 35674a765fea484898cded616dd6a471--f2b4976b584b48f596cceade1aedd956 f2b4976b584b48f596cceade1aedd956--4d1537ad14614a4ca9a60d95206f76c0 9cc90b20410a4df080acf3389a9a6503 f2b4976b584b48f596cceade1aedd956--9cc90b20410a4df080acf3389a9a6503 2f0fa51df71a41a8ac34f1ed14ca3c9c RX(theta₁₅) 9cc90b20410a4df080acf3389a9a6503--2f0fa51df71a41a8ac34f1ed14ca3c9c 4471b2d94b984abe83d0a72446a39e36 RY(theta₁₉) 2f0fa51df71a41a8ac34f1ed14ca3c9c--4471b2d94b984abe83d0a72446a39e36 d4e77d5fbba1438aaa72743b177ddcf9 RX(theta₂₃) 4471b2d94b984abe83d0a72446a39e36--d4e77d5fbba1438aaa72743b177ddcf9 ee67a8fea1894053a48246706b1696a1 X d4e77d5fbba1438aaa72743b177ddcf9--ee67a8fea1894053a48246706b1696a1 ee67a8fea1894053a48246706b1696a1--8fcbd58cfc2045858c0e9ae024305bf8 674f22b67ee54a01b621e7da49d194d0 ee67a8fea1894053a48246706b1696a1--674f22b67ee54a01b621e7da49d194d0 34de5e87a2664c979a51fc6391a8bf35 674f22b67ee54a01b621e7da49d194d0--34de5e87a2664c979a51fc6391a8bf35 34de5e87a2664c979a51fc6391a8bf35--b51d6b58aee24859a5f0bcf4c08fd998