Skip to content

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