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_7bc595f634de451d9660c0d6617c5fbf 601e8f0cd2864ed794399f9e34487191 0 cd3fa62b5c1d48d6af313ee7edc5b46d 601e8f0cd2864ed794399f9e34487191--cd3fa62b5c1d48d6af313ee7edc5b46d 2b2dc6d0974641cba78306949f0bd93c 1 0691690410ca458dab635bef7da7dc18 cd3fa62b5c1d48d6af313ee7edc5b46d--0691690410ca458dab635bef7da7dc18 6bd8f8f4c78941afba59e8b7fec2df63 cbbfafea0a0341f8a30f068dda617749 AddBlock 2b2dc6d0974641cba78306949f0bd93c--cbbfafea0a0341f8a30f068dda617749 fb06642fe33a4f42a246e796a85996e8 2 cbbfafea0a0341f8a30f068dda617749--6bd8f8f4c78941afba59e8b7fec2df63 3d1a1f9697cc4278857e0fccf83eb454 e0aa10a521204bc9a59767f2479218dc fb06642fe33a4f42a246e796a85996e8--e0aa10a521204bc9a59767f2479218dc 774b5d6181e7420697c21ca406e1e030 3 e0aa10a521204bc9a59767f2479218dc--3d1a1f9697cc4278857e0fccf83eb454 60c7d2f1493d4c6ea3ad974e861b7429 5fdd3973706a4c57a5fad686d6a998de 774b5d6181e7420697c21ca406e1e030--5fdd3973706a4c57a5fad686d6a998de 5fdd3973706a4c57a5fad686d6a998de--60c7d2f1493d4c6ea3ad974e861b7429

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_4bf20063700547daa3eae4b4c138ba5f Tower Chebyshev FM cluster_493bd54c2b13425b90ff0bc9f54fc5f1 Tower Chebyshev FM 576f50ca7e7b4d8fa9866ab83791d680 0 346fc70943d9413e973eac670e48fdb9 RX(1.0*acos(x)) 576f50ca7e7b4d8fa9866ab83791d680--346fc70943d9413e973eac670e48fdb9 052b412f00b64356bbdcfc2439f3fb08 1 fedb88c3c9c944c9902429e68c6432fb 346fc70943d9413e973eac670e48fdb9--fedb88c3c9c944c9902429e68c6432fb 114ee77a81054accb492bf1381efcd6e e942024b22294e2986a5ba745980bc6b RX(2.0*acos(x)) 052b412f00b64356bbdcfc2439f3fb08--e942024b22294e2986a5ba745980bc6b 7e32b2617ac1498da06fc1168cd5cb40 2 e942024b22294e2986a5ba745980bc6b--114ee77a81054accb492bf1381efcd6e 94fd280b11154eca80f631bdeb22d114 142eee4dfa5640689277c45a60198a55 RX(1.0*acos(2.0*y - 1.0)) 7e32b2617ac1498da06fc1168cd5cb40--142eee4dfa5640689277c45a60198a55 b1763edfbc2d4fc88589a950cd03db69 3 142eee4dfa5640689277c45a60198a55--94fd280b11154eca80f631bdeb22d114 1559900c48144e3294ca6d5a7f270f85 01ad005abea746e18f7baa8f2dfa2825 RX(2.0*acos(2.0*y - 1.0)) b1763edfbc2d4fc88589a950cd03db69--01ad005abea746e18f7baa8f2dfa2825 01ad005abea746e18f7baa8f2dfa2825--1559900c48144e3294ca6d5a7f270f85

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 5277873ce76f447fb5fabdcef7f4fe64 0 7e239ffc32b44c04a6856fa61adb1770 RX(theta₀) 5277873ce76f447fb5fabdcef7f4fe64--7e239ffc32b44c04a6856fa61adb1770 42e3d1c9a8cc4181a7dded625611f08c 1 afba3a9a7a9c4804a80d906864eb0f8b RY(theta₄) 7e239ffc32b44c04a6856fa61adb1770--afba3a9a7a9c4804a80d906864eb0f8b 3b962b63a20246babad78da947240614 RX(theta₈) afba3a9a7a9c4804a80d906864eb0f8b--3b962b63a20246babad78da947240614 90599610b9484e96bbec5ab69d31bb67 3b962b63a20246babad78da947240614--90599610b9484e96bbec5ab69d31bb67 b0a3b86b1db643f29a76de8dc6c63eb1 90599610b9484e96bbec5ab69d31bb67--b0a3b86b1db643f29a76de8dc6c63eb1 1c22e80f44d94f9ab7e4e502bc61c08d RX(theta₁₂) b0a3b86b1db643f29a76de8dc6c63eb1--1c22e80f44d94f9ab7e4e502bc61c08d 438131455c0d41da8c67190497ee12c1 RY(theta₁₆) 1c22e80f44d94f9ab7e4e502bc61c08d--438131455c0d41da8c67190497ee12c1 42b8ba7d8f464ac8af5b1b52242946ca RX(theta₂₀) 438131455c0d41da8c67190497ee12c1--42b8ba7d8f464ac8af5b1b52242946ca 736ad5c2081a409793e63f330c4222d4 42b8ba7d8f464ac8af5b1b52242946ca--736ad5c2081a409793e63f330c4222d4 4b7287d796d749bebcc5f0edd3692ed0 736ad5c2081a409793e63f330c4222d4--4b7287d796d749bebcc5f0edd3692ed0 9ab8b75a8dd0455a92c7d57fb25d5875 4b7287d796d749bebcc5f0edd3692ed0--9ab8b75a8dd0455a92c7d57fb25d5875 35cc531d12ec4086a19f7ce76d6f5b70 93ab8dc4b5e541718627949e88942966 RX(theta₁) 42e3d1c9a8cc4181a7dded625611f08c--93ab8dc4b5e541718627949e88942966 12c62fd4cc7d499383845d622691cb3f 2 c225ea4ecbd84eb09d194bc5b0dce131 RY(theta₅) 93ab8dc4b5e541718627949e88942966--c225ea4ecbd84eb09d194bc5b0dce131 681cde9946d9488daf0b482027a7866b RX(theta₉) c225ea4ecbd84eb09d194bc5b0dce131--681cde9946d9488daf0b482027a7866b 74d743a914db48d69118d2c60c750fa0 X 681cde9946d9488daf0b482027a7866b--74d743a914db48d69118d2c60c750fa0 74d743a914db48d69118d2c60c750fa0--90599610b9484e96bbec5ab69d31bb67 e11913396082428a8c13b4c51b1d0a3e 74d743a914db48d69118d2c60c750fa0--e11913396082428a8c13b4c51b1d0a3e bd65125a00ae403281519efddf67e379 RX(theta₁₃) e11913396082428a8c13b4c51b1d0a3e--bd65125a00ae403281519efddf67e379 f13ef51bc6e74bfdad63873e96d3f7b6 RY(theta₁₇) bd65125a00ae403281519efddf67e379--f13ef51bc6e74bfdad63873e96d3f7b6 5e9eea4cd3bf44b79781cf84dfccc15f RX(theta₂₁) f13ef51bc6e74bfdad63873e96d3f7b6--5e9eea4cd3bf44b79781cf84dfccc15f 6d5fb6f4025941fa8a35443b81c2648f X 5e9eea4cd3bf44b79781cf84dfccc15f--6d5fb6f4025941fa8a35443b81c2648f 6d5fb6f4025941fa8a35443b81c2648f--736ad5c2081a409793e63f330c4222d4 6047e03b98fe4a81b53e25c5d83c51d8 6d5fb6f4025941fa8a35443b81c2648f--6047e03b98fe4a81b53e25c5d83c51d8 6047e03b98fe4a81b53e25c5d83c51d8--35cc531d12ec4086a19f7ce76d6f5b70 f9dece3e11574419af9f64477bc9cffd d1e22e4befa343cc828adbc4efb56665 RX(theta₂) 12c62fd4cc7d499383845d622691cb3f--d1e22e4befa343cc828adbc4efb56665 36f46d738a764b53bb77f6234063bc71 3 0023efd281704570b257e40763531343 RY(theta₆) d1e22e4befa343cc828adbc4efb56665--0023efd281704570b257e40763531343 1ec6a80b5a644c0686f8226cbe8fc438 RX(theta₁₀) 0023efd281704570b257e40763531343--1ec6a80b5a644c0686f8226cbe8fc438 03ace2a42c114bbc95c24541ec8f2610 1ec6a80b5a644c0686f8226cbe8fc438--03ace2a42c114bbc95c24541ec8f2610 78931b6e4a5847e8897386c00f2ef23e X 03ace2a42c114bbc95c24541ec8f2610--78931b6e4a5847e8897386c00f2ef23e 78931b6e4a5847e8897386c00f2ef23e--e11913396082428a8c13b4c51b1d0a3e a02e633a64254676b4d88efc9adab2bd RX(theta₁₄) 78931b6e4a5847e8897386c00f2ef23e--a02e633a64254676b4d88efc9adab2bd fb0952c35ff7476f837fd718507af77d RY(theta₁₈) a02e633a64254676b4d88efc9adab2bd--fb0952c35ff7476f837fd718507af77d 15592a395a9b4824a1a89948964ed619 RX(theta₂₂) fb0952c35ff7476f837fd718507af77d--15592a395a9b4824a1a89948964ed619 2334e62068674797b6fd3a1f48d982e8 15592a395a9b4824a1a89948964ed619--2334e62068674797b6fd3a1f48d982e8 e52a3f4fe7504853bd3d82ad0bcf32ad X 2334e62068674797b6fd3a1f48d982e8--e52a3f4fe7504853bd3d82ad0bcf32ad e52a3f4fe7504853bd3d82ad0bcf32ad--6047e03b98fe4a81b53e25c5d83c51d8 e52a3f4fe7504853bd3d82ad0bcf32ad--f9dece3e11574419af9f64477bc9cffd fefb99b5d58546bb9e4ee436b17a2891 8d26b462731a4d4f9c7dd3944cfb93d9 RX(theta₃) 36f46d738a764b53bb77f6234063bc71--8d26b462731a4d4f9c7dd3944cfb93d9 184b257f8358410c8c3166434c6c2acf RY(theta₇) 8d26b462731a4d4f9c7dd3944cfb93d9--184b257f8358410c8c3166434c6c2acf 5795cd90714d4403bdb75265508c9e12 RX(theta₁₁) 184b257f8358410c8c3166434c6c2acf--5795cd90714d4403bdb75265508c9e12 e2d15ad1de534edcbd7f2766242531db X 5795cd90714d4403bdb75265508c9e12--e2d15ad1de534edcbd7f2766242531db e2d15ad1de534edcbd7f2766242531db--03ace2a42c114bbc95c24541ec8f2610 815205a9c27742bcaf8e22fb3a85e035 e2d15ad1de534edcbd7f2766242531db--815205a9c27742bcaf8e22fb3a85e035 22508472688745498e9f5c5b02c624a4 RX(theta₁₅) 815205a9c27742bcaf8e22fb3a85e035--22508472688745498e9f5c5b02c624a4 4421993dd1b446e5bf0a922208031d8a RY(theta₁₉) 22508472688745498e9f5c5b02c624a4--4421993dd1b446e5bf0a922208031d8a af4a69acc1ad4260a194050b9f89b368 RX(theta₂₃) 4421993dd1b446e5bf0a922208031d8a--af4a69acc1ad4260a194050b9f89b368 cbdc28dd674a4e598d622dec4bad0111 X af4a69acc1ad4260a194050b9f89b368--cbdc28dd674a4e598d622dec4bad0111 cbdc28dd674a4e598d622dec4bad0111--2334e62068674797b6fd3a1f48d982e8 f5c800f3c5024007aa841c5d1ee12c66 cbdc28dd674a4e598d622dec4bad0111--f5c800f3c5024007aa841c5d1ee12c66 f5c800f3c5024007aa841c5d1ee12c66--fefb99b5d58546bb9e4ee436b17a2891

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_a1faac5ba43245f489198827f30c7738 Obs. cluster_358f90be80114a28b27457768d9a5330 cluster_c149a11d427f4cb8b75bdc79b5861db1 Tower Chebyshev FM cluster_3e231281cbde4370ab1f812425aa5614 Tower Chebyshev FM cluster_63addeaa7dfc4b1092ade10af907955e HEA 3aae838acd854e50afe6ed7c592f103c 0 79a15a29ae544d29ba5dcbafcf71e3bf RX(1.0*acos(x)) 3aae838acd854e50afe6ed7c592f103c--79a15a29ae544d29ba5dcbafcf71e3bf e08271b3ebbd44c28e2710b19e75faba 1 3bef92ce56314e8eaa147d1d77bee3c4 RX(theta₀) 79a15a29ae544d29ba5dcbafcf71e3bf--3bef92ce56314e8eaa147d1d77bee3c4 295d844704804e66bbdfe64d74970680 RY(theta₄) 3bef92ce56314e8eaa147d1d77bee3c4--295d844704804e66bbdfe64d74970680 412ace0b8e214d27963d17d33e368391 RX(theta₈) 295d844704804e66bbdfe64d74970680--412ace0b8e214d27963d17d33e368391 df867676d4384483a03ce8199eff4638 412ace0b8e214d27963d17d33e368391--df867676d4384483a03ce8199eff4638 3e404d09cf91416fa9918aeec59f3076 df867676d4384483a03ce8199eff4638--3e404d09cf91416fa9918aeec59f3076 9c5ba3671ea04f2badccd256e6d0b755 RX(theta₁₂) 3e404d09cf91416fa9918aeec59f3076--9c5ba3671ea04f2badccd256e6d0b755 f8b11643851a40f6a33d54f3c9e6e476 RY(theta₁₆) 9c5ba3671ea04f2badccd256e6d0b755--f8b11643851a40f6a33d54f3c9e6e476 e0157eb26adc49a2b91021fa82542a7e RX(theta₂₀) f8b11643851a40f6a33d54f3c9e6e476--e0157eb26adc49a2b91021fa82542a7e 563b68ac75474b6dac75abf7f108b643 e0157eb26adc49a2b91021fa82542a7e--563b68ac75474b6dac75abf7f108b643 188a6bac5744427791e2cabec0c9f396 563b68ac75474b6dac75abf7f108b643--188a6bac5744427791e2cabec0c9f396 45e1a26c66f5426093109858efad08af 188a6bac5744427791e2cabec0c9f396--45e1a26c66f5426093109858efad08af 3e99334e1d7e403ca9657192989029f4 45e1a26c66f5426093109858efad08af--3e99334e1d7e403ca9657192989029f4 b85629baf995439998b60dd9d96de891 f471716f1bf449f8987d083187f2933c RX(2.0*acos(x)) e08271b3ebbd44c28e2710b19e75faba--f471716f1bf449f8987d083187f2933c 8a204fafeef440c785d2f2c21358480a 2 7d78f45738844be1a5a66a3da3520423 RX(theta₁) f471716f1bf449f8987d083187f2933c--7d78f45738844be1a5a66a3da3520423 b749e3a7a0f7474fb91b65aebcbdfc0a RY(theta₅) 7d78f45738844be1a5a66a3da3520423--b749e3a7a0f7474fb91b65aebcbdfc0a 98e25f8180364df99d69508129874d5c RX(theta₉) b749e3a7a0f7474fb91b65aebcbdfc0a--98e25f8180364df99d69508129874d5c aab0a1d2490b4a1f9039dda43db1b4fc X 98e25f8180364df99d69508129874d5c--aab0a1d2490b4a1f9039dda43db1b4fc aab0a1d2490b4a1f9039dda43db1b4fc--df867676d4384483a03ce8199eff4638 d00e2fe5cfb04397a490e96387c76016 aab0a1d2490b4a1f9039dda43db1b4fc--d00e2fe5cfb04397a490e96387c76016 3e4360fe143d40019bfb36131e1201e6 RX(theta₁₃) d00e2fe5cfb04397a490e96387c76016--3e4360fe143d40019bfb36131e1201e6 1840c03685a0487785eb6f28c590b946 RY(theta₁₇) 3e4360fe143d40019bfb36131e1201e6--1840c03685a0487785eb6f28c590b946 9b990f3786eb4481ac25142403c74efe RX(theta₂₁) 1840c03685a0487785eb6f28c590b946--9b990f3786eb4481ac25142403c74efe 75d68abb0f94447ba465c004ce921ad6 X 9b990f3786eb4481ac25142403c74efe--75d68abb0f94447ba465c004ce921ad6 75d68abb0f94447ba465c004ce921ad6--563b68ac75474b6dac75abf7f108b643 9d105b9d64324b0aa612f7e7a5bd32fb 75d68abb0f94447ba465c004ce921ad6--9d105b9d64324b0aa612f7e7a5bd32fb f2f57af241164c0f8f2dfb74b1cd160e AddBlock 9d105b9d64324b0aa612f7e7a5bd32fb--f2f57af241164c0f8f2dfb74b1cd160e f2f57af241164c0f8f2dfb74b1cd160e--b85629baf995439998b60dd9d96de891 a6963a230c2b4354ac3c7823526ea262 af0af75463424fe19e75f3f8ddb8c390 RX(1.0*acos(2.0*y - 1.0)) 8a204fafeef440c785d2f2c21358480a--af0af75463424fe19e75f3f8ddb8c390 0dc3e22cd7d148a8b40ef46c376b7f46 3 e07858913f934ae0af6e1a56449fb6fb RX(theta₂) af0af75463424fe19e75f3f8ddb8c390--e07858913f934ae0af6e1a56449fb6fb c17adad23ccf4fde99c57399a23f7716 RY(theta₆) e07858913f934ae0af6e1a56449fb6fb--c17adad23ccf4fde99c57399a23f7716 a17768606f464e578b806b74dbbb416f RX(theta₁₀) c17adad23ccf4fde99c57399a23f7716--a17768606f464e578b806b74dbbb416f c93754f71ba143f7ab8d348d616fa317 a17768606f464e578b806b74dbbb416f--c93754f71ba143f7ab8d348d616fa317 9ff3b594d4a541a0a8886e436959ed68 X c93754f71ba143f7ab8d348d616fa317--9ff3b594d4a541a0a8886e436959ed68 9ff3b594d4a541a0a8886e436959ed68--d00e2fe5cfb04397a490e96387c76016 90ed4221dc2d4c9aaf72b0e1e19ac440 RX(theta₁₄) 9ff3b594d4a541a0a8886e436959ed68--90ed4221dc2d4c9aaf72b0e1e19ac440 985218b23ad247bfa67126856e2e88ca RY(theta₁₈) 90ed4221dc2d4c9aaf72b0e1e19ac440--985218b23ad247bfa67126856e2e88ca b268b836a5254d15a8b8559e7c459d2b RX(theta₂₂) 985218b23ad247bfa67126856e2e88ca--b268b836a5254d15a8b8559e7c459d2b 8afaeb7a8f964851b173ec56ec008125 b268b836a5254d15a8b8559e7c459d2b--8afaeb7a8f964851b173ec56ec008125 ed0e27dc89c84d2d8aef38bd269d4709 X 8afaeb7a8f964851b173ec56ec008125--ed0e27dc89c84d2d8aef38bd269d4709 ed0e27dc89c84d2d8aef38bd269d4709--9d105b9d64324b0aa612f7e7a5bd32fb e75ca67d16234edd95201db8551a130d ed0e27dc89c84d2d8aef38bd269d4709--e75ca67d16234edd95201db8551a130d e75ca67d16234edd95201db8551a130d--a6963a230c2b4354ac3c7823526ea262 558375af98e34268bd864daa8140879c bd778082edc24611a3825e2bd762b1f2 RX(2.0*acos(2.0*y - 1.0)) 0dc3e22cd7d148a8b40ef46c376b7f46--bd778082edc24611a3825e2bd762b1f2 c10a1d80269f49acb575a0ce3bd2f176 RX(theta₃) bd778082edc24611a3825e2bd762b1f2--c10a1d80269f49acb575a0ce3bd2f176 ce07090fabbf4f29adba0890e8d6ff74 RY(theta₇) c10a1d80269f49acb575a0ce3bd2f176--ce07090fabbf4f29adba0890e8d6ff74 a05bc87587364a8a878e3f44b2aaf089 RX(theta₁₁) ce07090fabbf4f29adba0890e8d6ff74--a05bc87587364a8a878e3f44b2aaf089 6f604487ce5b4463a9a02153ba91a2f6 X a05bc87587364a8a878e3f44b2aaf089--6f604487ce5b4463a9a02153ba91a2f6 6f604487ce5b4463a9a02153ba91a2f6--c93754f71ba143f7ab8d348d616fa317 afc32b3587d14064833d5247186bb83f 6f604487ce5b4463a9a02153ba91a2f6--afc32b3587d14064833d5247186bb83f ab613671e2fc4a088d4d87ae1eb45858 RX(theta₁₅) afc32b3587d14064833d5247186bb83f--ab613671e2fc4a088d4d87ae1eb45858 77182e66d394491e9bf7618bc4dfccc5 RY(theta₁₉) ab613671e2fc4a088d4d87ae1eb45858--77182e66d394491e9bf7618bc4dfccc5 d69695ead6f34d39b31c9bdad36f6eee RX(theta₂₃) 77182e66d394491e9bf7618bc4dfccc5--d69695ead6f34d39b31c9bdad36f6eee 5686197daf704581aa92dc6b1591091c X d69695ead6f34d39b31c9bdad36f6eee--5686197daf704581aa92dc6b1591091c 5686197daf704581aa92dc6b1591091c--8afaeb7a8f964851b173ec56ec008125 a9833ab8b9c6431aa93aa01c4741abd8 5686197daf704581aa92dc6b1591091c--a9833ab8b9c6431aa93aa01c4741abd8 5deba5df7c9b4c658503a54a946908e5 a9833ab8b9c6431aa93aa01c4741abd8--5deba5df7c9b4c658503a54a946908e5 5deba5df7c9b4c658503a54a946908e5--558375af98e34268bd864daa8140879c