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_13f4726a0cac40c7bd7436432b04074f 6c7d9820f9d54606b264a44eb5a7383d 0 be8445df8c974f9fa3c5df43129b1b27 6c7d9820f9d54606b264a44eb5a7383d--be8445df8c974f9fa3c5df43129b1b27 5e59379050c048b4832f5f8d4dc6945e 1 435463f50cae4be1828bd1a2708de5d4 be8445df8c974f9fa3c5df43129b1b27--435463f50cae4be1828bd1a2708de5d4 c6ccc7413f404134b5ba20d3e9e6a1e1 abb4f60cfe38427dbf7151db67a41a87 AddBlock 5e59379050c048b4832f5f8d4dc6945e--abb4f60cfe38427dbf7151db67a41a87 013bcc9fd3304c1a90c0f239ae04197f 2 abb4f60cfe38427dbf7151db67a41a87--c6ccc7413f404134b5ba20d3e9e6a1e1 36d5cbd07b004759b8a5b026a67f0fcc 05e84c7a3b1748b492dd0d1f074c7475 013bcc9fd3304c1a90c0f239ae04197f--05e84c7a3b1748b492dd0d1f074c7475 6752b328e8b14cf6aa8da61a5148a57c 3 05e84c7a3b1748b492dd0d1f074c7475--36d5cbd07b004759b8a5b026a67f0fcc 9f8ec2827a9a48aabd5d100a014716cd 11f201402dd246a9b076f613e58d71ed 6752b328e8b14cf6aa8da61a5148a57c--11f201402dd246a9b076f613e58d71ed 11f201402dd246a9b076f613e58d71ed--9f8ec2827a9a48aabd5d100a014716cd

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_113f2badd7b445d88c4acc1c7beef179 Tower Chebyshev FM cluster_5140640b8f9f4cf18700304b44b656da Tower Chebyshev FM bc5f604bd98d49798a65bc7c4c9bae26 0 3ec926e9adfa42b28a011d5456383e18 RX(1.0*acos(x)) bc5f604bd98d49798a65bc7c4c9bae26--3ec926e9adfa42b28a011d5456383e18 ac61b1dbfeb940a0b23c7204845bd7d1 1 70681db6612840199024f4c019643d6d 3ec926e9adfa42b28a011d5456383e18--70681db6612840199024f4c019643d6d fcf48dc0ee364bc79070f2bbaf2bf740 2cb18ea83eb346f68161cf203a87c4a9 RX(2.0*acos(x)) ac61b1dbfeb940a0b23c7204845bd7d1--2cb18ea83eb346f68161cf203a87c4a9 34e937d8486448599a8187bb599f92d3 2 2cb18ea83eb346f68161cf203a87c4a9--fcf48dc0ee364bc79070f2bbaf2bf740 2eac24cb9ea346fcbe0235c098b4d5ec d9743b59c247444cb1a16f6b04c1228f RX(1.0*acos(2.0*y - 1.0)) 34e937d8486448599a8187bb599f92d3--d9743b59c247444cb1a16f6b04c1228f 06785fa615ad4a7996e56eb47adb11a3 3 d9743b59c247444cb1a16f6b04c1228f--2eac24cb9ea346fcbe0235c098b4d5ec 327d63237fb44e73a4c3a15c4f86f0a4 de6b6e85e6d34d058acc0de7412c9b13 RX(2.0*acos(2.0*y - 1.0)) 06785fa615ad4a7996e56eb47adb11a3--de6b6e85e6d34d058acc0de7412c9b13 de6b6e85e6d34d058acc0de7412c9b13--327d63237fb44e73a4c3a15c4f86f0a4

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 1d6fc8382eb2418ab590db6c19857ae4 0 fd854cc5b33f4d1a86f8463657825fbe RX(theta₀) 1d6fc8382eb2418ab590db6c19857ae4--fd854cc5b33f4d1a86f8463657825fbe 3b8e808cfdca4f14a3a5ad3f814780d7 1 677dff9ded2e45b89b40a4ccca66f2ee RY(theta₄) fd854cc5b33f4d1a86f8463657825fbe--677dff9ded2e45b89b40a4ccca66f2ee a8c90d6fb0b144f88ad3022fab791b7a RX(theta₈) 677dff9ded2e45b89b40a4ccca66f2ee--a8c90d6fb0b144f88ad3022fab791b7a b720c0c395e94542b68a8bb415ba3008 a8c90d6fb0b144f88ad3022fab791b7a--b720c0c395e94542b68a8bb415ba3008 9c6f29b57b20495e8d363441d7aef273 b720c0c395e94542b68a8bb415ba3008--9c6f29b57b20495e8d363441d7aef273 c46a8c43fb6f4f9db64d547d189a051d RX(theta₁₂) 9c6f29b57b20495e8d363441d7aef273--c46a8c43fb6f4f9db64d547d189a051d b1f22018e0174847a264018c43c25f7a RY(theta₁₆) c46a8c43fb6f4f9db64d547d189a051d--b1f22018e0174847a264018c43c25f7a 50448241e06f4bb6aed9d224f4ae2be9 RX(theta₂₀) b1f22018e0174847a264018c43c25f7a--50448241e06f4bb6aed9d224f4ae2be9 0062b3c1772b4d57ae3901d222b15e9e 50448241e06f4bb6aed9d224f4ae2be9--0062b3c1772b4d57ae3901d222b15e9e 0a812b121c754c54861f8e8a5903c483 0062b3c1772b4d57ae3901d222b15e9e--0a812b121c754c54861f8e8a5903c483 0dab95a7f9ce4d7e9f6b4a846fa90376 0a812b121c754c54861f8e8a5903c483--0dab95a7f9ce4d7e9f6b4a846fa90376 f45042eb0bb24f8f8bf5f53e8cbaa489 b2ddbaa3505d4175ba8e6c7a33baad81 RX(theta₁) 3b8e808cfdca4f14a3a5ad3f814780d7--b2ddbaa3505d4175ba8e6c7a33baad81 d78be058e3b04c519305c68ff77815f3 2 8b2aa2c205a348a589e4454e07815333 RY(theta₅) b2ddbaa3505d4175ba8e6c7a33baad81--8b2aa2c205a348a589e4454e07815333 5bcbf7e128ff4a91bc1c201831cd5422 RX(theta₉) 8b2aa2c205a348a589e4454e07815333--5bcbf7e128ff4a91bc1c201831cd5422 9a6eb33b46e846f982c69f3467a5d714 X 5bcbf7e128ff4a91bc1c201831cd5422--9a6eb33b46e846f982c69f3467a5d714 9a6eb33b46e846f982c69f3467a5d714--b720c0c395e94542b68a8bb415ba3008 03f36db9a8d14796b03d3ca826be2a4e 9a6eb33b46e846f982c69f3467a5d714--03f36db9a8d14796b03d3ca826be2a4e e40cf9b1003f4777aa5cd84294d143c4 RX(theta₁₃) 03f36db9a8d14796b03d3ca826be2a4e--e40cf9b1003f4777aa5cd84294d143c4 7a3e5501efdb4be98a630a28f5e0b7d6 RY(theta₁₇) e40cf9b1003f4777aa5cd84294d143c4--7a3e5501efdb4be98a630a28f5e0b7d6 2ec4363fd7c14633bba2d9f69b74ce10 RX(theta₂₁) 7a3e5501efdb4be98a630a28f5e0b7d6--2ec4363fd7c14633bba2d9f69b74ce10 f8d26f1e6f8940ef9958d5e82e12297d X 2ec4363fd7c14633bba2d9f69b74ce10--f8d26f1e6f8940ef9958d5e82e12297d f8d26f1e6f8940ef9958d5e82e12297d--0062b3c1772b4d57ae3901d222b15e9e 789db5e104704f64b6fffc92e5e15cca f8d26f1e6f8940ef9958d5e82e12297d--789db5e104704f64b6fffc92e5e15cca 789db5e104704f64b6fffc92e5e15cca--f45042eb0bb24f8f8bf5f53e8cbaa489 e1a37c6e67424910a046f6f6beb6485d 8d789813fdc44f808a2184eb326292d9 RX(theta₂) d78be058e3b04c519305c68ff77815f3--8d789813fdc44f808a2184eb326292d9 655399ababa8405fab1838b0cd8e03f5 3 1c4d5c8845b748ff88771012535e3e53 RY(theta₆) 8d789813fdc44f808a2184eb326292d9--1c4d5c8845b748ff88771012535e3e53 3f4e9f297ca24144be6e2ee4885b698a RX(theta₁₀) 1c4d5c8845b748ff88771012535e3e53--3f4e9f297ca24144be6e2ee4885b698a 0028096e3fd3455faa6255a850911ffc 3f4e9f297ca24144be6e2ee4885b698a--0028096e3fd3455faa6255a850911ffc 3678b5fff8fa41649724cbf976be6a8d X 0028096e3fd3455faa6255a850911ffc--3678b5fff8fa41649724cbf976be6a8d 3678b5fff8fa41649724cbf976be6a8d--03f36db9a8d14796b03d3ca826be2a4e d64137c701624e1082baec7f0141fdf5 RX(theta₁₄) 3678b5fff8fa41649724cbf976be6a8d--d64137c701624e1082baec7f0141fdf5 f17dd742c8db474e9782d7dd4957b561 RY(theta₁₈) d64137c701624e1082baec7f0141fdf5--f17dd742c8db474e9782d7dd4957b561 1aa30fca5d4b429a8e4cff55753aca1d RX(theta₂₂) f17dd742c8db474e9782d7dd4957b561--1aa30fca5d4b429a8e4cff55753aca1d 6c2921d38ff94456ac511be82fac3ca8 1aa30fca5d4b429a8e4cff55753aca1d--6c2921d38ff94456ac511be82fac3ca8 5aa75f84d3ae469da2a13f4c5e5a9892 X 6c2921d38ff94456ac511be82fac3ca8--5aa75f84d3ae469da2a13f4c5e5a9892 5aa75f84d3ae469da2a13f4c5e5a9892--789db5e104704f64b6fffc92e5e15cca 5aa75f84d3ae469da2a13f4c5e5a9892--e1a37c6e67424910a046f6f6beb6485d 241aede1334c4976810dccc28ce24d57 beb2ff8a02b14e79b641ca1e66714f3c RX(theta₃) 655399ababa8405fab1838b0cd8e03f5--beb2ff8a02b14e79b641ca1e66714f3c 0ba2dac77fd141a9a8733f481e3ef572 RY(theta₇) beb2ff8a02b14e79b641ca1e66714f3c--0ba2dac77fd141a9a8733f481e3ef572 393f25410b1b488cb42c0e734b3397ec RX(theta₁₁) 0ba2dac77fd141a9a8733f481e3ef572--393f25410b1b488cb42c0e734b3397ec 6cbd7c9dbe814d3db3196e5eb6bda7a5 X 393f25410b1b488cb42c0e734b3397ec--6cbd7c9dbe814d3db3196e5eb6bda7a5 6cbd7c9dbe814d3db3196e5eb6bda7a5--0028096e3fd3455faa6255a850911ffc 59869a5fa15e4e4c9d9db33217c04dbc 6cbd7c9dbe814d3db3196e5eb6bda7a5--59869a5fa15e4e4c9d9db33217c04dbc 08be19b99c06411281c7e701a67ee35b RX(theta₁₅) 59869a5fa15e4e4c9d9db33217c04dbc--08be19b99c06411281c7e701a67ee35b cd8ff4af83764bcea5ee883b095de42f RY(theta₁₉) 08be19b99c06411281c7e701a67ee35b--cd8ff4af83764bcea5ee883b095de42f 94191541093a49fe84c07e2efaf324bf RX(theta₂₃) cd8ff4af83764bcea5ee883b095de42f--94191541093a49fe84c07e2efaf324bf c07e5678f5e949e082df86e3b93cbeab X 94191541093a49fe84c07e2efaf324bf--c07e5678f5e949e082df86e3b93cbeab c07e5678f5e949e082df86e3b93cbeab--6c2921d38ff94456ac511be82fac3ca8 81b82c241c114cbd8c69e26b6487aaf9 c07e5678f5e949e082df86e3b93cbeab--81b82c241c114cbd8c69e26b6487aaf9 81b82c241c114cbd8c69e26b6487aaf9--241aede1334c4976810dccc28ce24d57

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_5dab52e6156b44d394a673899c2a6245 Obs. cluster_57c09f020d574c1187c62d3c4e0d0411 cluster_a5bfdcb5220a4d7f917560648e86bbae Tower Chebyshev FM cluster_f7270bb0c4c4495aa899d014410d1a2c Tower Chebyshev FM cluster_45ac531800654002abcda8e4cf6f7d92 HEA 4153be9fcae64c74a915e355cab01f56 0 0ccf554e8e344909aa3a6cb8f2d67b79 RX(1.0*acos(x)) 4153be9fcae64c74a915e355cab01f56--0ccf554e8e344909aa3a6cb8f2d67b79 f3b59fcc461346fab146a58e6351fde8 1 ef6c29ff41174bb6b55f26fe151a37ed RX(theta₀) 0ccf554e8e344909aa3a6cb8f2d67b79--ef6c29ff41174bb6b55f26fe151a37ed d919f9ef6f00444aa66441afbc5d1068 RY(theta₄) ef6c29ff41174bb6b55f26fe151a37ed--d919f9ef6f00444aa66441afbc5d1068 c3c3db6304d1417c81fb5c5bf636fef7 RX(theta₈) d919f9ef6f00444aa66441afbc5d1068--c3c3db6304d1417c81fb5c5bf636fef7 92d373ec1039481b8faf5a97c43cf496 c3c3db6304d1417c81fb5c5bf636fef7--92d373ec1039481b8faf5a97c43cf496 c5739b256b854703b59883050ef6108c 92d373ec1039481b8faf5a97c43cf496--c5739b256b854703b59883050ef6108c e93503fa159448408d91b649a539a5d8 RX(theta₁₂) c5739b256b854703b59883050ef6108c--e93503fa159448408d91b649a539a5d8 e5953805e4274cc68c3aa748a99f2734 RY(theta₁₆) e93503fa159448408d91b649a539a5d8--e5953805e4274cc68c3aa748a99f2734 881ca58d7be941b98e93ee0dd2da4761 RX(theta₂₀) e5953805e4274cc68c3aa748a99f2734--881ca58d7be941b98e93ee0dd2da4761 ec67dd65a5074799a753953f9d6dd32f 881ca58d7be941b98e93ee0dd2da4761--ec67dd65a5074799a753953f9d6dd32f fb004cbcd2754590b8df9579897c4722 ec67dd65a5074799a753953f9d6dd32f--fb004cbcd2754590b8df9579897c4722 93b4058232404e2a8fe86fd95138d34e fb004cbcd2754590b8df9579897c4722--93b4058232404e2a8fe86fd95138d34e 21c8cdde90624135adb26ae571092caf 93b4058232404e2a8fe86fd95138d34e--21c8cdde90624135adb26ae571092caf d9a7b45acbb5460d8eb7e2690c967adb 991d4e3571db46c5b416966736073635 RX(2.0*acos(x)) f3b59fcc461346fab146a58e6351fde8--991d4e3571db46c5b416966736073635 c9d1288229114bb9880ea2b69ec90040 2 8b66366305b440d183556e6e324e080f RX(theta₁) 991d4e3571db46c5b416966736073635--8b66366305b440d183556e6e324e080f 6409aae372614a6ea967449dcff41102 RY(theta₅) 8b66366305b440d183556e6e324e080f--6409aae372614a6ea967449dcff41102 7cee038e5e1249679e5708a323792bcb RX(theta₉) 6409aae372614a6ea967449dcff41102--7cee038e5e1249679e5708a323792bcb fc2c0adc45dd4f08bdc99505b9f5516d X 7cee038e5e1249679e5708a323792bcb--fc2c0adc45dd4f08bdc99505b9f5516d fc2c0adc45dd4f08bdc99505b9f5516d--92d373ec1039481b8faf5a97c43cf496 c38aa648741b48c0ae84e5ab490e1ffe fc2c0adc45dd4f08bdc99505b9f5516d--c38aa648741b48c0ae84e5ab490e1ffe e10852fe5d6b4d978362b612b14e9d5e RX(theta₁₃) c38aa648741b48c0ae84e5ab490e1ffe--e10852fe5d6b4d978362b612b14e9d5e fea06a6edc934c45b4effb545317a67e RY(theta₁₇) e10852fe5d6b4d978362b612b14e9d5e--fea06a6edc934c45b4effb545317a67e 7b0728bcddcb42668642906e39a4ebc0 RX(theta₂₁) fea06a6edc934c45b4effb545317a67e--7b0728bcddcb42668642906e39a4ebc0 f50843b1f3134fd7a6b3209917fed4ca X 7b0728bcddcb42668642906e39a4ebc0--f50843b1f3134fd7a6b3209917fed4ca f50843b1f3134fd7a6b3209917fed4ca--ec67dd65a5074799a753953f9d6dd32f ea2978adb0904bcba6e321227d6cb039 f50843b1f3134fd7a6b3209917fed4ca--ea2978adb0904bcba6e321227d6cb039 7610b252de6e4727a83e465f6dc595df AddBlock ea2978adb0904bcba6e321227d6cb039--7610b252de6e4727a83e465f6dc595df 7610b252de6e4727a83e465f6dc595df--d9a7b45acbb5460d8eb7e2690c967adb a19a4de02fa84e1fb510f15066963510 c72bdebef68b488c91902b74aad505dc RX(1.0*acos(2.0*y - 1.0)) c9d1288229114bb9880ea2b69ec90040--c72bdebef68b488c91902b74aad505dc 9f9e73794efb4af183ce038df9ae89c8 3 0d065ee98c184aad8bcf476fc5287c06 RX(theta₂) c72bdebef68b488c91902b74aad505dc--0d065ee98c184aad8bcf476fc5287c06 810533759632401581b022350d1e7e36 RY(theta₆) 0d065ee98c184aad8bcf476fc5287c06--810533759632401581b022350d1e7e36 985d7aedb7a3406f81054c80c9d9f34a RX(theta₁₀) 810533759632401581b022350d1e7e36--985d7aedb7a3406f81054c80c9d9f34a 645c3cf296ba4bb7b0ae7e45288a54fb 985d7aedb7a3406f81054c80c9d9f34a--645c3cf296ba4bb7b0ae7e45288a54fb 6a188f0a04674996a1eef9d5f586b037 X 645c3cf296ba4bb7b0ae7e45288a54fb--6a188f0a04674996a1eef9d5f586b037 6a188f0a04674996a1eef9d5f586b037--c38aa648741b48c0ae84e5ab490e1ffe 0c923bbba5db454cb82be8530261ed06 RX(theta₁₄) 6a188f0a04674996a1eef9d5f586b037--0c923bbba5db454cb82be8530261ed06 0f32abdb7ca14c8a8382defbe8d3e8a0 RY(theta₁₈) 0c923bbba5db454cb82be8530261ed06--0f32abdb7ca14c8a8382defbe8d3e8a0 a8ddfc61359646c0acef833767c00698 RX(theta₂₂) 0f32abdb7ca14c8a8382defbe8d3e8a0--a8ddfc61359646c0acef833767c00698 2d130a33a3bf467c951f888fe4207635 a8ddfc61359646c0acef833767c00698--2d130a33a3bf467c951f888fe4207635 56aeab0547dd4cd08bdffc74cd5f9925 X 2d130a33a3bf467c951f888fe4207635--56aeab0547dd4cd08bdffc74cd5f9925 56aeab0547dd4cd08bdffc74cd5f9925--ea2978adb0904bcba6e321227d6cb039 8691eac467e84461bd2f6244629d5684 56aeab0547dd4cd08bdffc74cd5f9925--8691eac467e84461bd2f6244629d5684 8691eac467e84461bd2f6244629d5684--a19a4de02fa84e1fb510f15066963510 b74b782a555d4460b510045fb34eb7e8 8d297d9d3d4c44dc8e297cbee297dcda RX(2.0*acos(2.0*y - 1.0)) 9f9e73794efb4af183ce038df9ae89c8--8d297d9d3d4c44dc8e297cbee297dcda 9c34f3d735cb460a8b528a9f1e6d928e RX(theta₃) 8d297d9d3d4c44dc8e297cbee297dcda--9c34f3d735cb460a8b528a9f1e6d928e dbb25ea945f34ce1bbea866c0c3d8e27 RY(theta₇) 9c34f3d735cb460a8b528a9f1e6d928e--dbb25ea945f34ce1bbea866c0c3d8e27 82303f99ba374a918bb990bced25b3d3 RX(theta₁₁) dbb25ea945f34ce1bbea866c0c3d8e27--82303f99ba374a918bb990bced25b3d3 284df9024d3042f7bb110ff89cebfef4 X 82303f99ba374a918bb990bced25b3d3--284df9024d3042f7bb110ff89cebfef4 284df9024d3042f7bb110ff89cebfef4--645c3cf296ba4bb7b0ae7e45288a54fb a30d75dacc1e430fa1e5775813df37a9 284df9024d3042f7bb110ff89cebfef4--a30d75dacc1e430fa1e5775813df37a9 8ead45be5bdf4ecb8641e929b7b26776 RX(theta₁₅) a30d75dacc1e430fa1e5775813df37a9--8ead45be5bdf4ecb8641e929b7b26776 8478d40c95f84bee898e047f7dd9c960 RY(theta₁₉) 8ead45be5bdf4ecb8641e929b7b26776--8478d40c95f84bee898e047f7dd9c960 d997de94af534618943ac4b56877b609 RX(theta₂₃) 8478d40c95f84bee898e047f7dd9c960--d997de94af534618943ac4b56877b609 ffe4767d096041f4a909c7f9dae8fd8e X d997de94af534618943ac4b56877b609--ffe4767d096041f4a909c7f9dae8fd8e ffe4767d096041f4a909c7f9dae8fd8e--2d130a33a3bf467c951f888fe4207635 8eea000cf0f24893bc4bbf7dc757db1d ffe4767d096041f4a909c7f9dae8fd8e--8eea000cf0f24893bc4bbf7dc757db1d a0a0f909b9cf4244b35c0c6652b2e671 8eea000cf0f24893bc4bbf7dc757db1d--a0a0f909b9cf4244b35c0c6652b2e671 a0a0f909b9cf4244b35c0c6652b2e671--b74b782a555d4460b510045fb34eb7e8