Configuring a QNN
In qadence-model
, 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 ObservableConfig , Z
from qadence_model.models import create_observable
observable_config = ObservableConfig (
detuning = Z ,
interaction = None ,
scale = 2.0 ,
shift =- 1.0 ,
)
observable = create_observable ( register = 4 , config = observable_config )
%3
cluster_62950d01a50e42f698672894c7c43cbd
a947f466e7ba4d4f920ad3d43b7be589
0
d1842f9a80d84da3974dc9c1459be743
a947f466e7ba4d4f920ad3d43b7be589--d1842f9a80d84da3974dc9c1459be743
7f7fe2e030354f9c95dc99d1474dcbc0
1
bcb4dc2113d84788a9137666201be8b0
d1842f9a80d84da3974dc9c1459be743--bcb4dc2113d84788a9137666201be8b0
9b2a9af5869a47b7b81a6a54fa71e509
634dc739884e40a9bcdf4b04d8a6bed8
AddBlock
7f7fe2e030354f9c95dc99d1474dcbc0--634dc739884e40a9bcdf4b04d8a6bed8
e5fec2babd174ed489e3990bb00f753c
2
634dc739884e40a9bcdf4b04d8a6bed8--9b2a9af5869a47b7b81a6a54fa71e509
a5c3e69ea3a342789647e6e8cc63c944
88eb25d7238f4cbf8cad24ff0a37a830
e5fec2babd174ed489e3990bb00f753c--88eb25d7238f4cbf8cad24ff0a37a830
4576f8f0b4ea42baaf83adb811c3c0bc
3
88eb25d7238f4cbf8cad24ff0a37a830--a5c3e69ea3a342789647e6e8cc63c944
1d9d1de0b3d64982b7d650ea3433923c
2e7c559e4646410a957d91879c3ce02c
4576f8f0b4ea42baaf83adb811c3c0bc--2e7c559e4646410a957d91879c3ce02c
2e7c559e4646410a957d91879c3ce02c--1d9d1de0b3d64982b7d650ea3433923c
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 , ReuploadScaling
from qadence_model.models import create_fm_blocks , FeatureMapConfig
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_97a12310b8fd468883f1fe7a84ffb774
Tower Chebyshev FM
cluster_d2b176f61ca246239a7d964ff13e45eb
Tower Chebyshev FM
aab27b6a4b1f4e2b93386c2d19a5afd2
0
1b721c70f32c44d2ae04fc7a760971e3
RX(1.0*acos(x))
aab27b6a4b1f4e2b93386c2d19a5afd2--1b721c70f32c44d2ae04fc7a760971e3
d645f82330604deea50314a271b5c800
1
e51e05803579439b9dc7b43b2ca9a1ca
1b721c70f32c44d2ae04fc7a760971e3--e51e05803579439b9dc7b43b2ca9a1ca
068ced4d66054198b72c159b54959d9c
a88e4019010a46dc8557cbe848cdd343
RX(2.0*acos(x))
d645f82330604deea50314a271b5c800--a88e4019010a46dc8557cbe848cdd343
60866e5e31e044ae9830216c03ee1e84
2
a88e4019010a46dc8557cbe848cdd343--068ced4d66054198b72c159b54959d9c
cfc7a5d94a464da4baf9999ba47fc715
23cb09e600eb4281842a78ad696f19f4
RX(1.0*acos(2.0*y - 1.0))
60866e5e31e044ae9830216c03ee1e84--23cb09e600eb4281842a78ad696f19f4
feaab0277c964dcc958e5dabffd61ddc
3
23cb09e600eb4281842a78ad696f19f4--cfc7a5d94a464da4baf9999ba47fc715
be6b7ca111234217b8304f27be483d2d
7284c7be0d2342c494d4c12e9cf59f13
RX(2.0*acos(2.0*y - 1.0))
feaab0277c964dcc958e5dabffd61ddc--7284c7be0d2342c494d4c12e9cf59f13
7284c7be0d2342c494d4c12e9cf59f13--be6b7ca111234217b8304f27be483d2d
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 AnsatzType , Strategy
from qadence_model.models import AnsatzConfig , create_ansatz
ansatz_config = AnsatzConfig (
depth = 2 ,
ansatz_type = AnsatzType . HEA ,
ansatz_strategy = Strategy . DIGITAL ,
)
ansatz = create_ansatz ( register = 4 , config = ansatz_config )
%3
6f46f8fc0c8a48709182e74e47fc2d86
0
751710ce76a4459ca2f211f8a5a80966
RX(theta₀)
6f46f8fc0c8a48709182e74e47fc2d86--751710ce76a4459ca2f211f8a5a80966
2c04bc536b1f42c9b9b982caeb4793cb
1
99637433cb8d427ba086ee510c3ae7d2
RY(theta₄)
751710ce76a4459ca2f211f8a5a80966--99637433cb8d427ba086ee510c3ae7d2
d227982fbc59487a9824af5513ddef59
RX(theta₈)
99637433cb8d427ba086ee510c3ae7d2--d227982fbc59487a9824af5513ddef59
1f2dee88870b4deab012c43edf76d1e6
d227982fbc59487a9824af5513ddef59--1f2dee88870b4deab012c43edf76d1e6
ac1c9710cde24fceb00217850406541e
1f2dee88870b4deab012c43edf76d1e6--ac1c9710cde24fceb00217850406541e
d8aa7aca365645f49b9c3ddff2e92391
RX(theta₁₂)
ac1c9710cde24fceb00217850406541e--d8aa7aca365645f49b9c3ddff2e92391
094cd6de496749aab9410783bfb7e0c9
RY(theta₁₆)
d8aa7aca365645f49b9c3ddff2e92391--094cd6de496749aab9410783bfb7e0c9
2a23d508c1e2433aa893ac7c8bca76fc
RX(theta₂₀)
094cd6de496749aab9410783bfb7e0c9--2a23d508c1e2433aa893ac7c8bca76fc
a1de4976b4aa4d399954146eaaea2528
2a23d508c1e2433aa893ac7c8bca76fc--a1de4976b4aa4d399954146eaaea2528
6ec6657fcf474f72a97c78813e9b2420
a1de4976b4aa4d399954146eaaea2528--6ec6657fcf474f72a97c78813e9b2420
9ca0dc23319c470680b026e7ee82afec
6ec6657fcf474f72a97c78813e9b2420--9ca0dc23319c470680b026e7ee82afec
6a18bc19b4e8440c9243631604b8e7d5
9352f30b339b42e2aa1661762ec1238a
RX(theta₁)
2c04bc536b1f42c9b9b982caeb4793cb--9352f30b339b42e2aa1661762ec1238a
49960b5890b64e709f094544f8aaf22c
2
d1ca09b6a90f49f088436e1645b25bea
RY(theta₅)
9352f30b339b42e2aa1661762ec1238a--d1ca09b6a90f49f088436e1645b25bea
49e60282e0a64d7fb0708fa703c59552
RX(theta₉)
d1ca09b6a90f49f088436e1645b25bea--49e60282e0a64d7fb0708fa703c59552
c3dff0e424fc4071bb25fab9468fc04e
X
49e60282e0a64d7fb0708fa703c59552--c3dff0e424fc4071bb25fab9468fc04e
c3dff0e424fc4071bb25fab9468fc04e--1f2dee88870b4deab012c43edf76d1e6
1f7ed5d3f76d436dabb64b02d136f787
c3dff0e424fc4071bb25fab9468fc04e--1f7ed5d3f76d436dabb64b02d136f787
d36a9650b08848eab17f9a1cd99130ef
RX(theta₁₃)
1f7ed5d3f76d436dabb64b02d136f787--d36a9650b08848eab17f9a1cd99130ef
cedddd5c05964aa8a7bea5c5519f5e52
RY(theta₁₇)
d36a9650b08848eab17f9a1cd99130ef--cedddd5c05964aa8a7bea5c5519f5e52
41c3bbf1540e4985b9cc238570bdda4a
RX(theta₂₁)
cedddd5c05964aa8a7bea5c5519f5e52--41c3bbf1540e4985b9cc238570bdda4a
300c8dd82fbf442ab455b2ffe780c797
X
41c3bbf1540e4985b9cc238570bdda4a--300c8dd82fbf442ab455b2ffe780c797
300c8dd82fbf442ab455b2ffe780c797--a1de4976b4aa4d399954146eaaea2528
4bd53928e4c44c428ec6909718910514
300c8dd82fbf442ab455b2ffe780c797--4bd53928e4c44c428ec6909718910514
4bd53928e4c44c428ec6909718910514--6a18bc19b4e8440c9243631604b8e7d5
9a5e4563f50e4ded850b4f21d372219f
1da10e1e810b4a879c49e75d86c1478c
RX(theta₂)
49960b5890b64e709f094544f8aaf22c--1da10e1e810b4a879c49e75d86c1478c
866637acc22745a78ebcd25591109af1
3
b1887cdda6164aa184f6e7334ca116c7
RY(theta₆)
1da10e1e810b4a879c49e75d86c1478c--b1887cdda6164aa184f6e7334ca116c7
c5588b9e54474c13bd8c74966cde65a5
RX(theta₁₀)
b1887cdda6164aa184f6e7334ca116c7--c5588b9e54474c13bd8c74966cde65a5
5f3654ab8d42412cac41adcdf2189e73
c5588b9e54474c13bd8c74966cde65a5--5f3654ab8d42412cac41adcdf2189e73
64fe382c57f1402d91c2648b1911308c
X
5f3654ab8d42412cac41adcdf2189e73--64fe382c57f1402d91c2648b1911308c
64fe382c57f1402d91c2648b1911308c--1f7ed5d3f76d436dabb64b02d136f787
4763095afacb41968a7e34f2d5d58012
RX(theta₁₄)
64fe382c57f1402d91c2648b1911308c--4763095afacb41968a7e34f2d5d58012
712d6bc14a4b4e5a8ea1e4c5cbba646e
RY(theta₁₈)
4763095afacb41968a7e34f2d5d58012--712d6bc14a4b4e5a8ea1e4c5cbba646e
3b5e97ec9d5b49a89007acf72b233121
RX(theta₂₂)
712d6bc14a4b4e5a8ea1e4c5cbba646e--3b5e97ec9d5b49a89007acf72b233121
9eb3e8d821574a8c95e7f5b56282a55a
3b5e97ec9d5b49a89007acf72b233121--9eb3e8d821574a8c95e7f5b56282a55a
db30130a360e42e49145d4004346305a
X
9eb3e8d821574a8c95e7f5b56282a55a--db30130a360e42e49145d4004346305a
db30130a360e42e49145d4004346305a--4bd53928e4c44c428ec6909718910514
db30130a360e42e49145d4004346305a--9a5e4563f50e4ded850b4f21d372219f
af182989d9184247bb87671450007aee
fcca0d0b411646d9821029807f3738de
RX(theta₃)
866637acc22745a78ebcd25591109af1--fcca0d0b411646d9821029807f3738de
becf536bd4314929ac16dd7983d47c4f
RY(theta₇)
fcca0d0b411646d9821029807f3738de--becf536bd4314929ac16dd7983d47c4f
3d95579e20ee4f0b8fa4fea4a410b2f6
RX(theta₁₁)
becf536bd4314929ac16dd7983d47c4f--3d95579e20ee4f0b8fa4fea4a410b2f6
22c641bb30df4551b3f4c8fa67d945ef
X
3d95579e20ee4f0b8fa4fea4a410b2f6--22c641bb30df4551b3f4c8fa67d945ef
22c641bb30df4551b3f4c8fa67d945ef--5f3654ab8d42412cac41adcdf2189e73
633dc9d2d8a642f7baad809eaac7b644
22c641bb30df4551b3f4c8fa67d945ef--633dc9d2d8a642f7baad809eaac7b644
22c7750d43b345b9be8c81a60a0732f7
RX(theta₁₅)
633dc9d2d8a642f7baad809eaac7b644--22c7750d43b345b9be8c81a60a0732f7
c76d0947ef2e40729bb7de93234db9cb
RY(theta₁₉)
22c7750d43b345b9be8c81a60a0732f7--c76d0947ef2e40729bb7de93234db9cb
a5085eda2d744a438f0509f2d2df99da
RX(theta₂₃)
c76d0947ef2e40729bb7de93234db9cb--a5085eda2d744a438f0509f2d2df99da
afa3c3d01b0e460ab6c114e1d4ce18c3
X
a5085eda2d744a438f0509f2d2df99da--afa3c3d01b0e460ab6c114e1d4ce18c3
afa3c3d01b0e460ab6c114e1d4ce18c3--9eb3e8d821574a8c95e7f5b56282a55a
691a4795c60d47d9b8b3c3c8f842309c
afa3c3d01b0e460ab6c114e1d4ce18c3--691a4795c60d47d9b8b3c3c8f842309c
691a4795c60d47d9b8b3c3c8f842309c--af182989d9184247bb87671450007aee
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 , ObservableConfig , Z
from qadence_model.models import QNN
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_618f8aae4b63406d883f44098f67e7a9
Obs.
cluster_547d9c2693874dcb9f374b5ba0daffd4
cluster_e4cf0a5b2bf14767ac9a014b2f5db0b4
Tower Chebyshev FM
cluster_ceea6e2cd18442a184aae6b8107a01a8
Tower Chebyshev FM
cluster_580bff45b65348a0ac159095a1c96349
HEA
33d24976b2b04100bb4d591663ae41a6
0
dae4b97cb8014b3bb8970b0a43474bcb
RX(1.0*acos(x))
33d24976b2b04100bb4d591663ae41a6--dae4b97cb8014b3bb8970b0a43474bcb
8153fe6c6dcc4fa9b9abbce55688c535
1
8552b39ef9b84323a74c7a20e400d997
RX(theta₀)
dae4b97cb8014b3bb8970b0a43474bcb--8552b39ef9b84323a74c7a20e400d997
7f61298120af4d07a731f7f05de2ded5
RY(theta₄)
8552b39ef9b84323a74c7a20e400d997--7f61298120af4d07a731f7f05de2ded5
329ebbec8f5e4643b1bde4d523ee261d
RX(theta₈)
7f61298120af4d07a731f7f05de2ded5--329ebbec8f5e4643b1bde4d523ee261d
9c2e77305bab41a6b9e12fe525701a6e
329ebbec8f5e4643b1bde4d523ee261d--9c2e77305bab41a6b9e12fe525701a6e
823a1f38f7124b3783ba381a0ef041a9
9c2e77305bab41a6b9e12fe525701a6e--823a1f38f7124b3783ba381a0ef041a9
4e3a0090f38f4ac29e954b001d566da5
RX(theta₁₂)
823a1f38f7124b3783ba381a0ef041a9--4e3a0090f38f4ac29e954b001d566da5
8a611490056e4592baea0a22aa183fff
RY(theta₁₆)
4e3a0090f38f4ac29e954b001d566da5--8a611490056e4592baea0a22aa183fff
ad1dbcbc93164eaf9370d9013e8dd964
RX(theta₂₀)
8a611490056e4592baea0a22aa183fff--ad1dbcbc93164eaf9370d9013e8dd964
6fff92b735b2490f88f9a8d1d44143a7
ad1dbcbc93164eaf9370d9013e8dd964--6fff92b735b2490f88f9a8d1d44143a7
d68a952570394bc4b8fd2fad7b1841a3
6fff92b735b2490f88f9a8d1d44143a7--d68a952570394bc4b8fd2fad7b1841a3
bc4852ee99af4011a8e3c240421dc1b5
d68a952570394bc4b8fd2fad7b1841a3--bc4852ee99af4011a8e3c240421dc1b5
3895d4edc4e446b0996a2f6cafae50b3
bc4852ee99af4011a8e3c240421dc1b5--3895d4edc4e446b0996a2f6cafae50b3
2dc85d674ba24aa6b7cb531031814468
1984581fcbfe41178ab50df3c64c31f2
RX(2.0*acos(x))
8153fe6c6dcc4fa9b9abbce55688c535--1984581fcbfe41178ab50df3c64c31f2
3b765b665475410c86e5e10b4ee73966
2
5b12be4679cd480e93dd3495fc487990
RX(theta₁)
1984581fcbfe41178ab50df3c64c31f2--5b12be4679cd480e93dd3495fc487990
71506f44b3b54c5094393910db44a12f
RY(theta₅)
5b12be4679cd480e93dd3495fc487990--71506f44b3b54c5094393910db44a12f
8a2e691097054b46acea237156412373
RX(theta₉)
71506f44b3b54c5094393910db44a12f--8a2e691097054b46acea237156412373
a927da5823774281b5bf20dbe4f95bec
X
8a2e691097054b46acea237156412373--a927da5823774281b5bf20dbe4f95bec
a927da5823774281b5bf20dbe4f95bec--9c2e77305bab41a6b9e12fe525701a6e
eecfd7b47bc245cfb6b0fc80a4fcfc60
a927da5823774281b5bf20dbe4f95bec--eecfd7b47bc245cfb6b0fc80a4fcfc60
e85c3dd45c344856a110011e469b3913
RX(theta₁₃)
eecfd7b47bc245cfb6b0fc80a4fcfc60--e85c3dd45c344856a110011e469b3913
05cdbe1fee94429f9211738db4ede964
RY(theta₁₇)
e85c3dd45c344856a110011e469b3913--05cdbe1fee94429f9211738db4ede964
66e917205d6f45198f6aa8c0c2366643
RX(theta₂₁)
05cdbe1fee94429f9211738db4ede964--66e917205d6f45198f6aa8c0c2366643
4e9b7e08eaa14fce87bda2e2b0bfd178
X
66e917205d6f45198f6aa8c0c2366643--4e9b7e08eaa14fce87bda2e2b0bfd178
4e9b7e08eaa14fce87bda2e2b0bfd178--6fff92b735b2490f88f9a8d1d44143a7
8a81d94e7c4f4d6b9eb17e03ac5cb1c8
4e9b7e08eaa14fce87bda2e2b0bfd178--8a81d94e7c4f4d6b9eb17e03ac5cb1c8
ca78f2c42de244568bec9ead825e34e1
AddBlock
8a81d94e7c4f4d6b9eb17e03ac5cb1c8--ca78f2c42de244568bec9ead825e34e1
ca78f2c42de244568bec9ead825e34e1--2dc85d674ba24aa6b7cb531031814468
116e868932904c419ded0a5775b0e8f9
036ed6335b4b47feb07bcbee69da673d
RX(1.0*acos(2.0*y - 1.0))
3b765b665475410c86e5e10b4ee73966--036ed6335b4b47feb07bcbee69da673d
b0a024e6efa444caa9073a503e102549
3
dc200b9dc7aa48f9b0b9f8ad8da43c9b
RX(theta₂)
036ed6335b4b47feb07bcbee69da673d--dc200b9dc7aa48f9b0b9f8ad8da43c9b
c71281db4e1f41fa85180d53bd11821c
RY(theta₆)
dc200b9dc7aa48f9b0b9f8ad8da43c9b--c71281db4e1f41fa85180d53bd11821c
4d633c8e927143b483ca7a36cddd29ee
RX(theta₁₀)
c71281db4e1f41fa85180d53bd11821c--4d633c8e927143b483ca7a36cddd29ee
2595cc315d124a14b55cbe48490ffc6f
4d633c8e927143b483ca7a36cddd29ee--2595cc315d124a14b55cbe48490ffc6f
2f54302f0fe942f9a56ff01300e31f3c
X
2595cc315d124a14b55cbe48490ffc6f--2f54302f0fe942f9a56ff01300e31f3c
2f54302f0fe942f9a56ff01300e31f3c--eecfd7b47bc245cfb6b0fc80a4fcfc60
05c60b30e0964d7cbc5edeffba1464e2
RX(theta₁₄)
2f54302f0fe942f9a56ff01300e31f3c--05c60b30e0964d7cbc5edeffba1464e2
190f016b3eef4d589b07ae775bc2f403
RY(theta₁₈)
05c60b30e0964d7cbc5edeffba1464e2--190f016b3eef4d589b07ae775bc2f403
f301a7227f0b4ff992255779083e0798
RX(theta₂₂)
190f016b3eef4d589b07ae775bc2f403--f301a7227f0b4ff992255779083e0798
1357579b5f994e3a8a874f60a018c3ec
f301a7227f0b4ff992255779083e0798--1357579b5f994e3a8a874f60a018c3ec
0582d5fbeed349e3a352e489adca5ab4
X
1357579b5f994e3a8a874f60a018c3ec--0582d5fbeed349e3a352e489adca5ab4
0582d5fbeed349e3a352e489adca5ab4--8a81d94e7c4f4d6b9eb17e03ac5cb1c8
abe3b42163bd4fb6ba92aaf1e2ff31f4
0582d5fbeed349e3a352e489adca5ab4--abe3b42163bd4fb6ba92aaf1e2ff31f4
abe3b42163bd4fb6ba92aaf1e2ff31f4--116e868932904c419ded0a5775b0e8f9
2edef6f2e15f4c93aa413fa8e0305de6
185d5fef7a2d49989f8c007eaab56f1a
RX(2.0*acos(2.0*y - 1.0))
b0a024e6efa444caa9073a503e102549--185d5fef7a2d49989f8c007eaab56f1a
b79ae3f094bc4654ad305384c00942dd
RX(theta₃)
185d5fef7a2d49989f8c007eaab56f1a--b79ae3f094bc4654ad305384c00942dd
4c34ef72ce2f4de1831fa7d59b78334d
RY(theta₇)
b79ae3f094bc4654ad305384c00942dd--4c34ef72ce2f4de1831fa7d59b78334d
38c7524a28614efdbde89d4221309cde
RX(theta₁₁)
4c34ef72ce2f4de1831fa7d59b78334d--38c7524a28614efdbde89d4221309cde
c1bddd45f058466bb47b3a670c44def6
X
38c7524a28614efdbde89d4221309cde--c1bddd45f058466bb47b3a670c44def6
c1bddd45f058466bb47b3a670c44def6--2595cc315d124a14b55cbe48490ffc6f
0338e3511e7b45ca86fae75add3a0c6b
c1bddd45f058466bb47b3a670c44def6--0338e3511e7b45ca86fae75add3a0c6b
2cfe0902fd7c4b9e8e00aaf7461dfb84
RX(theta₁₅)
0338e3511e7b45ca86fae75add3a0c6b--2cfe0902fd7c4b9e8e00aaf7461dfb84
a734b67e4efd4c36a74e0a6c4d2e579b
RY(theta₁₉)
2cfe0902fd7c4b9e8e00aaf7461dfb84--a734b67e4efd4c36a74e0a6c4d2e579b
c4d014b457864058b3325b59984e4ee8
RX(theta₂₃)
a734b67e4efd4c36a74e0a6c4d2e579b--c4d014b457864058b3325b59984e4ee8
3c3236ab61fa4844a3d3c5fbd92232b4
X
c4d014b457864058b3325b59984e4ee8--3c3236ab61fa4844a3d3c5fbd92232b4
3c3236ab61fa4844a3d3c5fbd92232b4--1357579b5f994e3a8a874f60a018c3ec
38047bc166c0416597202ae1c23de10f
3c3236ab61fa4844a3d3c5fbd92232b4--38047bc166c0416597202ae1c23de10f
64d40325e9dc482d8409b7bd23f2209e
38047bc166c0416597202ae1c23de10f--64d40325e9dc482d8409b7bd23f2209e
64d40325e9dc482d8409b7bd23f2209e--2edef6f2e15f4c93aa413fa8e0305de6