Skip to content

QNN Config

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 this tutorial, we will see how to do the same using configs.

One convenient way to construct these two parts of the model is to use the config classes, namely, FeatureMapConfig and 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.

It can be used to create Hamiltonians with 2-qubit interactions and single-qubit detunings. Any Hamiltonian supported by hamiltonian_factory can be specified as an observable. For example, suppose we want to measure the Z operator:

from qadence import create_observable, ObservableConfig, Z

observable_config = ObservableConfig(
    detuning=Z,
    interaction = None,
    scale = 2.0,
    shift=-1.0,
)

observable = create_observable(register=4, config=observable_config)
%3 cluster_a45549cb3feb4930853819936a9b56a5 b4b169b3c9ea414680e113e930fa19a3 0 55235efcc0704a6e97fcad3e9e9106a7 b4b169b3c9ea414680e113e930fa19a3--55235efcc0704a6e97fcad3e9e9106a7 389dcc47826c41e4a716c3694252d532 1 20538ea2542b47a388ce7e3497a5c8a1 55235efcc0704a6e97fcad3e9e9106a7--20538ea2542b47a388ce7e3497a5c8a1 e7646b63bcf34ac6bb5ab00c697b655c 9125daff5b5944cb91a4331aa7e2c517 AddBlock 389dcc47826c41e4a716c3694252d532--9125daff5b5944cb91a4331aa7e2c517 7a76f1ec80d5409ca29925c3d4cfc96c 2 9125daff5b5944cb91a4331aa7e2c517--e7646b63bcf34ac6bb5ab00c697b655c f4c342bcc1764a4ab6d262595586a335 d38055e72a0843ec8613a22c73eab639 7a76f1ec80d5409ca29925c3d4cfc96c--d38055e72a0843ec8613a22c73eab639 7f40f08b462c45b1816c86a6b43252b4 3 d38055e72a0843ec8613a22c73eab639--f4c342bcc1764a4ab6d262595586a335 138a46c323324d729c2fba461859a60b 7b82e3d7070d408b8c547ee0811e2e1d 7f40f08b462c45b1816c86a6b43252b4--7b82e3d7070d408b8c547ee0811e2e1d 7b82e3d7070d408b8c547ee0811e2e1d--138a46c323324d729c2fba461859a60b

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_a8f4453d22774e519b7946be49e38e90 Tower Chebyshev FM cluster_22ff185312014850a6ddadd5fd50d0a7 Tower Chebyshev FM cd2939e031084fe88c55a2ca1077ac21 0 e607b574831343c4b42de3e367d0025f RX(1.0*acos(x)) cd2939e031084fe88c55a2ca1077ac21--e607b574831343c4b42de3e367d0025f a247aacc29984d15a48aebf25c6bf999 1 b41e0ef7c8f84291b1d73c3ea704990b e607b574831343c4b42de3e367d0025f--b41e0ef7c8f84291b1d73c3ea704990b 9fc49f0f025f47a98f2f8db6eb1e97ed c1ae8420b4c147088434594115b8767a RX(2.0*acos(x)) a247aacc29984d15a48aebf25c6bf999--c1ae8420b4c147088434594115b8767a 82aa907f3133446dab385a83cfca723e 2 c1ae8420b4c147088434594115b8767a--9fc49f0f025f47a98f2f8db6eb1e97ed cfe1da92c68d466393b1e6c48dc9dc90 dcaebffaa02e4555b9519ac89c1490a2 RX(1.0*acos(2.0*y - 1.0)) 82aa907f3133446dab385a83cfca723e--dcaebffaa02e4555b9519ac89c1490a2 61ae447d4a454af4a601389968e51242 3 dcaebffaa02e4555b9519ac89c1490a2--cfe1da92c68d466393b1e6c48dc9dc90 0dff8653d35b42638b4122a5372b9f2b b2c350a1d5474c04bb96bfa8ebb94af4 RX(2.0*acos(2.0*y - 1.0)) 61ae447d4a454af4a601389968e51242--b2c350a1d5474c04bb96bfa8ebb94af4 b2c350a1d5474c04bb96bfa8ebb94af4--0dff8653d35b42638b4122a5372b9f2b

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..

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 4e38f91f472546499f25f35d49eafb50 0 1d0eb2c0ec5047158eae8e381d8743a1 RX(theta₀) 4e38f91f472546499f25f35d49eafb50--1d0eb2c0ec5047158eae8e381d8743a1 c62c0bfa2142443e8ca6d366d1fdf4f6 1 9bba0ee19e954b2e8855618bce0ee592 RY(theta₄) 1d0eb2c0ec5047158eae8e381d8743a1--9bba0ee19e954b2e8855618bce0ee592 c7c645484721498193083f3481ad3601 RX(theta₈) 9bba0ee19e954b2e8855618bce0ee592--c7c645484721498193083f3481ad3601 b73f68d472c841d8aedda18eb3e1daac c7c645484721498193083f3481ad3601--b73f68d472c841d8aedda18eb3e1daac 6941ca598bdb472c876b7b92429130ba b73f68d472c841d8aedda18eb3e1daac--6941ca598bdb472c876b7b92429130ba cf1b5fc96a9948fa975db31346fb2b94 RX(theta₁₂) 6941ca598bdb472c876b7b92429130ba--cf1b5fc96a9948fa975db31346fb2b94 f2d89feb4ae24b0e920c6b8ef25bb8da RY(theta₁₆) cf1b5fc96a9948fa975db31346fb2b94--f2d89feb4ae24b0e920c6b8ef25bb8da f0e440337e7e4d83bff2e4bd419f7312 RX(theta₂₀) f2d89feb4ae24b0e920c6b8ef25bb8da--f0e440337e7e4d83bff2e4bd419f7312 04d14dca14cb4158b42482ac7beb3133 f0e440337e7e4d83bff2e4bd419f7312--04d14dca14cb4158b42482ac7beb3133 7afb490e9ae04c4aa9b489be580b44b4 04d14dca14cb4158b42482ac7beb3133--7afb490e9ae04c4aa9b489be580b44b4 2fe74ac6aafe4bf599b1e6aeece5cf10 7afb490e9ae04c4aa9b489be580b44b4--2fe74ac6aafe4bf599b1e6aeece5cf10 ea06cc5d7501445ab1ebfc23efc33907 761b34759e3d41d3abf124b688b728a9 RX(theta₁) c62c0bfa2142443e8ca6d366d1fdf4f6--761b34759e3d41d3abf124b688b728a9 fe5b2cffa4f7444d8ab53e2222d4a958 2 a7fbae7e9f8546f59366dd309a55bec5 RY(theta₅) 761b34759e3d41d3abf124b688b728a9--a7fbae7e9f8546f59366dd309a55bec5 5f96dbbc6415483d8c9781354d04827d RX(theta₉) a7fbae7e9f8546f59366dd309a55bec5--5f96dbbc6415483d8c9781354d04827d 8478122c81ca4959b70e74d23bcb135e X 5f96dbbc6415483d8c9781354d04827d--8478122c81ca4959b70e74d23bcb135e 8478122c81ca4959b70e74d23bcb135e--b73f68d472c841d8aedda18eb3e1daac 97ccaa3566c74930b6fd4279595d36c9 8478122c81ca4959b70e74d23bcb135e--97ccaa3566c74930b6fd4279595d36c9 c9afcfe984b34ead909528890a4cac4a RX(theta₁₃) 97ccaa3566c74930b6fd4279595d36c9--c9afcfe984b34ead909528890a4cac4a 910c4ca49e8d4e70842b0fe26a6d55a8 RY(theta₁₇) c9afcfe984b34ead909528890a4cac4a--910c4ca49e8d4e70842b0fe26a6d55a8 2ad42b9db4b54f598bf8c099bdf21bd4 RX(theta₂₁) 910c4ca49e8d4e70842b0fe26a6d55a8--2ad42b9db4b54f598bf8c099bdf21bd4 23b6cf7353a84660862cbd2e2f43c882 X 2ad42b9db4b54f598bf8c099bdf21bd4--23b6cf7353a84660862cbd2e2f43c882 23b6cf7353a84660862cbd2e2f43c882--04d14dca14cb4158b42482ac7beb3133 abeccee150b84f2ebe66440f80074b1d 23b6cf7353a84660862cbd2e2f43c882--abeccee150b84f2ebe66440f80074b1d abeccee150b84f2ebe66440f80074b1d--ea06cc5d7501445ab1ebfc23efc33907 f097505f2abe4ec7bb9f012f4115e5db d6a66c09f7c24cca8e664595eaba875a RX(theta₂) fe5b2cffa4f7444d8ab53e2222d4a958--d6a66c09f7c24cca8e664595eaba875a 7f79f2e2f56e4684afb8272a06e98ae7 3 b8067b0a52534ea7b69ce9661ad91b10 RY(theta₆) d6a66c09f7c24cca8e664595eaba875a--b8067b0a52534ea7b69ce9661ad91b10 66245227b9664894ba805c8d61911931 RX(theta₁₀) b8067b0a52534ea7b69ce9661ad91b10--66245227b9664894ba805c8d61911931 525bc5f0563d48469618885408e3f8ea 66245227b9664894ba805c8d61911931--525bc5f0563d48469618885408e3f8ea e26900527d934693b57e4b9c9ad413e9 X 525bc5f0563d48469618885408e3f8ea--e26900527d934693b57e4b9c9ad413e9 e26900527d934693b57e4b9c9ad413e9--97ccaa3566c74930b6fd4279595d36c9 aca0f2d257a84f82828fedfdd86ca2a3 RX(theta₁₄) e26900527d934693b57e4b9c9ad413e9--aca0f2d257a84f82828fedfdd86ca2a3 d20aa8151622418f82002a2509c3245c RY(theta₁₈) aca0f2d257a84f82828fedfdd86ca2a3--d20aa8151622418f82002a2509c3245c 4a01696101664ef19496f70b9fabad1e RX(theta₂₂) d20aa8151622418f82002a2509c3245c--4a01696101664ef19496f70b9fabad1e 4da877c211b141eb8c09594c7ca407d0 4a01696101664ef19496f70b9fabad1e--4da877c211b141eb8c09594c7ca407d0 6940b9ed4ea640008ac80025a3d88051 X 4da877c211b141eb8c09594c7ca407d0--6940b9ed4ea640008ac80025a3d88051 6940b9ed4ea640008ac80025a3d88051--abeccee150b84f2ebe66440f80074b1d 6940b9ed4ea640008ac80025a3d88051--f097505f2abe4ec7bb9f012f4115e5db 52efcd8fcdd048409d4fd46294c0d64d 6d52246c354a4d77a93e5b0b35a28222 RX(theta₃) 7f79f2e2f56e4684afb8272a06e98ae7--6d52246c354a4d77a93e5b0b35a28222 e6792a0c58c943678deae12e96c1ebe0 RY(theta₇) 6d52246c354a4d77a93e5b0b35a28222--e6792a0c58c943678deae12e96c1ebe0 fd0c35cca6fe47578918702807c9a9dd RX(theta₁₁) e6792a0c58c943678deae12e96c1ebe0--fd0c35cca6fe47578918702807c9a9dd d412c8a75d9841e4903f53531dfe35c9 X fd0c35cca6fe47578918702807c9a9dd--d412c8a75d9841e4903f53531dfe35c9 d412c8a75d9841e4903f53531dfe35c9--525bc5f0563d48469618885408e3f8ea 0cfff1e7cbfe4e279382fa81efbd244a d412c8a75d9841e4903f53531dfe35c9--0cfff1e7cbfe4e279382fa81efbd244a cf77d5efc3ff4051add3c672de3ea43b RX(theta₁₅) 0cfff1e7cbfe4e279382fa81efbd244a--cf77d5efc3ff4051add3c672de3ea43b f288fd9b0cc5403cbcbf8fa8179f533d RY(theta₁₉) cf77d5efc3ff4051add3c672de3ea43b--f288fd9b0cc5403cbcbf8fa8179f533d 2ae0b20784e84d6abf593f61f1305523 RX(theta₂₃) f288fd9b0cc5403cbcbf8fa8179f533d--2ae0b20784e84d6abf593f61f1305523 9f2d9f0d5414477a8af5d88321829758 X 2ae0b20784e84d6abf593f61f1305523--9f2d9f0d5414477a8af5d88321829758 9f2d9f0d5414477a8af5d88321829758--4da877c211b141eb8c09594c7ca407d0 2e7d43620e81490d8934502f9e27c9c7 9f2d9f0d5414477a8af5d88321829758--2e7d43620e81490d8934502f9e27c9c7 2e7d43620e81490d8934502f9e27c9c7--52efcd8fcdd048409d4fd46294c0d64d

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.

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.

