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_dab9dcd7f443471c88f9a2d760df01ac
dc8b1f4811d946b29afac44aa03a541c
0
4b211e98187d42db993351b0a309dbb4
dc8b1f4811d946b29afac44aa03a541c--4b211e98187d42db993351b0a309dbb4
e6b198d8068845bdbdb3e82e3206d073
1
207bd17268fa4b77b375e7aac58f115c
4b211e98187d42db993351b0a309dbb4--207bd17268fa4b77b375e7aac58f115c
9e30825c95664caf8be66d37ad5b394a
f995ee2c28fa473680d166641c15cb79
AddBlock
e6b198d8068845bdbdb3e82e3206d073--f995ee2c28fa473680d166641c15cb79
dd30121e1987467e98d539581ce04698
2
f995ee2c28fa473680d166641c15cb79--9e30825c95664caf8be66d37ad5b394a
50dcdbaf729443c4b9b63acde2b512c5
dc517641c23e450fbc501974dd751abc
dd30121e1987467e98d539581ce04698--dc517641c23e450fbc501974dd751abc
50b744749933476a84f49aa39e4bd4f4
3
dc517641c23e450fbc501974dd751abc--50dcdbaf729443c4b9b63acde2b512c5
bb4e2c09816744c2a4879efee3fa1931
8044c306810041258e0ab4a5b4017ec3
50b744749933476a84f49aa39e4bd4f4--8044c306810041258e0ab4a5b4017ec3
8044c306810041258e0ab4a5b4017ec3--bb4e2c09816744c2a4879efee3fa1931
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_86db9a64edef49e0a5ba7a5e74c4577c
Tower Chebyshev FM
cluster_954640dec9bc4a26853e22e3a4063cd2
Tower Chebyshev FM
546952ad090849f389c933b743a748e0
0
cbf4e336cc0a4e4ab402033a9ece15db
RX(1.0*acos(x))
546952ad090849f389c933b743a748e0--cbf4e336cc0a4e4ab402033a9ece15db
e8c67537afe6409f8c66e461d2aeb46c
1
59f6cbee41fc44b0a43080dee42b3b54
cbf4e336cc0a4e4ab402033a9ece15db--59f6cbee41fc44b0a43080dee42b3b54
d28ac868a90a40f6a2a3e21b02464c9a
0122aaec1543472db94c2b6d154b49e7
RX(2.0*acos(x))
e8c67537afe6409f8c66e461d2aeb46c--0122aaec1543472db94c2b6d154b49e7
71c21f17f32246498bb3e970b616a5c9
2
0122aaec1543472db94c2b6d154b49e7--d28ac868a90a40f6a2a3e21b02464c9a
9e75db0932c34da7b18079860ee11147
d954c22a7cb64e25bbd1916ade2d9446
RX(1.0*acos(2.0*y - 1.0))
71c21f17f32246498bb3e970b616a5c9--d954c22a7cb64e25bbd1916ade2d9446
a23cc9f3b0804c9aa5d463ce8246bc3d
3
d954c22a7cb64e25bbd1916ade2d9446--9e75db0932c34da7b18079860ee11147
90fe3b6729c84090ae8ad9454d5654b3
e755aa26de7144c18c8b2be051a6928b
RX(2.0*acos(2.0*y - 1.0))
a23cc9f3b0804c9aa5d463ce8246bc3d--e755aa26de7144c18c8b2be051a6928b
e755aa26de7144c18c8b2be051a6928b--90fe3b6729c84090ae8ad9454d5654b3
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
3d99f06aebb8466fa717d560250ae6ce
0
1734e24ca45541feb926612f4457e219
RX(theta₀)
3d99f06aebb8466fa717d560250ae6ce--1734e24ca45541feb926612f4457e219
88eed6a60ff7485d9706dce1c866c6ca
1
bf34d2a368f240d4891c10244a0e1db3
RY(theta₄)
1734e24ca45541feb926612f4457e219--bf34d2a368f240d4891c10244a0e1db3
8b9d2c1bf0454a3e912a7b57b481eaa4
RX(theta₈)
bf34d2a368f240d4891c10244a0e1db3--8b9d2c1bf0454a3e912a7b57b481eaa4
141b9c62dde148e6bf02117f3f705a3a
8b9d2c1bf0454a3e912a7b57b481eaa4--141b9c62dde148e6bf02117f3f705a3a
f3d5f595c2a942eaaaef1935d76c55e3
141b9c62dde148e6bf02117f3f705a3a--f3d5f595c2a942eaaaef1935d76c55e3
23542abe87424e458325abf82550721f
RX(theta₁₂)
f3d5f595c2a942eaaaef1935d76c55e3--23542abe87424e458325abf82550721f
7d4fe90a6b614c92bdbe4945c129d54a
RY(theta₁₆)
23542abe87424e458325abf82550721f--7d4fe90a6b614c92bdbe4945c129d54a
b6e9e9f119da450f98a70aac54633ecf
RX(theta₂₀)
7d4fe90a6b614c92bdbe4945c129d54a--b6e9e9f119da450f98a70aac54633ecf
856d1b25409441409592bfe111673bd3
b6e9e9f119da450f98a70aac54633ecf--856d1b25409441409592bfe111673bd3
6f0ef3b1d84a44339eb84ddedf8c2040
856d1b25409441409592bfe111673bd3--6f0ef3b1d84a44339eb84ddedf8c2040
82451ed1afa74cc3b81b66d0f584a189
6f0ef3b1d84a44339eb84ddedf8c2040--82451ed1afa74cc3b81b66d0f584a189
b55c9c46faa04d77add91c85b4c1b5b9
5ebeaff21dac409bb47a1aaf4272cd16
RX(theta₁)
88eed6a60ff7485d9706dce1c866c6ca--5ebeaff21dac409bb47a1aaf4272cd16
b06b638592f747ad89e79696bafcc161
2
837d8d0b51ff4f1fb77efe482be4271c
RY(theta₅)
5ebeaff21dac409bb47a1aaf4272cd16--837d8d0b51ff4f1fb77efe482be4271c
7688d196df2f48138630b46dc538b138
RX(theta₉)
837d8d0b51ff4f1fb77efe482be4271c--7688d196df2f48138630b46dc538b138
2261ac89a6c9492cb9ada4fc88fe61a6
X
7688d196df2f48138630b46dc538b138--2261ac89a6c9492cb9ada4fc88fe61a6
2261ac89a6c9492cb9ada4fc88fe61a6--141b9c62dde148e6bf02117f3f705a3a
9b46df0c7ba7475097f516300cd1ada8
2261ac89a6c9492cb9ada4fc88fe61a6--9b46df0c7ba7475097f516300cd1ada8
a6dc889590b243308c8acefa76c18912
RX(theta₁₃)
9b46df0c7ba7475097f516300cd1ada8--a6dc889590b243308c8acefa76c18912
1a616cd7e0004eaa96f520e876bfa77e
RY(theta₁₇)
a6dc889590b243308c8acefa76c18912--1a616cd7e0004eaa96f520e876bfa77e
1ddd9f3c0909463ab68bce306d0cd2ef
RX(theta₂₁)
1a616cd7e0004eaa96f520e876bfa77e--1ddd9f3c0909463ab68bce306d0cd2ef
9b31d2446ac0493181c7dbad8d5d1268
X
1ddd9f3c0909463ab68bce306d0cd2ef--9b31d2446ac0493181c7dbad8d5d1268
9b31d2446ac0493181c7dbad8d5d1268--856d1b25409441409592bfe111673bd3
d9081bb481c54110bd9a114d4b06b445
9b31d2446ac0493181c7dbad8d5d1268--d9081bb481c54110bd9a114d4b06b445
d9081bb481c54110bd9a114d4b06b445--b55c9c46faa04d77add91c85b4c1b5b9
85a7103674004e17b0ad5bb37e6e35d7
406927909c0d4075968464360e7a452e
RX(theta₂)
b06b638592f747ad89e79696bafcc161--406927909c0d4075968464360e7a452e
469f4a67649040bc81761cbaa37761d5
3
64e06ac0abad4dc08d00866d58774cf1
RY(theta₆)
406927909c0d4075968464360e7a452e--64e06ac0abad4dc08d00866d58774cf1
8a11be122fba44c6b47903ea0da72c94
RX(theta₁₀)
64e06ac0abad4dc08d00866d58774cf1--8a11be122fba44c6b47903ea0da72c94
d212f3d712ee40ff9c5dd1018247905b
8a11be122fba44c6b47903ea0da72c94--d212f3d712ee40ff9c5dd1018247905b
af2db88087da4b268b4dca60f89a6898
X
d212f3d712ee40ff9c5dd1018247905b--af2db88087da4b268b4dca60f89a6898
af2db88087da4b268b4dca60f89a6898--9b46df0c7ba7475097f516300cd1ada8
3e89f58654884c34857f693265794dcd
RX(theta₁₄)
af2db88087da4b268b4dca60f89a6898--3e89f58654884c34857f693265794dcd
1bc8acc3727b4990b4680b5592e426bd
RY(theta₁₈)
3e89f58654884c34857f693265794dcd--1bc8acc3727b4990b4680b5592e426bd
68dd45b6524748f7bc15df05cab88c75
RX(theta₂₂)
1bc8acc3727b4990b4680b5592e426bd--68dd45b6524748f7bc15df05cab88c75
b9713a9f39ab4b769a5b03520cbd3511
68dd45b6524748f7bc15df05cab88c75--b9713a9f39ab4b769a5b03520cbd3511
0838caeb24bf434584365475b8efe680
X
b9713a9f39ab4b769a5b03520cbd3511--0838caeb24bf434584365475b8efe680
0838caeb24bf434584365475b8efe680--d9081bb481c54110bd9a114d4b06b445
0838caeb24bf434584365475b8efe680--85a7103674004e17b0ad5bb37e6e35d7
55708194e2984cee90ba570a09a1c08d
396bd1c374b749bd8c0dd33707eb9a23
RX(theta₃)
469f4a67649040bc81761cbaa37761d5--396bd1c374b749bd8c0dd33707eb9a23
2ded23e72e7140f9b25a16d8e553b4ae
RY(theta₇)
396bd1c374b749bd8c0dd33707eb9a23--2ded23e72e7140f9b25a16d8e553b4ae
0bd81140c063485e807481ecd8e40374
RX(theta₁₁)
2ded23e72e7140f9b25a16d8e553b4ae--0bd81140c063485e807481ecd8e40374
9a773419790b4fb48fdbe28e96b51604
X
0bd81140c063485e807481ecd8e40374--9a773419790b4fb48fdbe28e96b51604
9a773419790b4fb48fdbe28e96b51604--d212f3d712ee40ff9c5dd1018247905b
9d52bad1fd9845feaaac43b42eaa31f0
9a773419790b4fb48fdbe28e96b51604--9d52bad1fd9845feaaac43b42eaa31f0
258547f386c94be793be047c8ea68f1d
RX(theta₁₅)
9d52bad1fd9845feaaac43b42eaa31f0--258547f386c94be793be047c8ea68f1d
7f36cc266909468bbc53f21c48b83f5f
RY(theta₁₉)
258547f386c94be793be047c8ea68f1d--7f36cc266909468bbc53f21c48b83f5f
6ead6ecea45e4c0d9a1af451a832ef4d
RX(theta₂₃)
7f36cc266909468bbc53f21c48b83f5f--6ead6ecea45e4c0d9a1af451a832ef4d
35efbbea752644f2aee9c2938117326b
X
6ead6ecea45e4c0d9a1af451a832ef4d--35efbbea752644f2aee9c2938117326b
35efbbea752644f2aee9c2938117326b--b9713a9f39ab4b769a5b03520cbd3511
4dbf7aa142da4847b586b7d93473fb2a
35efbbea752644f2aee9c2938117326b--4dbf7aa142da4847b586b7d93473fb2a
4dbf7aa142da4847b586b7d93473fb2a--55708194e2984cee90ba570a09a1c08d
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_2ae0c25c5fb649ffa9b1940ea8acf5c4
Obs.
cluster_dba5fe2a99bc4cef8466a1674fbc1c36
cluster_11ecd2d0998547f2b322b6d573f5cd46
Tower Chebyshev FM
cluster_52cf9fcf61b1438e9edde97ad8edec59
Tower Chebyshev FM
cluster_9e71fd3da567471cb69148cb2f889eb5
HEA
96ad845ffec54681abe90a7f296eeb19
0
062dfc2e5f73465484e5506cd406f56b
RX(1.0*acos(x))
96ad845ffec54681abe90a7f296eeb19--062dfc2e5f73465484e5506cd406f56b
878a0656d0f648d691728d20fadac2d3
1
0a05c1a3505b48a8b3e6f2a41e176685
RX(theta₀)
062dfc2e5f73465484e5506cd406f56b--0a05c1a3505b48a8b3e6f2a41e176685
671d473fb20e4b3bae5eb8e19c87f4aa
RY(theta₄)
0a05c1a3505b48a8b3e6f2a41e176685--671d473fb20e4b3bae5eb8e19c87f4aa
829cce0c3545494b9c17bfe84cb15954
RX(theta₈)
671d473fb20e4b3bae5eb8e19c87f4aa--829cce0c3545494b9c17bfe84cb15954
761ff8ae43ce4c92a6d9f07c38b47476
829cce0c3545494b9c17bfe84cb15954--761ff8ae43ce4c92a6d9f07c38b47476
9f26b74b324347e98840ac647614350d
761ff8ae43ce4c92a6d9f07c38b47476--9f26b74b324347e98840ac647614350d
5a137f26bc024615aff618b5d02456c3
RX(theta₁₂)
9f26b74b324347e98840ac647614350d--5a137f26bc024615aff618b5d02456c3
b94f8e69096e40cbbdc809810893ca2d
RY(theta₁₆)
5a137f26bc024615aff618b5d02456c3--b94f8e69096e40cbbdc809810893ca2d
531e12201a4a4474a080ae9ff2592d25
RX(theta₂₀)
b94f8e69096e40cbbdc809810893ca2d--531e12201a4a4474a080ae9ff2592d25
0217b02ec06244abafdd5a3c5d085e7a
531e12201a4a4474a080ae9ff2592d25--0217b02ec06244abafdd5a3c5d085e7a
fddb9358ea9a4edea1b90cca3a95e30a
0217b02ec06244abafdd5a3c5d085e7a--fddb9358ea9a4edea1b90cca3a95e30a
72cf8f56476c4c7a9bf67e4d70f9c3ef
fddb9358ea9a4edea1b90cca3a95e30a--72cf8f56476c4c7a9bf67e4d70f9c3ef
bc6b03faeac74e3d9c5ec0737956d6bc
72cf8f56476c4c7a9bf67e4d70f9c3ef--bc6b03faeac74e3d9c5ec0737956d6bc
04e68e2a54cd43b88be77467fe37b48a
b3c6db2a8368400590407155d685dcdb
RX(2.0*acos(x))
878a0656d0f648d691728d20fadac2d3--b3c6db2a8368400590407155d685dcdb
c190d2c7c74b47b8bc20783ff5c66ac3
2
a7560d9b163843ccb4e03a62d0f88f47
RX(theta₁)
b3c6db2a8368400590407155d685dcdb--a7560d9b163843ccb4e03a62d0f88f47
2c5181f09be744ac9c015c08ae0a9e5d
RY(theta₅)
a7560d9b163843ccb4e03a62d0f88f47--2c5181f09be744ac9c015c08ae0a9e5d
7ebc8ba4aa154d7d895dfda02589de6f
RX(theta₉)
2c5181f09be744ac9c015c08ae0a9e5d--7ebc8ba4aa154d7d895dfda02589de6f
e907e95c82ae4d19929b3a56d7468c3e
X
7ebc8ba4aa154d7d895dfda02589de6f--e907e95c82ae4d19929b3a56d7468c3e
e907e95c82ae4d19929b3a56d7468c3e--761ff8ae43ce4c92a6d9f07c38b47476
127ff6836eb64f69a2b40ed871712a1f
e907e95c82ae4d19929b3a56d7468c3e--127ff6836eb64f69a2b40ed871712a1f
1cd6e9c47d934b399c2a97a095f95ca3
RX(theta₁₃)
127ff6836eb64f69a2b40ed871712a1f--1cd6e9c47d934b399c2a97a095f95ca3
832e788024a94fb6acd7cbea3fb6b18f
RY(theta₁₇)
1cd6e9c47d934b399c2a97a095f95ca3--832e788024a94fb6acd7cbea3fb6b18f
2c31d69c2da8449e9a2e11758f14a7a3
RX(theta₂₁)
832e788024a94fb6acd7cbea3fb6b18f--2c31d69c2da8449e9a2e11758f14a7a3
7a7dda2cde9f4cfebdafe32d9ac15be5
X
2c31d69c2da8449e9a2e11758f14a7a3--7a7dda2cde9f4cfebdafe32d9ac15be5
7a7dda2cde9f4cfebdafe32d9ac15be5--0217b02ec06244abafdd5a3c5d085e7a
9ed51fe90de241f8bdd1f1b3dc65b0f2
7a7dda2cde9f4cfebdafe32d9ac15be5--9ed51fe90de241f8bdd1f1b3dc65b0f2
95d9163657554f438c13b5806596b1bc
AddBlock
9ed51fe90de241f8bdd1f1b3dc65b0f2--95d9163657554f438c13b5806596b1bc
95d9163657554f438c13b5806596b1bc--04e68e2a54cd43b88be77467fe37b48a
a0461be0e1cc499da4b762d586a21b24
d62fca460d9f44f0a932643654ebe0c2
RX(1.0*acos(2.0*y - 1.0))
c190d2c7c74b47b8bc20783ff5c66ac3--d62fca460d9f44f0a932643654ebe0c2
01270aa2b2994aa5b52f85593871b24a
3
e4ee6d3f492c4ad99b72a10e96027c7a
RX(theta₂)
d62fca460d9f44f0a932643654ebe0c2--e4ee6d3f492c4ad99b72a10e96027c7a
98fd911ac9bc4e4d905ce20ce99f5ef2
RY(theta₆)
e4ee6d3f492c4ad99b72a10e96027c7a--98fd911ac9bc4e4d905ce20ce99f5ef2
dc2adaaaeb064596939d9dabe57f4b11
RX(theta₁₀)
98fd911ac9bc4e4d905ce20ce99f5ef2--dc2adaaaeb064596939d9dabe57f4b11
5b3ee4b1f0bb4ffd88065759c8ab0a2f
dc2adaaaeb064596939d9dabe57f4b11--5b3ee4b1f0bb4ffd88065759c8ab0a2f
07378070713c4feab26a9f337c1b79d1
X
5b3ee4b1f0bb4ffd88065759c8ab0a2f--07378070713c4feab26a9f337c1b79d1
07378070713c4feab26a9f337c1b79d1--127ff6836eb64f69a2b40ed871712a1f
6244c6da2bfd4c44b038f39820db1944
RX(theta₁₄)
07378070713c4feab26a9f337c1b79d1--6244c6da2bfd4c44b038f39820db1944
84e623e23f4c4799991557bcd61f27e5
RY(theta₁₈)
6244c6da2bfd4c44b038f39820db1944--84e623e23f4c4799991557bcd61f27e5
a38f3fcd775743d0aa9f432dcfb13df4
RX(theta₂₂)
84e623e23f4c4799991557bcd61f27e5--a38f3fcd775743d0aa9f432dcfb13df4
689a7454516540eba0b175ab0f82b1ea
a38f3fcd775743d0aa9f432dcfb13df4--689a7454516540eba0b175ab0f82b1ea
eca17e29323b41d4a006a7ae0e36a4db
X
689a7454516540eba0b175ab0f82b1ea--eca17e29323b41d4a006a7ae0e36a4db
eca17e29323b41d4a006a7ae0e36a4db--9ed51fe90de241f8bdd1f1b3dc65b0f2
e394118c7ed74e7f938c5ba46ac5daaf
eca17e29323b41d4a006a7ae0e36a4db--e394118c7ed74e7f938c5ba46ac5daaf
e394118c7ed74e7f938c5ba46ac5daaf--a0461be0e1cc499da4b762d586a21b24
364ff7b1e1494fe18cc2d6e5967b5cda
a160ffb5df7c428f86fb9f44c1e4649d
RX(2.0*acos(2.0*y - 1.0))
01270aa2b2994aa5b52f85593871b24a--a160ffb5df7c428f86fb9f44c1e4649d
218dfa10b88d48ee8a12817870ad3b21
RX(theta₃)
a160ffb5df7c428f86fb9f44c1e4649d--218dfa10b88d48ee8a12817870ad3b21
de5a519bbdf248acbb451dc8ca0b75a4
RY(theta₇)
218dfa10b88d48ee8a12817870ad3b21--de5a519bbdf248acbb451dc8ca0b75a4
455b7067e3cc431fb4d4d397578678bf
RX(theta₁₁)
de5a519bbdf248acbb451dc8ca0b75a4--455b7067e3cc431fb4d4d397578678bf
09594b7bc784416384b3b933def751df
X
455b7067e3cc431fb4d4d397578678bf--09594b7bc784416384b3b933def751df
09594b7bc784416384b3b933def751df--5b3ee4b1f0bb4ffd88065759c8ab0a2f
99b31a8ac3ab426c95a6cb8504e0dd88
09594b7bc784416384b3b933def751df--99b31a8ac3ab426c95a6cb8504e0dd88
959087d27b3c4321bcd05ba96c5d22f3
RX(theta₁₅)
99b31a8ac3ab426c95a6cb8504e0dd88--959087d27b3c4321bcd05ba96c5d22f3
26872e37c4374f80ac6be270e347437f
RY(theta₁₉)
959087d27b3c4321bcd05ba96c5d22f3--26872e37c4374f80ac6be270e347437f
4b35d136a72b45f1add453e4fc13707d
RX(theta₂₃)
26872e37c4374f80ac6be270e347437f--4b35d136a72b45f1add453e4fc13707d
db13b598629744b9984c15fee21d6e31
X
4b35d136a72b45f1add453e4fc13707d--db13b598629744b9984c15fee21d6e31
db13b598629744b9984c15fee21d6e31--689a7454516540eba0b175ab0f82b1ea
a208f5c55887419089584be67d6557e3
db13b598629744b9984c15fee21d6e31--a208f5c55887419089584be67d6557e3
232aa790f07c46298b4e387e89ae5712
a208f5c55887419089584be67d6557e3--232aa790f07c46298b4e387e89ae5712
232aa790f07c46298b4e387e89ae5712--364ff7b1e1494fe18cc2d6e5967b5cda