QNN Config
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 this tutorial, we will see how to do the same using configs.
One convenient way to construct these two parts of the model is to use the config classes, namely, FeatureMapConfig
and 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.
It can be used to create Hamiltonians with 2-qubit interactions and single-qubit detunings. Any Hamiltonian supported by hamiltonian_factory
can be specified as an observable.
For example, suppose we want to measure the Z operator:
from qadence import create_observable , ObservableConfig , Z
observable_config = ObservableConfig (
detuning = Z ,
interaction = None ,
scale = 2.0 ,
shift =- 1.0 ,
)
observable = create_observable ( register = 4 , config = observable_config )
%3
cluster_a45549cb3feb4930853819936a9b56a5
b4b169b3c9ea414680e113e930fa19a3
0
55235efcc0704a6e97fcad3e9e9106a7
b4b169b3c9ea414680e113e930fa19a3--55235efcc0704a6e97fcad3e9e9106a7
389dcc47826c41e4a716c3694252d532
1
20538ea2542b47a388ce7e3497a5c8a1
55235efcc0704a6e97fcad3e9e9106a7--20538ea2542b47a388ce7e3497a5c8a1
e7646b63bcf34ac6bb5ab00c697b655c
9125daff5b5944cb91a4331aa7e2c517
AddBlock
389dcc47826c41e4a716c3694252d532--9125daff5b5944cb91a4331aa7e2c517
7a76f1ec80d5409ca29925c3d4cfc96c
2
9125daff5b5944cb91a4331aa7e2c517--e7646b63bcf34ac6bb5ab00c697b655c
f4c342bcc1764a4ab6d262595586a335
d38055e72a0843ec8613a22c73eab639
7a76f1ec80d5409ca29925c3d4cfc96c--d38055e72a0843ec8613a22c73eab639
7f40f08b462c45b1816c86a6b43252b4
3
d38055e72a0843ec8613a22c73eab639--f4c342bcc1764a4ab6d262595586a335
138a46c323324d729c2fba461859a60b
7b82e3d7070d408b8c547ee0811e2e1d
7f40f08b462c45b1816c86a6b43252b4--7b82e3d7070d408b8c547ee0811e2e1d
7b82e3d7070d408b8c547ee0811e2e1d--138a46c323324d729c2fba461859a60b
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_a8f4453d22774e519b7946be49e38e90
Tower Chebyshev FM
cluster_22ff185312014850a6ddadd5fd50d0a7
Tower Chebyshev FM
cd2939e031084fe88c55a2ca1077ac21
0
e607b574831343c4b42de3e367d0025f
RX(1.0*acos(x))
cd2939e031084fe88c55a2ca1077ac21--e607b574831343c4b42de3e367d0025f
a247aacc29984d15a48aebf25c6bf999
1
b41e0ef7c8f84291b1d73c3ea704990b
e607b574831343c4b42de3e367d0025f--b41e0ef7c8f84291b1d73c3ea704990b
9fc49f0f025f47a98f2f8db6eb1e97ed
c1ae8420b4c147088434594115b8767a
RX(2.0*acos(x))
a247aacc29984d15a48aebf25c6bf999--c1ae8420b4c147088434594115b8767a
82aa907f3133446dab385a83cfca723e
2
c1ae8420b4c147088434594115b8767a--9fc49f0f025f47a98f2f8db6eb1e97ed
cfe1da92c68d466393b1e6c48dc9dc90
dcaebffaa02e4555b9519ac89c1490a2
RX(1.0*acos(2.0*y - 1.0))
82aa907f3133446dab385a83cfca723e--dcaebffaa02e4555b9519ac89c1490a2
61ae447d4a454af4a601389968e51242
3
dcaebffaa02e4555b9519ac89c1490a2--cfe1da92c68d466393b1e6c48dc9dc90
0dff8653d35b42638b4122a5372b9f2b
b2c350a1d5474c04bb96bfa8ebb94af4
RX(2.0*acos(2.0*y - 1.0))
61ae447d4a454af4a601389968e51242--b2c350a1d5474c04bb96bfa8ebb94af4
b2c350a1d5474c04bb96bfa8ebb94af4--0dff8653d35b42638b4122a5372b9f2b
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..
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
4e38f91f472546499f25f35d49eafb50
0
1d0eb2c0ec5047158eae8e381d8743a1
RX(theta₀)
4e38f91f472546499f25f35d49eafb50--1d0eb2c0ec5047158eae8e381d8743a1
c62c0bfa2142443e8ca6d366d1fdf4f6
1
9bba0ee19e954b2e8855618bce0ee592
RY(theta₄)
1d0eb2c0ec5047158eae8e381d8743a1--9bba0ee19e954b2e8855618bce0ee592
c7c645484721498193083f3481ad3601
RX(theta₈)
9bba0ee19e954b2e8855618bce0ee592--c7c645484721498193083f3481ad3601
b73f68d472c841d8aedda18eb3e1daac
c7c645484721498193083f3481ad3601--b73f68d472c841d8aedda18eb3e1daac
6941ca598bdb472c876b7b92429130ba
b73f68d472c841d8aedda18eb3e1daac--6941ca598bdb472c876b7b92429130ba
cf1b5fc96a9948fa975db31346fb2b94
RX(theta₁₂)
6941ca598bdb472c876b7b92429130ba--cf1b5fc96a9948fa975db31346fb2b94
f2d89feb4ae24b0e920c6b8ef25bb8da
RY(theta₁₆)
cf1b5fc96a9948fa975db31346fb2b94--f2d89feb4ae24b0e920c6b8ef25bb8da
f0e440337e7e4d83bff2e4bd419f7312
RX(theta₂₀)
f2d89feb4ae24b0e920c6b8ef25bb8da--f0e440337e7e4d83bff2e4bd419f7312
04d14dca14cb4158b42482ac7beb3133
f0e440337e7e4d83bff2e4bd419f7312--04d14dca14cb4158b42482ac7beb3133
7afb490e9ae04c4aa9b489be580b44b4
04d14dca14cb4158b42482ac7beb3133--7afb490e9ae04c4aa9b489be580b44b4
2fe74ac6aafe4bf599b1e6aeece5cf10
7afb490e9ae04c4aa9b489be580b44b4--2fe74ac6aafe4bf599b1e6aeece5cf10
ea06cc5d7501445ab1ebfc23efc33907
761b34759e3d41d3abf124b688b728a9
RX(theta₁)
c62c0bfa2142443e8ca6d366d1fdf4f6--761b34759e3d41d3abf124b688b728a9
fe5b2cffa4f7444d8ab53e2222d4a958
2
a7fbae7e9f8546f59366dd309a55bec5
RY(theta₅)
761b34759e3d41d3abf124b688b728a9--a7fbae7e9f8546f59366dd309a55bec5
5f96dbbc6415483d8c9781354d04827d
RX(theta₉)
a7fbae7e9f8546f59366dd309a55bec5--5f96dbbc6415483d8c9781354d04827d
8478122c81ca4959b70e74d23bcb135e
X
5f96dbbc6415483d8c9781354d04827d--8478122c81ca4959b70e74d23bcb135e
8478122c81ca4959b70e74d23bcb135e--b73f68d472c841d8aedda18eb3e1daac
97ccaa3566c74930b6fd4279595d36c9
8478122c81ca4959b70e74d23bcb135e--97ccaa3566c74930b6fd4279595d36c9
c9afcfe984b34ead909528890a4cac4a
RX(theta₁₃)
97ccaa3566c74930b6fd4279595d36c9--c9afcfe984b34ead909528890a4cac4a
910c4ca49e8d4e70842b0fe26a6d55a8
RY(theta₁₇)
c9afcfe984b34ead909528890a4cac4a--910c4ca49e8d4e70842b0fe26a6d55a8
2ad42b9db4b54f598bf8c099bdf21bd4
RX(theta₂₁)
910c4ca49e8d4e70842b0fe26a6d55a8--2ad42b9db4b54f598bf8c099bdf21bd4
23b6cf7353a84660862cbd2e2f43c882
X
2ad42b9db4b54f598bf8c099bdf21bd4--23b6cf7353a84660862cbd2e2f43c882
23b6cf7353a84660862cbd2e2f43c882--04d14dca14cb4158b42482ac7beb3133
abeccee150b84f2ebe66440f80074b1d
23b6cf7353a84660862cbd2e2f43c882--abeccee150b84f2ebe66440f80074b1d
abeccee150b84f2ebe66440f80074b1d--ea06cc5d7501445ab1ebfc23efc33907
f097505f2abe4ec7bb9f012f4115e5db
d6a66c09f7c24cca8e664595eaba875a
RX(theta₂)
fe5b2cffa4f7444d8ab53e2222d4a958--d6a66c09f7c24cca8e664595eaba875a
7f79f2e2f56e4684afb8272a06e98ae7
3
b8067b0a52534ea7b69ce9661ad91b10
RY(theta₆)
d6a66c09f7c24cca8e664595eaba875a--b8067b0a52534ea7b69ce9661ad91b10
66245227b9664894ba805c8d61911931
RX(theta₁₀)
b8067b0a52534ea7b69ce9661ad91b10--66245227b9664894ba805c8d61911931
525bc5f0563d48469618885408e3f8ea
66245227b9664894ba805c8d61911931--525bc5f0563d48469618885408e3f8ea
e26900527d934693b57e4b9c9ad413e9
X
525bc5f0563d48469618885408e3f8ea--e26900527d934693b57e4b9c9ad413e9
e26900527d934693b57e4b9c9ad413e9--97ccaa3566c74930b6fd4279595d36c9
aca0f2d257a84f82828fedfdd86ca2a3
RX(theta₁₄)
e26900527d934693b57e4b9c9ad413e9--aca0f2d257a84f82828fedfdd86ca2a3
d20aa8151622418f82002a2509c3245c
RY(theta₁₈)
aca0f2d257a84f82828fedfdd86ca2a3--d20aa8151622418f82002a2509c3245c
4a01696101664ef19496f70b9fabad1e
RX(theta₂₂)
d20aa8151622418f82002a2509c3245c--4a01696101664ef19496f70b9fabad1e
4da877c211b141eb8c09594c7ca407d0
4a01696101664ef19496f70b9fabad1e--4da877c211b141eb8c09594c7ca407d0
6940b9ed4ea640008ac80025a3d88051
X
4da877c211b141eb8c09594c7ca407d0--6940b9ed4ea640008ac80025a3d88051
6940b9ed4ea640008ac80025a3d88051--abeccee150b84f2ebe66440f80074b1d
6940b9ed4ea640008ac80025a3d88051--f097505f2abe4ec7bb9f012f4115e5db
52efcd8fcdd048409d4fd46294c0d64d
6d52246c354a4d77a93e5b0b35a28222
RX(theta₃)
7f79f2e2f56e4684afb8272a06e98ae7--6d52246c354a4d77a93e5b0b35a28222
e6792a0c58c943678deae12e96c1ebe0
RY(theta₇)
6d52246c354a4d77a93e5b0b35a28222--e6792a0c58c943678deae12e96c1ebe0
fd0c35cca6fe47578918702807c9a9dd
RX(theta₁₁)
e6792a0c58c943678deae12e96c1ebe0--fd0c35cca6fe47578918702807c9a9dd
d412c8a75d9841e4903f53531dfe35c9
X
fd0c35cca6fe47578918702807c9a9dd--d412c8a75d9841e4903f53531dfe35c9
d412c8a75d9841e4903f53531dfe35c9--525bc5f0563d48469618885408e3f8ea
0cfff1e7cbfe4e279382fa81efbd244a
d412c8a75d9841e4903f53531dfe35c9--0cfff1e7cbfe4e279382fa81efbd244a
cf77d5efc3ff4051add3c672de3ea43b
RX(theta₁₅)
0cfff1e7cbfe4e279382fa81efbd244a--cf77d5efc3ff4051add3c672de3ea43b
f288fd9b0cc5403cbcbf8fa8179f533d
RY(theta₁₉)
cf77d5efc3ff4051add3c672de3ea43b--f288fd9b0cc5403cbcbf8fa8179f533d
2ae0b20784e84d6abf593f61f1305523
RX(theta₂₃)
f288fd9b0cc5403cbcbf8fa8179f533d--2ae0b20784e84d6abf593f61f1305523
9f2d9f0d5414477a8af5d88321829758
X
2ae0b20784e84d6abf593f61f1305523--9f2d9f0d5414477a8af5d88321829758
9f2d9f0d5414477a8af5d88321829758--4da877c211b141eb8c09594c7ca407d0
2e7d43620e81490d8934502f9e27c9c7
9f2d9f0d5414477a8af5d88321829758--2e7d43620e81490d8934502f9e27c9c7
2e7d43620e81490d8934502f9e27c9c7--52efcd8fcdd048409d4fd46294c0d64d
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.
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.
from qadence import BackendName , DiffMode , QNN , ObservableConfig , Z
observable_config = ObservableConfig (
detuning = Z ,
interaction = None ,
scale = 2.0 ,
shift =- 1.0 ,
)
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_23b1f148d627479389ac1ed91dbf2d71
Obs.
cluster_1b799e98a78f43bd8147f94ee2ef4450
cluster_746786b9ecef4c488d90aa00c3903940
Tower Chebyshev FM
cluster_eaa39817f02943909e1158b83c54a42a
Tower Chebyshev FM
cluster_918584e3294648a5972c787c71b2367c
HEA
6cb28039e439460c841143b096bc8420
0
f610f975ea0640fcbdc36ebf32c15f7a
RX(1.0*acos(x))
6cb28039e439460c841143b096bc8420--f610f975ea0640fcbdc36ebf32c15f7a
3e01d54ad35a40b19c3c6930c3567d28
1
2c1ef96f6a4240209a49ae570a94d874
RX(theta₀)
f610f975ea0640fcbdc36ebf32c15f7a--2c1ef96f6a4240209a49ae570a94d874
081d93d72e9a4e58b25df580be3e2a93
RY(theta₄)
2c1ef96f6a4240209a49ae570a94d874--081d93d72e9a4e58b25df580be3e2a93
bc10532365744dbb96332498bd14ff2c
RX(theta₈)
081d93d72e9a4e58b25df580be3e2a93--bc10532365744dbb96332498bd14ff2c
ebb3531c474244308e984397ad0d2047
bc10532365744dbb96332498bd14ff2c--ebb3531c474244308e984397ad0d2047
ef59ec64b54a43038070931b525c7f41
ebb3531c474244308e984397ad0d2047--ef59ec64b54a43038070931b525c7f41
3145cc8dd04743f18ac29dea11f0e365
RX(theta₁₂)
ef59ec64b54a43038070931b525c7f41--3145cc8dd04743f18ac29dea11f0e365
4d05f8615b0a458db3942da179f39e26
RY(theta₁₆)
3145cc8dd04743f18ac29dea11f0e365--4d05f8615b0a458db3942da179f39e26
d650d0679ff84354a0af4871599706be
RX(theta₂₀)
4d05f8615b0a458db3942da179f39e26--d650d0679ff84354a0af4871599706be
e9d6ced9ec6a4a96875d4cb0bdfc2057
d650d0679ff84354a0af4871599706be--e9d6ced9ec6a4a96875d4cb0bdfc2057
7b80237d86ea48ffb0527c5e0dd101ce
e9d6ced9ec6a4a96875d4cb0bdfc2057--7b80237d86ea48ffb0527c5e0dd101ce
2ff082557e3641f7b6de96042699c9ad
7b80237d86ea48ffb0527c5e0dd101ce--2ff082557e3641f7b6de96042699c9ad
a5da1292fa5d4de189e8d1eef0c73b33
2ff082557e3641f7b6de96042699c9ad--a5da1292fa5d4de189e8d1eef0c73b33
0af9badad42a446eaf00f9b5d250e8aa
5c50eba3ad8f40e1bc93a70b92be38af
RX(2.0*acos(x))
3e01d54ad35a40b19c3c6930c3567d28--5c50eba3ad8f40e1bc93a70b92be38af
61e1940784804d4bb2ba4c0e11084454
2
8cec43e1e03244fc8bcdf95ca9941d1a
RX(theta₁)
5c50eba3ad8f40e1bc93a70b92be38af--8cec43e1e03244fc8bcdf95ca9941d1a
ff4c7da569504d8bbc2bc1b967ee773c
RY(theta₅)
8cec43e1e03244fc8bcdf95ca9941d1a--ff4c7da569504d8bbc2bc1b967ee773c
147b4c201c7d446481258fe18612c4be
RX(theta₉)
ff4c7da569504d8bbc2bc1b967ee773c--147b4c201c7d446481258fe18612c4be
e71652f8049c4b63b47e62235fdbbc35
X
147b4c201c7d446481258fe18612c4be--e71652f8049c4b63b47e62235fdbbc35
e71652f8049c4b63b47e62235fdbbc35--ebb3531c474244308e984397ad0d2047
809c2f68126148bbba45221896fcdc4a
e71652f8049c4b63b47e62235fdbbc35--809c2f68126148bbba45221896fcdc4a
2b6127b891d04a3f95f9d872f3a568ed
RX(theta₁₃)
809c2f68126148bbba45221896fcdc4a--2b6127b891d04a3f95f9d872f3a568ed
8663371a4d33430d90e82149df158311
RY(theta₁₇)
2b6127b891d04a3f95f9d872f3a568ed--8663371a4d33430d90e82149df158311
3afb0161c013457cbcf2a6260076c707
RX(theta₂₁)
8663371a4d33430d90e82149df158311--3afb0161c013457cbcf2a6260076c707
1c083c0beba04b12b1b61e4dde9d97cf
X
3afb0161c013457cbcf2a6260076c707--1c083c0beba04b12b1b61e4dde9d97cf
1c083c0beba04b12b1b61e4dde9d97cf--e9d6ced9ec6a4a96875d4cb0bdfc2057
9813ab31f8be4990bc85c0fee714d8f8
1c083c0beba04b12b1b61e4dde9d97cf--9813ab31f8be4990bc85c0fee714d8f8
3609e6fa0b16493199cb905e56bbbd50
AddBlock
9813ab31f8be4990bc85c0fee714d8f8--3609e6fa0b16493199cb905e56bbbd50
3609e6fa0b16493199cb905e56bbbd50--0af9badad42a446eaf00f9b5d250e8aa
49563c8013f1440cb170a9db1be2b5db
7418dbb423864174985c6c6e57afe5c8
RX(1.0*acos(2.0*y - 1.0))
61e1940784804d4bb2ba4c0e11084454--7418dbb423864174985c6c6e57afe5c8
bb67ce7ff1ed48df902d6a200705c2aa
3
48d0b0ec72cd4b369cbb1fdf61af944f
RX(theta₂)
7418dbb423864174985c6c6e57afe5c8--48d0b0ec72cd4b369cbb1fdf61af944f
eb459ddcfda1493c8a6ec0c1f3ad1ef6
RY(theta₆)
48d0b0ec72cd4b369cbb1fdf61af944f--eb459ddcfda1493c8a6ec0c1f3ad1ef6
3e01f71ddaff48a2935ef4971bdd845f
RX(theta₁₀)
eb459ddcfda1493c8a6ec0c1f3ad1ef6--3e01f71ddaff48a2935ef4971bdd845f
e2154f6561f24c13b5712b0c76b67114
3e01f71ddaff48a2935ef4971bdd845f--e2154f6561f24c13b5712b0c76b67114
be253ee0ead14a21a5298d43eb394dac
X
e2154f6561f24c13b5712b0c76b67114--be253ee0ead14a21a5298d43eb394dac
be253ee0ead14a21a5298d43eb394dac--809c2f68126148bbba45221896fcdc4a
c55e7fad31b04713b6d9172eb1669584
RX(theta₁₄)
be253ee0ead14a21a5298d43eb394dac--c55e7fad31b04713b6d9172eb1669584
83b27c2c2f1245e9936ecf9923e2db25
RY(theta₁₈)
c55e7fad31b04713b6d9172eb1669584--83b27c2c2f1245e9936ecf9923e2db25
fa96e6b72da1475e96eb76f70adfc891
RX(theta₂₂)
83b27c2c2f1245e9936ecf9923e2db25--fa96e6b72da1475e96eb76f70adfc891
8cd0cffb601342fc902c04bfccc737be
fa96e6b72da1475e96eb76f70adfc891--8cd0cffb601342fc902c04bfccc737be
5e102e09ff324e979758bc18eb14ce52
X
8cd0cffb601342fc902c04bfccc737be--5e102e09ff324e979758bc18eb14ce52
5e102e09ff324e979758bc18eb14ce52--9813ab31f8be4990bc85c0fee714d8f8
7fd26f6d4de94362a6046b67690b9c68
5e102e09ff324e979758bc18eb14ce52--7fd26f6d4de94362a6046b67690b9c68
7fd26f6d4de94362a6046b67690b9c68--49563c8013f1440cb170a9db1be2b5db
a8e9418c401b45a9930224d7099d375c
a6d27c1349b845dd949b758ad445c4ab
RX(2.0*acos(2.0*y - 1.0))
bb67ce7ff1ed48df902d6a200705c2aa--a6d27c1349b845dd949b758ad445c4ab
a84a5c7ae2414e60954ecadcc6f4e2d2
RX(theta₃)
a6d27c1349b845dd949b758ad445c4ab--a84a5c7ae2414e60954ecadcc6f4e2d2
9466669b68344d8a9634f21f00ec9edb
RY(theta₇)
a84a5c7ae2414e60954ecadcc6f4e2d2--9466669b68344d8a9634f21f00ec9edb
d9e67c5fa8e34560a30f4f1007450f88
RX(theta₁₁)
9466669b68344d8a9634f21f00ec9edb--d9e67c5fa8e34560a30f4f1007450f88
23c6ced4039740fd9c14e9e9e0af4b00
X
d9e67c5fa8e34560a30f4f1007450f88--23c6ced4039740fd9c14e9e9e0af4b00
23c6ced4039740fd9c14e9e9e0af4b00--e2154f6561f24c13b5712b0c76b67114
97dd75401e424f569d62ec7c53ec0693
23c6ced4039740fd9c14e9e9e0af4b00--97dd75401e424f569d62ec7c53ec0693
539f4fc7b3f540a68c08b2e6fcd5c6b8
RX(theta₁₅)
97dd75401e424f569d62ec7c53ec0693--539f4fc7b3f540a68c08b2e6fcd5c6b8
af43718eff8b49f79c5b7b43d759c603
RY(theta₁₉)
539f4fc7b3f540a68c08b2e6fcd5c6b8--af43718eff8b49f79c5b7b43d759c603
5fd79dd0e1fd4a55a98395f4127a9c4d
RX(theta₂₃)
af43718eff8b49f79c5b7b43d759c603--5fd79dd0e1fd4a55a98395f4127a9c4d
1002e32899eb4042bae143449b1e4b87
X
5fd79dd0e1fd4a55a98395f4127a9c4d--1002e32899eb4042bae143449b1e4b87
1002e32899eb4042bae143449b1e4b87--8cd0cffb601342fc902c04bfccc737be
1f5f36e8859743db91030e92fe3e0861
1002e32899eb4042bae143449b1e4b87--1f5f36e8859743db91030e92fe3e0861
5c6b5cbcb472407b9865a953b31a410e
1f5f36e8859743db91030e92fe3e0861--5c6b5cbcb472407b9865a953b31a410e
5c6b5cbcb472407b9865a953b31a410e--a8e9418c401b45a9930224d7099d375c