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_541f4ee92e034c3c89082a770053cb0d 867da886b0084a798831678396a94deb 0 6f8fb82de2594399957891d96801e45f 867da886b0084a798831678396a94deb--6f8fb82de2594399957891d96801e45f 6fd60cb557a34839b0f617ec514e98ab 1 6697aa9808e540bf9f8fce7e51a008c7 6f8fb82de2594399957891d96801e45f--6697aa9808e540bf9f8fce7e51a008c7 e553aa631b574357a3bf29d7fc6b72d4 e8fc72f438da4120922d34ac858ba262 AddBlock 6fd60cb557a34839b0f617ec514e98ab--e8fc72f438da4120922d34ac858ba262 8aba3ceb2d7c45c38d67adadbced7741 2 e8fc72f438da4120922d34ac858ba262--e553aa631b574357a3bf29d7fc6b72d4 cb557fd1f6e7464bbacdf0ad576ef63f 2170748c5176451f823b94851d8bf53f 8aba3ceb2d7c45c38d67adadbced7741--2170748c5176451f823b94851d8bf53f 76081653a84a4361a25168b62956b4ed 3 2170748c5176451f823b94851d8bf53f--cb557fd1f6e7464bbacdf0ad576ef63f 67fad262bf7346a8b0d98bdc16c55918 c0404d94c0be4916bd9f22187443a932 76081653a84a4361a25168b62956b4ed--c0404d94c0be4916bd9f22187443a932 c0404d94c0be4916bd9f22187443a932--67fad262bf7346a8b0d98bdc16c55918

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_489cffe289844df9838585332ff84473 Tower Chebyshev FM cluster_96ff5e30e2064d4cb7fd827f41aa9ba2 Tower Chebyshev FM b2d1a067bbec4ef988378f863593a54b 0 bac4d734102d4dbca03b00be65f9f400 RX(1.0*acos(x)) b2d1a067bbec4ef988378f863593a54b--bac4d734102d4dbca03b00be65f9f400 d1f70317dd2847c399cc5a4aec49b344 1 8347762d0242414fa57ef555feb677b7 bac4d734102d4dbca03b00be65f9f400--8347762d0242414fa57ef555feb677b7 46240487586f424c858c83f0a296bda6 77bcbd74d2e54140b903fc587bb5f083 RX(2.0*acos(x)) d1f70317dd2847c399cc5a4aec49b344--77bcbd74d2e54140b903fc587bb5f083 e751122f8e3848cd87b3bbbae8da450e 2 77bcbd74d2e54140b903fc587bb5f083--46240487586f424c858c83f0a296bda6 36c97d3478a344a091193609cb419383 7c91b12b141d48eeb0403f52067cfcc2 RX(1.0*acos(2.0*y - 1.0)) e751122f8e3848cd87b3bbbae8da450e--7c91b12b141d48eeb0403f52067cfcc2 d4f216cd77cf4eb2a4be9b31df7d6998 3 7c91b12b141d48eeb0403f52067cfcc2--36c97d3478a344a091193609cb419383 7b6ec4499bce44a997840681537ed08b 9f7937ee48e14de789d3b4c68d2f830b RX(2.0*acos(2.0*y - 1.0)) d4f216cd77cf4eb2a4be9b31df7d6998--9f7937ee48e14de789d3b4c68d2f830b 9f7937ee48e14de789d3b4c68d2f830b--7b6ec4499bce44a997840681537ed08b

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 1dc04b6e201d4b268629888ab47b768b 0 c9f0064eeeac43669325d31acbd8a713 RX(theta₀) 1dc04b6e201d4b268629888ab47b768b--c9f0064eeeac43669325d31acbd8a713 2de9b4e0963a44e4b0781ab4405f1668 1 92946c66cf6e40c19295df7e21785e2e RY(theta₄) c9f0064eeeac43669325d31acbd8a713--92946c66cf6e40c19295df7e21785e2e 1a1b22bea5584f4b92f22812c812608c RX(theta₈) 92946c66cf6e40c19295df7e21785e2e--1a1b22bea5584f4b92f22812c812608c 787f157ece2b45cb8f4737fb8e9408b6 1a1b22bea5584f4b92f22812c812608c--787f157ece2b45cb8f4737fb8e9408b6 ab2c8691d7ec46989a240b33b6f5472b 787f157ece2b45cb8f4737fb8e9408b6--ab2c8691d7ec46989a240b33b6f5472b 696fa36b4c0c47c98a31a84550f2c28e RX(theta₁₂) ab2c8691d7ec46989a240b33b6f5472b--696fa36b4c0c47c98a31a84550f2c28e f2f3b752b8b0404fa6f354b7fa08c94b RY(theta₁₆) 696fa36b4c0c47c98a31a84550f2c28e--f2f3b752b8b0404fa6f354b7fa08c94b 5f24a030f64a4c24aba35ea43fc88f25 RX(theta₂₀) f2f3b752b8b0404fa6f354b7fa08c94b--5f24a030f64a4c24aba35ea43fc88f25 61c47c88e78f455c9088d82f2d3b9b23 5f24a030f64a4c24aba35ea43fc88f25--61c47c88e78f455c9088d82f2d3b9b23 e580e904157740c281014c68d10d6a74 61c47c88e78f455c9088d82f2d3b9b23--e580e904157740c281014c68d10d6a74 435a7271cedb4066a7c9880a602d51fc e580e904157740c281014c68d10d6a74--435a7271cedb4066a7c9880a602d51fc 1a074225bbb64a42bab546a53dee83a9 5b5c43fdc0ef4e97baf901b6afb027ae RX(theta₁) 2de9b4e0963a44e4b0781ab4405f1668--5b5c43fdc0ef4e97baf901b6afb027ae 89396481168249e79c1932fa5141a38b 2 483865d84ef94655921f103b71723ca9 RY(theta₅) 5b5c43fdc0ef4e97baf901b6afb027ae--483865d84ef94655921f103b71723ca9 220e3eb4c0414eea996e0c6454d5641c RX(theta₉) 483865d84ef94655921f103b71723ca9--220e3eb4c0414eea996e0c6454d5641c 84bdd70acb454fb9835a65c5e586d8c3 X 220e3eb4c0414eea996e0c6454d5641c--84bdd70acb454fb9835a65c5e586d8c3 84bdd70acb454fb9835a65c5e586d8c3--787f157ece2b45cb8f4737fb8e9408b6 c3a7cabaf0c143db9eb637c413433a0f 84bdd70acb454fb9835a65c5e586d8c3--c3a7cabaf0c143db9eb637c413433a0f fcde6bcbd0f347be9a6fb32f4a2cc5ee RX(theta₁₃) c3a7cabaf0c143db9eb637c413433a0f--fcde6bcbd0f347be9a6fb32f4a2cc5ee b26d10f61c5a416eb73cbd5a531c2792 RY(theta₁₇) fcde6bcbd0f347be9a6fb32f4a2cc5ee--b26d10f61c5a416eb73cbd5a531c2792 69388d79c9c14551b9e1f927e0439f49 RX(theta₂₁) b26d10f61c5a416eb73cbd5a531c2792--69388d79c9c14551b9e1f927e0439f49 a8faa9ff89fd4c769eaf1ea8fb5ba2c2 X 69388d79c9c14551b9e1f927e0439f49--a8faa9ff89fd4c769eaf1ea8fb5ba2c2 a8faa9ff89fd4c769eaf1ea8fb5ba2c2--61c47c88e78f455c9088d82f2d3b9b23 a55724b10aa24bffbd3c264cfcf46eb2 a8faa9ff89fd4c769eaf1ea8fb5ba2c2--a55724b10aa24bffbd3c264cfcf46eb2 a55724b10aa24bffbd3c264cfcf46eb2--1a074225bbb64a42bab546a53dee83a9 46b284955e004addac16736d4d556625 db418da0db2e4341803ef3981f620888 RX(theta₂) 89396481168249e79c1932fa5141a38b--db418da0db2e4341803ef3981f620888 15839764a6984deb826a8cef7d09bf18 3 6ce4a00680214354b1495324bf3b2d09 RY(theta₆) db418da0db2e4341803ef3981f620888--6ce4a00680214354b1495324bf3b2d09 9d886cddc6584364b1051fe97bf2ebec RX(theta₁₀) 6ce4a00680214354b1495324bf3b2d09--9d886cddc6584364b1051fe97bf2ebec 23bfa266cd4f4e69a1fcad963d217842 9d886cddc6584364b1051fe97bf2ebec--23bfa266cd4f4e69a1fcad963d217842 421aa17090124a59a017bbfb97a8c70b X 23bfa266cd4f4e69a1fcad963d217842--421aa17090124a59a017bbfb97a8c70b 421aa17090124a59a017bbfb97a8c70b--c3a7cabaf0c143db9eb637c413433a0f 2c73e1d8997040b58b76135ed1fcf263 RX(theta₁₄) 421aa17090124a59a017bbfb97a8c70b--2c73e1d8997040b58b76135ed1fcf263 07b5a2d210eb472d8d3e7d979b82a41c RY(theta₁₈) 2c73e1d8997040b58b76135ed1fcf263--07b5a2d210eb472d8d3e7d979b82a41c a71d9dd596b0425282ad047ea6e3d366 RX(theta₂₂) 07b5a2d210eb472d8d3e7d979b82a41c--a71d9dd596b0425282ad047ea6e3d366 fd827673b0384a06a6be1e4af5b3a752 a71d9dd596b0425282ad047ea6e3d366--fd827673b0384a06a6be1e4af5b3a752 dc2a740181d44279b9c8f6e0cb76e5aa X fd827673b0384a06a6be1e4af5b3a752--dc2a740181d44279b9c8f6e0cb76e5aa dc2a740181d44279b9c8f6e0cb76e5aa--a55724b10aa24bffbd3c264cfcf46eb2 dc2a740181d44279b9c8f6e0cb76e5aa--46b284955e004addac16736d4d556625 d505e8e5d4b046b6ae16b7c6ee4b41a7 5d59c4487f49425cb77ac593b1de48fd RX(theta₃) 15839764a6984deb826a8cef7d09bf18--5d59c4487f49425cb77ac593b1de48fd f98c6fb05a9f4570b6fc12bc89fa26fb RY(theta₇) 5d59c4487f49425cb77ac593b1de48fd--f98c6fb05a9f4570b6fc12bc89fa26fb 7a2d6d488bf543e8b853e07862c71219 RX(theta₁₁) f98c6fb05a9f4570b6fc12bc89fa26fb--7a2d6d488bf543e8b853e07862c71219 f93210ddaae5402e8aa1bc62cb0b95fb X 7a2d6d488bf543e8b853e07862c71219--f93210ddaae5402e8aa1bc62cb0b95fb f93210ddaae5402e8aa1bc62cb0b95fb--23bfa266cd4f4e69a1fcad963d217842 861f03bbd726483699b041d7316f0c81 f93210ddaae5402e8aa1bc62cb0b95fb--861f03bbd726483699b041d7316f0c81 10fa39f69efc44c8a100073c6253be0e RX(theta₁₅) 861f03bbd726483699b041d7316f0c81--10fa39f69efc44c8a100073c6253be0e bf112636fb8949f4b8de6a712752a242 RY(theta₁₉) 10fa39f69efc44c8a100073c6253be0e--bf112636fb8949f4b8de6a712752a242 d325e7c50d1541aabad9a3f369ec4445 RX(theta₂₃) bf112636fb8949f4b8de6a712752a242--d325e7c50d1541aabad9a3f369ec4445 fecd5c05ee3f4799be6a2d8ecdc1b8d2 X d325e7c50d1541aabad9a3f369ec4445--fecd5c05ee3f4799be6a2d8ecdc1b8d2 fecd5c05ee3f4799be6a2d8ecdc1b8d2--fd827673b0384a06a6be1e4af5b3a752 eb443f49af8f4123a84c945c0206e592 fecd5c05ee3f4799be6a2d8ecdc1b8d2--eb443f49af8f4123a84c945c0206e592 eb443f49af8f4123a84c945c0206e592--d505e8e5d4b046b6ae16b7c6ee4b41a7

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_fcd6ca276af84497a59f3e88503dd899 Obs. cluster_68d2cd94bf6c4beca9ac2ee29c489eb7 cluster_a04ef34015ae467f8baa51e4a340082e Tower Chebyshev FM cluster_b479ddb07b6f44b8af7657d4518efa1b Tower Chebyshev FM cluster_15d8a8e2c1024199bb20800dc72dded9 HEA aeb0a61c07774d5babf1b6e1691e2540 0 66f7ce93d88f4dd6a4fbf9a617890829 RX(1.0*acos(x)) aeb0a61c07774d5babf1b6e1691e2540--66f7ce93d88f4dd6a4fbf9a617890829 f2f4da764dbb4394bd4bff362c8d59d6 1 1894101271b042ea9b2a58e2a1336345 RX(theta₀) 66f7ce93d88f4dd6a4fbf9a617890829--1894101271b042ea9b2a58e2a1336345 280341718f4947d499ad181ee58a7eb3 RY(theta₄) 1894101271b042ea9b2a58e2a1336345--280341718f4947d499ad181ee58a7eb3 454135867f1641b8b0efdb84b3cbc719 RX(theta₈) 280341718f4947d499ad181ee58a7eb3--454135867f1641b8b0efdb84b3cbc719 96a4537c80c14760b074605e329b49e3 454135867f1641b8b0efdb84b3cbc719--96a4537c80c14760b074605e329b49e3 f0f011cacbd44c2a92404b75432649fd 96a4537c80c14760b074605e329b49e3--f0f011cacbd44c2a92404b75432649fd f476ba4d1eed45b7881604cd70b0e43b RX(theta₁₂) f0f011cacbd44c2a92404b75432649fd--f476ba4d1eed45b7881604cd70b0e43b d0a1fa8905e84edcb064f39e1e438078 RY(theta₁₆) f476ba4d1eed45b7881604cd70b0e43b--d0a1fa8905e84edcb064f39e1e438078 d2c05476603f4b52a0e4772a928bcfe4 RX(theta₂₀) d0a1fa8905e84edcb064f39e1e438078--d2c05476603f4b52a0e4772a928bcfe4 2cb4242d572c43ea8031b0924ae70ec7 d2c05476603f4b52a0e4772a928bcfe4--2cb4242d572c43ea8031b0924ae70ec7 a97c4ab3eb3945c088e058912a1d0d21 2cb4242d572c43ea8031b0924ae70ec7--a97c4ab3eb3945c088e058912a1d0d21 a865561e042f437085873e25221b27df a97c4ab3eb3945c088e058912a1d0d21--a865561e042f437085873e25221b27df 7d54a5dfae0a48838dd9643a866978a7 a865561e042f437085873e25221b27df--7d54a5dfae0a48838dd9643a866978a7 590869a9698f4a7b8179539d4b53a695 e06477fc16fc4fa9ad238971018215ea RX(2.0*acos(x)) f2f4da764dbb4394bd4bff362c8d59d6--e06477fc16fc4fa9ad238971018215ea c9eb8101359d44a0990378a5a484f8ca 2 5ab91bce19164f96a8eba3bd7e23449a RX(theta₁) e06477fc16fc4fa9ad238971018215ea--5ab91bce19164f96a8eba3bd7e23449a 054dc43b08584bfabc477ed6ba73ff97 RY(theta₅) 5ab91bce19164f96a8eba3bd7e23449a--054dc43b08584bfabc477ed6ba73ff97 c84da9fdf54b4500a342e400958a9d5d RX(theta₉) 054dc43b08584bfabc477ed6ba73ff97--c84da9fdf54b4500a342e400958a9d5d 7519b93e112d40ab80ef50fe9d55b054 X c84da9fdf54b4500a342e400958a9d5d--7519b93e112d40ab80ef50fe9d55b054 7519b93e112d40ab80ef50fe9d55b054--96a4537c80c14760b074605e329b49e3 38f4055ae61440b68aa2e8c789db508c 7519b93e112d40ab80ef50fe9d55b054--38f4055ae61440b68aa2e8c789db508c 653a4b8770b5427fa6c5a11d0a88c080 RX(theta₁₃) 38f4055ae61440b68aa2e8c789db508c--653a4b8770b5427fa6c5a11d0a88c080 0c80a858cf804c39879cf92bf93bc249 RY(theta₁₇) 653a4b8770b5427fa6c5a11d0a88c080--0c80a858cf804c39879cf92bf93bc249 c7b8613edf4044aea94d32c4d27d07e5 RX(theta₂₁) 0c80a858cf804c39879cf92bf93bc249--c7b8613edf4044aea94d32c4d27d07e5 aa49bae4e1cf4670abdda2a02cc5ec43 X c7b8613edf4044aea94d32c4d27d07e5--aa49bae4e1cf4670abdda2a02cc5ec43 aa49bae4e1cf4670abdda2a02cc5ec43--2cb4242d572c43ea8031b0924ae70ec7 3b1bd910de384101b3caf79cead37e8b aa49bae4e1cf4670abdda2a02cc5ec43--3b1bd910de384101b3caf79cead37e8b 9cf81eb51c5740158ad55b5d1c20880d AddBlock 3b1bd910de384101b3caf79cead37e8b--9cf81eb51c5740158ad55b5d1c20880d 9cf81eb51c5740158ad55b5d1c20880d--590869a9698f4a7b8179539d4b53a695 43856d36bf36497285154431dc595abc 95253544957547d68d62bebdaeca62c8 RX(1.0*acos(2.0*y - 1.0)) c9eb8101359d44a0990378a5a484f8ca--95253544957547d68d62bebdaeca62c8 63d2c7e11b1048a0ab44b5be9337db43 3 82586aebbcae4c329a659676a8004101 RX(theta₂) 95253544957547d68d62bebdaeca62c8--82586aebbcae4c329a659676a8004101 cc9d783f8aa9417fad4f57cbd842e05a RY(theta₆) 82586aebbcae4c329a659676a8004101--cc9d783f8aa9417fad4f57cbd842e05a 0beb65ff1a984ff99bb9fbbbed589e40 RX(theta₁₀) cc9d783f8aa9417fad4f57cbd842e05a--0beb65ff1a984ff99bb9fbbbed589e40 11167cf1601a430395c4d2b6c75785b8 0beb65ff1a984ff99bb9fbbbed589e40--11167cf1601a430395c4d2b6c75785b8 cd703a0e47a04634af2f9af822a1ceed X 11167cf1601a430395c4d2b6c75785b8--cd703a0e47a04634af2f9af822a1ceed cd703a0e47a04634af2f9af822a1ceed--38f4055ae61440b68aa2e8c789db508c 21f7cce45e1b4cc5847bdca65bec8c06 RX(theta₁₄) cd703a0e47a04634af2f9af822a1ceed--21f7cce45e1b4cc5847bdca65bec8c06 44c2efb6b115436ea4f1b07af869bae9 RY(theta₁₈) 21f7cce45e1b4cc5847bdca65bec8c06--44c2efb6b115436ea4f1b07af869bae9 19124612f2b24c08a9fa167af3dc2458 RX(theta₂₂) 44c2efb6b115436ea4f1b07af869bae9--19124612f2b24c08a9fa167af3dc2458 6568cec8faf24915bdc6f4c8325561f0 19124612f2b24c08a9fa167af3dc2458--6568cec8faf24915bdc6f4c8325561f0 c0eb20908209470e929876ea997c41b0 X 6568cec8faf24915bdc6f4c8325561f0--c0eb20908209470e929876ea997c41b0 c0eb20908209470e929876ea997c41b0--3b1bd910de384101b3caf79cead37e8b dad2caebd8b34c6095ee3c181c3acc30 c0eb20908209470e929876ea997c41b0--dad2caebd8b34c6095ee3c181c3acc30 dad2caebd8b34c6095ee3c181c3acc30--43856d36bf36497285154431dc595abc 58d368f37ac84db2a28d7388f2472caa d45afa8a52cb4ad7a86c8b96b00f8955 RX(2.0*acos(2.0*y - 1.0)) 63d2c7e11b1048a0ab44b5be9337db43--d45afa8a52cb4ad7a86c8b96b00f8955 4cd354aae94043109886a10b017952e0 RX(theta₃) d45afa8a52cb4ad7a86c8b96b00f8955--4cd354aae94043109886a10b017952e0 76117c5113d74fd3970abeac66a1a3ce RY(theta₇) 4cd354aae94043109886a10b017952e0--76117c5113d74fd3970abeac66a1a3ce 1c7a19ea47154359a259b90ecf39f984 RX(theta₁₁) 76117c5113d74fd3970abeac66a1a3ce--1c7a19ea47154359a259b90ecf39f984 aaa7a47f1e674dba80ac87e35822e91b X 1c7a19ea47154359a259b90ecf39f984--aaa7a47f1e674dba80ac87e35822e91b aaa7a47f1e674dba80ac87e35822e91b--11167cf1601a430395c4d2b6c75785b8 eef550ba57214f7bb43fa6d27a30ccdd aaa7a47f1e674dba80ac87e35822e91b--eef550ba57214f7bb43fa6d27a30ccdd 546e267ab45c493e9398414fb54b3186 RX(theta₁₅) eef550ba57214f7bb43fa6d27a30ccdd--546e267ab45c493e9398414fb54b3186 fa43138d3de94d84948cc720b8c238f7 RY(theta₁₉) 546e267ab45c493e9398414fb54b3186--fa43138d3de94d84948cc720b8c238f7 b834de979a7f49eea5a449e5b235706f RX(theta₂₃) fa43138d3de94d84948cc720b8c238f7--b834de979a7f49eea5a449e5b235706f 16acfda6032544809522f00a1c50fb5e X b834de979a7f49eea5a449e5b235706f--16acfda6032544809522f00a1c50fb5e 16acfda6032544809522f00a1c50fb5e--6568cec8faf24915bdc6f4c8325561f0 0cd52addb34e4670b187fad2a68c3930 16acfda6032544809522f00a1c50fb5e--0cd52addb34e4670b187fad2a68c3930 a7dd1e3fa718442f82b8e36348d77a84 0cd52addb34e4670b187fad2a68c3930--a7dd1e3fa718442f82b8e36348d77a84 a7dd1e3fa718442f82b8e36348d77a84--58d368f37ac84db2a28d7388f2472caa