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_c1e5a758d0634debb926167de477fb8a f223db3c924d4ffeaba373a95abd7666 0 31e4e10711124a77b877f152f471e21e f223db3c924d4ffeaba373a95abd7666--31e4e10711124a77b877f152f471e21e f03945071d614efd96d715ed1603e6ed 1 feffe1055bc14f5a8cfa2137cc69a5db 31e4e10711124a77b877f152f471e21e--feffe1055bc14f5a8cfa2137cc69a5db c3176642a3c747b08a65d6c4dcb360c0 198cc5882a894ee8bc28cab96452f4fb AddBlock f03945071d614efd96d715ed1603e6ed--198cc5882a894ee8bc28cab96452f4fb 617e6d15420b43ff9789b23e991a2743 2 198cc5882a894ee8bc28cab96452f4fb--c3176642a3c747b08a65d6c4dcb360c0 f016e0985ce449a8bb3835f40dc6f5d6 593e292c3c264500989820be7b5836cc 617e6d15420b43ff9789b23e991a2743--593e292c3c264500989820be7b5836cc 56457159a89a4e8a9967e4eee1ca7396 3 593e292c3c264500989820be7b5836cc--f016e0985ce449a8bb3835f40dc6f5d6 66bf7a76ac614c5b80477f3367900f51 09f25cfdfb6847ca8e5f8e46727a543c 56457159a89a4e8a9967e4eee1ca7396--09f25cfdfb6847ca8e5f8e46727a543c 09f25cfdfb6847ca8e5f8e46727a543c--66bf7a76ac614c5b80477f3367900f51

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_9568d3c615c44756bd9d21154c0ba8f6 Tower Chebyshev FM cluster_612f698092a349b0b0ed0909824180b2 Tower Chebyshev FM c164f769fb024c6f910b35b2ce7b8b83 0 f0e102e13a7c4a3186ebdf59cc4adf38 RX(1.0*acos(x)) c164f769fb024c6f910b35b2ce7b8b83--f0e102e13a7c4a3186ebdf59cc4adf38 2824a60f76684c13a098d1f7ee30ff8f 1 48002cfe7b394cf7b0bdf2e87177670c f0e102e13a7c4a3186ebdf59cc4adf38--48002cfe7b394cf7b0bdf2e87177670c 5ff2edb7c5bc4a1cad5acc46b2098a2c df44047eac09470db4d1c2461c2b8c0a RX(2.0*acos(x)) 2824a60f76684c13a098d1f7ee30ff8f--df44047eac09470db4d1c2461c2b8c0a fcb3338de69b416ab21fb94d9ca20a88 2 df44047eac09470db4d1c2461c2b8c0a--5ff2edb7c5bc4a1cad5acc46b2098a2c 5e775a8467214893a4deac79ca7dce66 c8a8ae27fd0f4aebb5f335363c9a580e RX(1.0*acos(2.0*y - 1.0)) fcb3338de69b416ab21fb94d9ca20a88--c8a8ae27fd0f4aebb5f335363c9a580e b72c88dd033341f19d8bc61e690dd61e 3 c8a8ae27fd0f4aebb5f335363c9a580e--5e775a8467214893a4deac79ca7dce66 06fe263bf61c40afb2bac5a51ed3b2d2 082c7079cab64958b052a039e8b6d4fa RX(2.0*acos(2.0*y - 1.0)) b72c88dd033341f19d8bc61e690dd61e--082c7079cab64958b052a039e8b6d4fa 082c7079cab64958b052a039e8b6d4fa--06fe263bf61c40afb2bac5a51ed3b2d2

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 658f00491808477d95aa3abf279bc5c4 0 95a958e070a7437d80d6d1d1b5dc0a11 RX(theta₀) 658f00491808477d95aa3abf279bc5c4--95a958e070a7437d80d6d1d1b5dc0a11 0969b9704a3e4869b60797cad222ae4c 1 a75df66e26744a4fa7859ad2a7a86a76 RY(theta₄) 95a958e070a7437d80d6d1d1b5dc0a11--a75df66e26744a4fa7859ad2a7a86a76 fba10b7114a04e1fab3a01b19856bf7b RX(theta₈) a75df66e26744a4fa7859ad2a7a86a76--fba10b7114a04e1fab3a01b19856bf7b 8a217124af974e3e871bab43cf46093d fba10b7114a04e1fab3a01b19856bf7b--8a217124af974e3e871bab43cf46093d ad6fa7a12ba042a9874e81c0b44daadc 8a217124af974e3e871bab43cf46093d--ad6fa7a12ba042a9874e81c0b44daadc fdec1083016b4ff891e90f319aeda108 RX(theta₁₂) ad6fa7a12ba042a9874e81c0b44daadc--fdec1083016b4ff891e90f319aeda108 e578032d0256497f91c532fa577dd23b RY(theta₁₆) fdec1083016b4ff891e90f319aeda108--e578032d0256497f91c532fa577dd23b 2e45d843945e4195bff96dc25b17d175 RX(theta₂₀) e578032d0256497f91c532fa577dd23b--2e45d843945e4195bff96dc25b17d175 b233a248e9854a988fb4d97d698392a0 2e45d843945e4195bff96dc25b17d175--b233a248e9854a988fb4d97d698392a0 37785b6ffa9e4e5b8894b65a4601ae8a b233a248e9854a988fb4d97d698392a0--37785b6ffa9e4e5b8894b65a4601ae8a 0c97e40ac602429a83c03d572821e9ea 37785b6ffa9e4e5b8894b65a4601ae8a--0c97e40ac602429a83c03d572821e9ea c8323d1a50f84be5908f34e1a5684f72 82100f6d62e840cba6aebcc5cdcd184b RX(theta₁) 0969b9704a3e4869b60797cad222ae4c--82100f6d62e840cba6aebcc5cdcd184b 9b73d0e140e341599bea35e3c4fd526d 2 6f523ef932c0483a96c5e4ca8b2ede8a RY(theta₅) 82100f6d62e840cba6aebcc5cdcd184b--6f523ef932c0483a96c5e4ca8b2ede8a 5380642cd25446aabfd3d23f040d0ffe RX(theta₉) 6f523ef932c0483a96c5e4ca8b2ede8a--5380642cd25446aabfd3d23f040d0ffe 305143c4fd604533a79733932b016a09 X 5380642cd25446aabfd3d23f040d0ffe--305143c4fd604533a79733932b016a09 305143c4fd604533a79733932b016a09--8a217124af974e3e871bab43cf46093d f0e522f46d9641e7b8b66df406ff4152 305143c4fd604533a79733932b016a09--f0e522f46d9641e7b8b66df406ff4152 5d9d2382f92745df96c6baee2e59ba65 RX(theta₁₃) f0e522f46d9641e7b8b66df406ff4152--5d9d2382f92745df96c6baee2e59ba65 d50b8e17977e40fdafabe26c0c9e5dc5 RY(theta₁₇) 5d9d2382f92745df96c6baee2e59ba65--d50b8e17977e40fdafabe26c0c9e5dc5 22d1a8d0523f4e20978463c32796a266 RX(theta₂₁) d50b8e17977e40fdafabe26c0c9e5dc5--22d1a8d0523f4e20978463c32796a266 52e06be574bf427db7ac1b0938084412 X 22d1a8d0523f4e20978463c32796a266--52e06be574bf427db7ac1b0938084412 52e06be574bf427db7ac1b0938084412--b233a248e9854a988fb4d97d698392a0 ecde93308da441dc8b585447e74c7174 52e06be574bf427db7ac1b0938084412--ecde93308da441dc8b585447e74c7174 ecde93308da441dc8b585447e74c7174--c8323d1a50f84be5908f34e1a5684f72 ff5946d00dc845318d4302c9f5c3702c c454296cf68549779a16f53ad5e36e5e RX(theta₂) 9b73d0e140e341599bea35e3c4fd526d--c454296cf68549779a16f53ad5e36e5e e7d679c2454c40f7954c6cfa65657fc2 3 1aa3b72985a84af28ed493c92e3fd8d4 RY(theta₆) c454296cf68549779a16f53ad5e36e5e--1aa3b72985a84af28ed493c92e3fd8d4 7a96dd2f4eca4308ae741ff3eaac10d4 RX(theta₁₀) 1aa3b72985a84af28ed493c92e3fd8d4--7a96dd2f4eca4308ae741ff3eaac10d4 7f58f1be4766451e916142ad77697b5e 7a96dd2f4eca4308ae741ff3eaac10d4--7f58f1be4766451e916142ad77697b5e 734cd90f81f54328b96365f840635c44 X 7f58f1be4766451e916142ad77697b5e--734cd90f81f54328b96365f840635c44 734cd90f81f54328b96365f840635c44--f0e522f46d9641e7b8b66df406ff4152 2e8b3908f9614a2fa8a92102420675a3 RX(theta₁₄) 734cd90f81f54328b96365f840635c44--2e8b3908f9614a2fa8a92102420675a3 d48a2b52899b41acad422f00ac42999f RY(theta₁₈) 2e8b3908f9614a2fa8a92102420675a3--d48a2b52899b41acad422f00ac42999f 3947e2c11f86453399e3b89bb1b84a62 RX(theta₂₂) d48a2b52899b41acad422f00ac42999f--3947e2c11f86453399e3b89bb1b84a62 2b6364d0ff6a4f3797d7f67422a58f22 3947e2c11f86453399e3b89bb1b84a62--2b6364d0ff6a4f3797d7f67422a58f22 c02a7464a485459b840412df3cdd6919 X 2b6364d0ff6a4f3797d7f67422a58f22--c02a7464a485459b840412df3cdd6919 c02a7464a485459b840412df3cdd6919--ecde93308da441dc8b585447e74c7174 c02a7464a485459b840412df3cdd6919--ff5946d00dc845318d4302c9f5c3702c 18a6e8f4dcc7453283a131b59738a008 e4152e60de804e13886099077ccaf1b4 RX(theta₃) e7d679c2454c40f7954c6cfa65657fc2--e4152e60de804e13886099077ccaf1b4 41d7e72ec58c4541956f6ae59f41e219 RY(theta₇) e4152e60de804e13886099077ccaf1b4--41d7e72ec58c4541956f6ae59f41e219 ef315455e96748948cb42fc06caeb53f RX(theta₁₁) 41d7e72ec58c4541956f6ae59f41e219--ef315455e96748948cb42fc06caeb53f 33adb1eadcf54390b9c64cfe0a0c7970 X ef315455e96748948cb42fc06caeb53f--33adb1eadcf54390b9c64cfe0a0c7970 33adb1eadcf54390b9c64cfe0a0c7970--7f58f1be4766451e916142ad77697b5e ce51427738914c7dae0b62c954dfefee 33adb1eadcf54390b9c64cfe0a0c7970--ce51427738914c7dae0b62c954dfefee 0ecc703c6b1d45d69c05b23d5eac2c5d RX(theta₁₅) ce51427738914c7dae0b62c954dfefee--0ecc703c6b1d45d69c05b23d5eac2c5d ddc3fd677aa148488eaa1a95fc196bc4 RY(theta₁₉) 0ecc703c6b1d45d69c05b23d5eac2c5d--ddc3fd677aa148488eaa1a95fc196bc4 a88c15c9c05049328b3eac54eb982244 RX(theta₂₃) ddc3fd677aa148488eaa1a95fc196bc4--a88c15c9c05049328b3eac54eb982244 3caae4f94b9546a795eeffb03ba20de4 X a88c15c9c05049328b3eac54eb982244--3caae4f94b9546a795eeffb03ba20de4 3caae4f94b9546a795eeffb03ba20de4--2b6364d0ff6a4f3797d7f67422a58f22 c2bdc931bb94447cb2fef66dc63971ac 3caae4f94b9546a795eeffb03ba20de4--c2bdc931bb94447cb2fef66dc63971ac c2bdc931bb94447cb2fef66dc63971ac--18a6e8f4dcc7453283a131b59738a008

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_e6d2558af0294269a87104bf5cef4321 Obs. cluster_049adb8beb6c4280b6a9eb1719cad93f cluster_9a3edcd8000944deac8e01044ebd5559 Tower Chebyshev FM cluster_47339768e6fe41b6a91f9aa0888b3ece Tower Chebyshev FM cluster_cf8db481e06742a28ae699810695870b HEA fcf686ba8ec341a0804d779965bff352 0 fa64c249aa8f4ff59b2fb773e0f5f37c RX(1.0*acos(x)) fcf686ba8ec341a0804d779965bff352--fa64c249aa8f4ff59b2fb773e0f5f37c edff79019c814afbb16198f5229778d9 1 9b190fc9455846f98f58c4b030bb85d5 RX(theta₀) fa64c249aa8f4ff59b2fb773e0f5f37c--9b190fc9455846f98f58c4b030bb85d5 72eda3a39d01454389cae97a28a943d4 RY(theta₄) 9b190fc9455846f98f58c4b030bb85d5--72eda3a39d01454389cae97a28a943d4 101dd2dfd4ce4aa5a2e93fbce31c9c22 RX(theta₈) 72eda3a39d01454389cae97a28a943d4--101dd2dfd4ce4aa5a2e93fbce31c9c22 a5c8c6f07aed41df8386d55b2522ed71 101dd2dfd4ce4aa5a2e93fbce31c9c22--a5c8c6f07aed41df8386d55b2522ed71 36fd082986bb4acc8d24ba85c04d1802 a5c8c6f07aed41df8386d55b2522ed71--36fd082986bb4acc8d24ba85c04d1802 8ad6c07839334b0688f1e1a82d6925a5 RX(theta₁₂) 36fd082986bb4acc8d24ba85c04d1802--8ad6c07839334b0688f1e1a82d6925a5 1c70852d616f40c2b2df24da80d67780 RY(theta₁₆) 8ad6c07839334b0688f1e1a82d6925a5--1c70852d616f40c2b2df24da80d67780 c401e216dd414951ad992db7049c0872 RX(theta₂₀) 1c70852d616f40c2b2df24da80d67780--c401e216dd414951ad992db7049c0872 fa04bface6f74064adb5455b879d1649 c401e216dd414951ad992db7049c0872--fa04bface6f74064adb5455b879d1649 4bb35e9109d045478a085392b39b1beb fa04bface6f74064adb5455b879d1649--4bb35e9109d045478a085392b39b1beb 3bff7af0415e4ecabba557576ac6f057 4bb35e9109d045478a085392b39b1beb--3bff7af0415e4ecabba557576ac6f057 d6c8c441ead24a8c85d669f29437a1b5 3bff7af0415e4ecabba557576ac6f057--d6c8c441ead24a8c85d669f29437a1b5 6ea7e76710f04bb5b86cc8c4fd1e6718 4e4320c062cf42e084b92b5ddf339f1f RX(2.0*acos(x)) edff79019c814afbb16198f5229778d9--4e4320c062cf42e084b92b5ddf339f1f a5cfaa4df1d148f2bd0505d2eb8c7013 2 12d0734ffa054fe5b672be88ce5aaf5c RX(theta₁) 4e4320c062cf42e084b92b5ddf339f1f--12d0734ffa054fe5b672be88ce5aaf5c 9f0446d73dfe4d728fe49170b2abb2c8 RY(theta₅) 12d0734ffa054fe5b672be88ce5aaf5c--9f0446d73dfe4d728fe49170b2abb2c8 0fcc5342a93e462aa06d6f7e5a4c1311 RX(theta₉) 9f0446d73dfe4d728fe49170b2abb2c8--0fcc5342a93e462aa06d6f7e5a4c1311 8bdbf56159a34665837d1bed90ef507e X 0fcc5342a93e462aa06d6f7e5a4c1311--8bdbf56159a34665837d1bed90ef507e 8bdbf56159a34665837d1bed90ef507e--a5c8c6f07aed41df8386d55b2522ed71 99704caaf7c34ed4a570e7df6832c4af 8bdbf56159a34665837d1bed90ef507e--99704caaf7c34ed4a570e7df6832c4af 63765db98f5e4312b8ac4164072404e8 RX(theta₁₃) 99704caaf7c34ed4a570e7df6832c4af--63765db98f5e4312b8ac4164072404e8 c3e5ce1a96b640a79476bd60039c1af5 RY(theta₁₇) 63765db98f5e4312b8ac4164072404e8--c3e5ce1a96b640a79476bd60039c1af5 b026f86c7d084b90a14ce24a2df64aff RX(theta₂₁) c3e5ce1a96b640a79476bd60039c1af5--b026f86c7d084b90a14ce24a2df64aff a30875a5e4e54114a8b568eb2001aff6 X b026f86c7d084b90a14ce24a2df64aff--a30875a5e4e54114a8b568eb2001aff6 a30875a5e4e54114a8b568eb2001aff6--fa04bface6f74064adb5455b879d1649 3597b8da175e4b8d83f38b17919596d8 a30875a5e4e54114a8b568eb2001aff6--3597b8da175e4b8d83f38b17919596d8 187c2908236f4b96b02879467dade176 AddBlock 3597b8da175e4b8d83f38b17919596d8--187c2908236f4b96b02879467dade176 187c2908236f4b96b02879467dade176--6ea7e76710f04bb5b86cc8c4fd1e6718 c0c737d4bbae44759a1169e236fd2285 d819c72f0bc94c0dbea2208fc1320455 RX(1.0*acos(2.0*y - 1.0)) a5cfaa4df1d148f2bd0505d2eb8c7013--d819c72f0bc94c0dbea2208fc1320455 ed0f62e6fd0a46dd8017e4d55d81641e 3 dfc8ab66b9b04f08a30f6a0592f3ad81 RX(theta₂) d819c72f0bc94c0dbea2208fc1320455--dfc8ab66b9b04f08a30f6a0592f3ad81 72cb885eb4bf412080dd12f53449685d RY(theta₆) dfc8ab66b9b04f08a30f6a0592f3ad81--72cb885eb4bf412080dd12f53449685d 9166d96588a04853b2a12cb4a89191d9 RX(theta₁₀) 72cb885eb4bf412080dd12f53449685d--9166d96588a04853b2a12cb4a89191d9 52c730bda28148378baae959717ec3d2 9166d96588a04853b2a12cb4a89191d9--52c730bda28148378baae959717ec3d2 69c6a607fa5c4ad28c8d8fdf6392c9ec X 52c730bda28148378baae959717ec3d2--69c6a607fa5c4ad28c8d8fdf6392c9ec 69c6a607fa5c4ad28c8d8fdf6392c9ec--99704caaf7c34ed4a570e7df6832c4af 1d9b1b6aa82744d9a2cef9802c7e2222 RX(theta₁₄) 69c6a607fa5c4ad28c8d8fdf6392c9ec--1d9b1b6aa82744d9a2cef9802c7e2222 891e54ddec024bd6aae638a7935e6955 RY(theta₁₈) 1d9b1b6aa82744d9a2cef9802c7e2222--891e54ddec024bd6aae638a7935e6955 85913fc3eaf845519b9f8f003788a138 RX(theta₂₂) 891e54ddec024bd6aae638a7935e6955--85913fc3eaf845519b9f8f003788a138 29d01de74d5049d0946ce2162f11438b 85913fc3eaf845519b9f8f003788a138--29d01de74d5049d0946ce2162f11438b 4bb66fd03cff42c789b029f73342687d X 29d01de74d5049d0946ce2162f11438b--4bb66fd03cff42c789b029f73342687d 4bb66fd03cff42c789b029f73342687d--3597b8da175e4b8d83f38b17919596d8 f759a5b28989460baeb066e66f48753e 4bb66fd03cff42c789b029f73342687d--f759a5b28989460baeb066e66f48753e f759a5b28989460baeb066e66f48753e--c0c737d4bbae44759a1169e236fd2285 09b8e11f2c284c03a48ac2784b812273 ff6075230d5b4cacb463d6897c0fc050 RX(2.0*acos(2.0*y - 1.0)) ed0f62e6fd0a46dd8017e4d55d81641e--ff6075230d5b4cacb463d6897c0fc050 867f5813065040f2b54e04990ccb395a RX(theta₃) ff6075230d5b4cacb463d6897c0fc050--867f5813065040f2b54e04990ccb395a 14d9fd6ed211492794c3f35386c8deac RY(theta₇) 867f5813065040f2b54e04990ccb395a--14d9fd6ed211492794c3f35386c8deac 4fb2b3099d9a4bac9b82b79cc75e721a RX(theta₁₁) 14d9fd6ed211492794c3f35386c8deac--4fb2b3099d9a4bac9b82b79cc75e721a f45a4c4d777d4d13bf7977b37b101448 X 4fb2b3099d9a4bac9b82b79cc75e721a--f45a4c4d777d4d13bf7977b37b101448 f45a4c4d777d4d13bf7977b37b101448--52c730bda28148378baae959717ec3d2 5360dbd679504282a6714fcad64bdeab f45a4c4d777d4d13bf7977b37b101448--5360dbd679504282a6714fcad64bdeab fdac466a4f8f43588e9b516ae2921127 RX(theta₁₅) 5360dbd679504282a6714fcad64bdeab--fdac466a4f8f43588e9b516ae2921127 4047bdb09c4440828bd393e8c106c069 RY(theta₁₉) fdac466a4f8f43588e9b516ae2921127--4047bdb09c4440828bd393e8c106c069 631c56a9f462417593ba5275972eaf95 RX(theta₂₃) 4047bdb09c4440828bd393e8c106c069--631c56a9f462417593ba5275972eaf95 afef56ac99cc4359932453d4da1140c9 X 631c56a9f462417593ba5275972eaf95--afef56ac99cc4359932453d4da1140c9 afef56ac99cc4359932453d4da1140c9--29d01de74d5049d0946ce2162f11438b 859dd239b5ce41acb6f83df916ee95e0 afef56ac99cc4359932453d4da1140c9--859dd239b5ce41acb6f83df916ee95e0 c77d5c23dde44f5e97cbdd9067165b28 859dd239b5ce41acb6f83df916ee95e0--c77d5c23dde44f5e97cbdd9067165b28 c77d5c23dde44f5e97cbdd9067165b28--09b8e11f2c284c03a48ac2784b812273