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, FeatureMapConfig, AnsatzConfig, and ObservableConfig. These classes allow you to specify the type of circuit and the parameters of the circuit in a structured way.

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_f966834a3f1c47ffbdd866022ca223b4 Tower Chebyshev FM cluster_52f39c8ef4cf4b41a3daa6d6c6c97e23 Tower Chebyshev FM c1eebc6b7e024bd1958d76dea85c0fc8 0 ecdb6c411a0d4df2874a21eb89c56fb7 RX(1.0*acos(x)) c1eebc6b7e024bd1958d76dea85c0fc8--ecdb6c411a0d4df2874a21eb89c56fb7 6439b38b1c2b4e7aa7469f550524a7c1 1 47d15609331346178b775f8b0a5f2b31 ecdb6c411a0d4df2874a21eb89c56fb7--47d15609331346178b775f8b0a5f2b31 c3a29159321943c2aa62066ed62f281d 9729c1c10ce249bca909729b0c1af0ca RX(2.0*acos(x)) 6439b38b1c2b4e7aa7469f550524a7c1--9729c1c10ce249bca909729b0c1af0ca 85a1e941589044cda0ab2b494f9237e6 2 9729c1c10ce249bca909729b0c1af0ca--c3a29159321943c2aa62066ed62f281d 985e0005b8b6427ca4083652dd7b1549 3f47e245cc084eac92529ae96a032d5f RX(1.0*acos(2.0*y - 1.0)) 85a1e941589044cda0ab2b494f9237e6--3f47e245cc084eac92529ae96a032d5f cc4607baa629478c8c71fd639566469c 3 3f47e245cc084eac92529ae96a032d5f--985e0005b8b6427ca4083652dd7b1549 823480ae7b05438f9166e7f6b180c83e be8a7d4284ba4ffda8a86f1337bd1798 RX(2.0*acos(2.0*y - 1.0)) cc4607baa629478c8c71fd639566469c--be8a7d4284ba4ffda8a86f1337bd1798 be8a7d4284ba4ffda8a86f1337bd1798--823480ae7b05438f9166e7f6b180c83e

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 58303b0be56b424fa3b27710f6c7f9f9 0 88677d61ddd3460b9c2d8d4205c3024f RX(theta₀) 58303b0be56b424fa3b27710f6c7f9f9--88677d61ddd3460b9c2d8d4205c3024f a376d1abbe394f5ea19e591cab0674d8 1 444e6b0c9fa849449f53d861f621b7e6 RY(theta₄) 88677d61ddd3460b9c2d8d4205c3024f--444e6b0c9fa849449f53d861f621b7e6 f7dce2d1667a48fc9b4f226bc1399ffc RX(theta₈) 444e6b0c9fa849449f53d861f621b7e6--f7dce2d1667a48fc9b4f226bc1399ffc c4cad54a5eaa467f9fb0282758f5843b f7dce2d1667a48fc9b4f226bc1399ffc--c4cad54a5eaa467f9fb0282758f5843b 19a28d64e3f743d690bdbfa4646bbddf c4cad54a5eaa467f9fb0282758f5843b--19a28d64e3f743d690bdbfa4646bbddf d566cee4c5f04d179a81e52905785384 RX(theta₁₂) 19a28d64e3f743d690bdbfa4646bbddf--d566cee4c5f04d179a81e52905785384 250fa94250944a348944ef93d4f223db RY(theta₁₆) d566cee4c5f04d179a81e52905785384--250fa94250944a348944ef93d4f223db f0a4435d593c460d9d0a7cf04637b3ef RX(theta₂₀) 250fa94250944a348944ef93d4f223db--f0a4435d593c460d9d0a7cf04637b3ef ba4ba77ebd224d9fa7b3c8868d421b16 f0a4435d593c460d9d0a7cf04637b3ef--ba4ba77ebd224d9fa7b3c8868d421b16 2d2230e7a483413a98e3482c6634fbd4 ba4ba77ebd224d9fa7b3c8868d421b16--2d2230e7a483413a98e3482c6634fbd4 2b4f5441b0264e8d9185f9dada983f3c 2d2230e7a483413a98e3482c6634fbd4--2b4f5441b0264e8d9185f9dada983f3c 636d2522d45645cfb07d8267188d365b 5fdcd74c89cc49efbfa52f4963a83200 RX(theta₁) a376d1abbe394f5ea19e591cab0674d8--5fdcd74c89cc49efbfa52f4963a83200 b6abab2e9c81496aa088426356410cf5 2 9f851cb855094c50b3f3c43da874c81a RY(theta₅) 5fdcd74c89cc49efbfa52f4963a83200--9f851cb855094c50b3f3c43da874c81a 344b2a891ee34a35af3e093f3d071417 RX(theta₉) 9f851cb855094c50b3f3c43da874c81a--344b2a891ee34a35af3e093f3d071417 5f1655dd464d407e829a9d14789542eb X 344b2a891ee34a35af3e093f3d071417--5f1655dd464d407e829a9d14789542eb 5f1655dd464d407e829a9d14789542eb--c4cad54a5eaa467f9fb0282758f5843b ec432e08baa14966bba7082237eeae95 5f1655dd464d407e829a9d14789542eb--ec432e08baa14966bba7082237eeae95 59d13cd81cc64eb0bf17ca948720190c RX(theta₁₃) ec432e08baa14966bba7082237eeae95--59d13cd81cc64eb0bf17ca948720190c 2a88df5dffa64807887fbaed5a71b378 RY(theta₁₇) 59d13cd81cc64eb0bf17ca948720190c--2a88df5dffa64807887fbaed5a71b378 283791aa8e204b0c89bcfa1d3c02c7e7 RX(theta₂₁) 2a88df5dffa64807887fbaed5a71b378--283791aa8e204b0c89bcfa1d3c02c7e7 555104f0b5734f1dacc3a04bb8d53847 X 283791aa8e204b0c89bcfa1d3c02c7e7--555104f0b5734f1dacc3a04bb8d53847 555104f0b5734f1dacc3a04bb8d53847--ba4ba77ebd224d9fa7b3c8868d421b16 e31670a51bd5454eb2a1aa6a5b5d7fc1 555104f0b5734f1dacc3a04bb8d53847--e31670a51bd5454eb2a1aa6a5b5d7fc1 e31670a51bd5454eb2a1aa6a5b5d7fc1--636d2522d45645cfb07d8267188d365b 2fbab7708ab84938b2c655310c20d3ba 663e72f743a94233a2a4b35df2c5aeb2 RX(theta₂) b6abab2e9c81496aa088426356410cf5--663e72f743a94233a2a4b35df2c5aeb2 16cb98eeebab4f738b2f82dded0c8973 3 b7e5a21e19f9488588aa779345e47c98 RY(theta₆) 663e72f743a94233a2a4b35df2c5aeb2--b7e5a21e19f9488588aa779345e47c98 b641d0fae1ba476fb9af8c54b74284da RX(theta₁₀) b7e5a21e19f9488588aa779345e47c98--b641d0fae1ba476fb9af8c54b74284da ed85a57b5f764d249028a46d8ee46067 b641d0fae1ba476fb9af8c54b74284da--ed85a57b5f764d249028a46d8ee46067 9acf005dfa4c413b926734798b4b66c9 X ed85a57b5f764d249028a46d8ee46067--9acf005dfa4c413b926734798b4b66c9 9acf005dfa4c413b926734798b4b66c9--ec432e08baa14966bba7082237eeae95 d97f9572bc0f4b6aab4db8e420e90311 RX(theta₁₄) 9acf005dfa4c413b926734798b4b66c9--d97f9572bc0f4b6aab4db8e420e90311 f5bc95c0d49e476f9c1af63fcb944be2 RY(theta₁₈) d97f9572bc0f4b6aab4db8e420e90311--f5bc95c0d49e476f9c1af63fcb944be2 972e6f9d5322417ab48733f61dde69b8 RX(theta₂₂) f5bc95c0d49e476f9c1af63fcb944be2--972e6f9d5322417ab48733f61dde69b8 9011bf9abd15481e9edf6886e68ef219 972e6f9d5322417ab48733f61dde69b8--9011bf9abd15481e9edf6886e68ef219 c5f14e46b677428ca6a0910bed0b1606 X 9011bf9abd15481e9edf6886e68ef219--c5f14e46b677428ca6a0910bed0b1606 c5f14e46b677428ca6a0910bed0b1606--e31670a51bd5454eb2a1aa6a5b5d7fc1 c5f14e46b677428ca6a0910bed0b1606--2fbab7708ab84938b2c655310c20d3ba d102c30447464bcebfc0310549df32e9 cd3bc7830352406c860f378eb640d667 RX(theta₃) 16cb98eeebab4f738b2f82dded0c8973--cd3bc7830352406c860f378eb640d667 4c03651d5d1d4364a189cb20a628d4d7 RY(theta₇) cd3bc7830352406c860f378eb640d667--4c03651d5d1d4364a189cb20a628d4d7 5d59b7f6532a4ab7b7d13e83a2ea814f RX(theta₁₁) 4c03651d5d1d4364a189cb20a628d4d7--5d59b7f6532a4ab7b7d13e83a2ea814f 3d91e4c95c9746b79a9b887405406de0 X 5d59b7f6532a4ab7b7d13e83a2ea814f--3d91e4c95c9746b79a9b887405406de0 3d91e4c95c9746b79a9b887405406de0--ed85a57b5f764d249028a46d8ee46067 62692c813d1a416698c0af644b419eef 3d91e4c95c9746b79a9b887405406de0--62692c813d1a416698c0af644b419eef 57acf88a4c0b43bfa15992491c39bb83 RX(theta₁₅) 62692c813d1a416698c0af644b419eef--57acf88a4c0b43bfa15992491c39bb83 d3859ad20a5e498897a1b5404619433b RY(theta₁₉) 57acf88a4c0b43bfa15992491c39bb83--d3859ad20a5e498897a1b5404619433b 0a19e31da4e44efebc9f41a090b13187 RX(theta₂₃) d3859ad20a5e498897a1b5404619433b--0a19e31da4e44efebc9f41a090b13187 84bc97c9f7f044c3a83dc9cdf6a272ac X 0a19e31da4e44efebc9f41a090b13187--84bc97c9f7f044c3a83dc9cdf6a272ac 84bc97c9f7f044c3a83dc9cdf6a272ac--9011bf9abd15481e9edf6886e68ef219 564751c3a05c46868bfc547240c96984 84bc97c9f7f044c3a83dc9cdf6a272ac--564751c3a05c46868bfc547240c96984 564751c3a05c46868bfc547240c96984--d102c30447464bcebfc0310549df32e9

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 Observable

