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_23c635ce8c064af79fe9aabd69989cea
d8ed892cc16740ca9c775676ad5920fb
0
ed19512853b448aab00f1b58e2d175bc
d8ed892cc16740ca9c775676ad5920fb--ed19512853b448aab00f1b58e2d175bc
6ba0dbf014264b439bca5484f56b2bca
1
1df0df0ac48d44318bbefc5f95ea3305
ed19512853b448aab00f1b58e2d175bc--1df0df0ac48d44318bbefc5f95ea3305
b894c0cb751c43e8beb96f3cfe3fc533
4efbaef58e9f4943b743570aab81e306
AddBlock
6ba0dbf014264b439bca5484f56b2bca--4efbaef58e9f4943b743570aab81e306
40274168da7045ad8597e726df3c8a2d
2
4efbaef58e9f4943b743570aab81e306--b894c0cb751c43e8beb96f3cfe3fc533
4fc45e4feed64a13bc6d97302940a094
a31f2f28ad6744289e735024beb766dd
40274168da7045ad8597e726df3c8a2d--a31f2f28ad6744289e735024beb766dd
3debc8c7358a48ccae15cd3b9058a519
3
a31f2f28ad6744289e735024beb766dd--4fc45e4feed64a13bc6d97302940a094
5c69e40b161b4dcabf2442af0706aabd
00e3ac6499474aadbb7edc4024a42e28
3debc8c7358a48ccae15cd3b9058a519--00e3ac6499474aadbb7edc4024a42e28
00e3ac6499474aadbb7edc4024a42e28--5c69e40b161b4dcabf2442af0706aabd
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_95f10bab328c4442827a28240ef3e9a6
Tower Chebyshev FM
cluster_cf2ba0603a2a445081b9c084ea30eabb
Tower Chebyshev FM
f3e9a2a9dd3d41f9ad68000d1050d659
0
0335705fde79417692715ac341b0ebde
RX(1.0*acos(x))
f3e9a2a9dd3d41f9ad68000d1050d659--0335705fde79417692715ac341b0ebde
a1645f0e07464c988dc07c1b6a171333
1
949c66e2f8524cfc8badec9f1fc50029
0335705fde79417692715ac341b0ebde--949c66e2f8524cfc8badec9f1fc50029
6bcfab26cc3d4a49ad4cd91326bc8d83
2ab6cfad46864578a2474d70663d1a7a
RX(2.0*acos(x))
a1645f0e07464c988dc07c1b6a171333--2ab6cfad46864578a2474d70663d1a7a
99b8682e3da744aabbd7e19d38ece39e
2
2ab6cfad46864578a2474d70663d1a7a--6bcfab26cc3d4a49ad4cd91326bc8d83
5bca698f6b7f4af0823d33a662a86dfb
7cd22c70d9d04f308878ca0b565f34ae
RX(1.0*acos(2.0*y - 1.0))
99b8682e3da744aabbd7e19d38ece39e--7cd22c70d9d04f308878ca0b565f34ae
b5bb04ce2f70431b907b6605e04aaa7e
3
7cd22c70d9d04f308878ca0b565f34ae--5bca698f6b7f4af0823d33a662a86dfb
1dd6ccc1afab4b14abb65f56edbaa9ad
eeada2c372ee43eea214958f3bdf235e
RX(2.0*acos(2.0*y - 1.0))
b5bb04ce2f70431b907b6605e04aaa7e--eeada2c372ee43eea214958f3bdf235e
eeada2c372ee43eea214958f3bdf235e--1dd6ccc1afab4b14abb65f56edbaa9ad
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
efafd248efcc4d719227e162ac934975
0
0e1c821b64da40c8b446c2b30f1d1a0e
RX(theta₀)
efafd248efcc4d719227e162ac934975--0e1c821b64da40c8b446c2b30f1d1a0e
7edd10aa64a6446dbc8c97f47354cb48
1
8bb955944db14932ba0e6d2144ab935a
RY(theta₄)
0e1c821b64da40c8b446c2b30f1d1a0e--8bb955944db14932ba0e6d2144ab935a
7039b67cef394bda885743435d1ec268
RX(theta₈)
8bb955944db14932ba0e6d2144ab935a--7039b67cef394bda885743435d1ec268
2c76c54a911147b0a630d9f47a2d6730
7039b67cef394bda885743435d1ec268--2c76c54a911147b0a630d9f47a2d6730
9ad2e4782cdd4010afe14c7b505da361
2c76c54a911147b0a630d9f47a2d6730--9ad2e4782cdd4010afe14c7b505da361
8a160c0151cd4b4ca921949dae03f63e
RX(theta₁₂)
9ad2e4782cdd4010afe14c7b505da361--8a160c0151cd4b4ca921949dae03f63e
7b0a4871183345a8b060c068bfab1dd5
RY(theta₁₆)
8a160c0151cd4b4ca921949dae03f63e--7b0a4871183345a8b060c068bfab1dd5
f4acabcf4e0749c596c0f742d86b3310
RX(theta₂₀)
7b0a4871183345a8b060c068bfab1dd5--f4acabcf4e0749c596c0f742d86b3310
7ef96ebbb98441719d4871d2774ba7a1
f4acabcf4e0749c596c0f742d86b3310--7ef96ebbb98441719d4871d2774ba7a1
97f4b8ecbd2c4bc491c53130437183a1
7ef96ebbb98441719d4871d2774ba7a1--97f4b8ecbd2c4bc491c53130437183a1
f3001fbadb0241bcbe592d00251b7aad
97f4b8ecbd2c4bc491c53130437183a1--f3001fbadb0241bcbe592d00251b7aad
e84c073958914d4b95b572be13063cc4
f350bb0538de4e6da59f89135d47e493
RX(theta₁)
7edd10aa64a6446dbc8c97f47354cb48--f350bb0538de4e6da59f89135d47e493
a667db805b424bce93645f2095a903d1
2
6b31a9c9a8bf4fd2aa134b7b01743575
RY(theta₅)
f350bb0538de4e6da59f89135d47e493--6b31a9c9a8bf4fd2aa134b7b01743575
53ed29c04e03495a9bd785311d966c6b
RX(theta₉)
6b31a9c9a8bf4fd2aa134b7b01743575--53ed29c04e03495a9bd785311d966c6b
18fde677021c42c78e5d1ee32db77900
X
53ed29c04e03495a9bd785311d966c6b--18fde677021c42c78e5d1ee32db77900
18fde677021c42c78e5d1ee32db77900--2c76c54a911147b0a630d9f47a2d6730
3dbc32944ee041bebc329fc0ac712546
18fde677021c42c78e5d1ee32db77900--3dbc32944ee041bebc329fc0ac712546
2dfef6e87f514600ab552f66237b2661
RX(theta₁₃)
3dbc32944ee041bebc329fc0ac712546--2dfef6e87f514600ab552f66237b2661
99a0b71a1ad946108e0adc12aecdd967
RY(theta₁₇)
2dfef6e87f514600ab552f66237b2661--99a0b71a1ad946108e0adc12aecdd967
e9d426a710df485bbffb113d325aabec
RX(theta₂₁)
99a0b71a1ad946108e0adc12aecdd967--e9d426a710df485bbffb113d325aabec
5156f87d4991412cb323fba6ef6f4304
X
e9d426a710df485bbffb113d325aabec--5156f87d4991412cb323fba6ef6f4304
5156f87d4991412cb323fba6ef6f4304--7ef96ebbb98441719d4871d2774ba7a1
bfd3ba84d5684854bb161ec69361e9b5
5156f87d4991412cb323fba6ef6f4304--bfd3ba84d5684854bb161ec69361e9b5
bfd3ba84d5684854bb161ec69361e9b5--e84c073958914d4b95b572be13063cc4
e44293e6dc6b4dd791c541fdc5f949bc
09ad9d6005f34545a74361c21b6cd7fe
RX(theta₂)
a667db805b424bce93645f2095a903d1--09ad9d6005f34545a74361c21b6cd7fe
405ad6238c6e44efa3f75e75d6abdf86
3
c22ed985da434cc2a1e53790308d5af8
RY(theta₆)
09ad9d6005f34545a74361c21b6cd7fe--c22ed985da434cc2a1e53790308d5af8
f8db45e3d6c24ae88ddb6d0523e80b0c
RX(theta₁₀)
c22ed985da434cc2a1e53790308d5af8--f8db45e3d6c24ae88ddb6d0523e80b0c
636fb4951bae4de480db5ab905eacd3e
f8db45e3d6c24ae88ddb6d0523e80b0c--636fb4951bae4de480db5ab905eacd3e
c8026efc4a8442e4b320f4c99a0a80dc
X
636fb4951bae4de480db5ab905eacd3e--c8026efc4a8442e4b320f4c99a0a80dc
c8026efc4a8442e4b320f4c99a0a80dc--3dbc32944ee041bebc329fc0ac712546
6df1724ed9b148b29a3a1584da491e2e
RX(theta₁₄)
c8026efc4a8442e4b320f4c99a0a80dc--6df1724ed9b148b29a3a1584da491e2e
c19211f94d9941e8938e9fb1097a1a8f
RY(theta₁₈)
6df1724ed9b148b29a3a1584da491e2e--c19211f94d9941e8938e9fb1097a1a8f
8efb0984ff504c1cab9c68846e80c8f2
RX(theta₂₂)
c19211f94d9941e8938e9fb1097a1a8f--8efb0984ff504c1cab9c68846e80c8f2
860c9cdb4f114a269177d6141eecb063
8efb0984ff504c1cab9c68846e80c8f2--860c9cdb4f114a269177d6141eecb063
5f8508e9b4b34b06841c34b8ddfab83b
X
860c9cdb4f114a269177d6141eecb063--5f8508e9b4b34b06841c34b8ddfab83b
5f8508e9b4b34b06841c34b8ddfab83b--bfd3ba84d5684854bb161ec69361e9b5
5f8508e9b4b34b06841c34b8ddfab83b--e44293e6dc6b4dd791c541fdc5f949bc
1b57f1f54e06446b934bae2a79a2d828
c7e0b853221248788c8cbbbb9a5f1187
RX(theta₃)
405ad6238c6e44efa3f75e75d6abdf86--c7e0b853221248788c8cbbbb9a5f1187
9c70e1fd691c4bdc80db6ca7b3cea410
RY(theta₇)
c7e0b853221248788c8cbbbb9a5f1187--9c70e1fd691c4bdc80db6ca7b3cea410
e85ea83c66584ffdb6025ceb910b7a40
RX(theta₁₁)
9c70e1fd691c4bdc80db6ca7b3cea410--e85ea83c66584ffdb6025ceb910b7a40
1ebfab5c23bd409286fb2a12c2c72edc
X
e85ea83c66584ffdb6025ceb910b7a40--1ebfab5c23bd409286fb2a12c2c72edc
1ebfab5c23bd409286fb2a12c2c72edc--636fb4951bae4de480db5ab905eacd3e
8e9c790bed604e6aac234f0e19cb6717
1ebfab5c23bd409286fb2a12c2c72edc--8e9c790bed604e6aac234f0e19cb6717
e812bfa5af9b4d00a2e1c5f77e1c380a
RX(theta₁₅)
8e9c790bed604e6aac234f0e19cb6717--e812bfa5af9b4d00a2e1c5f77e1c380a
4c405db4be1b4b99bc90e7c0e84bd952
RY(theta₁₉)
e812bfa5af9b4d00a2e1c5f77e1c380a--4c405db4be1b4b99bc90e7c0e84bd952
cf9fb840906a4a619230646132a0a28d
RX(theta₂₃)
4c405db4be1b4b99bc90e7c0e84bd952--cf9fb840906a4a619230646132a0a28d
3d43af1d695d4dd48dfe7bbd5907a8cc
X
cf9fb840906a4a619230646132a0a28d--3d43af1d695d4dd48dfe7bbd5907a8cc
3d43af1d695d4dd48dfe7bbd5907a8cc--860c9cdb4f114a269177d6141eecb063
98c493f011434364acba6dfcc9334237
3d43af1d695d4dd48dfe7bbd5907a8cc--98c493f011434364acba6dfcc9334237
98c493f011434364acba6dfcc9334237--1b57f1f54e06446b934bae2a79a2d828
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_dedab20ae33c467f9def4466fd401a6c
Obs.
cluster_8cabadbfcc374f90950c689d217909c4
cluster_ba24d0dfbd5745f9a9f5efbd22a5fae2
Tower Chebyshev FM
cluster_092d057b0c2142faa3e2d83460dfd6cd
Tower Chebyshev FM
cluster_99c349fe21634774b86c0d24f99d6a41
HEA
2a47a92dc4fd4c46b8d5d4dcbac5ad33
0
76463d0db8844a3b9fab062d6d435252
RX(1.0*acos(x))
2a47a92dc4fd4c46b8d5d4dcbac5ad33--76463d0db8844a3b9fab062d6d435252
62a7175ed31445d1b446ab4d8e5dd735
1
b7d053193e894ba1aaebdf8910661ee6
RX(theta₀)
76463d0db8844a3b9fab062d6d435252--b7d053193e894ba1aaebdf8910661ee6
569b72f9e6794d50b97f8369c96c4231
RY(theta₄)
b7d053193e894ba1aaebdf8910661ee6--569b72f9e6794d50b97f8369c96c4231
0f6aebb4eb8f41bf98acd519ab592ec8
RX(theta₈)
569b72f9e6794d50b97f8369c96c4231--0f6aebb4eb8f41bf98acd519ab592ec8
4e38f90460964ef08320c41fce6c1480
0f6aebb4eb8f41bf98acd519ab592ec8--4e38f90460964ef08320c41fce6c1480
2a17180b4c2f44308aeec2fafa17a08e
4e38f90460964ef08320c41fce6c1480--2a17180b4c2f44308aeec2fafa17a08e
f76d5fb6c5ec41f79ef3f35c676c7899
RX(theta₁₂)
2a17180b4c2f44308aeec2fafa17a08e--f76d5fb6c5ec41f79ef3f35c676c7899
eab2dcb258324ecc9a28a8ed6874b24a
RY(theta₁₆)
f76d5fb6c5ec41f79ef3f35c676c7899--eab2dcb258324ecc9a28a8ed6874b24a
8fe5b9d8e3eb434e81f5ace10d792a37
RX(theta₂₀)
eab2dcb258324ecc9a28a8ed6874b24a--8fe5b9d8e3eb434e81f5ace10d792a37
a3f3868bfe6c4f829cdf1ed3ae69c875
8fe5b9d8e3eb434e81f5ace10d792a37--a3f3868bfe6c4f829cdf1ed3ae69c875
7a98f2cbb63e46528deb07e31b9a1b82
a3f3868bfe6c4f829cdf1ed3ae69c875--7a98f2cbb63e46528deb07e31b9a1b82
4818bb9e025d4d4ca9771c933bb80079
7a98f2cbb63e46528deb07e31b9a1b82--4818bb9e025d4d4ca9771c933bb80079
f253ab14860f410e9d284f503a263167
4818bb9e025d4d4ca9771c933bb80079--f253ab14860f410e9d284f503a263167
e1e6d9e9d17a4e12890295eb5b2c680b
36af8041462147e9af00c920b6e711f6
RX(2.0*acos(x))
62a7175ed31445d1b446ab4d8e5dd735--36af8041462147e9af00c920b6e711f6
ecb661db1e224613b7f3116ddab6b9c2
2
201b52566e3841e4825131762ac6a9eb
RX(theta₁)
36af8041462147e9af00c920b6e711f6--201b52566e3841e4825131762ac6a9eb
d3f370618841493f8f2ff70949144601
RY(theta₅)
201b52566e3841e4825131762ac6a9eb--d3f370618841493f8f2ff70949144601
855c361fb2fb413993092aec34e83926
RX(theta₉)
d3f370618841493f8f2ff70949144601--855c361fb2fb413993092aec34e83926
a2e40cd9a40d4797ba9d3350b0d5ec6b
X
855c361fb2fb413993092aec34e83926--a2e40cd9a40d4797ba9d3350b0d5ec6b
a2e40cd9a40d4797ba9d3350b0d5ec6b--4e38f90460964ef08320c41fce6c1480
b069a22a84ac4d8b9e9c1fecc40be71e
a2e40cd9a40d4797ba9d3350b0d5ec6b--b069a22a84ac4d8b9e9c1fecc40be71e
80fa9d5a7a694c6bacca62490d647693
RX(theta₁₃)
b069a22a84ac4d8b9e9c1fecc40be71e--80fa9d5a7a694c6bacca62490d647693
bbcceede555e4309bdf0ad8b62cc7937
RY(theta₁₇)
80fa9d5a7a694c6bacca62490d647693--bbcceede555e4309bdf0ad8b62cc7937
dc5c113afc4e45b48b7904c377ebaf56
RX(theta₂₁)
bbcceede555e4309bdf0ad8b62cc7937--dc5c113afc4e45b48b7904c377ebaf56
a5efe248d95a4ba6a20bf8d848680b77
X
dc5c113afc4e45b48b7904c377ebaf56--a5efe248d95a4ba6a20bf8d848680b77
a5efe248d95a4ba6a20bf8d848680b77--a3f3868bfe6c4f829cdf1ed3ae69c875
dad8dce898494fc59a45dc0e55780d24
a5efe248d95a4ba6a20bf8d848680b77--dad8dce898494fc59a45dc0e55780d24
d487b11a8b1949b99597cf3e80b82783
AddBlock
dad8dce898494fc59a45dc0e55780d24--d487b11a8b1949b99597cf3e80b82783
d487b11a8b1949b99597cf3e80b82783--e1e6d9e9d17a4e12890295eb5b2c680b
8a79f7338f1f43819182a92ce39bceec
4ecc164e27b9469d88f8d75afcc059b4
RX(1.0*acos(2.0*y - 1.0))
ecb661db1e224613b7f3116ddab6b9c2--4ecc164e27b9469d88f8d75afcc059b4
810f9057b24d4eb4bfe70dc2c71f372a
3
63b2f2d5c8054da5bcc795a381b48e46
RX(theta₂)
4ecc164e27b9469d88f8d75afcc059b4--63b2f2d5c8054da5bcc795a381b48e46
0cdfe880118440a1bbae5c658baa2b77
RY(theta₆)
63b2f2d5c8054da5bcc795a381b48e46--0cdfe880118440a1bbae5c658baa2b77
f39584c500704a4e85e348a8db71057e
RX(theta₁₀)
0cdfe880118440a1bbae5c658baa2b77--f39584c500704a4e85e348a8db71057e
2f4fd8cb6942451eb321192d32095d0d
f39584c500704a4e85e348a8db71057e--2f4fd8cb6942451eb321192d32095d0d
067699382d674f83b29c217f4fc30d45
X
2f4fd8cb6942451eb321192d32095d0d--067699382d674f83b29c217f4fc30d45
067699382d674f83b29c217f4fc30d45--b069a22a84ac4d8b9e9c1fecc40be71e
a37e6671c7234af0a4679a45d9864e9a
RX(theta₁₄)
067699382d674f83b29c217f4fc30d45--a37e6671c7234af0a4679a45d9864e9a
9dc83c1148b74452ba7806896d2f8dbb
RY(theta₁₈)
a37e6671c7234af0a4679a45d9864e9a--9dc83c1148b74452ba7806896d2f8dbb
e30081adf62b4683a47ec95ba12ab32a
RX(theta₂₂)
9dc83c1148b74452ba7806896d2f8dbb--e30081adf62b4683a47ec95ba12ab32a
319c9285eb2f43ca80afed38efe568d5
e30081adf62b4683a47ec95ba12ab32a--319c9285eb2f43ca80afed38efe568d5
1917d559c900491485642bd2bf864764
X
319c9285eb2f43ca80afed38efe568d5--1917d559c900491485642bd2bf864764
1917d559c900491485642bd2bf864764--dad8dce898494fc59a45dc0e55780d24
581ab27e16c748f9bff3dba2e12ad474
1917d559c900491485642bd2bf864764--581ab27e16c748f9bff3dba2e12ad474
581ab27e16c748f9bff3dba2e12ad474--8a79f7338f1f43819182a92ce39bceec
ecd5dcab3fc34835a25bf361f22dd2f7
e6ddd3c93c2144048519a7d3bf0c7079
RX(2.0*acos(2.0*y - 1.0))
810f9057b24d4eb4bfe70dc2c71f372a--e6ddd3c93c2144048519a7d3bf0c7079
b5326820c5f4434b8f5d732a6e9ab783
RX(theta₃)
e6ddd3c93c2144048519a7d3bf0c7079--b5326820c5f4434b8f5d732a6e9ab783
e3b46ce383f24bbe9a72128a49849168
RY(theta₇)
b5326820c5f4434b8f5d732a6e9ab783--e3b46ce383f24bbe9a72128a49849168
b12e36ee09c64049b63036b81fc887fa
RX(theta₁₁)
e3b46ce383f24bbe9a72128a49849168--b12e36ee09c64049b63036b81fc887fa
d17e968b8b424c8389b1cfb2b005b780
X
b12e36ee09c64049b63036b81fc887fa--d17e968b8b424c8389b1cfb2b005b780
d17e968b8b424c8389b1cfb2b005b780--2f4fd8cb6942451eb321192d32095d0d
2eb52263bb5f471a99516cba2f83f1c1
d17e968b8b424c8389b1cfb2b005b780--2eb52263bb5f471a99516cba2f83f1c1
e96e8b224773432b898682a5ed6bc3e4
RX(theta₁₅)
2eb52263bb5f471a99516cba2f83f1c1--e96e8b224773432b898682a5ed6bc3e4
3552e87cc68c4425917784bdd0ed9dfd
RY(theta₁₉)
e96e8b224773432b898682a5ed6bc3e4--3552e87cc68c4425917784bdd0ed9dfd
5f73fa13ac874bb790b29a17af4dc770
RX(theta₂₃)
3552e87cc68c4425917784bdd0ed9dfd--5f73fa13ac874bb790b29a17af4dc770
2ecba01b816b4736a4a83e5ab5aaf359
X
5f73fa13ac874bb790b29a17af4dc770--2ecba01b816b4736a4a83e5ab5aaf359
2ecba01b816b4736a4a83e5ab5aaf359--319c9285eb2f43ca80afed38efe568d5
b80da3dabda94ad486a8df4959887817
2ecba01b816b4736a4a83e5ab5aaf359--b80da3dabda94ad486a8df4959887817
7f48e5718e05426f8d33233a24fe0ff3
b80da3dabda94ad486a8df4959887817--7f48e5718e05426f8d33233a24fe0ff3
7f48e5718e05426f8d33233a24fe0ff3--ecd5dcab3fc34835a25bf361f22dd2f7