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_6ffa0a05a9d448979bd7c2434a6e196c
b158f3919a1e42c9b3144da9d1c01817
0
d7b6ca3865bc4edab5d706e23e11226d
b158f3919a1e42c9b3144da9d1c01817--d7b6ca3865bc4edab5d706e23e11226d
15481268f02746f2811b9b37e2265404
1
5ddb96f25f9e49f78c411afa69d7f2e8
d7b6ca3865bc4edab5d706e23e11226d--5ddb96f25f9e49f78c411afa69d7f2e8
8af69619e326429ca7cb9178df51a533
543bdcbb67ff49fc9e183f4d0380bf01
AddBlock
15481268f02746f2811b9b37e2265404--543bdcbb67ff49fc9e183f4d0380bf01
4dfec50d77944f27a343f0083dfba648
2
543bdcbb67ff49fc9e183f4d0380bf01--8af69619e326429ca7cb9178df51a533
840e6d97bde64f5f9461edb8d65c78a2
a45052d2ab494fac9b1522b8175e4b10
4dfec50d77944f27a343f0083dfba648--a45052d2ab494fac9b1522b8175e4b10
f88746952a6c4b348c74b7d8044240e8
3
a45052d2ab494fac9b1522b8175e4b10--840e6d97bde64f5f9461edb8d65c78a2
d78582b64c3842d4982215f8c0134684
a30293aedb2f47d692215051ad852553
f88746952a6c4b348c74b7d8044240e8--a30293aedb2f47d692215051ad852553
a30293aedb2f47d692215051ad852553--d78582b64c3842d4982215f8c0134684
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_004bc18dcf1c4e57ade42c29bea68f6f
Tower Chebyshev FM
cluster_fca81f2389b74d3a844f7de11313e188
Tower Chebyshev FM
aa7683c1222946899a45cab963008dc8
0
947700c0049e4ae4a6971bf8e96d474d
RX(1.0*acos(x))
aa7683c1222946899a45cab963008dc8--947700c0049e4ae4a6971bf8e96d474d
d276611b3e844019869f084b10ed9ee2
1
08767069e3b946bc998d0e87b4113ecd
947700c0049e4ae4a6971bf8e96d474d--08767069e3b946bc998d0e87b4113ecd
bccf35d0891a40c5bcec4dfa084c8494
0132947b0d6341fc866ab74f79992a93
RX(2.0*acos(x))
d276611b3e844019869f084b10ed9ee2--0132947b0d6341fc866ab74f79992a93
1369d77738c942bd82bc088cc885b357
2
0132947b0d6341fc866ab74f79992a93--bccf35d0891a40c5bcec4dfa084c8494
16153a2e2f334c1aad7b41ea6d941d4a
df16213b943e4101978a1761d5522487
RX(1.0*acos(2.0*y - 1.0))
1369d77738c942bd82bc088cc885b357--df16213b943e4101978a1761d5522487
9d2982cb124d4082ba286c03aa1c59f3
3
df16213b943e4101978a1761d5522487--16153a2e2f334c1aad7b41ea6d941d4a
11636ad3d5ec433f99ec0c8cfd09ecec
d515b67709a74db5a23fd29da03c6915
RX(2.0*acos(2.0*y - 1.0))
9d2982cb124d4082ba286c03aa1c59f3--d515b67709a74db5a23fd29da03c6915
d515b67709a74db5a23fd29da03c6915--11636ad3d5ec433f99ec0c8cfd09ecec
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
7633904d08c940869e94f6b36f89eb24
0
6590e7237ac647439613c7ff8972273c
RX(theta₀)
7633904d08c940869e94f6b36f89eb24--6590e7237ac647439613c7ff8972273c
6a2fe94ef5524ea7abf0ad7d4694aba7
1
f7513e0b5ab14ce2a4ef9892a5df6358
RY(theta₄)
6590e7237ac647439613c7ff8972273c--f7513e0b5ab14ce2a4ef9892a5df6358
c7bfdc09f22e4f33b22fc06366e96411
RX(theta₈)
f7513e0b5ab14ce2a4ef9892a5df6358--c7bfdc09f22e4f33b22fc06366e96411
dbaf36f9ae36498eb4c8a983512cc652
c7bfdc09f22e4f33b22fc06366e96411--dbaf36f9ae36498eb4c8a983512cc652
2852109644bd435b861350bcc45867f4
dbaf36f9ae36498eb4c8a983512cc652--2852109644bd435b861350bcc45867f4
fb1b2e0a21f64ada8fe0a8f61c242a7c
RX(theta₁₂)
2852109644bd435b861350bcc45867f4--fb1b2e0a21f64ada8fe0a8f61c242a7c
085b4687985249c7938c4e08d4bc23e0
RY(theta₁₆)
fb1b2e0a21f64ada8fe0a8f61c242a7c--085b4687985249c7938c4e08d4bc23e0
fdff7cca190c46508dca77527c986596
RX(theta₂₀)
085b4687985249c7938c4e08d4bc23e0--fdff7cca190c46508dca77527c986596
007d13e5f2bf49008c43edcff42a3c35
fdff7cca190c46508dca77527c986596--007d13e5f2bf49008c43edcff42a3c35
09f472c1143a428b9941d9a88d4d88f2
007d13e5f2bf49008c43edcff42a3c35--09f472c1143a428b9941d9a88d4d88f2
b88f1f103c064245870ebacbbe0ed4d6
09f472c1143a428b9941d9a88d4d88f2--b88f1f103c064245870ebacbbe0ed4d6
9769c3820c9b4bc4ab707380f4a88c38
1765293ef46941a08240cca0b7bc4cf4
RX(theta₁)
6a2fe94ef5524ea7abf0ad7d4694aba7--1765293ef46941a08240cca0b7bc4cf4
90284b195039400db332ea06c83f05ae
2
a72025630ac84128adf875f3f76cdde8
RY(theta₅)
1765293ef46941a08240cca0b7bc4cf4--a72025630ac84128adf875f3f76cdde8
46897cdb2a2b49d6aefe81f42de0b4c6
RX(theta₉)
a72025630ac84128adf875f3f76cdde8--46897cdb2a2b49d6aefe81f42de0b4c6
0473d536837f4929812f29f4d58f8e08
X
46897cdb2a2b49d6aefe81f42de0b4c6--0473d536837f4929812f29f4d58f8e08
0473d536837f4929812f29f4d58f8e08--dbaf36f9ae36498eb4c8a983512cc652
524c40c889ef45c39e490850bdee973c
0473d536837f4929812f29f4d58f8e08--524c40c889ef45c39e490850bdee973c
7e411287e6dd4904b46bdcc9e4b18e2a
RX(theta₁₃)
524c40c889ef45c39e490850bdee973c--7e411287e6dd4904b46bdcc9e4b18e2a
51fd22f4d0414fe1b6d69f418895fdd3
RY(theta₁₇)
7e411287e6dd4904b46bdcc9e4b18e2a--51fd22f4d0414fe1b6d69f418895fdd3
1b42374d7cd340598c99b77fc1a98983
RX(theta₂₁)
51fd22f4d0414fe1b6d69f418895fdd3--1b42374d7cd340598c99b77fc1a98983
f874a9acfb1b42299476b641c34a0c63
X
1b42374d7cd340598c99b77fc1a98983--f874a9acfb1b42299476b641c34a0c63
f874a9acfb1b42299476b641c34a0c63--007d13e5f2bf49008c43edcff42a3c35
2b8e11fd19394ca1acab3b7faa6695de
f874a9acfb1b42299476b641c34a0c63--2b8e11fd19394ca1acab3b7faa6695de
2b8e11fd19394ca1acab3b7faa6695de--9769c3820c9b4bc4ab707380f4a88c38
5c200050d1d54660b350656edf3b0756
bcb1c2352ee74d439edd52a7383d867d
RX(theta₂)
90284b195039400db332ea06c83f05ae--bcb1c2352ee74d439edd52a7383d867d
9f47d03c9db34ccfa2a315609ca0785e
3
2dc7b8bb82264bceb04008ef70b19890
RY(theta₆)
bcb1c2352ee74d439edd52a7383d867d--2dc7b8bb82264bceb04008ef70b19890
239144dd359f49b2b18942c8560e47f0
RX(theta₁₀)
2dc7b8bb82264bceb04008ef70b19890--239144dd359f49b2b18942c8560e47f0
6d8867b52fa94d3194e446403651cdb0
239144dd359f49b2b18942c8560e47f0--6d8867b52fa94d3194e446403651cdb0
ee7720158b134c1591f98e58667a3515
X
6d8867b52fa94d3194e446403651cdb0--ee7720158b134c1591f98e58667a3515
ee7720158b134c1591f98e58667a3515--524c40c889ef45c39e490850bdee973c
47f4396780c248f6879cf49a38650ec6
RX(theta₁₄)
ee7720158b134c1591f98e58667a3515--47f4396780c248f6879cf49a38650ec6
336d9bfb99e44a6ebdd90aa4139bdb7f
RY(theta₁₈)
47f4396780c248f6879cf49a38650ec6--336d9bfb99e44a6ebdd90aa4139bdb7f
3920c7118acf4b5493b5bc1241e67207
RX(theta₂₂)
336d9bfb99e44a6ebdd90aa4139bdb7f--3920c7118acf4b5493b5bc1241e67207
7bca5f0d6ae04121adeb9f6bec7028e2
3920c7118acf4b5493b5bc1241e67207--7bca5f0d6ae04121adeb9f6bec7028e2
7f7e69710bf2470e9beebd326e2c7cb7
X
7bca5f0d6ae04121adeb9f6bec7028e2--7f7e69710bf2470e9beebd326e2c7cb7
7f7e69710bf2470e9beebd326e2c7cb7--2b8e11fd19394ca1acab3b7faa6695de
7f7e69710bf2470e9beebd326e2c7cb7--5c200050d1d54660b350656edf3b0756
7d62e082f8b9490e92897e211653e781
9cc284842efe49458d1745976aab3c49
RX(theta₃)
9f47d03c9db34ccfa2a315609ca0785e--9cc284842efe49458d1745976aab3c49
f17629a3d90840f6baf746322548a00a
RY(theta₇)
9cc284842efe49458d1745976aab3c49--f17629a3d90840f6baf746322548a00a
9567f00cf11f4f62b14ff54f5a183cc7
RX(theta₁₁)
f17629a3d90840f6baf746322548a00a--9567f00cf11f4f62b14ff54f5a183cc7
b51bef73c63e4772841bab58911617ce
X
9567f00cf11f4f62b14ff54f5a183cc7--b51bef73c63e4772841bab58911617ce
b51bef73c63e4772841bab58911617ce--6d8867b52fa94d3194e446403651cdb0
dc4c3cda92dd4ae984e2b877ffd135bd
b51bef73c63e4772841bab58911617ce--dc4c3cda92dd4ae984e2b877ffd135bd
03ad5dcc6f7f4276af3c9e5d04d7c34e
RX(theta₁₅)
dc4c3cda92dd4ae984e2b877ffd135bd--03ad5dcc6f7f4276af3c9e5d04d7c34e
bdb8a55ab2964bc299db0b302e11f49a
RY(theta₁₉)
03ad5dcc6f7f4276af3c9e5d04d7c34e--bdb8a55ab2964bc299db0b302e11f49a
ac811d6fff62415d9f98fee55f2b3465
RX(theta₂₃)
bdb8a55ab2964bc299db0b302e11f49a--ac811d6fff62415d9f98fee55f2b3465
d04c947584184b78a3e2f813b54eb682
X
ac811d6fff62415d9f98fee55f2b3465--d04c947584184b78a3e2f813b54eb682
d04c947584184b78a3e2f813b54eb682--7bca5f0d6ae04121adeb9f6bec7028e2
75480df7272e4e23ba1666e135b4d9eb
d04c947584184b78a3e2f813b54eb682--75480df7272e4e23ba1666e135b4d9eb
75480df7272e4e23ba1666e135b4d9eb--7d62e082f8b9490e92897e211653e781
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_f91c99f2cd23426a8805b0f043e4af87
Obs.
cluster_3347dc4094fa42f8a3b227c6f28b2d61
cluster_46782c8c21ed4963ab5852a0fc3d37f4
Tower Chebyshev FM
cluster_bd3737d49aaf4b42bb6b5cd7d4e13e3d
Tower Chebyshev FM
cluster_1e5be8e7075a40e1adb67b4eb1438bf7
HEA
b2f0d4795f714a239733afd72310e8f1
0
58a10ff9670e47f5a8a3d2fd8ef4f6e8
RX(1.0*acos(x))
b2f0d4795f714a239733afd72310e8f1--58a10ff9670e47f5a8a3d2fd8ef4f6e8
c9f03c9e3f7049619399f35a2880bafc
1
e8a449a94b1b4d0da4b1b3ae10606667
RX(theta₀)
58a10ff9670e47f5a8a3d2fd8ef4f6e8--e8a449a94b1b4d0da4b1b3ae10606667
4668055c31fa473da4ffe0b7f1c0d87a
RY(theta₄)
e8a449a94b1b4d0da4b1b3ae10606667--4668055c31fa473da4ffe0b7f1c0d87a
714d706c9761435e99b404a0d33cd00b
RX(theta₈)
4668055c31fa473da4ffe0b7f1c0d87a--714d706c9761435e99b404a0d33cd00b
ec7c63130e8244318c73173fff1d0b19
714d706c9761435e99b404a0d33cd00b--ec7c63130e8244318c73173fff1d0b19
f0bf06c566034a63afdd9d7ccfc5e39f
ec7c63130e8244318c73173fff1d0b19--f0bf06c566034a63afdd9d7ccfc5e39f
5c90a5180830454daad224a0c489dc81
RX(theta₁₂)
f0bf06c566034a63afdd9d7ccfc5e39f--5c90a5180830454daad224a0c489dc81
4d56623bdd2948f7af80d654e0584378
RY(theta₁₆)
5c90a5180830454daad224a0c489dc81--4d56623bdd2948f7af80d654e0584378
05315116c47040e392f34091cdaaba11
RX(theta₂₀)
4d56623bdd2948f7af80d654e0584378--05315116c47040e392f34091cdaaba11
57b88ec9fb02435ea6e8915b83ac408b
05315116c47040e392f34091cdaaba11--57b88ec9fb02435ea6e8915b83ac408b
980bc906f075464480205e676058b7c6
57b88ec9fb02435ea6e8915b83ac408b--980bc906f075464480205e676058b7c6
7310a28fcbb34c459d067724fa3c7f10
980bc906f075464480205e676058b7c6--7310a28fcbb34c459d067724fa3c7f10
dc410e15b1c24990ba1ebaa1bad07fd8
7310a28fcbb34c459d067724fa3c7f10--dc410e15b1c24990ba1ebaa1bad07fd8
68a8e8fc5be14da9a70b8d6b560f75c8
2e85738db9d145a0b7205368b1cf9b5d
RX(2.0*acos(x))
c9f03c9e3f7049619399f35a2880bafc--2e85738db9d145a0b7205368b1cf9b5d
ae6e869bc4bd48ceb5015d577d485516
2
fb9fd41816734d9bb3aed8f2b258f54f
RX(theta₁)
2e85738db9d145a0b7205368b1cf9b5d--fb9fd41816734d9bb3aed8f2b258f54f
00c7327aa6294fdbbc52609bfc6187cf
RY(theta₅)
fb9fd41816734d9bb3aed8f2b258f54f--00c7327aa6294fdbbc52609bfc6187cf
0ecb5a0348c34de7be0bff7b63f9eeae
RX(theta₉)
00c7327aa6294fdbbc52609bfc6187cf--0ecb5a0348c34de7be0bff7b63f9eeae
f0fc63e784b14fc3960927977804787c
X
0ecb5a0348c34de7be0bff7b63f9eeae--f0fc63e784b14fc3960927977804787c
f0fc63e784b14fc3960927977804787c--ec7c63130e8244318c73173fff1d0b19
583f59edbc484fe5acc873874b2e2b97
f0fc63e784b14fc3960927977804787c--583f59edbc484fe5acc873874b2e2b97
7b857f36c9b04590af7443286fefaebc
RX(theta₁₃)
583f59edbc484fe5acc873874b2e2b97--7b857f36c9b04590af7443286fefaebc
4368e1aad2514ad2879bdae5c080b973
RY(theta₁₇)
7b857f36c9b04590af7443286fefaebc--4368e1aad2514ad2879bdae5c080b973
966912b75049431c863b31112f17f9e7
RX(theta₂₁)
4368e1aad2514ad2879bdae5c080b973--966912b75049431c863b31112f17f9e7
4048f6f4532344fc8d857cf3bd19fec6
X
966912b75049431c863b31112f17f9e7--4048f6f4532344fc8d857cf3bd19fec6
4048f6f4532344fc8d857cf3bd19fec6--57b88ec9fb02435ea6e8915b83ac408b
ad7f55f717e744daa61a4a051b821bbc
4048f6f4532344fc8d857cf3bd19fec6--ad7f55f717e744daa61a4a051b821bbc
b8e0dae7fd2d4bb48aaba967280d8005
AddBlock
ad7f55f717e744daa61a4a051b821bbc--b8e0dae7fd2d4bb48aaba967280d8005
b8e0dae7fd2d4bb48aaba967280d8005--68a8e8fc5be14da9a70b8d6b560f75c8
a70e9f2fd7c64aa0a3a24dc0dcc0279f
24a2f48a3b7c4098bf366180f605ff04
RX(1.0*acos(2.0*y - 1.0))
ae6e869bc4bd48ceb5015d577d485516--24a2f48a3b7c4098bf366180f605ff04
31a9088b8ed440f782a1912a6850270f
3
46882595de8349c3a488a81002d44a94
RX(theta₂)
24a2f48a3b7c4098bf366180f605ff04--46882595de8349c3a488a81002d44a94
6599fc46637b4648bdffe639d6616d0c
RY(theta₆)
46882595de8349c3a488a81002d44a94--6599fc46637b4648bdffe639d6616d0c
58fe98be48a2419385743529571dcd45
RX(theta₁₀)
6599fc46637b4648bdffe639d6616d0c--58fe98be48a2419385743529571dcd45
716bceebc15f4c7d9fee4ce1e5d1e01d
58fe98be48a2419385743529571dcd45--716bceebc15f4c7d9fee4ce1e5d1e01d
3f5347e5cbc24b49b314cf688b1fc336
X
716bceebc15f4c7d9fee4ce1e5d1e01d--3f5347e5cbc24b49b314cf688b1fc336
3f5347e5cbc24b49b314cf688b1fc336--583f59edbc484fe5acc873874b2e2b97
4b2c066207834fa1b78bcf3b123cbec5
RX(theta₁₄)
3f5347e5cbc24b49b314cf688b1fc336--4b2c066207834fa1b78bcf3b123cbec5
263c0d93978449ecaeed1275f1770454
RY(theta₁₈)
4b2c066207834fa1b78bcf3b123cbec5--263c0d93978449ecaeed1275f1770454
958344af2aad41c48c8227603546bfb8
RX(theta₂₂)
263c0d93978449ecaeed1275f1770454--958344af2aad41c48c8227603546bfb8
751b53f3da8c4c44a96866e46941d5cf
958344af2aad41c48c8227603546bfb8--751b53f3da8c4c44a96866e46941d5cf
93b43b19a55947558b4859bc008816c0
X
751b53f3da8c4c44a96866e46941d5cf--93b43b19a55947558b4859bc008816c0
93b43b19a55947558b4859bc008816c0--ad7f55f717e744daa61a4a051b821bbc
8136c71ef13349cd80a24b6f37388d0d
93b43b19a55947558b4859bc008816c0--8136c71ef13349cd80a24b6f37388d0d
8136c71ef13349cd80a24b6f37388d0d--a70e9f2fd7c64aa0a3a24dc0dcc0279f
9c1dd365f86f4a5285669d0856d08d73
605ee03104ec45b6bc0d321bc8acfd97
RX(2.0*acos(2.0*y - 1.0))
31a9088b8ed440f782a1912a6850270f--605ee03104ec45b6bc0d321bc8acfd97
45110ca5c0cd4c79983b4494407e5acd
RX(theta₃)
605ee03104ec45b6bc0d321bc8acfd97--45110ca5c0cd4c79983b4494407e5acd
9e9436876bda4bebb8cb268f18be353c
RY(theta₇)
45110ca5c0cd4c79983b4494407e5acd--9e9436876bda4bebb8cb268f18be353c
92dae550534242dab76c72b38e1b55e8
RX(theta₁₁)
9e9436876bda4bebb8cb268f18be353c--92dae550534242dab76c72b38e1b55e8
c2157e77d3594a6f9f0329a15c05926b
X
92dae550534242dab76c72b38e1b55e8--c2157e77d3594a6f9f0329a15c05926b
c2157e77d3594a6f9f0329a15c05926b--716bceebc15f4c7d9fee4ce1e5d1e01d
dd162e05ed9e42e08eed2d39d861bee1
c2157e77d3594a6f9f0329a15c05926b--dd162e05ed9e42e08eed2d39d861bee1
9e56024cd32446c1a05622d1107594b6
RX(theta₁₅)
dd162e05ed9e42e08eed2d39d861bee1--9e56024cd32446c1a05622d1107594b6
d12fc1e17e1746a1b150a7198c1003d3
RY(theta₁₉)
9e56024cd32446c1a05622d1107594b6--d12fc1e17e1746a1b150a7198c1003d3
0f8e0ae503864b56b843ecf874c28e41
RX(theta₂₃)
d12fc1e17e1746a1b150a7198c1003d3--0f8e0ae503864b56b843ecf874c28e41
9a576f977d0f4c29a53a862b85aa331c
X
0f8e0ae503864b56b843ecf874c28e41--9a576f977d0f4c29a53a862b85aa331c
9a576f977d0f4c29a53a862b85aa331c--751b53f3da8c4c44a96866e46941d5cf
7e1a6ba70d294640abc2bb62cde5b9ab
9a576f977d0f4c29a53a862b85aa331c--7e1a6ba70d294640abc2bb62cde5b9ab
8b5c32f546dc46f5a74a0086761e5d4d
7e1a6ba70d294640abc2bb62cde5b9ab--8b5c32f546dc46f5a74a0086761e5d4d
8b5c32f546dc46f5a74a0086761e5d4d--9c1dd365f86f4a5285669d0856d08d73