And lastly, the observable. Naturally, 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_291e7f95a11943af914d9e2cdecb9925 4a9ec4e40c9c428e9fe6f251b58d36b7 0 edd756a81c4a4d8c8e5fc8f02c9ecf8f 4a9ec4e40c9c428e9fe6f251b58d36b7--edd756a81c4a4d8c8e5fc8f02c9ecf8f 56d1069f2f5c4567bd1474e8000f3166 1 8a0583753ff14420a31d5e1d8085aa31 edd756a81c4a4d8c8e5fc8f02c9ecf8f--8a0583753ff14420a31d5e1d8085aa31 180e251c3af6450b8d8303eac8b38718 5da69e898c5743a5b5093a3b10db4053 AddBlock 56d1069f2f5c4567bd1474e8000f3166--5da69e898c5743a5b5093a3b10db4053 86a6c601d7aa4eefbff9c0a73e60ce13 2 5da69e898c5743a5b5093a3b10db4053--180e251c3af6450b8d8303eac8b38718 c05d68cbca92402eac062977326773d2 75db8de935ea4ea5b2752adf6b0b7fac 86a6c601d7aa4eefbff9c0a73e60ce13--75db8de935ea4ea5b2752adf6b0b7fac dc06d4b0d6df4c3fa0f0d4149e69e8ee 3 75db8de935ea4ea5b2752adf6b0b7fac--c05d68cbca92402eac062977326773d2 83e06aa37d0a4ad3befd44b8afbd6be6 60193d9004a2428ab4239bbdf161bdeb dc06d4b0d6df4c3fa0f0d4149e69e8ee--60193d9004a2428ab4239bbdf161bdeb 60193d9004a2428ab4239bbdf161bdeb--83e06aa37d0a4ad3befd44b8afbd6be6

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 QNN from the Configs

