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_7bc595f634de451d9660c0d6617c5fbf
601e8f0cd2864ed794399f9e34487191
0
cd3fa62b5c1d48d6af313ee7edc5b46d
601e8f0cd2864ed794399f9e34487191--cd3fa62b5c1d48d6af313ee7edc5b46d
2b2dc6d0974641cba78306949f0bd93c
1
0691690410ca458dab635bef7da7dc18
cd3fa62b5c1d48d6af313ee7edc5b46d--0691690410ca458dab635bef7da7dc18
6bd8f8f4c78941afba59e8b7fec2df63
cbbfafea0a0341f8a30f068dda617749
AddBlock
2b2dc6d0974641cba78306949f0bd93c--cbbfafea0a0341f8a30f068dda617749
fb06642fe33a4f42a246e796a85996e8
2
cbbfafea0a0341f8a30f068dda617749--6bd8f8f4c78941afba59e8b7fec2df63
3d1a1f9697cc4278857e0fccf83eb454
e0aa10a521204bc9a59767f2479218dc
fb06642fe33a4f42a246e796a85996e8--e0aa10a521204bc9a59767f2479218dc
774b5d6181e7420697c21ca406e1e030
3
e0aa10a521204bc9a59767f2479218dc--3d1a1f9697cc4278857e0fccf83eb454
60c7d2f1493d4c6ea3ad974e861b7429
5fdd3973706a4c57a5fad686d6a998de
774b5d6181e7420697c21ca406e1e030--5fdd3973706a4c57a5fad686d6a998de
5fdd3973706a4c57a5fad686d6a998de--60c7d2f1493d4c6ea3ad974e861b7429
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_4bf20063700547daa3eae4b4c138ba5f
Tower Chebyshev FM
cluster_493bd54c2b13425b90ff0bc9f54fc5f1
Tower Chebyshev FM
576f50ca7e7b4d8fa9866ab83791d680
0
346fc70943d9413e973eac670e48fdb9
RX(1.0*acos(x))
576f50ca7e7b4d8fa9866ab83791d680--346fc70943d9413e973eac670e48fdb9
052b412f00b64356bbdcfc2439f3fb08
1
fedb88c3c9c944c9902429e68c6432fb
346fc70943d9413e973eac670e48fdb9--fedb88c3c9c944c9902429e68c6432fb
114ee77a81054accb492bf1381efcd6e
e942024b22294e2986a5ba745980bc6b
RX(2.0*acos(x))
052b412f00b64356bbdcfc2439f3fb08--e942024b22294e2986a5ba745980bc6b
7e32b2617ac1498da06fc1168cd5cb40
2
e942024b22294e2986a5ba745980bc6b--114ee77a81054accb492bf1381efcd6e
94fd280b11154eca80f631bdeb22d114
142eee4dfa5640689277c45a60198a55
RX(1.0*acos(2.0*y - 1.0))
7e32b2617ac1498da06fc1168cd5cb40--142eee4dfa5640689277c45a60198a55
b1763edfbc2d4fc88589a950cd03db69
3
142eee4dfa5640689277c45a60198a55--94fd280b11154eca80f631bdeb22d114
1559900c48144e3294ca6d5a7f270f85
01ad005abea746e18f7baa8f2dfa2825
RX(2.0*acos(2.0*y - 1.0))
b1763edfbc2d4fc88589a950cd03db69--01ad005abea746e18f7baa8f2dfa2825
01ad005abea746e18f7baa8f2dfa2825--1559900c48144e3294ca6d5a7f270f85
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
5277873ce76f447fb5fabdcef7f4fe64
0
7e239ffc32b44c04a6856fa61adb1770
RX(theta₀)
5277873ce76f447fb5fabdcef7f4fe64--7e239ffc32b44c04a6856fa61adb1770
42e3d1c9a8cc4181a7dded625611f08c
1
afba3a9a7a9c4804a80d906864eb0f8b
RY(theta₄)
7e239ffc32b44c04a6856fa61adb1770--afba3a9a7a9c4804a80d906864eb0f8b
3b962b63a20246babad78da947240614
RX(theta₈)
afba3a9a7a9c4804a80d906864eb0f8b--3b962b63a20246babad78da947240614
90599610b9484e96bbec5ab69d31bb67
3b962b63a20246babad78da947240614--90599610b9484e96bbec5ab69d31bb67
b0a3b86b1db643f29a76de8dc6c63eb1
90599610b9484e96bbec5ab69d31bb67--b0a3b86b1db643f29a76de8dc6c63eb1
1c22e80f44d94f9ab7e4e502bc61c08d
RX(theta₁₂)
b0a3b86b1db643f29a76de8dc6c63eb1--1c22e80f44d94f9ab7e4e502bc61c08d
438131455c0d41da8c67190497ee12c1
RY(theta₁₆)
1c22e80f44d94f9ab7e4e502bc61c08d--438131455c0d41da8c67190497ee12c1
42b8ba7d8f464ac8af5b1b52242946ca
RX(theta₂₀)
438131455c0d41da8c67190497ee12c1--42b8ba7d8f464ac8af5b1b52242946ca
736ad5c2081a409793e63f330c4222d4
42b8ba7d8f464ac8af5b1b52242946ca--736ad5c2081a409793e63f330c4222d4
4b7287d796d749bebcc5f0edd3692ed0
736ad5c2081a409793e63f330c4222d4--4b7287d796d749bebcc5f0edd3692ed0
9ab8b75a8dd0455a92c7d57fb25d5875
4b7287d796d749bebcc5f0edd3692ed0--9ab8b75a8dd0455a92c7d57fb25d5875
35cc531d12ec4086a19f7ce76d6f5b70
93ab8dc4b5e541718627949e88942966
RX(theta₁)
42e3d1c9a8cc4181a7dded625611f08c--93ab8dc4b5e541718627949e88942966
12c62fd4cc7d499383845d622691cb3f
2
c225ea4ecbd84eb09d194bc5b0dce131
RY(theta₅)
93ab8dc4b5e541718627949e88942966--c225ea4ecbd84eb09d194bc5b0dce131
681cde9946d9488daf0b482027a7866b
RX(theta₉)
c225ea4ecbd84eb09d194bc5b0dce131--681cde9946d9488daf0b482027a7866b
74d743a914db48d69118d2c60c750fa0
X
681cde9946d9488daf0b482027a7866b--74d743a914db48d69118d2c60c750fa0
74d743a914db48d69118d2c60c750fa0--90599610b9484e96bbec5ab69d31bb67
e11913396082428a8c13b4c51b1d0a3e
74d743a914db48d69118d2c60c750fa0--e11913396082428a8c13b4c51b1d0a3e
bd65125a00ae403281519efddf67e379
RX(theta₁₃)
e11913396082428a8c13b4c51b1d0a3e--bd65125a00ae403281519efddf67e379
f13ef51bc6e74bfdad63873e96d3f7b6
RY(theta₁₇)
bd65125a00ae403281519efddf67e379--f13ef51bc6e74bfdad63873e96d3f7b6
5e9eea4cd3bf44b79781cf84dfccc15f
RX(theta₂₁)
f13ef51bc6e74bfdad63873e96d3f7b6--5e9eea4cd3bf44b79781cf84dfccc15f
6d5fb6f4025941fa8a35443b81c2648f
X
5e9eea4cd3bf44b79781cf84dfccc15f--6d5fb6f4025941fa8a35443b81c2648f
6d5fb6f4025941fa8a35443b81c2648f--736ad5c2081a409793e63f330c4222d4
6047e03b98fe4a81b53e25c5d83c51d8
6d5fb6f4025941fa8a35443b81c2648f--6047e03b98fe4a81b53e25c5d83c51d8
6047e03b98fe4a81b53e25c5d83c51d8--35cc531d12ec4086a19f7ce76d6f5b70
f9dece3e11574419af9f64477bc9cffd
d1e22e4befa343cc828adbc4efb56665
RX(theta₂)
12c62fd4cc7d499383845d622691cb3f--d1e22e4befa343cc828adbc4efb56665
36f46d738a764b53bb77f6234063bc71
3
0023efd281704570b257e40763531343
RY(theta₆)
d1e22e4befa343cc828adbc4efb56665--0023efd281704570b257e40763531343
1ec6a80b5a644c0686f8226cbe8fc438
RX(theta₁₀)
0023efd281704570b257e40763531343--1ec6a80b5a644c0686f8226cbe8fc438
03ace2a42c114bbc95c24541ec8f2610
1ec6a80b5a644c0686f8226cbe8fc438--03ace2a42c114bbc95c24541ec8f2610
78931b6e4a5847e8897386c00f2ef23e
X
03ace2a42c114bbc95c24541ec8f2610--78931b6e4a5847e8897386c00f2ef23e
78931b6e4a5847e8897386c00f2ef23e--e11913396082428a8c13b4c51b1d0a3e
a02e633a64254676b4d88efc9adab2bd
RX(theta₁₄)
78931b6e4a5847e8897386c00f2ef23e--a02e633a64254676b4d88efc9adab2bd
fb0952c35ff7476f837fd718507af77d
RY(theta₁₈)
a02e633a64254676b4d88efc9adab2bd--fb0952c35ff7476f837fd718507af77d
15592a395a9b4824a1a89948964ed619
RX(theta₂₂)
fb0952c35ff7476f837fd718507af77d--15592a395a9b4824a1a89948964ed619
2334e62068674797b6fd3a1f48d982e8
15592a395a9b4824a1a89948964ed619--2334e62068674797b6fd3a1f48d982e8
e52a3f4fe7504853bd3d82ad0bcf32ad
X
2334e62068674797b6fd3a1f48d982e8--e52a3f4fe7504853bd3d82ad0bcf32ad
e52a3f4fe7504853bd3d82ad0bcf32ad--6047e03b98fe4a81b53e25c5d83c51d8
e52a3f4fe7504853bd3d82ad0bcf32ad--f9dece3e11574419af9f64477bc9cffd
fefb99b5d58546bb9e4ee436b17a2891
8d26b462731a4d4f9c7dd3944cfb93d9
RX(theta₃)
36f46d738a764b53bb77f6234063bc71--8d26b462731a4d4f9c7dd3944cfb93d9
184b257f8358410c8c3166434c6c2acf
RY(theta₇)
8d26b462731a4d4f9c7dd3944cfb93d9--184b257f8358410c8c3166434c6c2acf
5795cd90714d4403bdb75265508c9e12
RX(theta₁₁)
184b257f8358410c8c3166434c6c2acf--5795cd90714d4403bdb75265508c9e12
e2d15ad1de534edcbd7f2766242531db
X
5795cd90714d4403bdb75265508c9e12--e2d15ad1de534edcbd7f2766242531db
e2d15ad1de534edcbd7f2766242531db--03ace2a42c114bbc95c24541ec8f2610
815205a9c27742bcaf8e22fb3a85e035
e2d15ad1de534edcbd7f2766242531db--815205a9c27742bcaf8e22fb3a85e035
22508472688745498e9f5c5b02c624a4
RX(theta₁₅)
815205a9c27742bcaf8e22fb3a85e035--22508472688745498e9f5c5b02c624a4
4421993dd1b446e5bf0a922208031d8a
RY(theta₁₉)
22508472688745498e9f5c5b02c624a4--4421993dd1b446e5bf0a922208031d8a
af4a69acc1ad4260a194050b9f89b368
RX(theta₂₃)
4421993dd1b446e5bf0a922208031d8a--af4a69acc1ad4260a194050b9f89b368
cbdc28dd674a4e598d622dec4bad0111
X
af4a69acc1ad4260a194050b9f89b368--cbdc28dd674a4e598d622dec4bad0111
cbdc28dd674a4e598d622dec4bad0111--2334e62068674797b6fd3a1f48d982e8
f5c800f3c5024007aa841c5d1ee12c66
cbdc28dd674a4e598d622dec4bad0111--f5c800f3c5024007aa841c5d1ee12c66
f5c800f3c5024007aa841c5d1ee12c66--fefb99b5d58546bb9e4ee436b17a2891
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_a1faac5ba43245f489198827f30c7738
Obs.
cluster_358f90be80114a28b27457768d9a5330
cluster_c149a11d427f4cb8b75bdc79b5861db1
Tower Chebyshev FM
cluster_3e231281cbde4370ab1f812425aa5614
Tower Chebyshev FM
cluster_63addeaa7dfc4b1092ade10af907955e
HEA
3aae838acd854e50afe6ed7c592f103c
0
79a15a29ae544d29ba5dcbafcf71e3bf
RX(1.0*acos(x))
3aae838acd854e50afe6ed7c592f103c--79a15a29ae544d29ba5dcbafcf71e3bf
e08271b3ebbd44c28e2710b19e75faba
1
3bef92ce56314e8eaa147d1d77bee3c4
RX(theta₀)
79a15a29ae544d29ba5dcbafcf71e3bf--3bef92ce56314e8eaa147d1d77bee3c4
295d844704804e66bbdfe64d74970680
RY(theta₄)
3bef92ce56314e8eaa147d1d77bee3c4--295d844704804e66bbdfe64d74970680
412ace0b8e214d27963d17d33e368391
RX(theta₈)
295d844704804e66bbdfe64d74970680--412ace0b8e214d27963d17d33e368391
df867676d4384483a03ce8199eff4638
412ace0b8e214d27963d17d33e368391--df867676d4384483a03ce8199eff4638
3e404d09cf91416fa9918aeec59f3076
df867676d4384483a03ce8199eff4638--3e404d09cf91416fa9918aeec59f3076
9c5ba3671ea04f2badccd256e6d0b755
RX(theta₁₂)
3e404d09cf91416fa9918aeec59f3076--9c5ba3671ea04f2badccd256e6d0b755
f8b11643851a40f6a33d54f3c9e6e476
RY(theta₁₆)
9c5ba3671ea04f2badccd256e6d0b755--f8b11643851a40f6a33d54f3c9e6e476
e0157eb26adc49a2b91021fa82542a7e
RX(theta₂₀)
f8b11643851a40f6a33d54f3c9e6e476--e0157eb26adc49a2b91021fa82542a7e
563b68ac75474b6dac75abf7f108b643
e0157eb26adc49a2b91021fa82542a7e--563b68ac75474b6dac75abf7f108b643
188a6bac5744427791e2cabec0c9f396
563b68ac75474b6dac75abf7f108b643--188a6bac5744427791e2cabec0c9f396
45e1a26c66f5426093109858efad08af
188a6bac5744427791e2cabec0c9f396--45e1a26c66f5426093109858efad08af
3e99334e1d7e403ca9657192989029f4
45e1a26c66f5426093109858efad08af--3e99334e1d7e403ca9657192989029f4
b85629baf995439998b60dd9d96de891
f471716f1bf449f8987d083187f2933c
RX(2.0*acos(x))
e08271b3ebbd44c28e2710b19e75faba--f471716f1bf449f8987d083187f2933c
8a204fafeef440c785d2f2c21358480a
2
7d78f45738844be1a5a66a3da3520423
RX(theta₁)
f471716f1bf449f8987d083187f2933c--7d78f45738844be1a5a66a3da3520423
b749e3a7a0f7474fb91b65aebcbdfc0a
RY(theta₅)
7d78f45738844be1a5a66a3da3520423--b749e3a7a0f7474fb91b65aebcbdfc0a
98e25f8180364df99d69508129874d5c
RX(theta₉)
b749e3a7a0f7474fb91b65aebcbdfc0a--98e25f8180364df99d69508129874d5c
aab0a1d2490b4a1f9039dda43db1b4fc
X
98e25f8180364df99d69508129874d5c--aab0a1d2490b4a1f9039dda43db1b4fc
aab0a1d2490b4a1f9039dda43db1b4fc--df867676d4384483a03ce8199eff4638
d00e2fe5cfb04397a490e96387c76016
aab0a1d2490b4a1f9039dda43db1b4fc--d00e2fe5cfb04397a490e96387c76016
3e4360fe143d40019bfb36131e1201e6
RX(theta₁₃)
d00e2fe5cfb04397a490e96387c76016--3e4360fe143d40019bfb36131e1201e6
1840c03685a0487785eb6f28c590b946
RY(theta₁₇)
3e4360fe143d40019bfb36131e1201e6--1840c03685a0487785eb6f28c590b946
9b990f3786eb4481ac25142403c74efe
RX(theta₂₁)
1840c03685a0487785eb6f28c590b946--9b990f3786eb4481ac25142403c74efe
75d68abb0f94447ba465c004ce921ad6
X
9b990f3786eb4481ac25142403c74efe--75d68abb0f94447ba465c004ce921ad6
75d68abb0f94447ba465c004ce921ad6--563b68ac75474b6dac75abf7f108b643
9d105b9d64324b0aa612f7e7a5bd32fb
75d68abb0f94447ba465c004ce921ad6--9d105b9d64324b0aa612f7e7a5bd32fb
f2f57af241164c0f8f2dfb74b1cd160e
AddBlock
9d105b9d64324b0aa612f7e7a5bd32fb--f2f57af241164c0f8f2dfb74b1cd160e
f2f57af241164c0f8f2dfb74b1cd160e--b85629baf995439998b60dd9d96de891
a6963a230c2b4354ac3c7823526ea262
af0af75463424fe19e75f3f8ddb8c390
RX(1.0*acos(2.0*y - 1.0))
8a204fafeef440c785d2f2c21358480a--af0af75463424fe19e75f3f8ddb8c390
0dc3e22cd7d148a8b40ef46c376b7f46
3
e07858913f934ae0af6e1a56449fb6fb
RX(theta₂)
af0af75463424fe19e75f3f8ddb8c390--e07858913f934ae0af6e1a56449fb6fb
c17adad23ccf4fde99c57399a23f7716
RY(theta₆)
e07858913f934ae0af6e1a56449fb6fb--c17adad23ccf4fde99c57399a23f7716
a17768606f464e578b806b74dbbb416f
RX(theta₁₀)
c17adad23ccf4fde99c57399a23f7716--a17768606f464e578b806b74dbbb416f
c93754f71ba143f7ab8d348d616fa317
a17768606f464e578b806b74dbbb416f--c93754f71ba143f7ab8d348d616fa317
9ff3b594d4a541a0a8886e436959ed68
X
c93754f71ba143f7ab8d348d616fa317--9ff3b594d4a541a0a8886e436959ed68
9ff3b594d4a541a0a8886e436959ed68--d00e2fe5cfb04397a490e96387c76016
90ed4221dc2d4c9aaf72b0e1e19ac440
RX(theta₁₄)
9ff3b594d4a541a0a8886e436959ed68--90ed4221dc2d4c9aaf72b0e1e19ac440
985218b23ad247bfa67126856e2e88ca
RY(theta₁₈)
90ed4221dc2d4c9aaf72b0e1e19ac440--985218b23ad247bfa67126856e2e88ca
b268b836a5254d15a8b8559e7c459d2b
RX(theta₂₂)
985218b23ad247bfa67126856e2e88ca--b268b836a5254d15a8b8559e7c459d2b
8afaeb7a8f964851b173ec56ec008125
b268b836a5254d15a8b8559e7c459d2b--8afaeb7a8f964851b173ec56ec008125
ed0e27dc89c84d2d8aef38bd269d4709
X
8afaeb7a8f964851b173ec56ec008125--ed0e27dc89c84d2d8aef38bd269d4709
ed0e27dc89c84d2d8aef38bd269d4709--9d105b9d64324b0aa612f7e7a5bd32fb
e75ca67d16234edd95201db8551a130d
ed0e27dc89c84d2d8aef38bd269d4709--e75ca67d16234edd95201db8551a130d
e75ca67d16234edd95201db8551a130d--a6963a230c2b4354ac3c7823526ea262
558375af98e34268bd864daa8140879c
bd778082edc24611a3825e2bd762b1f2
RX(2.0*acos(2.0*y - 1.0))
0dc3e22cd7d148a8b40ef46c376b7f46--bd778082edc24611a3825e2bd762b1f2
c10a1d80269f49acb575a0ce3bd2f176
RX(theta₃)
bd778082edc24611a3825e2bd762b1f2--c10a1d80269f49acb575a0ce3bd2f176
ce07090fabbf4f29adba0890e8d6ff74
RY(theta₇)
c10a1d80269f49acb575a0ce3bd2f176--ce07090fabbf4f29adba0890e8d6ff74
a05bc87587364a8a878e3f44b2aaf089
RX(theta₁₁)
ce07090fabbf4f29adba0890e8d6ff74--a05bc87587364a8a878e3f44b2aaf089
6f604487ce5b4463a9a02153ba91a2f6
X
a05bc87587364a8a878e3f44b2aaf089--6f604487ce5b4463a9a02153ba91a2f6
6f604487ce5b4463a9a02153ba91a2f6--c93754f71ba143f7ab8d348d616fa317
afc32b3587d14064833d5247186bb83f
6f604487ce5b4463a9a02153ba91a2f6--afc32b3587d14064833d5247186bb83f
ab613671e2fc4a088d4d87ae1eb45858
RX(theta₁₅)
afc32b3587d14064833d5247186bb83f--ab613671e2fc4a088d4d87ae1eb45858
77182e66d394491e9bf7618bc4dfccc5
RY(theta₁₉)
ab613671e2fc4a088d4d87ae1eb45858--77182e66d394491e9bf7618bc4dfccc5
d69695ead6f34d39b31c9bdad36f6eee
RX(theta₂₃)
77182e66d394491e9bf7618bc4dfccc5--d69695ead6f34d39b31c9bdad36f6eee
5686197daf704581aa92dc6b1591091c
X
d69695ead6f34d39b31c9bdad36f6eee--5686197daf704581aa92dc6b1591091c
5686197daf704581aa92dc6b1591091c--8afaeb7a8f964851b173ec56ec008125
a9833ab8b9c6431aa93aa01c4741abd8
5686197daf704581aa92dc6b1591091c--a9833ab8b9c6431aa93aa01c4741abd8
5deba5df7c9b4c658503a54a946908e5
a9833ab8b9c6431aa93aa01c4741abd8--5deba5df7c9b4c658503a54a946908e5
5deba5df7c9b4c658503a54a946908e5--558375af98e34268bd864daa8140879c