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, FeatureMapConfig
, AnsatzConfig
, and ObservableConfig
. These classes allow you to specify the type of circuit and the parameters of the circuit in a structured way.
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_f966834a3f1c47ffbdd866022ca223b4
Tower Chebyshev FM
cluster_52f39c8ef4cf4b41a3daa6d6c6c97e23
Tower Chebyshev FM
c1eebc6b7e024bd1958d76dea85c0fc8
0
ecdb6c411a0d4df2874a21eb89c56fb7
RX(1.0*acos(x))
c1eebc6b7e024bd1958d76dea85c0fc8--ecdb6c411a0d4df2874a21eb89c56fb7
6439b38b1c2b4e7aa7469f550524a7c1
1
47d15609331346178b775f8b0a5f2b31
ecdb6c411a0d4df2874a21eb89c56fb7--47d15609331346178b775f8b0a5f2b31
c3a29159321943c2aa62066ed62f281d
9729c1c10ce249bca909729b0c1af0ca
RX(2.0*acos(x))
6439b38b1c2b4e7aa7469f550524a7c1--9729c1c10ce249bca909729b0c1af0ca
85a1e941589044cda0ab2b494f9237e6
2
9729c1c10ce249bca909729b0c1af0ca--c3a29159321943c2aa62066ed62f281d
985e0005b8b6427ca4083652dd7b1549
3f47e245cc084eac92529ae96a032d5f
RX(1.0*acos(2.0*y - 1.0))
85a1e941589044cda0ab2b494f9237e6--3f47e245cc084eac92529ae96a032d5f
cc4607baa629478c8c71fd639566469c
3
3f47e245cc084eac92529ae96a032d5f--985e0005b8b6427ca4083652dd7b1549
823480ae7b05438f9166e7f6b180c83e
be8a7d4284ba4ffda8a86f1337bd1798
RX(2.0*acos(2.0*y - 1.0))
cc4607baa629478c8c71fd639566469c--be8a7d4284ba4ffda8a86f1337bd1798
be8a7d4284ba4ffda8a86f1337bd1798--823480ae7b05438f9166e7f6b180c83e
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
58303b0be56b424fa3b27710f6c7f9f9
0
88677d61ddd3460b9c2d8d4205c3024f
RX(theta₀)
58303b0be56b424fa3b27710f6c7f9f9--88677d61ddd3460b9c2d8d4205c3024f
a376d1abbe394f5ea19e591cab0674d8
1
444e6b0c9fa849449f53d861f621b7e6
RY(theta₄)
88677d61ddd3460b9c2d8d4205c3024f--444e6b0c9fa849449f53d861f621b7e6
f7dce2d1667a48fc9b4f226bc1399ffc
RX(theta₈)
444e6b0c9fa849449f53d861f621b7e6--f7dce2d1667a48fc9b4f226bc1399ffc
c4cad54a5eaa467f9fb0282758f5843b
f7dce2d1667a48fc9b4f226bc1399ffc--c4cad54a5eaa467f9fb0282758f5843b
19a28d64e3f743d690bdbfa4646bbddf
c4cad54a5eaa467f9fb0282758f5843b--19a28d64e3f743d690bdbfa4646bbddf
d566cee4c5f04d179a81e52905785384
RX(theta₁₂)
19a28d64e3f743d690bdbfa4646bbddf--d566cee4c5f04d179a81e52905785384
250fa94250944a348944ef93d4f223db
RY(theta₁₆)
d566cee4c5f04d179a81e52905785384--250fa94250944a348944ef93d4f223db
f0a4435d593c460d9d0a7cf04637b3ef
RX(theta₂₀)
250fa94250944a348944ef93d4f223db--f0a4435d593c460d9d0a7cf04637b3ef
ba4ba77ebd224d9fa7b3c8868d421b16
f0a4435d593c460d9d0a7cf04637b3ef--ba4ba77ebd224d9fa7b3c8868d421b16
2d2230e7a483413a98e3482c6634fbd4
ba4ba77ebd224d9fa7b3c8868d421b16--2d2230e7a483413a98e3482c6634fbd4
2b4f5441b0264e8d9185f9dada983f3c
2d2230e7a483413a98e3482c6634fbd4--2b4f5441b0264e8d9185f9dada983f3c
636d2522d45645cfb07d8267188d365b
5fdcd74c89cc49efbfa52f4963a83200
RX(theta₁)
a376d1abbe394f5ea19e591cab0674d8--5fdcd74c89cc49efbfa52f4963a83200
b6abab2e9c81496aa088426356410cf5
2
9f851cb855094c50b3f3c43da874c81a
RY(theta₅)
5fdcd74c89cc49efbfa52f4963a83200--9f851cb855094c50b3f3c43da874c81a
344b2a891ee34a35af3e093f3d071417
RX(theta₉)
9f851cb855094c50b3f3c43da874c81a--344b2a891ee34a35af3e093f3d071417
5f1655dd464d407e829a9d14789542eb
X
344b2a891ee34a35af3e093f3d071417--5f1655dd464d407e829a9d14789542eb
5f1655dd464d407e829a9d14789542eb--c4cad54a5eaa467f9fb0282758f5843b
ec432e08baa14966bba7082237eeae95
5f1655dd464d407e829a9d14789542eb--ec432e08baa14966bba7082237eeae95
59d13cd81cc64eb0bf17ca948720190c
RX(theta₁₃)
ec432e08baa14966bba7082237eeae95--59d13cd81cc64eb0bf17ca948720190c
2a88df5dffa64807887fbaed5a71b378
RY(theta₁₇)
59d13cd81cc64eb0bf17ca948720190c--2a88df5dffa64807887fbaed5a71b378
283791aa8e204b0c89bcfa1d3c02c7e7
RX(theta₂₁)
2a88df5dffa64807887fbaed5a71b378--283791aa8e204b0c89bcfa1d3c02c7e7
555104f0b5734f1dacc3a04bb8d53847
X
283791aa8e204b0c89bcfa1d3c02c7e7--555104f0b5734f1dacc3a04bb8d53847
555104f0b5734f1dacc3a04bb8d53847--ba4ba77ebd224d9fa7b3c8868d421b16
e31670a51bd5454eb2a1aa6a5b5d7fc1
555104f0b5734f1dacc3a04bb8d53847--e31670a51bd5454eb2a1aa6a5b5d7fc1
e31670a51bd5454eb2a1aa6a5b5d7fc1--636d2522d45645cfb07d8267188d365b
2fbab7708ab84938b2c655310c20d3ba
663e72f743a94233a2a4b35df2c5aeb2
RX(theta₂)
b6abab2e9c81496aa088426356410cf5--663e72f743a94233a2a4b35df2c5aeb2
16cb98eeebab4f738b2f82dded0c8973
3
b7e5a21e19f9488588aa779345e47c98
RY(theta₆)
663e72f743a94233a2a4b35df2c5aeb2--b7e5a21e19f9488588aa779345e47c98
b641d0fae1ba476fb9af8c54b74284da
RX(theta₁₀)
b7e5a21e19f9488588aa779345e47c98--b641d0fae1ba476fb9af8c54b74284da
ed85a57b5f764d249028a46d8ee46067
b641d0fae1ba476fb9af8c54b74284da--ed85a57b5f764d249028a46d8ee46067
9acf005dfa4c413b926734798b4b66c9
X
ed85a57b5f764d249028a46d8ee46067--9acf005dfa4c413b926734798b4b66c9
9acf005dfa4c413b926734798b4b66c9--ec432e08baa14966bba7082237eeae95
d97f9572bc0f4b6aab4db8e420e90311
RX(theta₁₄)
9acf005dfa4c413b926734798b4b66c9--d97f9572bc0f4b6aab4db8e420e90311
f5bc95c0d49e476f9c1af63fcb944be2
RY(theta₁₈)
d97f9572bc0f4b6aab4db8e420e90311--f5bc95c0d49e476f9c1af63fcb944be2
972e6f9d5322417ab48733f61dde69b8
RX(theta₂₂)
f5bc95c0d49e476f9c1af63fcb944be2--972e6f9d5322417ab48733f61dde69b8
9011bf9abd15481e9edf6886e68ef219
972e6f9d5322417ab48733f61dde69b8--9011bf9abd15481e9edf6886e68ef219
c5f14e46b677428ca6a0910bed0b1606
X
9011bf9abd15481e9edf6886e68ef219--c5f14e46b677428ca6a0910bed0b1606
c5f14e46b677428ca6a0910bed0b1606--e31670a51bd5454eb2a1aa6a5b5d7fc1
c5f14e46b677428ca6a0910bed0b1606--2fbab7708ab84938b2c655310c20d3ba
d102c30447464bcebfc0310549df32e9
cd3bc7830352406c860f378eb640d667
RX(theta₃)
16cb98eeebab4f738b2f82dded0c8973--cd3bc7830352406c860f378eb640d667
4c03651d5d1d4364a189cb20a628d4d7
RY(theta₇)
cd3bc7830352406c860f378eb640d667--4c03651d5d1d4364a189cb20a628d4d7
5d59b7f6532a4ab7b7d13e83a2ea814f
RX(theta₁₁)
4c03651d5d1d4364a189cb20a628d4d7--5d59b7f6532a4ab7b7d13e83a2ea814f
3d91e4c95c9746b79a9b887405406de0
X
5d59b7f6532a4ab7b7d13e83a2ea814f--3d91e4c95c9746b79a9b887405406de0
3d91e4c95c9746b79a9b887405406de0--ed85a57b5f764d249028a46d8ee46067
62692c813d1a416698c0af644b419eef
3d91e4c95c9746b79a9b887405406de0--62692c813d1a416698c0af644b419eef
57acf88a4c0b43bfa15992491c39bb83
RX(theta₁₅)
62692c813d1a416698c0af644b419eef--57acf88a4c0b43bfa15992491c39bb83
d3859ad20a5e498897a1b5404619433b
RY(theta₁₉)
57acf88a4c0b43bfa15992491c39bb83--d3859ad20a5e498897a1b5404619433b
0a19e31da4e44efebc9f41a090b13187
RX(theta₂₃)
d3859ad20a5e498897a1b5404619433b--0a19e31da4e44efebc9f41a090b13187
84bc97c9f7f044c3a83dc9cdf6a272ac
X
0a19e31da4e44efebc9f41a090b13187--84bc97c9f7f044c3a83dc9cdf6a272ac
84bc97c9f7f044c3a83dc9cdf6a272ac--9011bf9abd15481e9edf6886e68ef219
564751c3a05c46868bfc547240c96984
84bc97c9f7f044c3a83dc9cdf6a272ac--564751c3a05c46868bfc547240c96984
564751c3a05c46868bfc547240c96984--d102c30447464bcebfc0310549df32e9
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 Observable
And lastly, the observable. Naturally, 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_291e7f95a11943af914d9e2cdecb9925
4a9ec4e40c9c428e9fe6f251b58d36b7
0
edd756a81c4a4d8c8e5fc8f02c9ecf8f
4a9ec4e40c9c428e9fe6f251b58d36b7--edd756a81c4a4d8c8e5fc8f02c9ecf8f
56d1069f2f5c4567bd1474e8000f3166
1
8a0583753ff14420a31d5e1d8085aa31
edd756a81c4a4d8c8e5fc8f02c9ecf8f--8a0583753ff14420a31d5e1d8085aa31
180e251c3af6450b8d8303eac8b38718
5da69e898c5743a5b5093a3b10db4053
AddBlock
56d1069f2f5c4567bd1474e8000f3166--5da69e898c5743a5b5093a3b10db4053
86a6c601d7aa4eefbff9c0a73e60ce13
2
5da69e898c5743a5b5093a3b10db4053--180e251c3af6450b8d8303eac8b38718
c05d68cbca92402eac062977326773d2
75db8de935ea4ea5b2752adf6b0b7fac
86a6c601d7aa4eefbff9c0a73e60ce13--75db8de935ea4ea5b2752adf6b0b7fac
dc06d4b0d6df4c3fa0f0d4149e69e8ee
3
75db8de935ea4ea5b2752adf6b0b7fac--c05d68cbca92402eac062977326773d2
83e06aa37d0a4ad3befd44b8afbd6be6
60193d9004a2428ab4239bbdf161bdeb
dc06d4b0d6df4c3fa0f0d4149e69e8ee--60193d9004a2428ab4239bbdf161bdeb
60193d9004a2428ab4239bbdf161bdeb--83e06aa37d0a4ad3befd44b8afbd6be6
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 QNN from the Configs
To build the QNN, we can now use the QNN
class.
from qadence import QNN
qnn = QNN . from_configs (
register = 4 ,
fm_config = fm_config ,
ansatz_config = ansatz_config ,
obs_config = observable_config ,
)
%3
cluster_5c9729ed0a8e42f1a378ba1101149b69
Obs.
cluster_9b9d3da69a6541ce9171b75e232a8528
cluster_e217ec8748fa4b6c9ae0e22b0a1a1db1
Tower Chebyshev FM
cluster_c0b6a7a2ed5e4970a4c89383c5a7bfbd
Tower Chebyshev FM
cluster_4b3a0127dd664eb18e2620f5258dfea7
HEA
dfd9eb7789dc4f8bac98075f59b044b9
0
2a23b9b590e54bebbfe15e4e10d57ac8
RX(1.0*acos(x))
dfd9eb7789dc4f8bac98075f59b044b9--2a23b9b590e54bebbfe15e4e10d57ac8
cdcae4866dcb49c5a554358ae8660cf4
1
cc56c9adfb0b4201885fa2fcbf02523c
RX(theta₀)
2a23b9b590e54bebbfe15e4e10d57ac8--cc56c9adfb0b4201885fa2fcbf02523c
88eeb3065b76437b9a822e80d5883418
RY(theta₄)
cc56c9adfb0b4201885fa2fcbf02523c--88eeb3065b76437b9a822e80d5883418
ed8f0f1f681349e9993068d531845ecc
RX(theta₈)
88eeb3065b76437b9a822e80d5883418--ed8f0f1f681349e9993068d531845ecc
19fb895c1a77432aa24d8ef504f662ba
ed8f0f1f681349e9993068d531845ecc--19fb895c1a77432aa24d8ef504f662ba
9ca8ef35f323471ab8baf887eeceeb24
19fb895c1a77432aa24d8ef504f662ba--9ca8ef35f323471ab8baf887eeceeb24
4e589ac8730e42ea9175f7de79b9f453
RX(theta₁₂)
9ca8ef35f323471ab8baf887eeceeb24--4e589ac8730e42ea9175f7de79b9f453
3df77ad0750e4b6fab1fcdf4e9aff0b5
RY(theta₁₆)
4e589ac8730e42ea9175f7de79b9f453--3df77ad0750e4b6fab1fcdf4e9aff0b5
07cb384bb7b4407fa7d1ba36bd003a7e
RX(theta₂₀)
3df77ad0750e4b6fab1fcdf4e9aff0b5--07cb384bb7b4407fa7d1ba36bd003a7e
113a8dda037a4a95890c889eaff8778d
07cb384bb7b4407fa7d1ba36bd003a7e--113a8dda037a4a95890c889eaff8778d
5d3a32a9e5874238a33f8c8da07b2e55
113a8dda037a4a95890c889eaff8778d--5d3a32a9e5874238a33f8c8da07b2e55
066fff8c8bfa4817bc78d30724c05d96
5d3a32a9e5874238a33f8c8da07b2e55--066fff8c8bfa4817bc78d30724c05d96
53c076eef88c438bacf374fa6fe442ba
066fff8c8bfa4817bc78d30724c05d96--53c076eef88c438bacf374fa6fe442ba
973483007f0d4439a5419e30f08d6129
f07edea7c9da4c81978986236a6c5034
RX(2.0*acos(x))
cdcae4866dcb49c5a554358ae8660cf4--f07edea7c9da4c81978986236a6c5034
ab3d4fb6166f4bb1ae53c94b0b2ad118
2
d60df35fd9b54707a46fbd4487ed8e5a
RX(theta₁)
f07edea7c9da4c81978986236a6c5034--d60df35fd9b54707a46fbd4487ed8e5a
a70cf75fc7c44c1795629bfb32525d89
RY(theta₅)
d60df35fd9b54707a46fbd4487ed8e5a--a70cf75fc7c44c1795629bfb32525d89
46e6b1d728694508b1f78ee80ed5367b
RX(theta₉)
a70cf75fc7c44c1795629bfb32525d89--46e6b1d728694508b1f78ee80ed5367b
7ddea20fa41443658c197e89fd94a18a
X
46e6b1d728694508b1f78ee80ed5367b--7ddea20fa41443658c197e89fd94a18a
7ddea20fa41443658c197e89fd94a18a--19fb895c1a77432aa24d8ef504f662ba
b4f0894e01144a46b6388f5489e647a2
7ddea20fa41443658c197e89fd94a18a--b4f0894e01144a46b6388f5489e647a2
2f887c6ea4f84e6686b03a3ed2f89b92
RX(theta₁₃)
b4f0894e01144a46b6388f5489e647a2--2f887c6ea4f84e6686b03a3ed2f89b92
1a68610263d147e6a5f9326c76b08985
RY(theta₁₇)
2f887c6ea4f84e6686b03a3ed2f89b92--1a68610263d147e6a5f9326c76b08985
9e60723c0d884a3eb0b3ba37235fab15
RX(theta₂₁)
1a68610263d147e6a5f9326c76b08985--9e60723c0d884a3eb0b3ba37235fab15
a906b4b516ca4a9b8b836d5f87720e19
X
9e60723c0d884a3eb0b3ba37235fab15--a906b4b516ca4a9b8b836d5f87720e19
a906b4b516ca4a9b8b836d5f87720e19--113a8dda037a4a95890c889eaff8778d
291ec8aad08740eca1b587ee30bfb8f2
a906b4b516ca4a9b8b836d5f87720e19--291ec8aad08740eca1b587ee30bfb8f2
f41443c93c4d4e4fb282e0fc41d05b17
AddBlock
291ec8aad08740eca1b587ee30bfb8f2--f41443c93c4d4e4fb282e0fc41d05b17
f41443c93c4d4e4fb282e0fc41d05b17--973483007f0d4439a5419e30f08d6129
a8a75db8b75f467ba201f11d29659fe6
33303a7e95fc4603ad491834592bfbab
RX(1.0*acos(2.0*y - 1.0))
ab3d4fb6166f4bb1ae53c94b0b2ad118--33303a7e95fc4603ad491834592bfbab
76e8ad4d96e24c3aa06d99c59ac14956
3
bb4ce42842ab4ba6928ac9805313866b
RX(theta₂)
33303a7e95fc4603ad491834592bfbab--bb4ce42842ab4ba6928ac9805313866b
ef353cc7bf3247d49065cb2b1cd8e6ac
RY(theta₆)
bb4ce42842ab4ba6928ac9805313866b--ef353cc7bf3247d49065cb2b1cd8e6ac
062f81ce872b46cf88c48fdaae11a358
RX(theta₁₀)
ef353cc7bf3247d49065cb2b1cd8e6ac--062f81ce872b46cf88c48fdaae11a358
df910f73b56243a6a319dcf14200c38a
062f81ce872b46cf88c48fdaae11a358--df910f73b56243a6a319dcf14200c38a
1b805df3da164d519d7f8a6493c93483
X
df910f73b56243a6a319dcf14200c38a--1b805df3da164d519d7f8a6493c93483
1b805df3da164d519d7f8a6493c93483--b4f0894e01144a46b6388f5489e647a2
e4e385d6a48a4e6fa869741ae5b17d08
RX(theta₁₄)
1b805df3da164d519d7f8a6493c93483--e4e385d6a48a4e6fa869741ae5b17d08
3a8157f2065647f793cb390f6aaec9ad
RY(theta₁₈)
e4e385d6a48a4e6fa869741ae5b17d08--3a8157f2065647f793cb390f6aaec9ad
c284e992b35045f1ad8d6570d68d655e
RX(theta₂₂)
3a8157f2065647f793cb390f6aaec9ad--c284e992b35045f1ad8d6570d68d655e
73aff79c20e54b6f9824b6224f58eea0
c284e992b35045f1ad8d6570d68d655e--73aff79c20e54b6f9824b6224f58eea0
a7e5540b7e6948e69c2f015112db9719
X
73aff79c20e54b6f9824b6224f58eea0--a7e5540b7e6948e69c2f015112db9719
a7e5540b7e6948e69c2f015112db9719--291ec8aad08740eca1b587ee30bfb8f2
43cd9e4050554344920a548b1a40158f
a7e5540b7e6948e69c2f015112db9719--43cd9e4050554344920a548b1a40158f
43cd9e4050554344920a548b1a40158f--a8a75db8b75f467ba201f11d29659fe6
41c6ec54db824bb8b39d974c84de7ab1
f213e45f9504400cab3db8b12b3afe2d
RX(2.0*acos(2.0*y - 1.0))
76e8ad4d96e24c3aa06d99c59ac14956--f213e45f9504400cab3db8b12b3afe2d
7236f32c7e544db8a0eea4c53915e62e
RX(theta₃)
f213e45f9504400cab3db8b12b3afe2d--7236f32c7e544db8a0eea4c53915e62e
0cdc6dcd017340a7940fe7efc9476063
RY(theta₇)
7236f32c7e544db8a0eea4c53915e62e--0cdc6dcd017340a7940fe7efc9476063
7afa47bdecae463ba4084e7edb27d4bf
RX(theta₁₁)
0cdc6dcd017340a7940fe7efc9476063--7afa47bdecae463ba4084e7edb27d4bf
3b91db23e49545e3a0bcf55e6fe700f4
X
7afa47bdecae463ba4084e7edb27d4bf--3b91db23e49545e3a0bcf55e6fe700f4
3b91db23e49545e3a0bcf55e6fe700f4--df910f73b56243a6a319dcf14200c38a
555228d83fef41d4b85fde82401c17f2
3b91db23e49545e3a0bcf55e6fe700f4--555228d83fef41d4b85fde82401c17f2
2a082448c5124d35949aded050dd6808
RX(theta₁₅)
555228d83fef41d4b85fde82401c17f2--2a082448c5124d35949aded050dd6808
235462ef74344e91949202385173d22f
RY(theta₁₉)
2a082448c5124d35949aded050dd6808--235462ef74344e91949202385173d22f
88d48ef414494420a3fea8623c78e096
RX(theta₂₃)
235462ef74344e91949202385173d22f--88d48ef414494420a3fea8623c78e096
fb28746e0d314983915a5c3c0b06d030
X
88d48ef414494420a3fea8623c78e096--fb28746e0d314983915a5c3c0b06d030
fb28746e0d314983915a5c3c0b06d030--73aff79c20e54b6f9824b6224f58eea0
f62e0a61079c458f99779ffce8de3037
fb28746e0d314983915a5c3c0b06d030--f62e0a61079c458f99779ffce8de3037
cc3a0a9a6d0b464995d2d6116e7e5403
f62e0a61079c458f99779ffce8de3037--cc3a0a9a6d0b464995d2d6116e7e5403
cc3a0a9a6d0b464995d2d6116e7e5403--41c6ec54db824bb8b39d974c84de7ab1