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_7907d3080a6e4b6ead2b9c3a7553eeaa 2596829d04f24868a5d35595d34bdaa0 0 ee3c71f86be746e2a862912181fa3816 2596829d04f24868a5d35595d34bdaa0--ee3c71f86be746e2a862912181fa3816 081489e8a6554d23b86fc5f24d3f6444 1 8a4c1b8e6934421bba999f0ed02590d8 ee3c71f86be746e2a862912181fa3816--8a4c1b8e6934421bba999f0ed02590d8 1eb72caa88f44c40a09b038c85665b4d 76a70e4b5e624d32bec212073201b457 AddBlock 081489e8a6554d23b86fc5f24d3f6444--76a70e4b5e624d32bec212073201b457 68fc56286c0a4476ba9efdb7434251fc 2 76a70e4b5e624d32bec212073201b457--1eb72caa88f44c40a09b038c85665b4d f21ac171bd3245bc90b955a76eeedd43 e0a2d2ffe47c4b93b4f9aa08e22ae2e5 68fc56286c0a4476ba9efdb7434251fc--e0a2d2ffe47c4b93b4f9aa08e22ae2e5 2f693bdda63c4d60a5283d8e95bd6838 3 e0a2d2ffe47c4b93b4f9aa08e22ae2e5--f21ac171bd3245bc90b955a76eeedd43 be12ce14e1674079be22e60c70a863b5 cbdab11db55249d18a7d786202b5ccb4 2f693bdda63c4d60a5283d8e95bd6838--cbdab11db55249d18a7d786202b5ccb4 cbdab11db55249d18a7d786202b5ccb4--be12ce14e1674079be22e60c70a863b5

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_f5093eb17a9f4fe99a2c08913180ce9d Tower Chebyshev FM cluster_47fa4bb6101441fbbaa16bf41ec91c72 Tower Chebyshev FM 8f57775742214d86aa8c3ebb0dabd565 0 031b85d21c664f459efdcedc48b1f872 RX(1.0*acos(x)) 8f57775742214d86aa8c3ebb0dabd565--031b85d21c664f459efdcedc48b1f872 442b03b696e945b48628a84c03f394fa 1 736f85c8a70844b8a2d7e991df426065 031b85d21c664f459efdcedc48b1f872--736f85c8a70844b8a2d7e991df426065 baa7418f298944fc9fc529b6d9647e4a c299d42d848e4a1b9a41193c6783ed0d RX(2.0*acos(x)) 442b03b696e945b48628a84c03f394fa--c299d42d848e4a1b9a41193c6783ed0d 27e5629015f340ed98cf73930ad001d3 2 c299d42d848e4a1b9a41193c6783ed0d--baa7418f298944fc9fc529b6d9647e4a 01f391acb25e4f6d936aa6fec67d1cf0 ea53444d76264f27a0d1cb103f3874fc RX(1.0*acos(2.0*y - 1.0)) 27e5629015f340ed98cf73930ad001d3--ea53444d76264f27a0d1cb103f3874fc 29434cd33f9143529e956fe68f85791c 3 ea53444d76264f27a0d1cb103f3874fc--01f391acb25e4f6d936aa6fec67d1cf0 99b477df51a7476d9e4ad22e7e982637 9054f76b09954e3e8b2aff781751fc02 RX(2.0*acos(2.0*y - 1.0)) 29434cd33f9143529e956fe68f85791c--9054f76b09954e3e8b2aff781751fc02 9054f76b09954e3e8b2aff781751fc02--99b477df51a7476d9e4ad22e7e982637

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 85399d14ba604db09e93a98655089a82 0 6c56ffd16b0e4b42a4767294f260b5a2 RX(theta₀) 85399d14ba604db09e93a98655089a82--6c56ffd16b0e4b42a4767294f260b5a2 5a18fe40aa69459e906e15e41fd494bd 1 d575e1e8c2a74f3d847265cb1892cb35 RY(theta₄) 6c56ffd16b0e4b42a4767294f260b5a2--d575e1e8c2a74f3d847265cb1892cb35 cf5ec3fd5cfd4c6bab4964a8e22b2a50 RX(theta₈) d575e1e8c2a74f3d847265cb1892cb35--cf5ec3fd5cfd4c6bab4964a8e22b2a50 d699c847a8524a4db7735cbb21c4c257 cf5ec3fd5cfd4c6bab4964a8e22b2a50--d699c847a8524a4db7735cbb21c4c257 b1e4e7b7230c4ce7952366046a164c00 d699c847a8524a4db7735cbb21c4c257--b1e4e7b7230c4ce7952366046a164c00 424ffebd34a243908fe6e554d19571fc RX(theta₁₂) b1e4e7b7230c4ce7952366046a164c00--424ffebd34a243908fe6e554d19571fc 06db0d06b876447e942019f9824f38c1 RY(theta₁₆) 424ffebd34a243908fe6e554d19571fc--06db0d06b876447e942019f9824f38c1 2a1a8b632d22470eaaa83363fa410b2f RX(theta₂₀) 06db0d06b876447e942019f9824f38c1--2a1a8b632d22470eaaa83363fa410b2f 641ae6ed4a464489a483535b09d6b3d3 2a1a8b632d22470eaaa83363fa410b2f--641ae6ed4a464489a483535b09d6b3d3 0aff7d6c84164ae8ac906d0f858156be 641ae6ed4a464489a483535b09d6b3d3--0aff7d6c84164ae8ac906d0f858156be b12c039a378f460d85c25f2c2a243115 0aff7d6c84164ae8ac906d0f858156be--b12c039a378f460d85c25f2c2a243115 a8502dbeeb2645a8a37231d5f71a2c6f 2f0e628c916042229a48e3bcaba4dc5b RX(theta₁) 5a18fe40aa69459e906e15e41fd494bd--2f0e628c916042229a48e3bcaba4dc5b a5483a82c5764d779578ba83e7325b05 2 21c4e410c6084df18d54999a3d35039f RY(theta₅) 2f0e628c916042229a48e3bcaba4dc5b--21c4e410c6084df18d54999a3d35039f 412a0e53712741229aebae9934cdb86c RX(theta₉) 21c4e410c6084df18d54999a3d35039f--412a0e53712741229aebae9934cdb86c 38b404f1603c48bd86d53baca6bc7d92 X 412a0e53712741229aebae9934cdb86c--38b404f1603c48bd86d53baca6bc7d92 38b404f1603c48bd86d53baca6bc7d92--d699c847a8524a4db7735cbb21c4c257 a7874c00fc1544ccb987797e683fc9d1 38b404f1603c48bd86d53baca6bc7d92--a7874c00fc1544ccb987797e683fc9d1 833392a4c8fe4d5fae83d2f3fd874b4e RX(theta₁₃) a7874c00fc1544ccb987797e683fc9d1--833392a4c8fe4d5fae83d2f3fd874b4e f8a2ba2047fb4f41ad8271f6036a6ca7 RY(theta₁₇) 833392a4c8fe4d5fae83d2f3fd874b4e--f8a2ba2047fb4f41ad8271f6036a6ca7 86221752a9e64c638e3f52ddc1ba024f RX(theta₂₁) f8a2ba2047fb4f41ad8271f6036a6ca7--86221752a9e64c638e3f52ddc1ba024f d0241ec1cf3f485597cb2c817d142cc0 X 86221752a9e64c638e3f52ddc1ba024f--d0241ec1cf3f485597cb2c817d142cc0 d0241ec1cf3f485597cb2c817d142cc0--641ae6ed4a464489a483535b09d6b3d3 ffaa954beeed45d2879a9a93a5cf15d4 d0241ec1cf3f485597cb2c817d142cc0--ffaa954beeed45d2879a9a93a5cf15d4 ffaa954beeed45d2879a9a93a5cf15d4--a8502dbeeb2645a8a37231d5f71a2c6f 694414263e3e4492bc46c31ea06b039c f4fe4e527bd5403191574ab37cef5304 RX(theta₂) a5483a82c5764d779578ba83e7325b05--f4fe4e527bd5403191574ab37cef5304 a4945b59d93c47e7ab80996087b5a1ed 3 60c841fffbfd43c990d5d92d25e7365c RY(theta₆) f4fe4e527bd5403191574ab37cef5304--60c841fffbfd43c990d5d92d25e7365c 5cda0cd246e14f1ea7e618c236ddecd8 RX(theta₁₀) 60c841fffbfd43c990d5d92d25e7365c--5cda0cd246e14f1ea7e618c236ddecd8 26c5ecb3b632470ea9b21b90bbde190f 5cda0cd246e14f1ea7e618c236ddecd8--26c5ecb3b632470ea9b21b90bbde190f 0fa3d49d735a41c8b5d1b2312b31fde0 X 26c5ecb3b632470ea9b21b90bbde190f--0fa3d49d735a41c8b5d1b2312b31fde0 0fa3d49d735a41c8b5d1b2312b31fde0--a7874c00fc1544ccb987797e683fc9d1 871dc7cf1ffc426ba630259c8425fca4 RX(theta₁₄) 0fa3d49d735a41c8b5d1b2312b31fde0--871dc7cf1ffc426ba630259c8425fca4 6f0f68c02ca744e7a1e679bd2322e562 RY(theta₁₈) 871dc7cf1ffc426ba630259c8425fca4--6f0f68c02ca744e7a1e679bd2322e562 bca2cf808e81431fa1d13d17d746cc7d RX(theta₂₂) 6f0f68c02ca744e7a1e679bd2322e562--bca2cf808e81431fa1d13d17d746cc7d 34a96e8e94824b7da5cbc51c0f841b5d bca2cf808e81431fa1d13d17d746cc7d--34a96e8e94824b7da5cbc51c0f841b5d bb518ccce9c4489fb0f444ec605e4cdd X 34a96e8e94824b7da5cbc51c0f841b5d--bb518ccce9c4489fb0f444ec605e4cdd bb518ccce9c4489fb0f444ec605e4cdd--ffaa954beeed45d2879a9a93a5cf15d4 bb518ccce9c4489fb0f444ec605e4cdd--694414263e3e4492bc46c31ea06b039c 1fd8337b46eb4e089f0fca11ae14e6fb 960fd07dcee44600bd00ee70b669be76 RX(theta₃) a4945b59d93c47e7ab80996087b5a1ed--960fd07dcee44600bd00ee70b669be76 74cec4856983404489635f818c3b0060 RY(theta₇) 960fd07dcee44600bd00ee70b669be76--74cec4856983404489635f818c3b0060 0de5054bd202491e8bab5dbdac58da57 RX(theta₁₁) 74cec4856983404489635f818c3b0060--0de5054bd202491e8bab5dbdac58da57 4b94da7e927343778b4f769733d39f09 X 0de5054bd202491e8bab5dbdac58da57--4b94da7e927343778b4f769733d39f09 4b94da7e927343778b4f769733d39f09--26c5ecb3b632470ea9b21b90bbde190f c4a42a65a7714878924f0a05870df39c 4b94da7e927343778b4f769733d39f09--c4a42a65a7714878924f0a05870df39c c25764faf33b4f2c976fd8c00d46c2d7 RX(theta₁₅) c4a42a65a7714878924f0a05870df39c--c25764faf33b4f2c976fd8c00d46c2d7 dd1d0f10d6804077ad66c8e24e178c1a RY(theta₁₉) c25764faf33b4f2c976fd8c00d46c2d7--dd1d0f10d6804077ad66c8e24e178c1a 1f1f94eb49e646199b91e389dd219d3a RX(theta₂₃) dd1d0f10d6804077ad66c8e24e178c1a--1f1f94eb49e646199b91e389dd219d3a 04063482efd94f4db950948972be70f1 X 1f1f94eb49e646199b91e389dd219d3a--04063482efd94f4db950948972be70f1 04063482efd94f4db950948972be70f1--34a96e8e94824b7da5cbc51c0f841b5d 35c58d6ced464431bee89f8e6742db83 04063482efd94f4db950948972be70f1--35c58d6ced464431bee89f8e6742db83 35c58d6ced464431bee89f8e6742db83--1fd8337b46eb4e089f0fca11ae14e6fb

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_9aa6cb3e23944901bc305bf0bd01ecb6 Obs. cluster_06e43352f4e44046ac546e75c6654a37 cluster_c909c379d80141dca6ef5569c396cd68 Tower Chebyshev FM cluster_ed8b7f384417423fb2f311fe6e56b3dd Tower Chebyshev FM cluster_e48f48efbc754e648ff6ac4316ab9bc9 HEA 4a41c79f3fdd491da90b0decfda824d7 0 7345ff801da74d1a8008a85406b0810f RX(1.0*acos(x)) 4a41c79f3fdd491da90b0decfda824d7--7345ff801da74d1a8008a85406b0810f 28666bd15f8f4c1e80edd218a006ca56 1 320c1f06a1994bd7ac63cdf87fb84873 RX(theta₀) 7345ff801da74d1a8008a85406b0810f--320c1f06a1994bd7ac63cdf87fb84873 f2f9260de7494d64b3d32e738a6eee30 RY(theta₄) 320c1f06a1994bd7ac63cdf87fb84873--f2f9260de7494d64b3d32e738a6eee30 19267e5c31a144e1b99ad066186c2f1d RX(theta₈) f2f9260de7494d64b3d32e738a6eee30--19267e5c31a144e1b99ad066186c2f1d a196aa0db4f045199213d6a1306a69d3 19267e5c31a144e1b99ad066186c2f1d--a196aa0db4f045199213d6a1306a69d3 44be7bab45074e15accfe7c4dfa48842 a196aa0db4f045199213d6a1306a69d3--44be7bab45074e15accfe7c4dfa48842 4b27e454987b45ae9b0f4c823d561071 RX(theta₁₂) 44be7bab45074e15accfe7c4dfa48842--4b27e454987b45ae9b0f4c823d561071 ee2d4df2e20d4339a060bd374f463547 RY(theta₁₆) 4b27e454987b45ae9b0f4c823d561071--ee2d4df2e20d4339a060bd374f463547 b66a327f4d54452aa4f59962bccfaa41 RX(theta₂₀) ee2d4df2e20d4339a060bd374f463547--b66a327f4d54452aa4f59962bccfaa41 8a58e93f50e341e2a90bf22e3e9ea05c b66a327f4d54452aa4f59962bccfaa41--8a58e93f50e341e2a90bf22e3e9ea05c f9e3a74467da4dae842b8514fd9af785 8a58e93f50e341e2a90bf22e3e9ea05c--f9e3a74467da4dae842b8514fd9af785 f89be34a12d64670b478fb384a603b64 f9e3a74467da4dae842b8514fd9af785--f89be34a12d64670b478fb384a603b64 7c8ccf6bda1542b5bef2b19dca1612e6 f89be34a12d64670b478fb384a603b64--7c8ccf6bda1542b5bef2b19dca1612e6 1b3a625b0a7b4a1c912dbeeafd31d1e1 ebf7a746760c492ebb38c405bad6702f RX(2.0*acos(x)) 28666bd15f8f4c1e80edd218a006ca56--ebf7a746760c492ebb38c405bad6702f 4d30c525d3a141729851645075839c08 2 0bee3ea59bd2488c9ba43adb54dba8d4 RX(theta₁) ebf7a746760c492ebb38c405bad6702f--0bee3ea59bd2488c9ba43adb54dba8d4 a3b6504e652f439dba770d1586bc64c1 RY(theta₅) 0bee3ea59bd2488c9ba43adb54dba8d4--a3b6504e652f439dba770d1586bc64c1 3de4d3ec0efb418a9e34d59f9c7fc606 RX(theta₉) a3b6504e652f439dba770d1586bc64c1--3de4d3ec0efb418a9e34d59f9c7fc606 5ee5a3812b814d75b10bd034a1a7600a X 3de4d3ec0efb418a9e34d59f9c7fc606--5ee5a3812b814d75b10bd034a1a7600a 5ee5a3812b814d75b10bd034a1a7600a--a196aa0db4f045199213d6a1306a69d3 229c9925c3c947f5b3faa14e3430a0de 5ee5a3812b814d75b10bd034a1a7600a--229c9925c3c947f5b3faa14e3430a0de d0cfe28b0c3d411ca80d6d60dfd14703 RX(theta₁₃) 229c9925c3c947f5b3faa14e3430a0de--d0cfe28b0c3d411ca80d6d60dfd14703 79606d4acb1a4f9783f4701748d4fb13 RY(theta₁₇) d0cfe28b0c3d411ca80d6d60dfd14703--79606d4acb1a4f9783f4701748d4fb13 c24a4ed6548443e29042a7bd23e3730a RX(theta₂₁) 79606d4acb1a4f9783f4701748d4fb13--c24a4ed6548443e29042a7bd23e3730a 4777b8d6fa36414b9a6ef51c0d24b933 X c24a4ed6548443e29042a7bd23e3730a--4777b8d6fa36414b9a6ef51c0d24b933 4777b8d6fa36414b9a6ef51c0d24b933--8a58e93f50e341e2a90bf22e3e9ea05c 9653894d0c5340cb8461705b2f977bb0 4777b8d6fa36414b9a6ef51c0d24b933--9653894d0c5340cb8461705b2f977bb0 d8b3bf75fdf04aceb4c3be137afe4d65 AddBlock 9653894d0c5340cb8461705b2f977bb0--d8b3bf75fdf04aceb4c3be137afe4d65 d8b3bf75fdf04aceb4c3be137afe4d65--1b3a625b0a7b4a1c912dbeeafd31d1e1 419ea11b55814386b817fdaf0af72f17 a8a7bc70f74b4ccea5c2adbc875f4dc4 RX(1.0*acos(2.0*y - 1.0)) 4d30c525d3a141729851645075839c08--a8a7bc70f74b4ccea5c2adbc875f4dc4 14586e4156fa401abe911789b7c130a1 3 82349aa283774a0393dcd09204bfca59 RX(theta₂) a8a7bc70f74b4ccea5c2adbc875f4dc4--82349aa283774a0393dcd09204bfca59 cf24482c962f4ad7910dec4dd78c74f4 RY(theta₆) 82349aa283774a0393dcd09204bfca59--cf24482c962f4ad7910dec4dd78c74f4 e30f01303e824ddcbded5e8bdb0f32f2 RX(theta₁₀) cf24482c962f4ad7910dec4dd78c74f4--e30f01303e824ddcbded5e8bdb0f32f2 ac072fa3bbc749be961e729671b84f1e e30f01303e824ddcbded5e8bdb0f32f2--ac072fa3bbc749be961e729671b84f1e 2cb2be31708c4a6d9cc4668d7e784d1e X ac072fa3bbc749be961e729671b84f1e--2cb2be31708c4a6d9cc4668d7e784d1e 2cb2be31708c4a6d9cc4668d7e784d1e--229c9925c3c947f5b3faa14e3430a0de 25448ada93404808832f62033e6cf22c RX(theta₁₄) 2cb2be31708c4a6d9cc4668d7e784d1e--25448ada93404808832f62033e6cf22c 49dfa0f5cdf0451db91c87611dc86070 RY(theta₁₈) 25448ada93404808832f62033e6cf22c--49dfa0f5cdf0451db91c87611dc86070 06cb6f81d4f94a97b4cafbf59dcf45ff RX(theta₂₂) 49dfa0f5cdf0451db91c87611dc86070--06cb6f81d4f94a97b4cafbf59dcf45ff dbf63d4bc80a454dbe339084c63616de 06cb6f81d4f94a97b4cafbf59dcf45ff--dbf63d4bc80a454dbe339084c63616de ac77ea14837742019ba42b08cab03bc3 X dbf63d4bc80a454dbe339084c63616de--ac77ea14837742019ba42b08cab03bc3 ac77ea14837742019ba42b08cab03bc3--9653894d0c5340cb8461705b2f977bb0 04df885f776c42e58661a05015f7ff1e ac77ea14837742019ba42b08cab03bc3--04df885f776c42e58661a05015f7ff1e 04df885f776c42e58661a05015f7ff1e--419ea11b55814386b817fdaf0af72f17 3219296be33b4205ae9e41123768be6d acdcac4a05c24566b97849abf34aef26 RX(2.0*acos(2.0*y - 1.0)) 14586e4156fa401abe911789b7c130a1--acdcac4a05c24566b97849abf34aef26 1fd447ab24a64457b99cb2a09ab4a0a7 RX(theta₃) acdcac4a05c24566b97849abf34aef26--1fd447ab24a64457b99cb2a09ab4a0a7 0ea1c77cd9b9448c85680c76e3b7aee1 RY(theta₇) 1fd447ab24a64457b99cb2a09ab4a0a7--0ea1c77cd9b9448c85680c76e3b7aee1 e878eca5b90c4edd9450a748dfed79c3 RX(theta₁₁) 0ea1c77cd9b9448c85680c76e3b7aee1--e878eca5b90c4edd9450a748dfed79c3 6a54019bd7f743dba5785cd87a904020 X e878eca5b90c4edd9450a748dfed79c3--6a54019bd7f743dba5785cd87a904020 6a54019bd7f743dba5785cd87a904020--ac072fa3bbc749be961e729671b84f1e bda609c1c4054cf29df95365dc7b182b 6a54019bd7f743dba5785cd87a904020--bda609c1c4054cf29df95365dc7b182b 5ddf09fd72cf49fb9c5702861aa6ebe5 RX(theta₁₅) bda609c1c4054cf29df95365dc7b182b--5ddf09fd72cf49fb9c5702861aa6ebe5 7d5bfcd0ec174822a37740eb745b3aaa RY(theta₁₉) 5ddf09fd72cf49fb9c5702861aa6ebe5--7d5bfcd0ec174822a37740eb745b3aaa f69c252acf38475d83ea48a1076fd8d4 RX(theta₂₃) 7d5bfcd0ec174822a37740eb745b3aaa--f69c252acf38475d83ea48a1076fd8d4 e9ccbd3e68e845d695f37df4701255f4 X f69c252acf38475d83ea48a1076fd8d4--e9ccbd3e68e845d695f37df4701255f4 e9ccbd3e68e845d695f37df4701255f4--dbf63d4bc80a454dbe339084c63616de 9a66cec28f3645dbaf2d0fcf32faac22 e9ccbd3e68e845d695f37df4701255f4--9a66cec28f3645dbaf2d0fcf32faac22 e52cd5a9960a425aafb9b9e28c367e38 9a66cec28f3645dbaf2d0fcf32faac22--e52cd5a9960a425aafb9b9e28c367e38 e52cd5a9960a425aafb9b9e28c367e38--3219296be33b4205ae9e41123768be6d