from qadence import BackendName, DiffMode, QNN, ObservableConfig, Z

observable_config = ObservableConfig(
    detuning=Z,
    interaction = None,
    scale = 2.0,
    shift=-1.0,
)

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_23b1f148d627479389ac1ed91dbf2d71 Obs. cluster_1b799e98a78f43bd8147f94ee2ef4450 cluster_746786b9ecef4c488d90aa00c3903940 Tower Chebyshev FM cluster_eaa39817f02943909e1158b83c54a42a Tower Chebyshev FM cluster_918584e3294648a5972c787c71b2367c HEA 6cb28039e439460c841143b096bc8420 0 f610f975ea0640fcbdc36ebf32c15f7a RX(1.0*acos(x)) 6cb28039e439460c841143b096bc8420--f610f975ea0640fcbdc36ebf32c15f7a 3e01d54ad35a40b19c3c6930c3567d28 1 2c1ef96f6a4240209a49ae570a94d874 RX(theta₀) f610f975ea0640fcbdc36ebf32c15f7a--2c1ef96f6a4240209a49ae570a94d874 081d93d72e9a4e58b25df580be3e2a93 RY(theta₄) 2c1ef96f6a4240209a49ae570a94d874--081d93d72e9a4e58b25df580be3e2a93 bc10532365744dbb96332498bd14ff2c RX(theta₈) 081d93d72e9a4e58b25df580be3e2a93--bc10532365744dbb96332498bd14ff2c ebb3531c474244308e984397ad0d2047 bc10532365744dbb96332498bd14ff2c--ebb3531c474244308e984397ad0d2047 ef59ec64b54a43038070931b525c7f41 ebb3531c474244308e984397ad0d2047--ef59ec64b54a43038070931b525c7f41 3145cc8dd04743f18ac29dea11f0e365 RX(theta₁₂) ef59ec64b54a43038070931b525c7f41--3145cc8dd04743f18ac29dea11f0e365 4d05f8615b0a458db3942da179f39e26 RY(theta₁₆) 3145cc8dd04743f18ac29dea11f0e365--4d05f8615b0a458db3942da179f39e26 d650d0679ff84354a0af4871599706be RX(theta₂₀) 4d05f8615b0a458db3942da179f39e26--d650d0679ff84354a0af4871599706be e9d6ced9ec6a4a96875d4cb0bdfc2057 d650d0679ff84354a0af4871599706be--e9d6ced9ec6a4a96875d4cb0bdfc2057 7b80237d86ea48ffb0527c5e0dd101ce e9d6ced9ec6a4a96875d4cb0bdfc2057--7b80237d86ea48ffb0527c5e0dd101ce 2ff082557e3641f7b6de96042699c9ad 7b80237d86ea48ffb0527c5e0dd101ce--2ff082557e3641f7b6de96042699c9ad a5da1292fa5d4de189e8d1eef0c73b33 2ff082557e3641f7b6de96042699c9ad--a5da1292fa5d4de189e8d1eef0c73b33 0af9badad42a446eaf00f9b5d250e8aa 5c50eba3ad8f40e1bc93a70b92be38af RX(2.0*acos(x)) 3e01d54ad35a40b19c3c6930c3567d28--5c50eba3ad8f40e1bc93a70b92be38af 61e1940784804d4bb2ba4c0e11084454 2 8cec43e1e03244fc8bcdf95ca9941d1a RX(theta₁) 5c50eba3ad8f40e1bc93a70b92be38af--8cec43e1e03244fc8bcdf95ca9941d1a ff4c7da569504d8bbc2bc1b967ee773c RY(theta₅) 8cec43e1e03244fc8bcdf95ca9941d1a--ff4c7da569504d8bbc2bc1b967ee773c 147b4c201c7d446481258fe18612c4be RX(theta₉) ff4c7da569504d8bbc2bc1b967ee773c--147b4c201c7d446481258fe18612c4be e71652f8049c4b63b47e62235fdbbc35 X 147b4c201c7d446481258fe18612c4be--e71652f8049c4b63b47e62235fdbbc35 e71652f8049c4b63b47e62235fdbbc35--ebb3531c474244308e984397ad0d2047 809c2f68126148bbba45221896fcdc4a e71652f8049c4b63b47e62235fdbbc35--809c2f68126148bbba45221896fcdc4a 2b6127b891d04a3f95f9d872f3a568ed RX(theta₁₃) 809c2f68126148bbba45221896fcdc4a--2b6127b891d04a3f95f9d872f3a568ed 8663371a4d33430d90e82149df158311 RY(theta₁₇) 2b6127b891d04a3f95f9d872f3a568ed--8663371a4d33430d90e82149df158311 3afb0161c013457cbcf2a6260076c707 RX(theta₂₁) 8663371a4d33430d90e82149df158311--3afb0161c013457cbcf2a6260076c707 1c083c0beba04b12b1b61e4dde9d97cf X 3afb0161c013457cbcf2a6260076c707--1c083c0beba04b12b1b61e4dde9d97cf 1c083c0beba04b12b1b61e4dde9d97cf--e9d6ced9ec6a4a96875d4cb0bdfc2057 9813ab31f8be4990bc85c0fee714d8f8 1c083c0beba04b12b1b61e4dde9d97cf--9813ab31f8be4990bc85c0fee714d8f8 3609e6fa0b16493199cb905e56bbbd50 AddBlock 9813ab31f8be4990bc85c0fee714d8f8--3609e6fa0b16493199cb905e56bbbd50 3609e6fa0b16493199cb905e56bbbd50--0af9badad42a446eaf00f9b5d250e8aa 49563c8013f1440cb170a9db1be2b5db 7418dbb423864174985c6c6e57afe5c8 RX(1.0*acos(2.0*y - 1.0)) 61e1940784804d4bb2ba4c0e11084454--7418dbb423864174985c6c6e57afe5c8 bb67ce7ff1ed48df902d6a200705c2aa 3 48d0b0ec72cd4b369cbb1fdf61af944f RX(theta₂) 7418dbb423864174985c6c6e57afe5c8--48d0b0ec72cd4b369cbb1fdf61af944f eb459ddcfda1493c8a6ec0c1f3ad1ef6 RY(theta₆) 48d0b0ec72cd4b369cbb1fdf61af944f--eb459ddcfda1493c8a6ec0c1f3ad1ef6 3e01f71ddaff48a2935ef4971bdd845f RX(theta₁₀) eb459ddcfda1493c8a6ec0c1f3ad1ef6--3e01f71ddaff48a2935ef4971bdd845f e2154f6561f24c13b5712b0c76b67114 3e01f71ddaff48a2935ef4971bdd845f--e2154f6561f24c13b5712b0c76b67114 be253ee0ead14a21a5298d43eb394dac X e2154f6561f24c13b5712b0c76b67114--be253ee0ead14a21a5298d43eb394dac be253ee0ead14a21a5298d43eb394dac--809c2f68126148bbba45221896fcdc4a c55e7fad31b04713b6d9172eb1669584 RX(theta₁₄) be253ee0ead14a21a5298d43eb394dac--c55e7fad31b04713b6d9172eb1669584 83b27c2c2f1245e9936ecf9923e2db25 RY(theta₁₈) c55e7fad31b04713b6d9172eb1669584--83b27c2c2f1245e9936ecf9923e2db25 fa96e6b72da1475e96eb76f70adfc891 RX(theta₂₂) 83b27c2c2f1245e9936ecf9923e2db25--fa96e6b72da1475e96eb76f70adfc891 8cd0cffb601342fc902c04bfccc737be fa96e6b72da1475e96eb76f70adfc891--8cd0cffb601342fc902c04bfccc737be 5e102e09ff324e979758bc18eb14ce52 X 8cd0cffb601342fc902c04bfccc737be--5e102e09ff324e979758bc18eb14ce52 5e102e09ff324e979758bc18eb14ce52--9813ab31f8be4990bc85c0fee714d8f8 7fd26f6d4de94362a6046b67690b9c68 5e102e09ff324e979758bc18eb14ce52--7fd26f6d4de94362a6046b67690b9c68 7fd26f6d4de94362a6046b67690b9c68--49563c8013f1440cb170a9db1be2b5db a8e9418c401b45a9930224d7099d375c a6d27c1349b845dd949b758ad445c4ab RX(2.0*acos(2.0*y - 1.0)) bb67ce7ff1ed48df902d6a200705c2aa--a6d27c1349b845dd949b758ad445c4ab a84a5c7ae2414e60954ecadcc6f4e2d2 RX(theta₃) a6d27c1349b845dd949b758ad445c4ab--a84a5c7ae2414e60954ecadcc6f4e2d2 9466669b68344d8a9634f21f00ec9edb RY(theta₇) a84a5c7ae2414e60954ecadcc6f4e2d2--9466669b68344d8a9634f21f00ec9edb d9e67c5fa8e34560a30f4f1007450f88 RX(theta₁₁) 9466669b68344d8a9634f21f00ec9edb--d9e67c5fa8e34560a30f4f1007450f88 23c6ced4039740fd9c14e9e9e0af4b00 X d9e67c5fa8e34560a30f4f1007450f88--23c6ced4039740fd9c14e9e9e0af4b00 23c6ced4039740fd9c14e9e9e0af4b00--e2154f6561f24c13b5712b0c76b67114 97dd75401e424f569d62ec7c53ec0693 23c6ced4039740fd9c14e9e9e0af4b00--97dd75401e424f569d62ec7c53ec0693 539f4fc7b3f540a68c08b2e6fcd5c6b8 RX(theta₁₅) 97dd75401e424f569d62ec7c53ec0693--539f4fc7b3f540a68c08b2e6fcd5c6b8 af43718eff8b49f79c5b7b43d759c603 RY(theta₁₉) 539f4fc7b3f540a68c08b2e6fcd5c6b8--af43718eff8b49f79c5b7b43d759c603 5fd79dd0e1fd4a55a98395f4127a9c4d RX(theta₂₃) af43718eff8b49f79c5b7b43d759c603--5fd79dd0e1fd4a55a98395f4127a9c4d 1002e32899eb4042bae143449b1e4b87 X 5fd79dd0e1fd4a55a98395f4127a9c4d--1002e32899eb4042bae143449b1e4b87 1002e32899eb4042bae143449b1e4b87--8cd0cffb601342fc902c04bfccc737be 1f5f36e8859743db91030e92fe3e0861 1002e32899eb4042bae143449b1e4b87--1f5f36e8859743db91030e92fe3e0861 5c6b5cbcb472407b9865a953b31a410e 1f5f36e8859743db91030e92fe3e0861--5c6b5cbcb472407b9865a953b31a410e 5c6b5cbcb472407b9865a953b31a410e--a8e9418c401b45a9930224d7099d375c