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_c1ec82fcc86f465189ebea5ced0c55c9
ffeeb6bec4ba4415bbf1c133ff633ff5
0
55079d03caba45198647f63d0c77c263
ffeeb6bec4ba4415bbf1c133ff633ff5--55079d03caba45198647f63d0c77c263
f1b251b71f854523b3654da965ddea51
1
7363f721c3484a848904727a400faba3
55079d03caba45198647f63d0c77c263--7363f721c3484a848904727a400faba3
1887758f172f4fe58f28a5171836c708
4a3a158e9c9f4140918502a5da44cb29
AddBlock
f1b251b71f854523b3654da965ddea51--4a3a158e9c9f4140918502a5da44cb29
2c808ca94570412ba79da19bd011e7fa
2
4a3a158e9c9f4140918502a5da44cb29--1887758f172f4fe58f28a5171836c708
77ad8cdade4c4073b217459d28323b52
fae3db09f3a848f8984bc3b23190d82e
2c808ca94570412ba79da19bd011e7fa--fae3db09f3a848f8984bc3b23190d82e
7404f27d7de14477ac1cc6f62d21f78d
3
fae3db09f3a848f8984bc3b23190d82e--77ad8cdade4c4073b217459d28323b52
1da5a10b0bda45c6bf4f6bf96a3a2b5f
033dbd2a8d38483cb0e2335d5a175908
7404f27d7de14477ac1cc6f62d21f78d--033dbd2a8d38483cb0e2335d5a175908
033dbd2a8d38483cb0e2335d5a175908--1da5a10b0bda45c6bf4f6bf96a3a2b5f
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_d0e91c4d52f64a229993c78bc3f8802e
Tower Chebyshev FM
cluster_337b62a949e54f41844fe3872366f38a
Tower Chebyshev FM
4b5e974a5c644e71a2c8b62801646b8d
0
acf1d752623a48d2aeec371fde7f92a5
RX(1.0*acos(x))
4b5e974a5c644e71a2c8b62801646b8d--acf1d752623a48d2aeec371fde7f92a5
bb9b36a993f1476fa92ce6a8d77cac0d
1
6d00a515abc94143a283ccbf6564beb3
acf1d752623a48d2aeec371fde7f92a5--6d00a515abc94143a283ccbf6564beb3
436e0ae011214c9582d3bd3f95992c9d
3145e7b9decd4200b809f9eaf0550e35
RX(2.0*acos(x))
bb9b36a993f1476fa92ce6a8d77cac0d--3145e7b9decd4200b809f9eaf0550e35
7669983db1364a6ca7bec3cbc4da1bb7
2
3145e7b9decd4200b809f9eaf0550e35--436e0ae011214c9582d3bd3f95992c9d
b5ef2904713742f49e16af843c7e9a42
fe616d312c51473bbe8218d9eb304c70
RX(1.0*acos(2.0*y - 1.0))
7669983db1364a6ca7bec3cbc4da1bb7--fe616d312c51473bbe8218d9eb304c70
a25fdd61353e4cf4a21747708e8441fa
3
fe616d312c51473bbe8218d9eb304c70--b5ef2904713742f49e16af843c7e9a42
e8d633397da74104840ef4adf8c88e3f
8367f23bc8614421ba54429b94eb8d9b
RX(2.0*acos(2.0*y - 1.0))
a25fdd61353e4cf4a21747708e8441fa--8367f23bc8614421ba54429b94eb8d9b
8367f23bc8614421ba54429b94eb8d9b--e8d633397da74104840ef4adf8c88e3f
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
c4ef82016a704010bd1ca5ae73cbc991
0
74c7d82ead02418d9089a87226f0dfc5
RX(theta₀)
c4ef82016a704010bd1ca5ae73cbc991--74c7d82ead02418d9089a87226f0dfc5
23e6d46741d14285bd603c0023726b0f
1
0982461b460f4f2fa1f02c1416a94b8b
RY(theta₄)
74c7d82ead02418d9089a87226f0dfc5--0982461b460f4f2fa1f02c1416a94b8b
f7a5219314cf4c3aba5620306cfcfdc0
RX(theta₈)
0982461b460f4f2fa1f02c1416a94b8b--f7a5219314cf4c3aba5620306cfcfdc0
7687adff4ab84c4ea47d5dee5303f937
f7a5219314cf4c3aba5620306cfcfdc0--7687adff4ab84c4ea47d5dee5303f937
3da08587825d49b492e3014dca4977a4
7687adff4ab84c4ea47d5dee5303f937--3da08587825d49b492e3014dca4977a4
179b7948194b49788d36effa45a157e5
RX(theta₁₂)
3da08587825d49b492e3014dca4977a4--179b7948194b49788d36effa45a157e5
a48c59bce08046bdae051eb3e972448b
RY(theta₁₆)
179b7948194b49788d36effa45a157e5--a48c59bce08046bdae051eb3e972448b
f2ad1d23fe2943489278fcc41ab5a2ec
RX(theta₂₀)
a48c59bce08046bdae051eb3e972448b--f2ad1d23fe2943489278fcc41ab5a2ec
cb2de95ba6ad49fbb84c9a555e4c4bde
f2ad1d23fe2943489278fcc41ab5a2ec--cb2de95ba6ad49fbb84c9a555e4c4bde
81b34b93c2ba400aa811cc64388f4013
cb2de95ba6ad49fbb84c9a555e4c4bde--81b34b93c2ba400aa811cc64388f4013
7c09fae1f746455f940552925e2712fe
81b34b93c2ba400aa811cc64388f4013--7c09fae1f746455f940552925e2712fe
758972f2064f448d80cf3409fc95ed9b
e21a88472a364007a72afaab29f3207e
RX(theta₁)
23e6d46741d14285bd603c0023726b0f--e21a88472a364007a72afaab29f3207e
495171bf620e4ab09fb07095fccc8310
2
c24362a64f6c4591b661d6cabb025f67
RY(theta₅)
e21a88472a364007a72afaab29f3207e--c24362a64f6c4591b661d6cabb025f67
9ca7b788adf2407385be5d4afc3747b0
RX(theta₉)
c24362a64f6c4591b661d6cabb025f67--9ca7b788adf2407385be5d4afc3747b0
f726a626c34a4d21bc1151d0691fd288
X
9ca7b788adf2407385be5d4afc3747b0--f726a626c34a4d21bc1151d0691fd288
f726a626c34a4d21bc1151d0691fd288--7687adff4ab84c4ea47d5dee5303f937
ae5b8eae61ef45fd9c3b29c817684bbe
f726a626c34a4d21bc1151d0691fd288--ae5b8eae61ef45fd9c3b29c817684bbe
4924c1613f004f7f8e53a2a30df336af
RX(theta₁₃)
ae5b8eae61ef45fd9c3b29c817684bbe--4924c1613f004f7f8e53a2a30df336af
1486632794a340ebbbfc692636e9e251
RY(theta₁₇)
4924c1613f004f7f8e53a2a30df336af--1486632794a340ebbbfc692636e9e251
e6775dddfba941bf96e5fdab8fefc512
RX(theta₂₁)
1486632794a340ebbbfc692636e9e251--e6775dddfba941bf96e5fdab8fefc512
37de672d72864ff8a1fca6960c503507
X
e6775dddfba941bf96e5fdab8fefc512--37de672d72864ff8a1fca6960c503507
37de672d72864ff8a1fca6960c503507--cb2de95ba6ad49fbb84c9a555e4c4bde
7bc0823017374c9a8fc8107a4b640f65
37de672d72864ff8a1fca6960c503507--7bc0823017374c9a8fc8107a4b640f65
7bc0823017374c9a8fc8107a4b640f65--758972f2064f448d80cf3409fc95ed9b
b581fd0c1251463d99d40bab11c124fc
bf9a33f949f442ff95f520c653d8a212
RX(theta₂)
495171bf620e4ab09fb07095fccc8310--bf9a33f949f442ff95f520c653d8a212
1f983ec7f9b841b4b801190937ab9664
3
2c25ea67a2e548c6af27c471eaeb1f6b
RY(theta₆)
bf9a33f949f442ff95f520c653d8a212--2c25ea67a2e548c6af27c471eaeb1f6b
16d97bbbc855468dba003a055f566765
RX(theta₁₀)
2c25ea67a2e548c6af27c471eaeb1f6b--16d97bbbc855468dba003a055f566765
e6de68b38f824cd88174a0c66089f6d8
16d97bbbc855468dba003a055f566765--e6de68b38f824cd88174a0c66089f6d8
5b88ec20971e4a459e4e4926a4ab346c
X
e6de68b38f824cd88174a0c66089f6d8--5b88ec20971e4a459e4e4926a4ab346c
5b88ec20971e4a459e4e4926a4ab346c--ae5b8eae61ef45fd9c3b29c817684bbe
7e4119e60afd49b895fcac9911961c18
RX(theta₁₄)
5b88ec20971e4a459e4e4926a4ab346c--7e4119e60afd49b895fcac9911961c18
f40a106d66e843adb57895da591e4b75
RY(theta₁₈)
7e4119e60afd49b895fcac9911961c18--f40a106d66e843adb57895da591e4b75
32b913ab21f84ea3863b9edd9b1bcfb8
RX(theta₂₂)
f40a106d66e843adb57895da591e4b75--32b913ab21f84ea3863b9edd9b1bcfb8
b256d86f5c6b4b49a2d6312014511442
32b913ab21f84ea3863b9edd9b1bcfb8--b256d86f5c6b4b49a2d6312014511442
b4880f88c35c41ccb896215413850773
X
b256d86f5c6b4b49a2d6312014511442--b4880f88c35c41ccb896215413850773
b4880f88c35c41ccb896215413850773--7bc0823017374c9a8fc8107a4b640f65
b4880f88c35c41ccb896215413850773--b581fd0c1251463d99d40bab11c124fc
d1385e7bee974644b442d621bce3fc69
a3d171e7f4fc43d6864de1e1930b7b2a
RX(theta₃)
1f983ec7f9b841b4b801190937ab9664--a3d171e7f4fc43d6864de1e1930b7b2a
69bb6fb5c66946168e78bb78a80cc158
RY(theta₇)
a3d171e7f4fc43d6864de1e1930b7b2a--69bb6fb5c66946168e78bb78a80cc158
975a1218617d4100a2d81b7c277d28c2
RX(theta₁₁)
69bb6fb5c66946168e78bb78a80cc158--975a1218617d4100a2d81b7c277d28c2
6a75c4ec18e243a7af70f3aa84e2515e
X
975a1218617d4100a2d81b7c277d28c2--6a75c4ec18e243a7af70f3aa84e2515e
6a75c4ec18e243a7af70f3aa84e2515e--e6de68b38f824cd88174a0c66089f6d8
39b8c6e654fa4e0da89cd90682e4f15e
6a75c4ec18e243a7af70f3aa84e2515e--39b8c6e654fa4e0da89cd90682e4f15e
9b68c8f4d94f4e25809236eaa30a49f9
RX(theta₁₅)
39b8c6e654fa4e0da89cd90682e4f15e--9b68c8f4d94f4e25809236eaa30a49f9
3ca1b67ad78a4f2f98c5d51c4b9d221d
RY(theta₁₉)
9b68c8f4d94f4e25809236eaa30a49f9--3ca1b67ad78a4f2f98c5d51c4b9d221d
df34927a2cef450188bf9be7d27e19d0
RX(theta₂₃)
3ca1b67ad78a4f2f98c5d51c4b9d221d--df34927a2cef450188bf9be7d27e19d0
5884af6b97f64ec9843e562f9f7f3fca
X
df34927a2cef450188bf9be7d27e19d0--5884af6b97f64ec9843e562f9f7f3fca
5884af6b97f64ec9843e562f9f7f3fca--b256d86f5c6b4b49a2d6312014511442
61f41d586de04bd1838ebf02ab62c117
5884af6b97f64ec9843e562f9f7f3fca--61f41d586de04bd1838ebf02ab62c117
61f41d586de04bd1838ebf02ab62c117--d1385e7bee974644b442d621bce3fc69
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_ae483346c7e649068a1583bfe7a7a3d7
Obs.
cluster_28bf3b24a3a1474d859352ede17ba327
cluster_78caaaf669394773865bb622ca95d180
Tower Chebyshev FM
cluster_063acf492a3b429f90fb8e71907b0d7c
Tower Chebyshev FM
cluster_ee817ad07aa243489210356510482a37
HEA
903cb19ab0334b89a59078db721aaad5
0
dd35440b45d04c7691e04f55c1af05ad
RX(1.0*acos(x))
903cb19ab0334b89a59078db721aaad5--dd35440b45d04c7691e04f55c1af05ad
7ca5ec157c6d464faf9304febeaf525b
1
4b6e589dad37408fa18b7c8c217fafc2
RX(theta₀)
dd35440b45d04c7691e04f55c1af05ad--4b6e589dad37408fa18b7c8c217fafc2
2d1f74200f4b4cfc85c72ef4ed755eb5
RY(theta₄)
4b6e589dad37408fa18b7c8c217fafc2--2d1f74200f4b4cfc85c72ef4ed755eb5
44eb49d44f0b4ba7bd121aefdf8eb5ef
RX(theta₈)
2d1f74200f4b4cfc85c72ef4ed755eb5--44eb49d44f0b4ba7bd121aefdf8eb5ef
3980669eb56a4da2bd824a71c6d6d65a
44eb49d44f0b4ba7bd121aefdf8eb5ef--3980669eb56a4da2bd824a71c6d6d65a
0580a8f299304c01add3731aabf105af
3980669eb56a4da2bd824a71c6d6d65a--0580a8f299304c01add3731aabf105af
26aa101f67284630bdd4622e5e8712e6
RX(theta₁₂)
0580a8f299304c01add3731aabf105af--26aa101f67284630bdd4622e5e8712e6
faf8e30ad29540e2a50564f153cba31d
RY(theta₁₆)
26aa101f67284630bdd4622e5e8712e6--faf8e30ad29540e2a50564f153cba31d
0d3753bdadde48c5bad3f0bca8da6fce
RX(theta₂₀)
faf8e30ad29540e2a50564f153cba31d--0d3753bdadde48c5bad3f0bca8da6fce
a41911278b42494cb55b4b745d0d06d3
0d3753bdadde48c5bad3f0bca8da6fce--a41911278b42494cb55b4b745d0d06d3
fe7cab1097d545c7ac06641f2a2053bc
a41911278b42494cb55b4b745d0d06d3--fe7cab1097d545c7ac06641f2a2053bc
925915a2d82a42319ea48adba34557a8
fe7cab1097d545c7ac06641f2a2053bc--925915a2d82a42319ea48adba34557a8
54f72f10fb0841e9acc9ed3f41e4e19d
925915a2d82a42319ea48adba34557a8--54f72f10fb0841e9acc9ed3f41e4e19d
7fb686a356154a399677d62f6acacbf2
7d0e85cef8be47b89d11712ff8d6ebe7
RX(2.0*acos(x))
7ca5ec157c6d464faf9304febeaf525b--7d0e85cef8be47b89d11712ff8d6ebe7
fcde79a9e0634c5ba56c2d4e93a79976
2
9324c00a22134c7595deacb380f7b4b9
RX(theta₁)
7d0e85cef8be47b89d11712ff8d6ebe7--9324c00a22134c7595deacb380f7b4b9
762b31f4ff8f4032907af56765593ef0
RY(theta₅)
9324c00a22134c7595deacb380f7b4b9--762b31f4ff8f4032907af56765593ef0
f6d72c77303e4d48affcbfe8f5f35cae
RX(theta₉)
762b31f4ff8f4032907af56765593ef0--f6d72c77303e4d48affcbfe8f5f35cae
1cf7a93106f54f359bda46edceba20d1
X
f6d72c77303e4d48affcbfe8f5f35cae--1cf7a93106f54f359bda46edceba20d1
1cf7a93106f54f359bda46edceba20d1--3980669eb56a4da2bd824a71c6d6d65a
7b4df0beb4954fd481b4feb160eebca6
1cf7a93106f54f359bda46edceba20d1--7b4df0beb4954fd481b4feb160eebca6
125d9609133f426f821197213bf1e299
RX(theta₁₃)
7b4df0beb4954fd481b4feb160eebca6--125d9609133f426f821197213bf1e299
dce5fa45c00a474ca686903972820b94
RY(theta₁₇)
125d9609133f426f821197213bf1e299--dce5fa45c00a474ca686903972820b94
37e491d95f6c44d7973eff6887b00b51
RX(theta₂₁)
dce5fa45c00a474ca686903972820b94--37e491d95f6c44d7973eff6887b00b51
8f979bff3562421e9e4ebed6df6d5aad
X
37e491d95f6c44d7973eff6887b00b51--8f979bff3562421e9e4ebed6df6d5aad
8f979bff3562421e9e4ebed6df6d5aad--a41911278b42494cb55b4b745d0d06d3
c24293f254ff4878913b89b20c26554a
8f979bff3562421e9e4ebed6df6d5aad--c24293f254ff4878913b89b20c26554a
3b8ef85f7afc4d609f1ee4de02c16b50
AddBlock
c24293f254ff4878913b89b20c26554a--3b8ef85f7afc4d609f1ee4de02c16b50
3b8ef85f7afc4d609f1ee4de02c16b50--7fb686a356154a399677d62f6acacbf2
12c2cea404d4485da72f7c005c2ef86f
f5e46390657b49c48ccedb4130f8bf05
RX(1.0*acos(2.0*y - 1.0))
fcde79a9e0634c5ba56c2d4e93a79976--f5e46390657b49c48ccedb4130f8bf05
c12670f580114f3c84f327f05cd043a5
3
ca594d71249b4accb629d622d384b3f4
RX(theta₂)
f5e46390657b49c48ccedb4130f8bf05--ca594d71249b4accb629d622d384b3f4
fb2242007759454c83a2f5c91f5de3d7
RY(theta₆)
ca594d71249b4accb629d622d384b3f4--fb2242007759454c83a2f5c91f5de3d7
a0569d4d70dd412a97238037fe52c8fe
RX(theta₁₀)
fb2242007759454c83a2f5c91f5de3d7--a0569d4d70dd412a97238037fe52c8fe
4d1537ad14614a4ca9a60d95206f76c0
a0569d4d70dd412a97238037fe52c8fe--4d1537ad14614a4ca9a60d95206f76c0
d70d8b9d9b964136803bab279bcdab55
X
4d1537ad14614a4ca9a60d95206f76c0--d70d8b9d9b964136803bab279bcdab55
d70d8b9d9b964136803bab279bcdab55--7b4df0beb4954fd481b4feb160eebca6
95615046e603486fafc6f6a32160b6b1
RX(theta₁₄)
d70d8b9d9b964136803bab279bcdab55--95615046e603486fafc6f6a32160b6b1
74e0c8652a7c483eb7d62df411e768f9
RY(theta₁₈)
95615046e603486fafc6f6a32160b6b1--74e0c8652a7c483eb7d62df411e768f9
bdd3c117f52e409f95b9c231031f2c9f
RX(theta₂₂)
74e0c8652a7c483eb7d62df411e768f9--bdd3c117f52e409f95b9c231031f2c9f
8fcbd58cfc2045858c0e9ae024305bf8
bdd3c117f52e409f95b9c231031f2c9f--8fcbd58cfc2045858c0e9ae024305bf8
a9c157ac582e46248acccb210809bc19
X
8fcbd58cfc2045858c0e9ae024305bf8--a9c157ac582e46248acccb210809bc19
a9c157ac582e46248acccb210809bc19--c24293f254ff4878913b89b20c26554a
74c126f1f3c54e41a8aacc771a512d77
a9c157ac582e46248acccb210809bc19--74c126f1f3c54e41a8aacc771a512d77
74c126f1f3c54e41a8aacc771a512d77--12c2cea404d4485da72f7c005c2ef86f
b51d6b58aee24859a5f0bcf4c08fd998
b5cc317eb2a840d58f04a7ff19e9e27b
RX(2.0*acos(2.0*y - 1.0))
c12670f580114f3c84f327f05cd043a5--b5cc317eb2a840d58f04a7ff19e9e27b
ae5a373f63564f95ad56d8eb92e5cac1
RX(theta₃)
b5cc317eb2a840d58f04a7ff19e9e27b--ae5a373f63564f95ad56d8eb92e5cac1
09098619b0f34134b2532903d4a7252b
RY(theta₇)
ae5a373f63564f95ad56d8eb92e5cac1--09098619b0f34134b2532903d4a7252b
35674a765fea484898cded616dd6a471
RX(theta₁₁)
09098619b0f34134b2532903d4a7252b--35674a765fea484898cded616dd6a471
f2b4976b584b48f596cceade1aedd956
X
35674a765fea484898cded616dd6a471--f2b4976b584b48f596cceade1aedd956
f2b4976b584b48f596cceade1aedd956--4d1537ad14614a4ca9a60d95206f76c0
9cc90b20410a4df080acf3389a9a6503
f2b4976b584b48f596cceade1aedd956--9cc90b20410a4df080acf3389a9a6503
2f0fa51df71a41a8ac34f1ed14ca3c9c
RX(theta₁₅)
9cc90b20410a4df080acf3389a9a6503--2f0fa51df71a41a8ac34f1ed14ca3c9c
4471b2d94b984abe83d0a72446a39e36
RY(theta₁₉)
2f0fa51df71a41a8ac34f1ed14ca3c9c--4471b2d94b984abe83d0a72446a39e36
d4e77d5fbba1438aaa72743b177ddcf9
RX(theta₂₃)
4471b2d94b984abe83d0a72446a39e36--d4e77d5fbba1438aaa72743b177ddcf9
ee67a8fea1894053a48246706b1696a1
X
d4e77d5fbba1438aaa72743b177ddcf9--ee67a8fea1894053a48246706b1696a1
ee67a8fea1894053a48246706b1696a1--8fcbd58cfc2045858c0e9ae024305bf8
674f22b67ee54a01b621e7da49d194d0
ee67a8fea1894053a48246706b1696a1--674f22b67ee54a01b621e7da49d194d0
34de5e87a2664c979a51fc6391a8bf35
674f22b67ee54a01b621e7da49d194d0--34de5e87a2664c979a51fc6391a8bf35
34de5e87a2664c979a51fc6391a8bf35--b51d6b58aee24859a5f0bcf4c08fd998