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_0fefe75090d84cef9af7da9bd2565bfe 3410afa6966b41a1a0433dd901ad4650 0 9a9bf91a96d84137b558869e3b4917fc 3410afa6966b41a1a0433dd901ad4650--9a9bf91a96d84137b558869e3b4917fc 20525c72b0384cb1bb372c8b0774eec5 1 72b89d2fe8df4bbcace722d45ebc3f46 9a9bf91a96d84137b558869e3b4917fc--72b89d2fe8df4bbcace722d45ebc3f46 20de5a619508482abeea8a23aaa024c1 e95a2c97b9ba48a3bae0afb923bf6dd6 AddBlock 20525c72b0384cb1bb372c8b0774eec5--e95a2c97b9ba48a3bae0afb923bf6dd6 4eb95c14a40b40ae840a890a08039780 2 e95a2c97b9ba48a3bae0afb923bf6dd6--20de5a619508482abeea8a23aaa024c1 4444f6be12ca4ffb92d49cc818b964b5 4dd18fe678ae42e49b7d157677d4fce0 4eb95c14a40b40ae840a890a08039780--4dd18fe678ae42e49b7d157677d4fce0 d20e254127b140c4a961b65e3c981858 3 4dd18fe678ae42e49b7d157677d4fce0--4444f6be12ca4ffb92d49cc818b964b5 2d3d4d695cf04606b6b6443c05fc5e51 4b132899085b489fb9bc6d529c8129d5 d20e254127b140c4a961b65e3c981858--4b132899085b489fb9bc6d529c8129d5 4b132899085b489fb9bc6d529c8129d5--2d3d4d695cf04606b6b6443c05fc5e51

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_a09f989c4e0144eb9e5f9be279234dfc Tower Chebyshev FM cluster_829cfada3b914cbea945103d22a39b9c Tower Chebyshev FM 33b31052470d4393ac32ea9ac15641a0 0 533d3f60afb9412b987c71e211da637c RX(1.0*acos(x)) 33b31052470d4393ac32ea9ac15641a0--533d3f60afb9412b987c71e211da637c bc4332c13382478694fc1974b6979605 1 7a0cf00f722342e7b6baa1e2b1c97f64 533d3f60afb9412b987c71e211da637c--7a0cf00f722342e7b6baa1e2b1c97f64 4ec4664824064a89b12e4f118ebc1160 c5e9ab460de7467093bcc3b727cf266b RX(2.0*acos(x)) bc4332c13382478694fc1974b6979605--c5e9ab460de7467093bcc3b727cf266b 029eaabed7af44a6a3a3c69086165c01 2 c5e9ab460de7467093bcc3b727cf266b--4ec4664824064a89b12e4f118ebc1160 750531b9c0dd4756848d0ef1ce6cff7a 54ea485e6b1943829692587b3f4fd5c5 RX(1.0*acos(2.0*y - 1.0)) 029eaabed7af44a6a3a3c69086165c01--54ea485e6b1943829692587b3f4fd5c5 50475882981a4dc28e65d14677189dd7 3 54ea485e6b1943829692587b3f4fd5c5--750531b9c0dd4756848d0ef1ce6cff7a 7a40483ec1ba49e3bee4589f0df611b0 c210f2de1eb64a2d9bc3cbda1903aeff RX(2.0*acos(2.0*y - 1.0)) 50475882981a4dc28e65d14677189dd7--c210f2de1eb64a2d9bc3cbda1903aeff c210f2de1eb64a2d9bc3cbda1903aeff--7a40483ec1ba49e3bee4589f0df611b0

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 963aafb13a5d47da91c8ec482cb32d98 0 6f63209b565a4724a241d12245b65ca1 RX(theta₀) 963aafb13a5d47da91c8ec482cb32d98--6f63209b565a4724a241d12245b65ca1 4d9246f63bc44a5c900bbb9b00bd0178 1 0902229a40b14c049858e3a22f471e67 RY(theta₄) 6f63209b565a4724a241d12245b65ca1--0902229a40b14c049858e3a22f471e67 e573fab638ab4cc9adf67ff1f1d945c9 RX(theta₈) 0902229a40b14c049858e3a22f471e67--e573fab638ab4cc9adf67ff1f1d945c9 bdbfcce536214c7cbd70caef8470a4e3 e573fab638ab4cc9adf67ff1f1d945c9--bdbfcce536214c7cbd70caef8470a4e3 18bc4413a2a24e8b810c26871c17aa47 bdbfcce536214c7cbd70caef8470a4e3--18bc4413a2a24e8b810c26871c17aa47 c3cea064797c4002afcc290f55e2ebbc RX(theta₁₂) 18bc4413a2a24e8b810c26871c17aa47--c3cea064797c4002afcc290f55e2ebbc dc5d474ace884d2bb9dafa8e53e9da9b RY(theta₁₆) c3cea064797c4002afcc290f55e2ebbc--dc5d474ace884d2bb9dafa8e53e9da9b 2f68119f6dea42c4930bbcc3c6d38a29 RX(theta₂₀) dc5d474ace884d2bb9dafa8e53e9da9b--2f68119f6dea42c4930bbcc3c6d38a29 dd04e4b07dbc44f4ac5ff92bf9d9270e 2f68119f6dea42c4930bbcc3c6d38a29--dd04e4b07dbc44f4ac5ff92bf9d9270e 2b00b8f8dd2541ad958a3ca432345cb7 dd04e4b07dbc44f4ac5ff92bf9d9270e--2b00b8f8dd2541ad958a3ca432345cb7 f4eb02c1c10b43adb6ea7c623392d474 2b00b8f8dd2541ad958a3ca432345cb7--f4eb02c1c10b43adb6ea7c623392d474 00e21179a3aa4171be2dc14e8ae72d61 b31fe8d9e150417b94b4525a0ccb8682 RX(theta₁) 4d9246f63bc44a5c900bbb9b00bd0178--b31fe8d9e150417b94b4525a0ccb8682 f8fc2aec5a0849c0b598d7f9956545b9 2 bb53f81029db43e38b7e8657065a97b1 RY(theta₅) b31fe8d9e150417b94b4525a0ccb8682--bb53f81029db43e38b7e8657065a97b1 c65daab5051f4682bcd75b28eec146a5 RX(theta₉) bb53f81029db43e38b7e8657065a97b1--c65daab5051f4682bcd75b28eec146a5 4e8e6cb6c04e4ac0a969359e216cb478 X c65daab5051f4682bcd75b28eec146a5--4e8e6cb6c04e4ac0a969359e216cb478 4e8e6cb6c04e4ac0a969359e216cb478--bdbfcce536214c7cbd70caef8470a4e3 c0e97440c36943c4ace6f8d8d149424e 4e8e6cb6c04e4ac0a969359e216cb478--c0e97440c36943c4ace6f8d8d149424e 00fd701a631b41ec9d778cc5e5a1bf13 RX(theta₁₃) c0e97440c36943c4ace6f8d8d149424e--00fd701a631b41ec9d778cc5e5a1bf13 d082126ce1aa403184739378568bc9b5 RY(theta₁₇) 00fd701a631b41ec9d778cc5e5a1bf13--d082126ce1aa403184739378568bc9b5 8f94125be2ff4bd7869cbce85438aac5 RX(theta₂₁) d082126ce1aa403184739378568bc9b5--8f94125be2ff4bd7869cbce85438aac5 43397e1c07c34427b2e974a8a8339cba X 8f94125be2ff4bd7869cbce85438aac5--43397e1c07c34427b2e974a8a8339cba 43397e1c07c34427b2e974a8a8339cba--dd04e4b07dbc44f4ac5ff92bf9d9270e a1e090ad0ee24a74a47a65546d334f64 43397e1c07c34427b2e974a8a8339cba--a1e090ad0ee24a74a47a65546d334f64 a1e090ad0ee24a74a47a65546d334f64--00e21179a3aa4171be2dc14e8ae72d61 7c132cb762c34bde8ed7b719605beb16 0b0661b08abb4ce586b76a44df7e6cd7 RX(theta₂) f8fc2aec5a0849c0b598d7f9956545b9--0b0661b08abb4ce586b76a44df7e6cd7 89837559a18549a6ac036a5afd61a3cb 3 a35c1cb3b95a4c2f8c56f50a7912ac60 RY(theta₆) 0b0661b08abb4ce586b76a44df7e6cd7--a35c1cb3b95a4c2f8c56f50a7912ac60 75222c9e27254329bf7063d543a7a4ff RX(theta₁₀) a35c1cb3b95a4c2f8c56f50a7912ac60--75222c9e27254329bf7063d543a7a4ff 74f0a198268d474db3056e149d95900e 75222c9e27254329bf7063d543a7a4ff--74f0a198268d474db3056e149d95900e 96eb6ace636f42fe8dca2f72415c25bb X 74f0a198268d474db3056e149d95900e--96eb6ace636f42fe8dca2f72415c25bb 96eb6ace636f42fe8dca2f72415c25bb--c0e97440c36943c4ace6f8d8d149424e 49fc1859cb33463988b4edb91e475f6c RX(theta₁₄) 96eb6ace636f42fe8dca2f72415c25bb--49fc1859cb33463988b4edb91e475f6c 74d471efde904c29a2325b105c0d17d0 RY(theta₁₈) 49fc1859cb33463988b4edb91e475f6c--74d471efde904c29a2325b105c0d17d0 f2c07d17da9f4ca1bdca918eba7c8200 RX(theta₂₂) 74d471efde904c29a2325b105c0d17d0--f2c07d17da9f4ca1bdca918eba7c8200 543e087ab7ec4a3da63f838f95d2913f f2c07d17da9f4ca1bdca918eba7c8200--543e087ab7ec4a3da63f838f95d2913f c9062bc42c114de2b88a6281aa530098 X 543e087ab7ec4a3da63f838f95d2913f--c9062bc42c114de2b88a6281aa530098 c9062bc42c114de2b88a6281aa530098--a1e090ad0ee24a74a47a65546d334f64 c9062bc42c114de2b88a6281aa530098--7c132cb762c34bde8ed7b719605beb16 71fe836c599d4412b8e6045693bfe553 55d7e0c91b264330a1b8978dc0a0614d RX(theta₃) 89837559a18549a6ac036a5afd61a3cb--55d7e0c91b264330a1b8978dc0a0614d d1d4ee7679074bfb85c17d6cf9f77431 RY(theta₇) 55d7e0c91b264330a1b8978dc0a0614d--d1d4ee7679074bfb85c17d6cf9f77431 015f272ba6344e9581b758644f5d8d7d RX(theta₁₁) d1d4ee7679074bfb85c17d6cf9f77431--015f272ba6344e9581b758644f5d8d7d a160b50ddaf84c0f88b530fe9db7e8e1 X 015f272ba6344e9581b758644f5d8d7d--a160b50ddaf84c0f88b530fe9db7e8e1 a160b50ddaf84c0f88b530fe9db7e8e1--74f0a198268d474db3056e149d95900e 8e8c43cca11a49d5b1b2aae4790fca50 a160b50ddaf84c0f88b530fe9db7e8e1--8e8c43cca11a49d5b1b2aae4790fca50 3be47e03dd2b43be98eed7976550a200 RX(theta₁₅) 8e8c43cca11a49d5b1b2aae4790fca50--3be47e03dd2b43be98eed7976550a200 e4e3cdb1c2b44ff0bba4805ba92edc97 RY(theta₁₉) 3be47e03dd2b43be98eed7976550a200--e4e3cdb1c2b44ff0bba4805ba92edc97 b18d7f6f43d24c6cae90b06d793f400b RX(theta₂₃) e4e3cdb1c2b44ff0bba4805ba92edc97--b18d7f6f43d24c6cae90b06d793f400b da995a37f9804fd8817521c2d1851c4c X b18d7f6f43d24c6cae90b06d793f400b--da995a37f9804fd8817521c2d1851c4c da995a37f9804fd8817521c2d1851c4c--543e087ab7ec4a3da63f838f95d2913f 9418037346e240bebeed6d1e85664568 da995a37f9804fd8817521c2d1851c4c--9418037346e240bebeed6d1e85664568 9418037346e240bebeed6d1e85664568--71fe836c599d4412b8e6045693bfe553

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_79a16efc444241a688f2234a0921a2ab Obs. cluster_877aa0e9383648e3829da69454551faa cluster_ad11a3324b8b4b90a0e8b0122d6c5936 Tower Chebyshev FM cluster_b23061c6dd924d248b09d8562f09e7d9 Tower Chebyshev FM cluster_093fa6d9585a4c759dd329dd93f814ab HEA 579db9b9d6814d58960b7fcceb87c383 0 a4bc9465eedc484b9da3169bdcfa3195 RX(1.0*acos(x)) 579db9b9d6814d58960b7fcceb87c383--a4bc9465eedc484b9da3169bdcfa3195 533c9f90cc4f45feb3006eb8f6537916 1 38a460b5eb0541d895db5c38837a1101 RX(theta₀) a4bc9465eedc484b9da3169bdcfa3195--38a460b5eb0541d895db5c38837a1101 79a242f7d5854b4fb1916bda54ce4ade RY(theta₄) 38a460b5eb0541d895db5c38837a1101--79a242f7d5854b4fb1916bda54ce4ade 9791daad172d46b5b72ae5b502e45b9d RX(theta₈) 79a242f7d5854b4fb1916bda54ce4ade--9791daad172d46b5b72ae5b502e45b9d 6366b08c27bf41b495aee9f2fb8d1f78 9791daad172d46b5b72ae5b502e45b9d--6366b08c27bf41b495aee9f2fb8d1f78 941f32f0e0ae41a6baba9ae90201c277 6366b08c27bf41b495aee9f2fb8d1f78--941f32f0e0ae41a6baba9ae90201c277 bf4b2e3c45ea42359458c14d4200fdca RX(theta₁₂) 941f32f0e0ae41a6baba9ae90201c277--bf4b2e3c45ea42359458c14d4200fdca ab9997f3b9224613b22e655a9de02598 RY(theta₁₆) bf4b2e3c45ea42359458c14d4200fdca--ab9997f3b9224613b22e655a9de02598 308bbb289b374a8189fa99d1d09294c6 RX(theta₂₀) ab9997f3b9224613b22e655a9de02598--308bbb289b374a8189fa99d1d09294c6 17685dde6c1a452b85d4be69450b0014 308bbb289b374a8189fa99d1d09294c6--17685dde6c1a452b85d4be69450b0014 283092f27a754640a2b4e2cfe16af2c8 17685dde6c1a452b85d4be69450b0014--283092f27a754640a2b4e2cfe16af2c8 d937d4550c1646f9bd7c6b0b9da5ee09 283092f27a754640a2b4e2cfe16af2c8--d937d4550c1646f9bd7c6b0b9da5ee09 21f94b5d8d3c4a4f9eda3769ddf7655c d937d4550c1646f9bd7c6b0b9da5ee09--21f94b5d8d3c4a4f9eda3769ddf7655c 638f72649c4c4cb0bdd30537854325f1 80be829f9bb747bf991f3109e964ad20 RX(2.0*acos(x)) 533c9f90cc4f45feb3006eb8f6537916--80be829f9bb747bf991f3109e964ad20 3f32a5e375e04445b4e1f7d2a4fc4c65 2 8308e70cb5234871807a569833052376 RX(theta₁) 80be829f9bb747bf991f3109e964ad20--8308e70cb5234871807a569833052376 42652a399eec4223ad8e689ae5d41fab RY(theta₅) 8308e70cb5234871807a569833052376--42652a399eec4223ad8e689ae5d41fab 4849b84bc21b46ddb090a525a8edf10a RX(theta₉) 42652a399eec4223ad8e689ae5d41fab--4849b84bc21b46ddb090a525a8edf10a 0bd10fcbcc89472db8b6727eb5ee0e40 X 4849b84bc21b46ddb090a525a8edf10a--0bd10fcbcc89472db8b6727eb5ee0e40 0bd10fcbcc89472db8b6727eb5ee0e40--6366b08c27bf41b495aee9f2fb8d1f78 eb1a865dca444d77b870b1917b7b4b7e 0bd10fcbcc89472db8b6727eb5ee0e40--eb1a865dca444d77b870b1917b7b4b7e a6e8fb592e5a47ac86837b8c07b8103e RX(theta₁₃) eb1a865dca444d77b870b1917b7b4b7e--a6e8fb592e5a47ac86837b8c07b8103e ceb3a56ae8a24d6385f093e6e64c0f8d RY(theta₁₇) a6e8fb592e5a47ac86837b8c07b8103e--ceb3a56ae8a24d6385f093e6e64c0f8d 5202342810d546b9bc42afc964e18996 RX(theta₂₁) ceb3a56ae8a24d6385f093e6e64c0f8d--5202342810d546b9bc42afc964e18996 dd2e968afae6487ea8fa523f30a9e4c4 X 5202342810d546b9bc42afc964e18996--dd2e968afae6487ea8fa523f30a9e4c4 dd2e968afae6487ea8fa523f30a9e4c4--17685dde6c1a452b85d4be69450b0014 dd5dc3bd761049058487b4b4fd4a3d29 dd2e968afae6487ea8fa523f30a9e4c4--dd5dc3bd761049058487b4b4fd4a3d29 70bf2062198f48128e50261e979309a6 AddBlock dd5dc3bd761049058487b4b4fd4a3d29--70bf2062198f48128e50261e979309a6 70bf2062198f48128e50261e979309a6--638f72649c4c4cb0bdd30537854325f1 39acbb168a4049ccb9d752897e500b12 98841fca5d0b403294c84a29e0ba0b9a RX(1.0*acos(2.0*y - 1.0)) 3f32a5e375e04445b4e1f7d2a4fc4c65--98841fca5d0b403294c84a29e0ba0b9a f2294fc82ac3439c82252a6ae92d7f30 3 3cab25faf3de4e95a55d085592b0b3c5 RX(theta₂) 98841fca5d0b403294c84a29e0ba0b9a--3cab25faf3de4e95a55d085592b0b3c5 f929ef0cbbf8488cae62009dbf205040 RY(theta₆) 3cab25faf3de4e95a55d085592b0b3c5--f929ef0cbbf8488cae62009dbf205040 03bb75d1e6384aa48544a43edc259111 RX(theta₁₀) f929ef0cbbf8488cae62009dbf205040--03bb75d1e6384aa48544a43edc259111 38e626d458f446da8ec3c26dc3f12ccf 03bb75d1e6384aa48544a43edc259111--38e626d458f446da8ec3c26dc3f12ccf 8341a8e2c01f4f92a1e14c0f273c7a8b X 38e626d458f446da8ec3c26dc3f12ccf--8341a8e2c01f4f92a1e14c0f273c7a8b 8341a8e2c01f4f92a1e14c0f273c7a8b--eb1a865dca444d77b870b1917b7b4b7e d396a6355807473f861c83f38909b3e1 RX(theta₁₄) 8341a8e2c01f4f92a1e14c0f273c7a8b--d396a6355807473f861c83f38909b3e1 c35950f5337845ddacf7f2302f163736 RY(theta₁₈) d396a6355807473f861c83f38909b3e1--c35950f5337845ddacf7f2302f163736 3598a6c84b224c888e38a3af1f5d862b RX(theta₂₂) c35950f5337845ddacf7f2302f163736--3598a6c84b224c888e38a3af1f5d862b 8fe3827af29d45adbee6b8358e86a776 3598a6c84b224c888e38a3af1f5d862b--8fe3827af29d45adbee6b8358e86a776 4ca33204f39b4c439dde62dfec5bd425 X 8fe3827af29d45adbee6b8358e86a776--4ca33204f39b4c439dde62dfec5bd425 4ca33204f39b4c439dde62dfec5bd425--dd5dc3bd761049058487b4b4fd4a3d29 d6140f4b48844c60852ca5f61601e879 4ca33204f39b4c439dde62dfec5bd425--d6140f4b48844c60852ca5f61601e879 d6140f4b48844c60852ca5f61601e879--39acbb168a4049ccb9d752897e500b12 e10be73a165a408bb2ab47c90ba1ac27 314e087e91564358abb9ff60464c5bac RX(2.0*acos(2.0*y - 1.0)) f2294fc82ac3439c82252a6ae92d7f30--314e087e91564358abb9ff60464c5bac 1543150a98a34eb2b43e5964ecf4be06 RX(theta₃) 314e087e91564358abb9ff60464c5bac--1543150a98a34eb2b43e5964ecf4be06 ff54c2ab34c1407ea564ece900f48a47 RY(theta₇) 1543150a98a34eb2b43e5964ecf4be06--ff54c2ab34c1407ea564ece900f48a47 8f35b9b999ce4402a2beaa9a9489f89e RX(theta₁₁) ff54c2ab34c1407ea564ece900f48a47--8f35b9b999ce4402a2beaa9a9489f89e 2675569f54ad416a82a6373a76ecd940 X 8f35b9b999ce4402a2beaa9a9489f89e--2675569f54ad416a82a6373a76ecd940 2675569f54ad416a82a6373a76ecd940--38e626d458f446da8ec3c26dc3f12ccf 9811e8e9c0944822a53c37a22420160e 2675569f54ad416a82a6373a76ecd940--9811e8e9c0944822a53c37a22420160e 3ef29766f9b346ee96f73c138aee4c66 RX(theta₁₅) 9811e8e9c0944822a53c37a22420160e--3ef29766f9b346ee96f73c138aee4c66 0b4fd58b98ce4c51b9f486a6f62f5ce1 RY(theta₁₉) 3ef29766f9b346ee96f73c138aee4c66--0b4fd58b98ce4c51b9f486a6f62f5ce1 2019ef9c2d824812b073ca61def3f306 RX(theta₂₃) 0b4fd58b98ce4c51b9f486a6f62f5ce1--2019ef9c2d824812b073ca61def3f306 f4e18de4e4644a3bacf04a64e1bda688 X 2019ef9c2d824812b073ca61def3f306--f4e18de4e4644a3bacf04a64e1bda688 f4e18de4e4644a3bacf04a64e1bda688--8fe3827af29d45adbee6b8358e86a776 2216c7ee97184998893e94f5909f2afe f4e18de4e4644a3bacf04a64e1bda688--2216c7ee97184998893e94f5909f2afe 16dfff26de2c46608d7755f22655e08d 2216c7ee97184998893e94f5909f2afe--16dfff26de2c46608d7755f22655e08d 16dfff26de2c46608d7755f22655e08d--e10be73a165a408bb2ab47c90ba1ac27