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_6ffa0a05a9d448979bd7c2434a6e196c b158f3919a1e42c9b3144da9d1c01817 0 d7b6ca3865bc4edab5d706e23e11226d b158f3919a1e42c9b3144da9d1c01817--d7b6ca3865bc4edab5d706e23e11226d 15481268f02746f2811b9b37e2265404 1 5ddb96f25f9e49f78c411afa69d7f2e8 d7b6ca3865bc4edab5d706e23e11226d--5ddb96f25f9e49f78c411afa69d7f2e8 8af69619e326429ca7cb9178df51a533 543bdcbb67ff49fc9e183f4d0380bf01 AddBlock 15481268f02746f2811b9b37e2265404--543bdcbb67ff49fc9e183f4d0380bf01 4dfec50d77944f27a343f0083dfba648 2 543bdcbb67ff49fc9e183f4d0380bf01--8af69619e326429ca7cb9178df51a533 840e6d97bde64f5f9461edb8d65c78a2 a45052d2ab494fac9b1522b8175e4b10 4dfec50d77944f27a343f0083dfba648--a45052d2ab494fac9b1522b8175e4b10 f88746952a6c4b348c74b7d8044240e8 3 a45052d2ab494fac9b1522b8175e4b10--840e6d97bde64f5f9461edb8d65c78a2 d78582b64c3842d4982215f8c0134684 a30293aedb2f47d692215051ad852553 f88746952a6c4b348c74b7d8044240e8--a30293aedb2f47d692215051ad852553 a30293aedb2f47d692215051ad852553--d78582b64c3842d4982215f8c0134684

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_004bc18dcf1c4e57ade42c29bea68f6f Tower Chebyshev FM cluster_fca81f2389b74d3a844f7de11313e188 Tower Chebyshev FM aa7683c1222946899a45cab963008dc8 0 947700c0049e4ae4a6971bf8e96d474d RX(1.0*acos(x)) aa7683c1222946899a45cab963008dc8--947700c0049e4ae4a6971bf8e96d474d d276611b3e844019869f084b10ed9ee2 1 08767069e3b946bc998d0e87b4113ecd 947700c0049e4ae4a6971bf8e96d474d--08767069e3b946bc998d0e87b4113ecd bccf35d0891a40c5bcec4dfa084c8494 0132947b0d6341fc866ab74f79992a93 RX(2.0*acos(x)) d276611b3e844019869f084b10ed9ee2--0132947b0d6341fc866ab74f79992a93 1369d77738c942bd82bc088cc885b357 2 0132947b0d6341fc866ab74f79992a93--bccf35d0891a40c5bcec4dfa084c8494 16153a2e2f334c1aad7b41ea6d941d4a df16213b943e4101978a1761d5522487 RX(1.0*acos(2.0*y - 1.0)) 1369d77738c942bd82bc088cc885b357--df16213b943e4101978a1761d5522487 9d2982cb124d4082ba286c03aa1c59f3 3 df16213b943e4101978a1761d5522487--16153a2e2f334c1aad7b41ea6d941d4a 11636ad3d5ec433f99ec0c8cfd09ecec d515b67709a74db5a23fd29da03c6915 RX(2.0*acos(2.0*y - 1.0)) 9d2982cb124d4082ba286c03aa1c59f3--d515b67709a74db5a23fd29da03c6915 d515b67709a74db5a23fd29da03c6915--11636ad3d5ec433f99ec0c8cfd09ecec

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 7633904d08c940869e94f6b36f89eb24 0 6590e7237ac647439613c7ff8972273c RX(theta₀) 7633904d08c940869e94f6b36f89eb24--6590e7237ac647439613c7ff8972273c 6a2fe94ef5524ea7abf0ad7d4694aba7 1 f7513e0b5ab14ce2a4ef9892a5df6358 RY(theta₄) 6590e7237ac647439613c7ff8972273c--f7513e0b5ab14ce2a4ef9892a5df6358 c7bfdc09f22e4f33b22fc06366e96411 RX(theta₈) f7513e0b5ab14ce2a4ef9892a5df6358--c7bfdc09f22e4f33b22fc06366e96411 dbaf36f9ae36498eb4c8a983512cc652 c7bfdc09f22e4f33b22fc06366e96411--dbaf36f9ae36498eb4c8a983512cc652 2852109644bd435b861350bcc45867f4 dbaf36f9ae36498eb4c8a983512cc652--2852109644bd435b861350bcc45867f4 fb1b2e0a21f64ada8fe0a8f61c242a7c RX(theta₁₂) 2852109644bd435b861350bcc45867f4--fb1b2e0a21f64ada8fe0a8f61c242a7c 085b4687985249c7938c4e08d4bc23e0 RY(theta₁₆) fb1b2e0a21f64ada8fe0a8f61c242a7c--085b4687985249c7938c4e08d4bc23e0 fdff7cca190c46508dca77527c986596 RX(theta₂₀) 085b4687985249c7938c4e08d4bc23e0--fdff7cca190c46508dca77527c986596 007d13e5f2bf49008c43edcff42a3c35 fdff7cca190c46508dca77527c986596--007d13e5f2bf49008c43edcff42a3c35 09f472c1143a428b9941d9a88d4d88f2 007d13e5f2bf49008c43edcff42a3c35--09f472c1143a428b9941d9a88d4d88f2 b88f1f103c064245870ebacbbe0ed4d6 09f472c1143a428b9941d9a88d4d88f2--b88f1f103c064245870ebacbbe0ed4d6 9769c3820c9b4bc4ab707380f4a88c38 1765293ef46941a08240cca0b7bc4cf4 RX(theta₁) 6a2fe94ef5524ea7abf0ad7d4694aba7--1765293ef46941a08240cca0b7bc4cf4 90284b195039400db332ea06c83f05ae 2 a72025630ac84128adf875f3f76cdde8 RY(theta₅) 1765293ef46941a08240cca0b7bc4cf4--a72025630ac84128adf875f3f76cdde8 46897cdb2a2b49d6aefe81f42de0b4c6 RX(theta₉) a72025630ac84128adf875f3f76cdde8--46897cdb2a2b49d6aefe81f42de0b4c6 0473d536837f4929812f29f4d58f8e08 X 46897cdb2a2b49d6aefe81f42de0b4c6--0473d536837f4929812f29f4d58f8e08 0473d536837f4929812f29f4d58f8e08--dbaf36f9ae36498eb4c8a983512cc652 524c40c889ef45c39e490850bdee973c 0473d536837f4929812f29f4d58f8e08--524c40c889ef45c39e490850bdee973c 7e411287e6dd4904b46bdcc9e4b18e2a RX(theta₁₃) 524c40c889ef45c39e490850bdee973c--7e411287e6dd4904b46bdcc9e4b18e2a 51fd22f4d0414fe1b6d69f418895fdd3 RY(theta₁₇) 7e411287e6dd4904b46bdcc9e4b18e2a--51fd22f4d0414fe1b6d69f418895fdd3 1b42374d7cd340598c99b77fc1a98983 RX(theta₂₁) 51fd22f4d0414fe1b6d69f418895fdd3--1b42374d7cd340598c99b77fc1a98983 f874a9acfb1b42299476b641c34a0c63 X 1b42374d7cd340598c99b77fc1a98983--f874a9acfb1b42299476b641c34a0c63 f874a9acfb1b42299476b641c34a0c63--007d13e5f2bf49008c43edcff42a3c35 2b8e11fd19394ca1acab3b7faa6695de f874a9acfb1b42299476b641c34a0c63--2b8e11fd19394ca1acab3b7faa6695de 2b8e11fd19394ca1acab3b7faa6695de--9769c3820c9b4bc4ab707380f4a88c38 5c200050d1d54660b350656edf3b0756 bcb1c2352ee74d439edd52a7383d867d RX(theta₂) 90284b195039400db332ea06c83f05ae--bcb1c2352ee74d439edd52a7383d867d 9f47d03c9db34ccfa2a315609ca0785e 3 2dc7b8bb82264bceb04008ef70b19890 RY(theta₆) bcb1c2352ee74d439edd52a7383d867d--2dc7b8bb82264bceb04008ef70b19890 239144dd359f49b2b18942c8560e47f0 RX(theta₁₀) 2dc7b8bb82264bceb04008ef70b19890--239144dd359f49b2b18942c8560e47f0 6d8867b52fa94d3194e446403651cdb0 239144dd359f49b2b18942c8560e47f0--6d8867b52fa94d3194e446403651cdb0 ee7720158b134c1591f98e58667a3515 X 6d8867b52fa94d3194e446403651cdb0--ee7720158b134c1591f98e58667a3515 ee7720158b134c1591f98e58667a3515--524c40c889ef45c39e490850bdee973c 47f4396780c248f6879cf49a38650ec6 RX(theta₁₄) ee7720158b134c1591f98e58667a3515--47f4396780c248f6879cf49a38650ec6 336d9bfb99e44a6ebdd90aa4139bdb7f RY(theta₁₈) 47f4396780c248f6879cf49a38650ec6--336d9bfb99e44a6ebdd90aa4139bdb7f 3920c7118acf4b5493b5bc1241e67207 RX(theta₂₂) 336d9bfb99e44a6ebdd90aa4139bdb7f--3920c7118acf4b5493b5bc1241e67207 7bca5f0d6ae04121adeb9f6bec7028e2 3920c7118acf4b5493b5bc1241e67207--7bca5f0d6ae04121adeb9f6bec7028e2 7f7e69710bf2470e9beebd326e2c7cb7 X 7bca5f0d6ae04121adeb9f6bec7028e2--7f7e69710bf2470e9beebd326e2c7cb7 7f7e69710bf2470e9beebd326e2c7cb7--2b8e11fd19394ca1acab3b7faa6695de 7f7e69710bf2470e9beebd326e2c7cb7--5c200050d1d54660b350656edf3b0756 7d62e082f8b9490e92897e211653e781 9cc284842efe49458d1745976aab3c49 RX(theta₃) 9f47d03c9db34ccfa2a315609ca0785e--9cc284842efe49458d1745976aab3c49 f17629a3d90840f6baf746322548a00a RY(theta₇) 9cc284842efe49458d1745976aab3c49--f17629a3d90840f6baf746322548a00a 9567f00cf11f4f62b14ff54f5a183cc7 RX(theta₁₁) f17629a3d90840f6baf746322548a00a--9567f00cf11f4f62b14ff54f5a183cc7 b51bef73c63e4772841bab58911617ce X 9567f00cf11f4f62b14ff54f5a183cc7--b51bef73c63e4772841bab58911617ce b51bef73c63e4772841bab58911617ce--6d8867b52fa94d3194e446403651cdb0 dc4c3cda92dd4ae984e2b877ffd135bd b51bef73c63e4772841bab58911617ce--dc4c3cda92dd4ae984e2b877ffd135bd 03ad5dcc6f7f4276af3c9e5d04d7c34e RX(theta₁₅) dc4c3cda92dd4ae984e2b877ffd135bd--03ad5dcc6f7f4276af3c9e5d04d7c34e bdb8a55ab2964bc299db0b302e11f49a RY(theta₁₉) 03ad5dcc6f7f4276af3c9e5d04d7c34e--bdb8a55ab2964bc299db0b302e11f49a ac811d6fff62415d9f98fee55f2b3465 RX(theta₂₃) bdb8a55ab2964bc299db0b302e11f49a--ac811d6fff62415d9f98fee55f2b3465 d04c947584184b78a3e2f813b54eb682 X ac811d6fff62415d9f98fee55f2b3465--d04c947584184b78a3e2f813b54eb682 d04c947584184b78a3e2f813b54eb682--7bca5f0d6ae04121adeb9f6bec7028e2 75480df7272e4e23ba1666e135b4d9eb d04c947584184b78a3e2f813b54eb682--75480df7272e4e23ba1666e135b4d9eb 75480df7272e4e23ba1666e135b4d9eb--7d62e082f8b9490e92897e211653e781

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_f91c99f2cd23426a8805b0f043e4af87 Obs. cluster_3347dc4094fa42f8a3b227c6f28b2d61 cluster_46782c8c21ed4963ab5852a0fc3d37f4 Tower Chebyshev FM cluster_bd3737d49aaf4b42bb6b5cd7d4e13e3d Tower Chebyshev FM cluster_1e5be8e7075a40e1adb67b4eb1438bf7 HEA b2f0d4795f714a239733afd72310e8f1 0 58a10ff9670e47f5a8a3d2fd8ef4f6e8 RX(1.0*acos(x)) b2f0d4795f714a239733afd72310e8f1--58a10ff9670e47f5a8a3d2fd8ef4f6e8 c9f03c9e3f7049619399f35a2880bafc 1 e8a449a94b1b4d0da4b1b3ae10606667 RX(theta₀) 58a10ff9670e47f5a8a3d2fd8ef4f6e8--e8a449a94b1b4d0da4b1b3ae10606667 4668055c31fa473da4ffe0b7f1c0d87a RY(theta₄) e8a449a94b1b4d0da4b1b3ae10606667--4668055c31fa473da4ffe0b7f1c0d87a 714d706c9761435e99b404a0d33cd00b RX(theta₈) 4668055c31fa473da4ffe0b7f1c0d87a--714d706c9761435e99b404a0d33cd00b ec7c63130e8244318c73173fff1d0b19 714d706c9761435e99b404a0d33cd00b--ec7c63130e8244318c73173fff1d0b19 f0bf06c566034a63afdd9d7ccfc5e39f ec7c63130e8244318c73173fff1d0b19--f0bf06c566034a63afdd9d7ccfc5e39f 5c90a5180830454daad224a0c489dc81 RX(theta₁₂) f0bf06c566034a63afdd9d7ccfc5e39f--5c90a5180830454daad224a0c489dc81 4d56623bdd2948f7af80d654e0584378 RY(theta₁₆) 5c90a5180830454daad224a0c489dc81--4d56623bdd2948f7af80d654e0584378 05315116c47040e392f34091cdaaba11 RX(theta₂₀) 4d56623bdd2948f7af80d654e0584378--05315116c47040e392f34091cdaaba11 57b88ec9fb02435ea6e8915b83ac408b 05315116c47040e392f34091cdaaba11--57b88ec9fb02435ea6e8915b83ac408b 980bc906f075464480205e676058b7c6 57b88ec9fb02435ea6e8915b83ac408b--980bc906f075464480205e676058b7c6 7310a28fcbb34c459d067724fa3c7f10 980bc906f075464480205e676058b7c6--7310a28fcbb34c459d067724fa3c7f10 dc410e15b1c24990ba1ebaa1bad07fd8 7310a28fcbb34c459d067724fa3c7f10--dc410e15b1c24990ba1ebaa1bad07fd8 68a8e8fc5be14da9a70b8d6b560f75c8 2e85738db9d145a0b7205368b1cf9b5d RX(2.0*acos(x)) c9f03c9e3f7049619399f35a2880bafc--2e85738db9d145a0b7205368b1cf9b5d ae6e869bc4bd48ceb5015d577d485516 2 fb9fd41816734d9bb3aed8f2b258f54f RX(theta₁) 2e85738db9d145a0b7205368b1cf9b5d--fb9fd41816734d9bb3aed8f2b258f54f 00c7327aa6294fdbbc52609bfc6187cf RY(theta₅) fb9fd41816734d9bb3aed8f2b258f54f--00c7327aa6294fdbbc52609bfc6187cf 0ecb5a0348c34de7be0bff7b63f9eeae RX(theta₉) 00c7327aa6294fdbbc52609bfc6187cf--0ecb5a0348c34de7be0bff7b63f9eeae f0fc63e784b14fc3960927977804787c X 0ecb5a0348c34de7be0bff7b63f9eeae--f0fc63e784b14fc3960927977804787c f0fc63e784b14fc3960927977804787c--ec7c63130e8244318c73173fff1d0b19 583f59edbc484fe5acc873874b2e2b97 f0fc63e784b14fc3960927977804787c--583f59edbc484fe5acc873874b2e2b97 7b857f36c9b04590af7443286fefaebc RX(theta₁₃) 583f59edbc484fe5acc873874b2e2b97--7b857f36c9b04590af7443286fefaebc 4368e1aad2514ad2879bdae5c080b973 RY(theta₁₇) 7b857f36c9b04590af7443286fefaebc--4368e1aad2514ad2879bdae5c080b973 966912b75049431c863b31112f17f9e7 RX(theta₂₁) 4368e1aad2514ad2879bdae5c080b973--966912b75049431c863b31112f17f9e7 4048f6f4532344fc8d857cf3bd19fec6 X 966912b75049431c863b31112f17f9e7--4048f6f4532344fc8d857cf3bd19fec6 4048f6f4532344fc8d857cf3bd19fec6--57b88ec9fb02435ea6e8915b83ac408b ad7f55f717e744daa61a4a051b821bbc 4048f6f4532344fc8d857cf3bd19fec6--ad7f55f717e744daa61a4a051b821bbc b8e0dae7fd2d4bb48aaba967280d8005 AddBlock ad7f55f717e744daa61a4a051b821bbc--b8e0dae7fd2d4bb48aaba967280d8005 b8e0dae7fd2d4bb48aaba967280d8005--68a8e8fc5be14da9a70b8d6b560f75c8 a70e9f2fd7c64aa0a3a24dc0dcc0279f 24a2f48a3b7c4098bf366180f605ff04 RX(1.0*acos(2.0*y - 1.0)) ae6e869bc4bd48ceb5015d577d485516--24a2f48a3b7c4098bf366180f605ff04 31a9088b8ed440f782a1912a6850270f 3 46882595de8349c3a488a81002d44a94 RX(theta₂) 24a2f48a3b7c4098bf366180f605ff04--46882595de8349c3a488a81002d44a94 6599fc46637b4648bdffe639d6616d0c RY(theta₆) 46882595de8349c3a488a81002d44a94--6599fc46637b4648bdffe639d6616d0c 58fe98be48a2419385743529571dcd45 RX(theta₁₀) 6599fc46637b4648bdffe639d6616d0c--58fe98be48a2419385743529571dcd45 716bceebc15f4c7d9fee4ce1e5d1e01d 58fe98be48a2419385743529571dcd45--716bceebc15f4c7d9fee4ce1e5d1e01d 3f5347e5cbc24b49b314cf688b1fc336 X 716bceebc15f4c7d9fee4ce1e5d1e01d--3f5347e5cbc24b49b314cf688b1fc336 3f5347e5cbc24b49b314cf688b1fc336--583f59edbc484fe5acc873874b2e2b97 4b2c066207834fa1b78bcf3b123cbec5 RX(theta₁₄) 3f5347e5cbc24b49b314cf688b1fc336--4b2c066207834fa1b78bcf3b123cbec5 263c0d93978449ecaeed1275f1770454 RY(theta₁₈) 4b2c066207834fa1b78bcf3b123cbec5--263c0d93978449ecaeed1275f1770454 958344af2aad41c48c8227603546bfb8 RX(theta₂₂) 263c0d93978449ecaeed1275f1770454--958344af2aad41c48c8227603546bfb8 751b53f3da8c4c44a96866e46941d5cf 958344af2aad41c48c8227603546bfb8--751b53f3da8c4c44a96866e46941d5cf 93b43b19a55947558b4859bc008816c0 X 751b53f3da8c4c44a96866e46941d5cf--93b43b19a55947558b4859bc008816c0 93b43b19a55947558b4859bc008816c0--ad7f55f717e744daa61a4a051b821bbc 8136c71ef13349cd80a24b6f37388d0d 93b43b19a55947558b4859bc008816c0--8136c71ef13349cd80a24b6f37388d0d 8136c71ef13349cd80a24b6f37388d0d--a70e9f2fd7c64aa0a3a24dc0dcc0279f 9c1dd365f86f4a5285669d0856d08d73 605ee03104ec45b6bc0d321bc8acfd97 RX(2.0*acos(2.0*y - 1.0)) 31a9088b8ed440f782a1912a6850270f--605ee03104ec45b6bc0d321bc8acfd97 45110ca5c0cd4c79983b4494407e5acd RX(theta₃) 605ee03104ec45b6bc0d321bc8acfd97--45110ca5c0cd4c79983b4494407e5acd 9e9436876bda4bebb8cb268f18be353c RY(theta₇) 45110ca5c0cd4c79983b4494407e5acd--9e9436876bda4bebb8cb268f18be353c 92dae550534242dab76c72b38e1b55e8 RX(theta₁₁) 9e9436876bda4bebb8cb268f18be353c--92dae550534242dab76c72b38e1b55e8 c2157e77d3594a6f9f0329a15c05926b X 92dae550534242dab76c72b38e1b55e8--c2157e77d3594a6f9f0329a15c05926b c2157e77d3594a6f9f0329a15c05926b--716bceebc15f4c7d9fee4ce1e5d1e01d dd162e05ed9e42e08eed2d39d861bee1 c2157e77d3594a6f9f0329a15c05926b--dd162e05ed9e42e08eed2d39d861bee1 9e56024cd32446c1a05622d1107594b6 RX(theta₁₅) dd162e05ed9e42e08eed2d39d861bee1--9e56024cd32446c1a05622d1107594b6 d12fc1e17e1746a1b150a7198c1003d3 RY(theta₁₉) 9e56024cd32446c1a05622d1107594b6--d12fc1e17e1746a1b150a7198c1003d3 0f8e0ae503864b56b843ecf874c28e41 RX(theta₂₃) d12fc1e17e1746a1b150a7198c1003d3--0f8e0ae503864b56b843ecf874c28e41 9a576f977d0f4c29a53a862b85aa331c X 0f8e0ae503864b56b843ecf874c28e41--9a576f977d0f4c29a53a862b85aa331c 9a576f977d0f4c29a53a862b85aa331c--751b53f3da8c4c44a96866e46941d5cf 7e1a6ba70d294640abc2bb62cde5b9ab 9a576f977d0f4c29a53a862b85aa331c--7e1a6ba70d294640abc2bb62cde5b9ab 8b5c32f546dc46f5a74a0086761e5d4d 7e1a6ba70d294640abc2bb62cde5b9ab--8b5c32f546dc46f5a74a0086761e5d4d 8b5c32f546dc46f5a74a0086761e5d4d--9c1dd365f86f4a5285669d0856d08d73