To build the QNN, we can now use the QNN class.

from qadence import QNN

qnn = QNN.from_configs(
    register=4,
    fm_config=fm_config,
    ansatz_config=ansatz_config,
    obs_config=observable_config,
)
%3 cluster_5c9729ed0a8e42f1a378ba1101149b69 Obs. cluster_9b9d3da69a6541ce9171b75e232a8528 cluster_e217ec8748fa4b6c9ae0e22b0a1a1db1 Tower Chebyshev FM cluster_c0b6a7a2ed5e4970a4c89383c5a7bfbd Tower Chebyshev FM cluster_4b3a0127dd664eb18e2620f5258dfea7 HEA dfd9eb7789dc4f8bac98075f59b044b9 0 2a23b9b590e54bebbfe15e4e10d57ac8 RX(1.0*acos(x)) dfd9eb7789dc4f8bac98075f59b044b9--2a23b9b590e54bebbfe15e4e10d57ac8 cdcae4866dcb49c5a554358ae8660cf4 1 cc56c9adfb0b4201885fa2fcbf02523c RX(theta₀) 2a23b9b590e54bebbfe15e4e10d57ac8--cc56c9adfb0b4201885fa2fcbf02523c 88eeb3065b76437b9a822e80d5883418 RY(theta₄) cc56c9adfb0b4201885fa2fcbf02523c--88eeb3065b76437b9a822e80d5883418 ed8f0f1f681349e9993068d531845ecc RX(theta₈) 88eeb3065b76437b9a822e80d5883418--ed8f0f1f681349e9993068d531845ecc 19fb895c1a77432aa24d8ef504f662ba ed8f0f1f681349e9993068d531845ecc--19fb895c1a77432aa24d8ef504f662ba 9ca8ef35f323471ab8baf887eeceeb24 19fb895c1a77432aa24d8ef504f662ba--9ca8ef35f323471ab8baf887eeceeb24 4e589ac8730e42ea9175f7de79b9f453 RX(theta₁₂) 9ca8ef35f323471ab8baf887eeceeb24--4e589ac8730e42ea9175f7de79b9f453 3df77ad0750e4b6fab1fcdf4e9aff0b5 RY(theta₁₆) 4e589ac8730e42ea9175f7de79b9f453--3df77ad0750e4b6fab1fcdf4e9aff0b5 07cb384bb7b4407fa7d1ba36bd003a7e RX(theta₂₀) 3df77ad0750e4b6fab1fcdf4e9aff0b5--07cb384bb7b4407fa7d1ba36bd003a7e 113a8dda037a4a95890c889eaff8778d 07cb384bb7b4407fa7d1ba36bd003a7e--113a8dda037a4a95890c889eaff8778d 5d3a32a9e5874238a33f8c8da07b2e55 113a8dda037a4a95890c889eaff8778d--5d3a32a9e5874238a33f8c8da07b2e55 066fff8c8bfa4817bc78d30724c05d96 5d3a32a9e5874238a33f8c8da07b2e55--066fff8c8bfa4817bc78d30724c05d96 53c076eef88c438bacf374fa6fe442ba 066fff8c8bfa4817bc78d30724c05d96--53c076eef88c438bacf374fa6fe442ba 973483007f0d4439a5419e30f08d6129 f07edea7c9da4c81978986236a6c5034 RX(2.0*acos(x)) cdcae4866dcb49c5a554358ae8660cf4--f07edea7c9da4c81978986236a6c5034 ab3d4fb6166f4bb1ae53c94b0b2ad118 2 d60df35fd9b54707a46fbd4487ed8e5a RX(theta₁) f07edea7c9da4c81978986236a6c5034--d60df35fd9b54707a46fbd4487ed8e5a a70cf75fc7c44c1795629bfb32525d89 RY(theta₅) d60df35fd9b54707a46fbd4487ed8e5a--a70cf75fc7c44c1795629bfb32525d89 46e6b1d728694508b1f78ee80ed5367b RX(theta₉) a70cf75fc7c44c1795629bfb32525d89--46e6b1d728694508b1f78ee80ed5367b 7ddea20fa41443658c197e89fd94a18a X 46e6b1d728694508b1f78ee80ed5367b--7ddea20fa41443658c197e89fd94a18a 7ddea20fa41443658c197e89fd94a18a--19fb895c1a77432aa24d8ef504f662ba b4f0894e01144a46b6388f5489e647a2 7ddea20fa41443658c197e89fd94a18a--b4f0894e01144a46b6388f5489e647a2 2f887c6ea4f84e6686b03a3ed2f89b92 RX(theta₁₃) b4f0894e01144a46b6388f5489e647a2--2f887c6ea4f84e6686b03a3ed2f89b92 1a68610263d147e6a5f9326c76b08985 RY(theta₁₇) 2f887c6ea4f84e6686b03a3ed2f89b92--1a68610263d147e6a5f9326c76b08985 9e60723c0d884a3eb0b3ba37235fab15 RX(theta₂₁) 1a68610263d147e6a5f9326c76b08985--9e60723c0d884a3eb0b3ba37235fab15 a906b4b516ca4a9b8b836d5f87720e19 X 9e60723c0d884a3eb0b3ba37235fab15--a906b4b516ca4a9b8b836d5f87720e19 a906b4b516ca4a9b8b836d5f87720e19--113a8dda037a4a95890c889eaff8778d 291ec8aad08740eca1b587ee30bfb8f2 a906b4b516ca4a9b8b836d5f87720e19--291ec8aad08740eca1b587ee30bfb8f2 f41443c93c4d4e4fb282e0fc41d05b17 AddBlock 291ec8aad08740eca1b587ee30bfb8f2--f41443c93c4d4e4fb282e0fc41d05b17 f41443c93c4d4e4fb282e0fc41d05b17--973483007f0d4439a5419e30f08d6129 a8a75db8b75f467ba201f11d29659fe6 33303a7e95fc4603ad491834592bfbab RX(1.0*acos(2.0*y - 1.0)) ab3d4fb6166f4bb1ae53c94b0b2ad118--33303a7e95fc4603ad491834592bfbab 76e8ad4d96e24c3aa06d99c59ac14956 3 bb4ce42842ab4ba6928ac9805313866b RX(theta₂) 33303a7e95fc4603ad491834592bfbab--bb4ce42842ab4ba6928ac9805313866b ef353cc7bf3247d49065cb2b1cd8e6ac RY(theta₆) bb4ce42842ab4ba6928ac9805313866b--ef353cc7bf3247d49065cb2b1cd8e6ac 062f81ce872b46cf88c48fdaae11a358 RX(theta₁₀) ef353cc7bf3247d49065cb2b1cd8e6ac--062f81ce872b46cf88c48fdaae11a358 df910f73b56243a6a319dcf14200c38a 062f81ce872b46cf88c48fdaae11a358--df910f73b56243a6a319dcf14200c38a 1b805df3da164d519d7f8a6493c93483 X df910f73b56243a6a319dcf14200c38a--1b805df3da164d519d7f8a6493c93483 1b805df3da164d519d7f8a6493c93483--b4f0894e01144a46b6388f5489e647a2 e4e385d6a48a4e6fa869741ae5b17d08 RX(theta₁₄) 1b805df3da164d519d7f8a6493c93483--e4e385d6a48a4e6fa869741ae5b17d08 3a8157f2065647f793cb390f6aaec9ad RY(theta₁₈) e4e385d6a48a4e6fa869741ae5b17d08--3a8157f2065647f793cb390f6aaec9ad c284e992b35045f1ad8d6570d68d655e RX(theta₂₂) 3a8157f2065647f793cb390f6aaec9ad--c284e992b35045f1ad8d6570d68d655e 73aff79c20e54b6f9824b6224f58eea0 c284e992b35045f1ad8d6570d68d655e--73aff79c20e54b6f9824b6224f58eea0 a7e5540b7e6948e69c2f015112db9719 X 73aff79c20e54b6f9824b6224f58eea0--a7e5540b7e6948e69c2f015112db9719 a7e5540b7e6948e69c2f015112db9719--291ec8aad08740eca1b587ee30bfb8f2 43cd9e4050554344920a548b1a40158f a7e5540b7e6948e69c2f015112db9719--43cd9e4050554344920a548b1a40158f 43cd9e4050554344920a548b1a40158f--a8a75db8b75f467ba201f11d29659fe6 41c6ec54db824bb8b39d974c84de7ab1 f213e45f9504400cab3db8b12b3afe2d RX(2.0*acos(2.0*y - 1.0)) 76e8ad4d96e24c3aa06d99c59ac14956--f213e45f9504400cab3db8b12b3afe2d 7236f32c7e544db8a0eea4c53915e62e RX(theta₃) f213e45f9504400cab3db8b12b3afe2d--7236f32c7e544db8a0eea4c53915e62e 0cdc6dcd017340a7940fe7efc9476063 RY(theta₇) 7236f32c7e544db8a0eea4c53915e62e--0cdc6dcd017340a7940fe7efc9476063 7afa47bdecae463ba4084e7edb27d4bf RX(theta₁₁) 0cdc6dcd017340a7940fe7efc9476063--7afa47bdecae463ba4084e7edb27d4bf 3b91db23e49545e3a0bcf55e6fe700f4 X 7afa47bdecae463ba4084e7edb27d4bf--3b91db23e49545e3a0bcf55e6fe700f4 3b91db23e49545e3a0bcf55e6fe700f4--df910f73b56243a6a319dcf14200c38a 555228d83fef41d4b85fde82401c17f2 3b91db23e49545e3a0bcf55e6fe700f4--555228d83fef41d4b85fde82401c17f2 2a082448c5124d35949aded050dd6808 RX(theta₁₅) 555228d83fef41d4b85fde82401c17f2--2a082448c5124d35949aded050dd6808 235462ef74344e91949202385173d22f RY(theta₁₉) 2a082448c5124d35949aded050dd6808--235462ef74344e91949202385173d22f 88d48ef414494420a3fea8623c78e096 RX(theta₂₃) 235462ef74344e91949202385173d22f--88d48ef414494420a3fea8623c78e096 fb28746e0d314983915a5c3c0b06d030 X 88d48ef414494420a3fea8623c78e096--fb28746e0d314983915a5c3c0b06d030 fb28746e0d314983915a5c3c0b06d030--73aff79c20e54b6f9824b6224f58eea0 f62e0a61079c458f99779ffce8de3037 fb28746e0d314983915a5c3c0b06d030--f62e0a61079c458f99779ffce8de3037 cc3a0a9a6d0b464995d2d6116e7e5403 f62e0a61079c458f99779ffce8de3037--cc3a0a9a6d0b464995d2d6116e7e5403 cc3a0a9a6d0b464995d2d6116e7e5403--41c6ec54db824bb8b39d974c84de7ab1