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_6ba35e62834448d68033fe5f24571aa2
ae74d46656744077a8777fa69a91b340
0
e44ee7bd7d4243cca204eec77dd7b486
ae74d46656744077a8777fa69a91b340--e44ee7bd7d4243cca204eec77dd7b486
72d9eb980aad4b5f964edf24232a2478
1
e765c4300a4a4404be64c4aced8d7604
e44ee7bd7d4243cca204eec77dd7b486--e765c4300a4a4404be64c4aced8d7604
4e0d1e2671b04b43883d8dd5c218be89
d2a55c5c7a694e1685e83c624249596e
AddBlock
72d9eb980aad4b5f964edf24232a2478--d2a55c5c7a694e1685e83c624249596e
f857ec3991fa4042955ae2ff5ab89e44
2
d2a55c5c7a694e1685e83c624249596e--4e0d1e2671b04b43883d8dd5c218be89
2b7887a3d87f445d9a95c042ec3ca7a7
631bb7aad46e40eb84ff1dd99de9e0e7
f857ec3991fa4042955ae2ff5ab89e44--631bb7aad46e40eb84ff1dd99de9e0e7
3ad46ae0ee2746d88357b578e178333e
3
631bb7aad46e40eb84ff1dd99de9e0e7--2b7887a3d87f445d9a95c042ec3ca7a7
7be2bbd543fe4a13b3233015714eb8a7
5480f040c39c470fb72b2cafb4e4c2f2
3ad46ae0ee2746d88357b578e178333e--5480f040c39c470fb72b2cafb4e4c2f2
5480f040c39c470fb72b2cafb4e4c2f2--7be2bbd543fe4a13b3233015714eb8a7
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_ad7fd5b424304a9d9a3853fe954f8aaa
Tower Chebyshev FM
cluster_c0d7afd99d9b4da5896ca4124695806a
Tower Chebyshev FM
fe1273aec74f404bae81fe3912692e9c
0
1782efc829e34536a7808ce8a5871f78
RX(1.0*acos(x))
fe1273aec74f404bae81fe3912692e9c--1782efc829e34536a7808ce8a5871f78
2e2a7afc95fa4fc7bea457e8bad479fd
1
03abb7d2b08e40cdbbb93d359d744ed0
1782efc829e34536a7808ce8a5871f78--03abb7d2b08e40cdbbb93d359d744ed0
3ada0f98e9e546a8a497ae5a23662418
395e765988c54622b9510367c2ac5ad7
RX(2.0*acos(x))
2e2a7afc95fa4fc7bea457e8bad479fd--395e765988c54622b9510367c2ac5ad7
dc0ae46d2d294635a3ee35825607f217
2
395e765988c54622b9510367c2ac5ad7--3ada0f98e9e546a8a497ae5a23662418
59d46a48e50f42c48f1787b1eebb0581
b9ded512ba914563bbc33ff428224120
RX(1.0*acos(2.0*y - 1.0))
dc0ae46d2d294635a3ee35825607f217--b9ded512ba914563bbc33ff428224120
c6da6128635e4ca49cbdcb0d3c918e4a
3
b9ded512ba914563bbc33ff428224120--59d46a48e50f42c48f1787b1eebb0581
9068317caaf9452593bd35bd48eefd9d
71c1ab31631d48d9bd14405800195d51
RX(2.0*acos(2.0*y - 1.0))
c6da6128635e4ca49cbdcb0d3c918e4a--71c1ab31631d48d9bd14405800195d51
71c1ab31631d48d9bd14405800195d51--9068317caaf9452593bd35bd48eefd9d
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
b6600e821a03415482c4a0f4b812f219
0
40c6701f7b1a46e1b8f125d48ac86908
RX(theta₀)
b6600e821a03415482c4a0f4b812f219--40c6701f7b1a46e1b8f125d48ac86908
151bf087984a47edb530d1f723360448
1
079ee660597b4fd29648c6bc16893916
RY(theta₄)
40c6701f7b1a46e1b8f125d48ac86908--079ee660597b4fd29648c6bc16893916
3bd5090b54d34b159e9523a65dff04c6
RX(theta₈)
079ee660597b4fd29648c6bc16893916--3bd5090b54d34b159e9523a65dff04c6
6566fc671c014e89a4456b39c9c0b7da
3bd5090b54d34b159e9523a65dff04c6--6566fc671c014e89a4456b39c9c0b7da
9b1b2c3cf07f45fb8626bc0c8e8f3b60
6566fc671c014e89a4456b39c9c0b7da--9b1b2c3cf07f45fb8626bc0c8e8f3b60
5b5fb6f4749f45c39f410a1663738f36
RX(theta₁₂)
9b1b2c3cf07f45fb8626bc0c8e8f3b60--5b5fb6f4749f45c39f410a1663738f36
b209d79e5dd5482ca641c81892d656ba
RY(theta₁₆)
5b5fb6f4749f45c39f410a1663738f36--b209d79e5dd5482ca641c81892d656ba
c50a9aaf7bd0499ca23216a8eb5e4901
RX(theta₂₀)
b209d79e5dd5482ca641c81892d656ba--c50a9aaf7bd0499ca23216a8eb5e4901
3bcd7646881b41b7b318ba324f87b341
c50a9aaf7bd0499ca23216a8eb5e4901--3bcd7646881b41b7b318ba324f87b341
17e39f22f27e4c1babe23d31ee6c6237
3bcd7646881b41b7b318ba324f87b341--17e39f22f27e4c1babe23d31ee6c6237
a7950cda8f624c6dba138b6ab12c933c
17e39f22f27e4c1babe23d31ee6c6237--a7950cda8f624c6dba138b6ab12c933c
1ca970a824bf4bb58f786e585a2bad5f
a97d87225eb144a2b6a803e429e5d44f
RX(theta₁)
151bf087984a47edb530d1f723360448--a97d87225eb144a2b6a803e429e5d44f
f5719ecb86c04d16a00d5ebf1210e960
2
6fa6d914bfa046dfb63ae75c1eec265b
RY(theta₅)
a97d87225eb144a2b6a803e429e5d44f--6fa6d914bfa046dfb63ae75c1eec265b
5882c518b9c8454b9dbeebec3ecf2f25
RX(theta₉)
6fa6d914bfa046dfb63ae75c1eec265b--5882c518b9c8454b9dbeebec3ecf2f25
61a07d8b7f1b4792a45f530ba465bc91
X
5882c518b9c8454b9dbeebec3ecf2f25--61a07d8b7f1b4792a45f530ba465bc91
61a07d8b7f1b4792a45f530ba465bc91--6566fc671c014e89a4456b39c9c0b7da
edf6d904bba24b219bd077ae07c43bbf
61a07d8b7f1b4792a45f530ba465bc91--edf6d904bba24b219bd077ae07c43bbf
1847c3b40db34d6884a638da7d5585e0
RX(theta₁₃)
edf6d904bba24b219bd077ae07c43bbf--1847c3b40db34d6884a638da7d5585e0
8480651a600c4537bcab852844e8f4fd
RY(theta₁₇)
1847c3b40db34d6884a638da7d5585e0--8480651a600c4537bcab852844e8f4fd
07522f233e7d4972aa60449214bfbb54
RX(theta₂₁)
8480651a600c4537bcab852844e8f4fd--07522f233e7d4972aa60449214bfbb54
41a3170238994e74adf45dfd689ad507
X
07522f233e7d4972aa60449214bfbb54--41a3170238994e74adf45dfd689ad507
41a3170238994e74adf45dfd689ad507--3bcd7646881b41b7b318ba324f87b341
7c647e2391c448539518fe4dd86fb2a1
41a3170238994e74adf45dfd689ad507--7c647e2391c448539518fe4dd86fb2a1
7c647e2391c448539518fe4dd86fb2a1--1ca970a824bf4bb58f786e585a2bad5f
211681124f224aa9b31fb90052a7135f
fc6183601edb42419d2fece16bdc442e
RX(theta₂)
f5719ecb86c04d16a00d5ebf1210e960--fc6183601edb42419d2fece16bdc442e
3d57a192cd8b4ea39ef529ee37d1610e
3
9602eabeab4a4f4999c136ec62d1c8e7
RY(theta₆)
fc6183601edb42419d2fece16bdc442e--9602eabeab4a4f4999c136ec62d1c8e7
15af336d580544f9b74edff8845de6a9
RX(theta₁₀)
9602eabeab4a4f4999c136ec62d1c8e7--15af336d580544f9b74edff8845de6a9
5bc6898ba8bc4562abc5b07ab8ab54eb
15af336d580544f9b74edff8845de6a9--5bc6898ba8bc4562abc5b07ab8ab54eb
0100b634b958465dbb9ecb89d505c118
X
5bc6898ba8bc4562abc5b07ab8ab54eb--0100b634b958465dbb9ecb89d505c118
0100b634b958465dbb9ecb89d505c118--edf6d904bba24b219bd077ae07c43bbf
6b46e123ef6745b6b9128f55d52dfd55
RX(theta₁₄)
0100b634b958465dbb9ecb89d505c118--6b46e123ef6745b6b9128f55d52dfd55
283ddb02a7ed4fc3a7259e582b1c1a54
RY(theta₁₈)
6b46e123ef6745b6b9128f55d52dfd55--283ddb02a7ed4fc3a7259e582b1c1a54
8cdc41e1cc6a4f9c8f47c04c8ea6be75
RX(theta₂₂)
283ddb02a7ed4fc3a7259e582b1c1a54--8cdc41e1cc6a4f9c8f47c04c8ea6be75
42f16eb7634b414f8cbde9d073cb0db1
8cdc41e1cc6a4f9c8f47c04c8ea6be75--42f16eb7634b414f8cbde9d073cb0db1
6853c6fcd11e4524ada992f6d9532889
X
42f16eb7634b414f8cbde9d073cb0db1--6853c6fcd11e4524ada992f6d9532889
6853c6fcd11e4524ada992f6d9532889--7c647e2391c448539518fe4dd86fb2a1
6853c6fcd11e4524ada992f6d9532889--211681124f224aa9b31fb90052a7135f
0f888d9237d24bd0b92bf25b41e46f82
5009f533fc7e426cba79a27f67a6dfd6
RX(theta₃)
3d57a192cd8b4ea39ef529ee37d1610e--5009f533fc7e426cba79a27f67a6dfd6
5c839e272a1b4f1fb7c3e9ef2645844e
RY(theta₇)
5009f533fc7e426cba79a27f67a6dfd6--5c839e272a1b4f1fb7c3e9ef2645844e
75edd8799b504efe9ade02d66038ec01
RX(theta₁₁)
5c839e272a1b4f1fb7c3e9ef2645844e--75edd8799b504efe9ade02d66038ec01
67193d9ffd8148708424b97ad345a0d3
X
75edd8799b504efe9ade02d66038ec01--67193d9ffd8148708424b97ad345a0d3
67193d9ffd8148708424b97ad345a0d3--5bc6898ba8bc4562abc5b07ab8ab54eb
90cf4522001e4c72acb2258506c102f0
67193d9ffd8148708424b97ad345a0d3--90cf4522001e4c72acb2258506c102f0
6a5294dd175647a4bbabc8e13a6aa824
RX(theta₁₅)
90cf4522001e4c72acb2258506c102f0--6a5294dd175647a4bbabc8e13a6aa824
01475c352df04097a1d5145058c675de
RY(theta₁₉)
6a5294dd175647a4bbabc8e13a6aa824--01475c352df04097a1d5145058c675de
91bfb46308154d808ecb121a627a73ff
RX(theta₂₃)
01475c352df04097a1d5145058c675de--91bfb46308154d808ecb121a627a73ff
8080d3c9f2a0462287971a91700a02c5
X
91bfb46308154d808ecb121a627a73ff--8080d3c9f2a0462287971a91700a02c5
8080d3c9f2a0462287971a91700a02c5--42f16eb7634b414f8cbde9d073cb0db1
582c40f32e3742c0afd286984323b5e4
8080d3c9f2a0462287971a91700a02c5--582c40f32e3742c0afd286984323b5e4
582c40f32e3742c0afd286984323b5e4--0f888d9237d24bd0b92bf25b41e46f82
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_291db4558f8349f3b350eb358e0097ce
Obs.
cluster_e8b2b2a7b5334068869041970455ca22
cluster_dc1205c6873544729f9911fa7b8c14fb
Tower Chebyshev FM
cluster_61c62f7446ef43898ecf88496e24f257
Tower Chebyshev FM
cluster_ab3287f022744540a2cc4aef5f9d0be8
HEA
a338535e28974c2fbc4b6b7fed5b89b1
0
d415b05418c740c1ba30476d1fdf891e
RX(1.0*acos(x))
a338535e28974c2fbc4b6b7fed5b89b1--d415b05418c740c1ba30476d1fdf891e
b6e920e207b9474e9f52c1b62bea0b40
1
f07a80705afe4568998319371e1573d9
RX(theta₀)
d415b05418c740c1ba30476d1fdf891e--f07a80705afe4568998319371e1573d9
ded851a953624236a4fbe5f9c7b944f2
RY(theta₄)
f07a80705afe4568998319371e1573d9--ded851a953624236a4fbe5f9c7b944f2
1b54f79f81534b4e9e2bddd081ba30ff
RX(theta₈)
ded851a953624236a4fbe5f9c7b944f2--1b54f79f81534b4e9e2bddd081ba30ff
547b52f2569b4c79989211fb6f4f7525
1b54f79f81534b4e9e2bddd081ba30ff--547b52f2569b4c79989211fb6f4f7525
0e4ca826786f423da5a54e84848248ab
547b52f2569b4c79989211fb6f4f7525--0e4ca826786f423da5a54e84848248ab
f03f1e9de4634ab6a20d6cf5c33885df
RX(theta₁₂)
0e4ca826786f423da5a54e84848248ab--f03f1e9de4634ab6a20d6cf5c33885df
6ba5edf75c0940679916ba48871e29d6
RY(theta₁₆)
f03f1e9de4634ab6a20d6cf5c33885df--6ba5edf75c0940679916ba48871e29d6
ff32fb4862f04777b6975981d37f22ed
RX(theta₂₀)
6ba5edf75c0940679916ba48871e29d6--ff32fb4862f04777b6975981d37f22ed
5b63806a09e04df8886d4762c1a370cd
ff32fb4862f04777b6975981d37f22ed--5b63806a09e04df8886d4762c1a370cd
204d6b7cee7943fa824b90e0ea6e3869
5b63806a09e04df8886d4762c1a370cd--204d6b7cee7943fa824b90e0ea6e3869
a310ff044a494362812a77147cacc4c6
204d6b7cee7943fa824b90e0ea6e3869--a310ff044a494362812a77147cacc4c6
7ea57c4a0e0d4175b83278d761108f0c
a310ff044a494362812a77147cacc4c6--7ea57c4a0e0d4175b83278d761108f0c
5277a7b0d4344ce2ab11ff0841430cf9
a6e9a4da8fda4b01929cbb845f4244f0
RX(2.0*acos(x))
b6e920e207b9474e9f52c1b62bea0b40--a6e9a4da8fda4b01929cbb845f4244f0
0a7b8ad2801046a0b33b0641124da2fc
2
0e340a3541644d3f8e492c425834a5db
RX(theta₁)
a6e9a4da8fda4b01929cbb845f4244f0--0e340a3541644d3f8e492c425834a5db
574ef38834954b679395ff2069c7739f
RY(theta₅)
0e340a3541644d3f8e492c425834a5db--574ef38834954b679395ff2069c7739f
287167b841c540bda44fe8cd53c9628a
RX(theta₉)
574ef38834954b679395ff2069c7739f--287167b841c540bda44fe8cd53c9628a
ee73bd186d684b3c889415a482f8c471
X
287167b841c540bda44fe8cd53c9628a--ee73bd186d684b3c889415a482f8c471
ee73bd186d684b3c889415a482f8c471--547b52f2569b4c79989211fb6f4f7525
2b34a67257ba418181d7371ee6d2f523
ee73bd186d684b3c889415a482f8c471--2b34a67257ba418181d7371ee6d2f523
535c49f5eef64d69a73b8be090d3ea3c
RX(theta₁₃)
2b34a67257ba418181d7371ee6d2f523--535c49f5eef64d69a73b8be090d3ea3c
43e11326e50e43b4bbb0fcbf3c13530c
RY(theta₁₇)
535c49f5eef64d69a73b8be090d3ea3c--43e11326e50e43b4bbb0fcbf3c13530c
1175fbbdda7e4573ae9ee28a08aaba74
RX(theta₂₁)
43e11326e50e43b4bbb0fcbf3c13530c--1175fbbdda7e4573ae9ee28a08aaba74
4dab667d241f4ddfb8dee02514cfe54b
X
1175fbbdda7e4573ae9ee28a08aaba74--4dab667d241f4ddfb8dee02514cfe54b
4dab667d241f4ddfb8dee02514cfe54b--5b63806a09e04df8886d4762c1a370cd
0b856ef387e1460384542c9e26517fc2
4dab667d241f4ddfb8dee02514cfe54b--0b856ef387e1460384542c9e26517fc2
2001d193a0ad4b07939126e9ddfc0096
AddBlock
0b856ef387e1460384542c9e26517fc2--2001d193a0ad4b07939126e9ddfc0096
2001d193a0ad4b07939126e9ddfc0096--5277a7b0d4344ce2ab11ff0841430cf9
aac4e0a007074e679d4435c39bbfe5ff
63137f8a7b8c43b9820bf574e0802772
RX(1.0*acos(2.0*y - 1.0))
0a7b8ad2801046a0b33b0641124da2fc--63137f8a7b8c43b9820bf574e0802772
df54bfbd614648ff8c1c736f1c6d9af3
3
86b9a42fa7624f8fa4899ac0d9351608
RX(theta₂)
63137f8a7b8c43b9820bf574e0802772--86b9a42fa7624f8fa4899ac0d9351608
e1377d596b334fd3abde4c87b873ddfe
RY(theta₆)
86b9a42fa7624f8fa4899ac0d9351608--e1377d596b334fd3abde4c87b873ddfe
4efac4fbbbf44f84b721e09a849606af
RX(theta₁₀)
e1377d596b334fd3abde4c87b873ddfe--4efac4fbbbf44f84b721e09a849606af
4f12826cf72e49c4ac1e758254ed4727
4efac4fbbbf44f84b721e09a849606af--4f12826cf72e49c4ac1e758254ed4727
26c4bc71fd574f33b3e73850036cab4b
X
4f12826cf72e49c4ac1e758254ed4727--26c4bc71fd574f33b3e73850036cab4b
26c4bc71fd574f33b3e73850036cab4b--2b34a67257ba418181d7371ee6d2f523
eaf7be6642be43eaa5f24819d3795ec3
RX(theta₁₄)
26c4bc71fd574f33b3e73850036cab4b--eaf7be6642be43eaa5f24819d3795ec3
d6440681db4346b1b03692b044b434ba
RY(theta₁₈)
eaf7be6642be43eaa5f24819d3795ec3--d6440681db4346b1b03692b044b434ba
ad4995bb84fd4cb58f5e3ede6213db40
RX(theta₂₂)
d6440681db4346b1b03692b044b434ba--ad4995bb84fd4cb58f5e3ede6213db40
a7a8a8ae7a0a4fb0a65cd4143e7118f7
ad4995bb84fd4cb58f5e3ede6213db40--a7a8a8ae7a0a4fb0a65cd4143e7118f7
30abc3303a5449e18c404ddd8d73fbfd
X
a7a8a8ae7a0a4fb0a65cd4143e7118f7--30abc3303a5449e18c404ddd8d73fbfd
30abc3303a5449e18c404ddd8d73fbfd--0b856ef387e1460384542c9e26517fc2
d6cc80fe807543a19d7c66bc39bf15d8
30abc3303a5449e18c404ddd8d73fbfd--d6cc80fe807543a19d7c66bc39bf15d8
d6cc80fe807543a19d7c66bc39bf15d8--aac4e0a007074e679d4435c39bbfe5ff
794181c1dfa34f38818cba30433b66eb
42d05efd22bd45e59aeea5a0198a6a80
RX(2.0*acos(2.0*y - 1.0))
df54bfbd614648ff8c1c736f1c6d9af3--42d05efd22bd45e59aeea5a0198a6a80
a7eca2d5015a4188a521d9f72ab28988
RX(theta₃)
42d05efd22bd45e59aeea5a0198a6a80--a7eca2d5015a4188a521d9f72ab28988
c045e68c8cf0420a89ed2480f8395882
RY(theta₇)
a7eca2d5015a4188a521d9f72ab28988--c045e68c8cf0420a89ed2480f8395882
05ca72c20f3b4cc4a480277636210dd5
RX(theta₁₁)
c045e68c8cf0420a89ed2480f8395882--05ca72c20f3b4cc4a480277636210dd5
7a746dd9cccf43a2866be62375ce20fb
X
05ca72c20f3b4cc4a480277636210dd5--7a746dd9cccf43a2866be62375ce20fb
7a746dd9cccf43a2866be62375ce20fb--4f12826cf72e49c4ac1e758254ed4727
57161c56e1e242228d19a6cdacf87519
7a746dd9cccf43a2866be62375ce20fb--57161c56e1e242228d19a6cdacf87519
290429a2bca34239b5db7ae640aba082
RX(theta₁₅)
57161c56e1e242228d19a6cdacf87519--290429a2bca34239b5db7ae640aba082
5163830c0be24113bdbb27108f8e9428
RY(theta₁₉)
290429a2bca34239b5db7ae640aba082--5163830c0be24113bdbb27108f8e9428
22b9c382e31f469083365639210c9636
RX(theta₂₃)
5163830c0be24113bdbb27108f8e9428--22b9c382e31f469083365639210c9636
a29cf36d96024f9b94c39feefa5e4fef
X
22b9c382e31f469083365639210c9636--a29cf36d96024f9b94c39feefa5e4fef
a29cf36d96024f9b94c39feefa5e4fef--a7a8a8ae7a0a4fb0a65cd4143e7118f7
5d89ce8b74144c5bbd3dd69611486e86
a29cf36d96024f9b94c39feefa5e4fef--5d89ce8b74144c5bbd3dd69611486e86
f2ef88bb6f3e43d987bf301f09e325fa
5d89ce8b74144c5bbd3dd69611486e86--f2ef88bb6f3e43d987bf301f09e325fa
f2ef88bb6f3e43d987bf301f09e325fa--794181c1dfa34f38818cba30433b66eb