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_ba5eda7c8e784e38bc2f160b5ab5b51f
ce88cc4338b44596bcc7b9179cd07d43
0
2f87f4e960f0498ca7044165871367bf
ce88cc4338b44596bcc7b9179cd07d43--2f87f4e960f0498ca7044165871367bf
b017d58fe48145aa8eda1878858ec0a5
1
254835940f9a4c2cbd54d03c06b62633
2f87f4e960f0498ca7044165871367bf--254835940f9a4c2cbd54d03c06b62633
3b8a78d542a049c6be00567a7ca9b0c3
9a1d875823ed443299e1446043d85686
AddBlock
b017d58fe48145aa8eda1878858ec0a5--9a1d875823ed443299e1446043d85686
c3f43a4830494110b906fde17d4111e2
2
9a1d875823ed443299e1446043d85686--3b8a78d542a049c6be00567a7ca9b0c3
0c60e68b6b0f4bdd9495b03a9b905fe6
324be8ae6d8e406189e03dc1f7c8a032
c3f43a4830494110b906fde17d4111e2--324be8ae6d8e406189e03dc1f7c8a032
e80d66ea40ea42a885e808a60fe1fa9e
3
324be8ae6d8e406189e03dc1f7c8a032--0c60e68b6b0f4bdd9495b03a9b905fe6
33af86fe4ac6472b96f7ab2f8c1cb0e1
8a55524d5bc64f5196743ded5a1f9155
e80d66ea40ea42a885e808a60fe1fa9e--8a55524d5bc64f5196743ded5a1f9155
8a55524d5bc64f5196743ded5a1f9155--33af86fe4ac6472b96f7ab2f8c1cb0e1
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_da50be8ccdcc4f4f9962ec31dc74d31f
Tower Chebyshev FM
cluster_4c21da3fe19b45439df73ea6e66dd805
Tower Chebyshev FM
a82a44858d964038b076d2a03b2118d9
0
d616aa878c5e40b68215e0473ca2554e
RX(1.0*acos(x))
a82a44858d964038b076d2a03b2118d9--d616aa878c5e40b68215e0473ca2554e
c13fc5e3d31d475494f1272964c99c54
1
7d159fdec9594840a66f840738bafed0
d616aa878c5e40b68215e0473ca2554e--7d159fdec9594840a66f840738bafed0
8bcd7e7cab984287b0b6307f7c91112e
c2c45170028b4ccb9b41edd4599d0586
RX(2.0*acos(x))
c13fc5e3d31d475494f1272964c99c54--c2c45170028b4ccb9b41edd4599d0586
56d201d879bc4f0eb9011fbaa399147e
2
c2c45170028b4ccb9b41edd4599d0586--8bcd7e7cab984287b0b6307f7c91112e
27d857cbed1647c6ae5a0d506e1ce49e
4e5ebce79aa34a868ce42359928bbcb2
RX(1.0*acos(2.0*y - 1.0))
56d201d879bc4f0eb9011fbaa399147e--4e5ebce79aa34a868ce42359928bbcb2
44e0120dc5184574b39b1348144c99c1
3
4e5ebce79aa34a868ce42359928bbcb2--27d857cbed1647c6ae5a0d506e1ce49e
c2b4a1b4761044b0b200f6ab59d10e76
a544a3cd6cf446d6914ddf71d92a6abd
RX(2.0*acos(2.0*y - 1.0))
44e0120dc5184574b39b1348144c99c1--a544a3cd6cf446d6914ddf71d92a6abd
a544a3cd6cf446d6914ddf71d92a6abd--c2b4a1b4761044b0b200f6ab59d10e76
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
947fc89d7253403b98b9e93090846bdd
0
9a0e4e1f15d94fc19ee2e8aa15b8870d
RX(theta₀)
947fc89d7253403b98b9e93090846bdd--9a0e4e1f15d94fc19ee2e8aa15b8870d
83b9b5d37fd14f32adf28b61e4d1904c
1
773e764611a144df8a051a821d77952a
RY(theta₄)
9a0e4e1f15d94fc19ee2e8aa15b8870d--773e764611a144df8a051a821d77952a
949601ebbc5c4129a2465b8d1bca4f19
RX(theta₈)
773e764611a144df8a051a821d77952a--949601ebbc5c4129a2465b8d1bca4f19
7a3ae9297b1d47e1bb5bb0502ea03115
949601ebbc5c4129a2465b8d1bca4f19--7a3ae9297b1d47e1bb5bb0502ea03115
96b02fe349504f32a63688c1ee36d372
7a3ae9297b1d47e1bb5bb0502ea03115--96b02fe349504f32a63688c1ee36d372
bd581278df1943ed9e903fd4b4e8d21d
RX(theta₁₂)
96b02fe349504f32a63688c1ee36d372--bd581278df1943ed9e903fd4b4e8d21d
cc19b0735668439ca5414489d1fe9041
RY(theta₁₆)
bd581278df1943ed9e903fd4b4e8d21d--cc19b0735668439ca5414489d1fe9041
1dfdc9bdd96a458e838ffa8f08954863
RX(theta₂₀)
cc19b0735668439ca5414489d1fe9041--1dfdc9bdd96a458e838ffa8f08954863
f2d253e9f796430fb56b20107560db04
1dfdc9bdd96a458e838ffa8f08954863--f2d253e9f796430fb56b20107560db04
a6b983bf13f64d3ca9530f6b0e6972a3
f2d253e9f796430fb56b20107560db04--a6b983bf13f64d3ca9530f6b0e6972a3
c01507d8ba4449ee8636736dfb9a948e
a6b983bf13f64d3ca9530f6b0e6972a3--c01507d8ba4449ee8636736dfb9a948e
95790e1eea864cbcb24c2b5de643eddf
761d70277ee342cb8949a8ea4d859207
RX(theta₁)
83b9b5d37fd14f32adf28b61e4d1904c--761d70277ee342cb8949a8ea4d859207
7407defb770947d78b211bc0f3fcbc79
2
d62be7a001d042e3bb742c0cf830cbed
RY(theta₅)
761d70277ee342cb8949a8ea4d859207--d62be7a001d042e3bb742c0cf830cbed
35099afa8911436ba42bc3971238020b
RX(theta₉)
d62be7a001d042e3bb742c0cf830cbed--35099afa8911436ba42bc3971238020b
2043bee5e89c4069a3a510c3ef3a2a0a
X
35099afa8911436ba42bc3971238020b--2043bee5e89c4069a3a510c3ef3a2a0a
2043bee5e89c4069a3a510c3ef3a2a0a--7a3ae9297b1d47e1bb5bb0502ea03115
33cb3af0408642618e833ac1cf5180a1
2043bee5e89c4069a3a510c3ef3a2a0a--33cb3af0408642618e833ac1cf5180a1
f3525d8d8987427f9a666363b24064de
RX(theta₁₃)
33cb3af0408642618e833ac1cf5180a1--f3525d8d8987427f9a666363b24064de
6375ef0016854f26aa3b95a59a5b9509
RY(theta₁₇)
f3525d8d8987427f9a666363b24064de--6375ef0016854f26aa3b95a59a5b9509
4b1e9275f749403bb9a9a9edcd70bcca
RX(theta₂₁)
6375ef0016854f26aa3b95a59a5b9509--4b1e9275f749403bb9a9a9edcd70bcca
3efea8c45f1441899300dfb39d08b4fc
X
4b1e9275f749403bb9a9a9edcd70bcca--3efea8c45f1441899300dfb39d08b4fc
3efea8c45f1441899300dfb39d08b4fc--f2d253e9f796430fb56b20107560db04
7b163a9d24e64254b93a7cfe396d52fd
3efea8c45f1441899300dfb39d08b4fc--7b163a9d24e64254b93a7cfe396d52fd
7b163a9d24e64254b93a7cfe396d52fd--95790e1eea864cbcb24c2b5de643eddf
78dcaf6d5d4a4a8e81cf775562d48c3f
83317269ecc14379a211d75a332cd9d8
RX(theta₂)
7407defb770947d78b211bc0f3fcbc79--83317269ecc14379a211d75a332cd9d8
f7989053301944148596bb6076b49e5a
3
322bd36d558842cc86d823633dc26bd6
RY(theta₆)
83317269ecc14379a211d75a332cd9d8--322bd36d558842cc86d823633dc26bd6
008e7c65245f47448e8c50fdc350c6e2
RX(theta₁₀)
322bd36d558842cc86d823633dc26bd6--008e7c65245f47448e8c50fdc350c6e2
d0753fae355d4880983b3a594a651a05
008e7c65245f47448e8c50fdc350c6e2--d0753fae355d4880983b3a594a651a05
c921cf9a35b749868db233ac27196097
X
d0753fae355d4880983b3a594a651a05--c921cf9a35b749868db233ac27196097
c921cf9a35b749868db233ac27196097--33cb3af0408642618e833ac1cf5180a1
da392b217e2b454ab49849dd3dae4e91
RX(theta₁₄)
c921cf9a35b749868db233ac27196097--da392b217e2b454ab49849dd3dae4e91
9e7005c647894f0db5460b0e50c87e61
RY(theta₁₈)
da392b217e2b454ab49849dd3dae4e91--9e7005c647894f0db5460b0e50c87e61
ddbe78345fa440f88069c34885fa30dd
RX(theta₂₂)
9e7005c647894f0db5460b0e50c87e61--ddbe78345fa440f88069c34885fa30dd
aca6c72e49104b708b7f1bd0955bf1b1
ddbe78345fa440f88069c34885fa30dd--aca6c72e49104b708b7f1bd0955bf1b1
1ba615cc3d7f409aafd26cc43daf6abe
X
aca6c72e49104b708b7f1bd0955bf1b1--1ba615cc3d7f409aafd26cc43daf6abe
1ba615cc3d7f409aafd26cc43daf6abe--7b163a9d24e64254b93a7cfe396d52fd
1ba615cc3d7f409aafd26cc43daf6abe--78dcaf6d5d4a4a8e81cf775562d48c3f
eff3119c9b5c4bbb9a7a623b0ea7ab06
e6bcd90bd7f74cb088b1729cfd85f0e6
RX(theta₃)
f7989053301944148596bb6076b49e5a--e6bcd90bd7f74cb088b1729cfd85f0e6
413c58d14a7a42be9ca2243202fb6fb3
RY(theta₇)
e6bcd90bd7f74cb088b1729cfd85f0e6--413c58d14a7a42be9ca2243202fb6fb3
dd19542be1a14bee9b2cc34587946bcf
RX(theta₁₁)
413c58d14a7a42be9ca2243202fb6fb3--dd19542be1a14bee9b2cc34587946bcf
79e9735424f5453f9e2585457a6b1cb9
X
dd19542be1a14bee9b2cc34587946bcf--79e9735424f5453f9e2585457a6b1cb9
79e9735424f5453f9e2585457a6b1cb9--d0753fae355d4880983b3a594a651a05
9f3f0b5b138c4f97a4bc9ffd85e1e750
79e9735424f5453f9e2585457a6b1cb9--9f3f0b5b138c4f97a4bc9ffd85e1e750
33178a4e3def477499ed08da326fa3d0
RX(theta₁₅)
9f3f0b5b138c4f97a4bc9ffd85e1e750--33178a4e3def477499ed08da326fa3d0
8dd7d390ba494b6aa311ab28f5c7a346
RY(theta₁₉)
33178a4e3def477499ed08da326fa3d0--8dd7d390ba494b6aa311ab28f5c7a346
a6586ba210c24fda9fc3b3eca2daa362
RX(theta₂₃)
8dd7d390ba494b6aa311ab28f5c7a346--a6586ba210c24fda9fc3b3eca2daa362
812729297a7c4f4b86ee43ed38363d44
X
a6586ba210c24fda9fc3b3eca2daa362--812729297a7c4f4b86ee43ed38363d44
812729297a7c4f4b86ee43ed38363d44--aca6c72e49104b708b7f1bd0955bf1b1
d224c9d858cd4a2fb30fab3c82726520
812729297a7c4f4b86ee43ed38363d44--d224c9d858cd4a2fb30fab3c82726520
d224c9d858cd4a2fb30fab3c82726520--eff3119c9b5c4bbb9a7a623b0ea7ab06
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_9835ae4eadbd454c95e8d29a4525d7ae
Obs.
cluster_79c4ee3491504703a49542e5bb7668b4
cluster_00e0922e9f2a4375b1ccd7d5a4bfa54e
Tower Chebyshev FM
cluster_36a8affd9bf14dc4927a6fa650722ec6
Tower Chebyshev FM
cluster_78207a20bf884741abfd99ba52e3c537
HEA
e5856b77d8e14d4eb60eb6260cfcd229
0
85c2f6aa5eaa458297be05a607200148
RX(1.0*acos(x))
e5856b77d8e14d4eb60eb6260cfcd229--85c2f6aa5eaa458297be05a607200148
d503e054ff614492a27115ad4b8cfac2
1
d98e9271d71e4fa98498534092522305
RX(theta₀)
85c2f6aa5eaa458297be05a607200148--d98e9271d71e4fa98498534092522305
18bc137172d6451d90bb30330b77f132
RY(theta₄)
d98e9271d71e4fa98498534092522305--18bc137172d6451d90bb30330b77f132
4a549aa88e92474ab5a8601c9414b62d
RX(theta₈)
18bc137172d6451d90bb30330b77f132--4a549aa88e92474ab5a8601c9414b62d
27cbe8f29687462db084ebf975309fab
4a549aa88e92474ab5a8601c9414b62d--27cbe8f29687462db084ebf975309fab
ccbfc35884514f29a7c88f6c18ea12f5
27cbe8f29687462db084ebf975309fab--ccbfc35884514f29a7c88f6c18ea12f5
e251e83896414eefb90cf52f3450f773
RX(theta₁₂)
ccbfc35884514f29a7c88f6c18ea12f5--e251e83896414eefb90cf52f3450f773
510afcee9f4a47fbb27223a08d669ca8
RY(theta₁₆)
e251e83896414eefb90cf52f3450f773--510afcee9f4a47fbb27223a08d669ca8
d5f3720c14b04c5aac82b70e3adad55b
RX(theta₂₀)
510afcee9f4a47fbb27223a08d669ca8--d5f3720c14b04c5aac82b70e3adad55b
a278a14525c54a8ebd9730a22b75b7fd
d5f3720c14b04c5aac82b70e3adad55b--a278a14525c54a8ebd9730a22b75b7fd
f59a9493e0a14193bbee1ab66a6f398c
a278a14525c54a8ebd9730a22b75b7fd--f59a9493e0a14193bbee1ab66a6f398c
6a7ee671193c454e96fc26f491631ffa
f59a9493e0a14193bbee1ab66a6f398c--6a7ee671193c454e96fc26f491631ffa
4d9baa9ece764cc5b7712aa4205d7b9d
6a7ee671193c454e96fc26f491631ffa--4d9baa9ece764cc5b7712aa4205d7b9d
c314c6297d0f45a69c125e6c89fc9c8a
bcba55aeaba64f6babafcce0e6c2f126
RX(2.0*acos(x))
d503e054ff614492a27115ad4b8cfac2--bcba55aeaba64f6babafcce0e6c2f126
bf7dfc6da091477e8d224d8875350804
2
5d574c77104b418da9413796090b085e
RX(theta₁)
bcba55aeaba64f6babafcce0e6c2f126--5d574c77104b418da9413796090b085e
c4e34e19ac8f421cb4d80748da21de8e
RY(theta₅)
5d574c77104b418da9413796090b085e--c4e34e19ac8f421cb4d80748da21de8e
4337d6ab44c645ecbd5e08de09212b36
RX(theta₉)
c4e34e19ac8f421cb4d80748da21de8e--4337d6ab44c645ecbd5e08de09212b36
121f68822f174b63836389d63e288079
X
4337d6ab44c645ecbd5e08de09212b36--121f68822f174b63836389d63e288079
121f68822f174b63836389d63e288079--27cbe8f29687462db084ebf975309fab
b05de6dd92f54c3b9dbdcd6d7da594db
121f68822f174b63836389d63e288079--b05de6dd92f54c3b9dbdcd6d7da594db
d1b53c3e449443c29fea0ad4c21820cc
RX(theta₁₃)
b05de6dd92f54c3b9dbdcd6d7da594db--d1b53c3e449443c29fea0ad4c21820cc
4e01b264fb37421da490098324fecf35
RY(theta₁₇)
d1b53c3e449443c29fea0ad4c21820cc--4e01b264fb37421da490098324fecf35
70e3516597564615942da8c38e20d0ae
RX(theta₂₁)
4e01b264fb37421da490098324fecf35--70e3516597564615942da8c38e20d0ae
68772cc7741d4709882001573a9b4119
X
70e3516597564615942da8c38e20d0ae--68772cc7741d4709882001573a9b4119
68772cc7741d4709882001573a9b4119--a278a14525c54a8ebd9730a22b75b7fd
0a759c9466e14ae49770837583344d93
68772cc7741d4709882001573a9b4119--0a759c9466e14ae49770837583344d93
3e1477c1cbe64f599cc912c5137a547a
AddBlock
0a759c9466e14ae49770837583344d93--3e1477c1cbe64f599cc912c5137a547a
3e1477c1cbe64f599cc912c5137a547a--c314c6297d0f45a69c125e6c89fc9c8a
fce2b54fed6b4620bed308474c1ba970
c68c38afc5fd4de7bfea74bd5318e8ac
RX(1.0*acos(2.0*y - 1.0))
bf7dfc6da091477e8d224d8875350804--c68c38afc5fd4de7bfea74bd5318e8ac
aedce3c00b874eb795a51ae46c739ff5
3
0bef3be3113243378d974a54791d8118
RX(theta₂)
c68c38afc5fd4de7bfea74bd5318e8ac--0bef3be3113243378d974a54791d8118
61da16c907274ee293b342ac98df7b48
RY(theta₆)
0bef3be3113243378d974a54791d8118--61da16c907274ee293b342ac98df7b48
4d7e5e0b1fce490e90a66914f6c31841
RX(theta₁₀)
61da16c907274ee293b342ac98df7b48--4d7e5e0b1fce490e90a66914f6c31841
947bc7b7a1cf454ba778fcec9b28a82f
4d7e5e0b1fce490e90a66914f6c31841--947bc7b7a1cf454ba778fcec9b28a82f
78114657ac374e20b03455b8acefc1c9
X
947bc7b7a1cf454ba778fcec9b28a82f--78114657ac374e20b03455b8acefc1c9
78114657ac374e20b03455b8acefc1c9--b05de6dd92f54c3b9dbdcd6d7da594db
554ffe4bf70247498ce8e9a5720605b0
RX(theta₁₄)
78114657ac374e20b03455b8acefc1c9--554ffe4bf70247498ce8e9a5720605b0
8884a30bb79944aa8d12cb591cda4482
RY(theta₁₈)
554ffe4bf70247498ce8e9a5720605b0--8884a30bb79944aa8d12cb591cda4482
ca47d2db97804ba6831880956f243355
RX(theta₂₂)
8884a30bb79944aa8d12cb591cda4482--ca47d2db97804ba6831880956f243355
a4bfaa4e187a4895996074cc8edd8dac
ca47d2db97804ba6831880956f243355--a4bfaa4e187a4895996074cc8edd8dac
b7aefc5408a44d078e9b89b587a20d0c
X
a4bfaa4e187a4895996074cc8edd8dac--b7aefc5408a44d078e9b89b587a20d0c
b7aefc5408a44d078e9b89b587a20d0c--0a759c9466e14ae49770837583344d93
b594b4343ba940fca4d75d5f72a1df14
b7aefc5408a44d078e9b89b587a20d0c--b594b4343ba940fca4d75d5f72a1df14
b594b4343ba940fca4d75d5f72a1df14--fce2b54fed6b4620bed308474c1ba970
16b5db84e7184803bba397a005976d06
c89026f8497949f58fd63f8ada1dd652
RX(2.0*acos(2.0*y - 1.0))
aedce3c00b874eb795a51ae46c739ff5--c89026f8497949f58fd63f8ada1dd652
3048f5fc1f11496fba650545a0226639
RX(theta₃)
c89026f8497949f58fd63f8ada1dd652--3048f5fc1f11496fba650545a0226639
bbbb1f7bf6d34302a2be13da035349f0
RY(theta₇)
3048f5fc1f11496fba650545a0226639--bbbb1f7bf6d34302a2be13da035349f0
a5199a9cedce4a9bba003658ec9d98f6
RX(theta₁₁)
bbbb1f7bf6d34302a2be13da035349f0--a5199a9cedce4a9bba003658ec9d98f6
83f0f763f9ef4d54b6d9e7bb40afea17
X
a5199a9cedce4a9bba003658ec9d98f6--83f0f763f9ef4d54b6d9e7bb40afea17
83f0f763f9ef4d54b6d9e7bb40afea17--947bc7b7a1cf454ba778fcec9b28a82f
adf6082540e941bf8dbba32068850bac
83f0f763f9ef4d54b6d9e7bb40afea17--adf6082540e941bf8dbba32068850bac
0d27e86af2604274bf5ee04b3e2bda28
RX(theta₁₅)
adf6082540e941bf8dbba32068850bac--0d27e86af2604274bf5ee04b3e2bda28
d9aa6b2b40c340dc88196bd7b8f16031
RY(theta₁₉)
0d27e86af2604274bf5ee04b3e2bda28--d9aa6b2b40c340dc88196bd7b8f16031
6bf40fcbfc414c5e80dbab2b9f4a4ce1
RX(theta₂₃)
d9aa6b2b40c340dc88196bd7b8f16031--6bf40fcbfc414c5e80dbab2b9f4a4ce1
084da2087c8f412dbe7f10f309f3880b
X
6bf40fcbfc414c5e80dbab2b9f4a4ce1--084da2087c8f412dbe7f10f309f3880b
084da2087c8f412dbe7f10f309f3880b--a4bfaa4e187a4895996074cc8edd8dac
845ee614070149ada7ac1cec28ab9c2e
084da2087c8f412dbe7f10f309f3880b--845ee614070149ada7ac1cec28ab9c2e
137628e116484b5b81ff762cf0aae9df
845ee614070149ada7ac1cec28ab9c2e--137628e116484b5b81ff762cf0aae9df
137628e116484b5b81ff762cf0aae9df--16b5db84e7184803bba397a005976d06