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