Skip to content

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_ba5eda7c8e784e38bc2f160b5ab5b51f ce88cc4338b44596bcc7b9179cd07d43 0 2f87f4e960f0498ca7044165871367bf ce88cc4338b44596bcc7b9179cd07d43--2f87f4e960f0498ca7044165871367bf b017d58fe48145aa8eda1878858ec0a5 1 254835940f9a4c2cbd54d03c06b62633 2f87f4e960f0498ca7044165871367bf--254835940f9a4c2cbd54d03c06b62633 3b8a78d542a049c6be00567a7ca9b0c3 9a1d875823ed443299e1446043d85686 AddBlock b017d58fe48145aa8eda1878858ec0a5--9a1d875823ed443299e1446043d85686 c3f43a4830494110b906fde17d4111e2 2 9a1d875823ed443299e1446043d85686--3b8a78d542a049c6be00567a7ca9b0c3 0c60e68b6b0f4bdd9495b03a9b905fe6 324be8ae6d8e406189e03dc1f7c8a032 c3f43a4830494110b906fde17d4111e2--324be8ae6d8e406189e03dc1f7c8a032 e80d66ea40ea42a885e808a60fe1fa9e 3 324be8ae6d8e406189e03dc1f7c8a032--0c60e68b6b0f4bdd9495b03a9b905fe6 33af86fe4ac6472b96f7ab2f8c1cb0e1 8a55524d5bc64f5196743ded5a1f9155 e80d66ea40ea42a885e808a60fe1fa9e--8a55524d5bc64f5196743ded5a1f9155 8a55524d5bc64f5196743ded5a1f9155--33af86fe4ac6472b96f7ab2f8c1cb0e1

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_da50be8ccdcc4f4f9962ec31dc74d31f Tower Chebyshev FM cluster_4c21da3fe19b45439df73ea6e66dd805 Tower Chebyshev FM a82a44858d964038b076d2a03b2118d9 0 d616aa878c5e40b68215e0473ca2554e RX(1.0*acos(x)) a82a44858d964038b076d2a03b2118d9--d616aa878c5e40b68215e0473ca2554e c13fc5e3d31d475494f1272964c99c54 1 7d159fdec9594840a66f840738bafed0 d616aa878c5e40b68215e0473ca2554e--7d159fdec9594840a66f840738bafed0 8bcd7e7cab984287b0b6307f7c91112e c2c45170028b4ccb9b41edd4599d0586 RX(2.0*acos(x)) c13fc5e3d31d475494f1272964c99c54--c2c45170028b4ccb9b41edd4599d0586 56d201d879bc4f0eb9011fbaa399147e 2 c2c45170028b4ccb9b41edd4599d0586--8bcd7e7cab984287b0b6307f7c91112e 27d857cbed1647c6ae5a0d506e1ce49e 4e5ebce79aa34a868ce42359928bbcb2 RX(1.0*acos(2.0*y - 1.0)) 56d201d879bc4f0eb9011fbaa399147e--4e5ebce79aa34a868ce42359928bbcb2 44e0120dc5184574b39b1348144c99c1 3 4e5ebce79aa34a868ce42359928bbcb2--27d857cbed1647c6ae5a0d506e1ce49e c2b4a1b4761044b0b200f6ab59d10e76 a544a3cd6cf446d6914ddf71d92a6abd RX(2.0*acos(2.0*y - 1.0)) 44e0120dc5184574b39b1348144c99c1--a544a3cd6cf446d6914ddf71d92a6abd a544a3cd6cf446d6914ddf71d92a6abd--c2b4a1b4761044b0b200f6ab59d10e76

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 947fc89d7253403b98b9e93090846bdd 0 9a0e4e1f15d94fc19ee2e8aa15b8870d RX(theta₀) 947fc89d7253403b98b9e93090846bdd--9a0e4e1f15d94fc19ee2e8aa15b8870d 83b9b5d37fd14f32adf28b61e4d1904c 1 773e764611a144df8a051a821d77952a RY(theta₄) 9a0e4e1f15d94fc19ee2e8aa15b8870d--773e764611a144df8a051a821d77952a 949601ebbc5c4129a2465b8d1bca4f19 RX(theta₈) 773e764611a144df8a051a821d77952a--949601ebbc5c4129a2465b8d1bca4f19 7a3ae9297b1d47e1bb5bb0502ea03115 949601ebbc5c4129a2465b8d1bca4f19--7a3ae9297b1d47e1bb5bb0502ea03115 96b02fe349504f32a63688c1ee36d372 7a3ae9297b1d47e1bb5bb0502ea03115--96b02fe349504f32a63688c1ee36d372 bd581278df1943ed9e903fd4b4e8d21d RX(theta₁₂) 96b02fe349504f32a63688c1ee36d372--bd581278df1943ed9e903fd4b4e8d21d cc19b0735668439ca5414489d1fe9041 RY(theta₁₆) bd581278df1943ed9e903fd4b4e8d21d--cc19b0735668439ca5414489d1fe9041 1dfdc9bdd96a458e838ffa8f08954863 RX(theta₂₀) cc19b0735668439ca5414489d1fe9041--1dfdc9bdd96a458e838ffa8f08954863 f2d253e9f796430fb56b20107560db04 1dfdc9bdd96a458e838ffa8f08954863--f2d253e9f796430fb56b20107560db04 a6b983bf13f64d3ca9530f6b0e6972a3 f2d253e9f796430fb56b20107560db04--a6b983bf13f64d3ca9530f6b0e6972a3 c01507d8ba4449ee8636736dfb9a948e a6b983bf13f64d3ca9530f6b0e6972a3--c01507d8ba4449ee8636736dfb9a948e 95790e1eea864cbcb24c2b5de643eddf 761d70277ee342cb8949a8ea4d859207 RX(theta₁) 83b9b5d37fd14f32adf28b61e4d1904c--761d70277ee342cb8949a8ea4d859207 7407defb770947d78b211bc0f3fcbc79 2 d62be7a001d042e3bb742c0cf830cbed RY(theta₅) 761d70277ee342cb8949a8ea4d859207--d62be7a001d042e3bb742c0cf830cbed 35099afa8911436ba42bc3971238020b RX(theta₉) d62be7a001d042e3bb742c0cf830cbed--35099afa8911436ba42bc3971238020b 2043bee5e89c4069a3a510c3ef3a2a0a X 35099afa8911436ba42bc3971238020b--2043bee5e89c4069a3a510c3ef3a2a0a 2043bee5e89c4069a3a510c3ef3a2a0a--7a3ae9297b1d47e1bb5bb0502ea03115 33cb3af0408642618e833ac1cf5180a1 2043bee5e89c4069a3a510c3ef3a2a0a--33cb3af0408642618e833ac1cf5180a1 f3525d8d8987427f9a666363b24064de RX(theta₁₃) 33cb3af0408642618e833ac1cf5180a1--f3525d8d8987427f9a666363b24064de 6375ef0016854f26aa3b95a59a5b9509 RY(theta₁₇) f3525d8d8987427f9a666363b24064de--6375ef0016854f26aa3b95a59a5b9509 4b1e9275f749403bb9a9a9edcd70bcca RX(theta₂₁) 6375ef0016854f26aa3b95a59a5b9509--4b1e9275f749403bb9a9a9edcd70bcca 3efea8c45f1441899300dfb39d08b4fc X 4b1e9275f749403bb9a9a9edcd70bcca--3efea8c45f1441899300dfb39d08b4fc 3efea8c45f1441899300dfb39d08b4fc--f2d253e9f796430fb56b20107560db04 7b163a9d24e64254b93a7cfe396d52fd 3efea8c45f1441899300dfb39d08b4fc--7b163a9d24e64254b93a7cfe396d52fd 7b163a9d24e64254b93a7cfe396d52fd--95790e1eea864cbcb24c2b5de643eddf 78dcaf6d5d4a4a8e81cf775562d48c3f 83317269ecc14379a211d75a332cd9d8 RX(theta₂) 7407defb770947d78b211bc0f3fcbc79--83317269ecc14379a211d75a332cd9d8 f7989053301944148596bb6076b49e5a 3 322bd36d558842cc86d823633dc26bd6 RY(theta₆) 83317269ecc14379a211d75a332cd9d8--322bd36d558842cc86d823633dc26bd6 008e7c65245f47448e8c50fdc350c6e2 RX(theta₁₀) 322bd36d558842cc86d823633dc26bd6--008e7c65245f47448e8c50fdc350c6e2 d0753fae355d4880983b3a594a651a05 008e7c65245f47448e8c50fdc350c6e2--d0753fae355d4880983b3a594a651a05 c921cf9a35b749868db233ac27196097 X d0753fae355d4880983b3a594a651a05--c921cf9a35b749868db233ac27196097 c921cf9a35b749868db233ac27196097--33cb3af0408642618e833ac1cf5180a1 da392b217e2b454ab49849dd3dae4e91 RX(theta₁₄) c921cf9a35b749868db233ac27196097--da392b217e2b454ab49849dd3dae4e91 9e7005c647894f0db5460b0e50c87e61 RY(theta₁₈) da392b217e2b454ab49849dd3dae4e91--9e7005c647894f0db5460b0e50c87e61 ddbe78345fa440f88069c34885fa30dd RX(theta₂₂) 9e7005c647894f0db5460b0e50c87e61--ddbe78345fa440f88069c34885fa30dd aca6c72e49104b708b7f1bd0955bf1b1 ddbe78345fa440f88069c34885fa30dd--aca6c72e49104b708b7f1bd0955bf1b1 1ba615cc3d7f409aafd26cc43daf6abe X aca6c72e49104b708b7f1bd0955bf1b1--1ba615cc3d7f409aafd26cc43daf6abe 1ba615cc3d7f409aafd26cc43daf6abe--7b163a9d24e64254b93a7cfe396d52fd 1ba615cc3d7f409aafd26cc43daf6abe--78dcaf6d5d4a4a8e81cf775562d48c3f eff3119c9b5c4bbb9a7a623b0ea7ab06 e6bcd90bd7f74cb088b1729cfd85f0e6 RX(theta₃) f7989053301944148596bb6076b49e5a--e6bcd90bd7f74cb088b1729cfd85f0e6 413c58d14a7a42be9ca2243202fb6fb3 RY(theta₇) e6bcd90bd7f74cb088b1729cfd85f0e6--413c58d14a7a42be9ca2243202fb6fb3 dd19542be1a14bee9b2cc34587946bcf RX(theta₁₁) 413c58d14a7a42be9ca2243202fb6fb3--dd19542be1a14bee9b2cc34587946bcf 79e9735424f5453f9e2585457a6b1cb9 X dd19542be1a14bee9b2cc34587946bcf--79e9735424f5453f9e2585457a6b1cb9 79e9735424f5453f9e2585457a6b1cb9--d0753fae355d4880983b3a594a651a05 9f3f0b5b138c4f97a4bc9ffd85e1e750 79e9735424f5453f9e2585457a6b1cb9--9f3f0b5b138c4f97a4bc9ffd85e1e750 33178a4e3def477499ed08da326fa3d0 RX(theta₁₅) 9f3f0b5b138c4f97a4bc9ffd85e1e750--33178a4e3def477499ed08da326fa3d0 8dd7d390ba494b6aa311ab28f5c7a346 RY(theta₁₉) 33178a4e3def477499ed08da326fa3d0--8dd7d390ba494b6aa311ab28f5c7a346 a6586ba210c24fda9fc3b3eca2daa362 RX(theta₂₃) 8dd7d390ba494b6aa311ab28f5c7a346--a6586ba210c24fda9fc3b3eca2daa362 812729297a7c4f4b86ee43ed38363d44 X a6586ba210c24fda9fc3b3eca2daa362--812729297a7c4f4b86ee43ed38363d44 812729297a7c4f4b86ee43ed38363d44--aca6c72e49104b708b7f1bd0955bf1b1 d224c9d858cd4a2fb30fab3c82726520 812729297a7c4f4b86ee43ed38363d44--d224c9d858cd4a2fb30fab3c82726520 d224c9d858cd4a2fb30fab3c82726520--eff3119c9b5c4bbb9a7a623b0ea7ab06

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_9835ae4eadbd454c95e8d29a4525d7ae Obs. cluster_79c4ee3491504703a49542e5bb7668b4 cluster_00e0922e9f2a4375b1ccd7d5a4bfa54e Tower Chebyshev FM cluster_36a8affd9bf14dc4927a6fa650722ec6 Tower Chebyshev FM cluster_78207a20bf884741abfd99ba52e3c537 HEA e5856b77d8e14d4eb60eb6260cfcd229 0 85c2f6aa5eaa458297be05a607200148 RX(1.0*acos(x)) e5856b77d8e14d4eb60eb6260cfcd229--85c2f6aa5eaa458297be05a607200148 d503e054ff614492a27115ad4b8cfac2 1 d98e9271d71e4fa98498534092522305 RX(theta₀) 85c2f6aa5eaa458297be05a607200148--d98e9271d71e4fa98498534092522305 18bc137172d6451d90bb30330b77f132 RY(theta₄) d98e9271d71e4fa98498534092522305--18bc137172d6451d90bb30330b77f132 4a549aa88e92474ab5a8601c9414b62d RX(theta₈) 18bc137172d6451d90bb30330b77f132--4a549aa88e92474ab5a8601c9414b62d 27cbe8f29687462db084ebf975309fab 4a549aa88e92474ab5a8601c9414b62d--27cbe8f29687462db084ebf975309fab ccbfc35884514f29a7c88f6c18ea12f5 27cbe8f29687462db084ebf975309fab--ccbfc35884514f29a7c88f6c18ea12f5 e251e83896414eefb90cf52f3450f773 RX(theta₁₂) ccbfc35884514f29a7c88f6c18ea12f5--e251e83896414eefb90cf52f3450f773 510afcee9f4a47fbb27223a08d669ca8 RY(theta₁₆) e251e83896414eefb90cf52f3450f773--510afcee9f4a47fbb27223a08d669ca8 d5f3720c14b04c5aac82b70e3adad55b RX(theta₂₀) 510afcee9f4a47fbb27223a08d669ca8--d5f3720c14b04c5aac82b70e3adad55b a278a14525c54a8ebd9730a22b75b7fd d5f3720c14b04c5aac82b70e3adad55b--a278a14525c54a8ebd9730a22b75b7fd f59a9493e0a14193bbee1ab66a6f398c a278a14525c54a8ebd9730a22b75b7fd--f59a9493e0a14193bbee1ab66a6f398c 6a7ee671193c454e96fc26f491631ffa f59a9493e0a14193bbee1ab66a6f398c--6a7ee671193c454e96fc26f491631ffa 4d9baa9ece764cc5b7712aa4205d7b9d 6a7ee671193c454e96fc26f491631ffa--4d9baa9ece764cc5b7712aa4205d7b9d c314c6297d0f45a69c125e6c89fc9c8a bcba55aeaba64f6babafcce0e6c2f126 RX(2.0*acos(x)) d503e054ff614492a27115ad4b8cfac2--bcba55aeaba64f6babafcce0e6c2f126 bf7dfc6da091477e8d224d8875350804 2 5d574c77104b418da9413796090b085e RX(theta₁) bcba55aeaba64f6babafcce0e6c2f126--5d574c77104b418da9413796090b085e c4e34e19ac8f421cb4d80748da21de8e RY(theta₅) 5d574c77104b418da9413796090b085e--c4e34e19ac8f421cb4d80748da21de8e 4337d6ab44c645ecbd5e08de09212b36 RX(theta₉) c4e34e19ac8f421cb4d80748da21de8e--4337d6ab44c645ecbd5e08de09212b36 121f68822f174b63836389d63e288079 X 4337d6ab44c645ecbd5e08de09212b36--121f68822f174b63836389d63e288079 121f68822f174b63836389d63e288079--27cbe8f29687462db084ebf975309fab b05de6dd92f54c3b9dbdcd6d7da594db 121f68822f174b63836389d63e288079--b05de6dd92f54c3b9dbdcd6d7da594db d1b53c3e449443c29fea0ad4c21820cc RX(theta₁₃) b05de6dd92f54c3b9dbdcd6d7da594db--d1b53c3e449443c29fea0ad4c21820cc 4e01b264fb37421da490098324fecf35 RY(theta₁₇) d1b53c3e449443c29fea0ad4c21820cc--4e01b264fb37421da490098324fecf35 70e3516597564615942da8c38e20d0ae RX(theta₂₁) 4e01b264fb37421da490098324fecf35--70e3516597564615942da8c38e20d0ae 68772cc7741d4709882001573a9b4119 X 70e3516597564615942da8c38e20d0ae--68772cc7741d4709882001573a9b4119 68772cc7741d4709882001573a9b4119--a278a14525c54a8ebd9730a22b75b7fd 0a759c9466e14ae49770837583344d93 68772cc7741d4709882001573a9b4119--0a759c9466e14ae49770837583344d93 3e1477c1cbe64f599cc912c5137a547a AddBlock 0a759c9466e14ae49770837583344d93--3e1477c1cbe64f599cc912c5137a547a 3e1477c1cbe64f599cc912c5137a547a--c314c6297d0f45a69c125e6c89fc9c8a fce2b54fed6b4620bed308474c1ba970 c68c38afc5fd4de7bfea74bd5318e8ac RX(1.0*acos(2.0*y - 1.0)) bf7dfc6da091477e8d224d8875350804--c68c38afc5fd4de7bfea74bd5318e8ac aedce3c00b874eb795a51ae46c739ff5 3 0bef3be3113243378d974a54791d8118 RX(theta₂) c68c38afc5fd4de7bfea74bd5318e8ac--0bef3be3113243378d974a54791d8118 61da16c907274ee293b342ac98df7b48 RY(theta₆) 0bef3be3113243378d974a54791d8118--61da16c907274ee293b342ac98df7b48 4d7e5e0b1fce490e90a66914f6c31841 RX(theta₁₀) 61da16c907274ee293b342ac98df7b48--4d7e5e0b1fce490e90a66914f6c31841 947bc7b7a1cf454ba778fcec9b28a82f 4d7e5e0b1fce490e90a66914f6c31841--947bc7b7a1cf454ba778fcec9b28a82f 78114657ac374e20b03455b8acefc1c9 X 947bc7b7a1cf454ba778fcec9b28a82f--78114657ac374e20b03455b8acefc1c9 78114657ac374e20b03455b8acefc1c9--b05de6dd92f54c3b9dbdcd6d7da594db 554ffe4bf70247498ce8e9a5720605b0 RX(theta₁₄) 78114657ac374e20b03455b8acefc1c9--554ffe4bf70247498ce8e9a5720605b0 8884a30bb79944aa8d12cb591cda4482 RY(theta₁₈) 554ffe4bf70247498ce8e9a5720605b0--8884a30bb79944aa8d12cb591cda4482 ca47d2db97804ba6831880956f243355 RX(theta₂₂) 8884a30bb79944aa8d12cb591cda4482--ca47d2db97804ba6831880956f243355 a4bfaa4e187a4895996074cc8edd8dac ca47d2db97804ba6831880956f243355--a4bfaa4e187a4895996074cc8edd8dac b7aefc5408a44d078e9b89b587a20d0c X a4bfaa4e187a4895996074cc8edd8dac--b7aefc5408a44d078e9b89b587a20d0c b7aefc5408a44d078e9b89b587a20d0c--0a759c9466e14ae49770837583344d93 b594b4343ba940fca4d75d5f72a1df14 b7aefc5408a44d078e9b89b587a20d0c--b594b4343ba940fca4d75d5f72a1df14 b594b4343ba940fca4d75d5f72a1df14--fce2b54fed6b4620bed308474c1ba970 16b5db84e7184803bba397a005976d06 c89026f8497949f58fd63f8ada1dd652 RX(2.0*acos(2.0*y - 1.0)) aedce3c00b874eb795a51ae46c739ff5--c89026f8497949f58fd63f8ada1dd652 3048f5fc1f11496fba650545a0226639 RX(theta₃) c89026f8497949f58fd63f8ada1dd652--3048f5fc1f11496fba650545a0226639 bbbb1f7bf6d34302a2be13da035349f0 RY(theta₇) 3048f5fc1f11496fba650545a0226639--bbbb1f7bf6d34302a2be13da035349f0 a5199a9cedce4a9bba003658ec9d98f6 RX(theta₁₁) bbbb1f7bf6d34302a2be13da035349f0--a5199a9cedce4a9bba003658ec9d98f6 83f0f763f9ef4d54b6d9e7bb40afea17 X a5199a9cedce4a9bba003658ec9d98f6--83f0f763f9ef4d54b6d9e7bb40afea17 83f0f763f9ef4d54b6d9e7bb40afea17--947bc7b7a1cf454ba778fcec9b28a82f adf6082540e941bf8dbba32068850bac 83f0f763f9ef4d54b6d9e7bb40afea17--adf6082540e941bf8dbba32068850bac 0d27e86af2604274bf5ee04b3e2bda28 RX(theta₁₅) adf6082540e941bf8dbba32068850bac--0d27e86af2604274bf5ee04b3e2bda28 d9aa6b2b40c340dc88196bd7b8f16031 RY(theta₁₉) 0d27e86af2604274bf5ee04b3e2bda28--d9aa6b2b40c340dc88196bd7b8f16031 6bf40fcbfc414c5e80dbab2b9f4a4ce1 RX(theta₂₃) d9aa6b2b40c340dc88196bd7b8f16031--6bf40fcbfc414c5e80dbab2b9f4a4ce1 084da2087c8f412dbe7f10f309f3880b X 6bf40fcbfc414c5e80dbab2b9f4a4ce1--084da2087c8f412dbe7f10f309f3880b 084da2087c8f412dbe7f10f309f3880b--a4bfaa4e187a4895996074cc8edd8dac 845ee614070149ada7ac1cec28ab9c2e 084da2087c8f412dbe7f10f309f3880b--845ee614070149ada7ac1cec28ab9c2e 137628e116484b5b81ff762cf0aae9df 845ee614070149ada7ac1cec28ab9c2e--137628e116484b5b81ff762cf0aae9df 137628e116484b5b81ff762cf0aae9df--16b5db84e7184803bba397a005976d06