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_a8de414579b34984bc115b8dd9caffb3 7c502c1acc214890b727bf53a61bb1e0 0 490d7d182b4f4b4ab2631309ec523b25 7c502c1acc214890b727bf53a61bb1e0--490d7d182b4f4b4ab2631309ec523b25 e3f7cbb78da74c8bb8c683242cdc1958 1 18c400bc2433478084e5530fd2051114 490d7d182b4f4b4ab2631309ec523b25--18c400bc2433478084e5530fd2051114 01f9a0a880a64476982f8baef009abd9 374b5d0a7d5448c89ce7ecd3d8987cf1 AddBlock e3f7cbb78da74c8bb8c683242cdc1958--374b5d0a7d5448c89ce7ecd3d8987cf1 0cfc30790e1a41cbbce7c3e1de210f86 2 374b5d0a7d5448c89ce7ecd3d8987cf1--01f9a0a880a64476982f8baef009abd9 08a89b9e627443d191efff760ca917c6 279987af57344e0bb84c5da7be98b2d0 0cfc30790e1a41cbbce7c3e1de210f86--279987af57344e0bb84c5da7be98b2d0 cbeb6b735c59451c88516c9dd3c68b89 3 279987af57344e0bb84c5da7be98b2d0--08a89b9e627443d191efff760ca917c6 ee27f970aa104528b2d783f64bf5ba29 addae2f89baa4e83a6655bf985c286aa cbeb6b735c59451c88516c9dd3c68b89--addae2f89baa4e83a6655bf985c286aa addae2f89baa4e83a6655bf985c286aa--ee27f970aa104528b2d783f64bf5ba29

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_62fc9dec414e41b58d06e2f85cda54f2 Tower Chebyshev FM cluster_9b66121e2ef84fd89e1a873bd5b31105 Tower Chebyshev FM 5eacea69f1b6451d85c0f1579b2fcbb5 0 c095c8685b9543e5b8d2aec06301544c RX(1.0*acos(x)) 5eacea69f1b6451d85c0f1579b2fcbb5--c095c8685b9543e5b8d2aec06301544c ccb8b3175cab46ff9bd01ed2f84fc6ac 1 fd452344461b4d9b95e6c132063a2f6e c095c8685b9543e5b8d2aec06301544c--fd452344461b4d9b95e6c132063a2f6e 9e912421c2c14b1384824a7660ade0cc e98c816210e64dc7b0e617411775a2e7 RX(2.0*acos(x)) ccb8b3175cab46ff9bd01ed2f84fc6ac--e98c816210e64dc7b0e617411775a2e7 4720fbfecf1c4e6aa9a8dae887d6dacb 2 e98c816210e64dc7b0e617411775a2e7--9e912421c2c14b1384824a7660ade0cc a7db3a62e5ea4873924b98a63188a6af c5cd07c21ebd4994acac885f32733141 RX(1.0*acos(2.0*y - 1.0)) 4720fbfecf1c4e6aa9a8dae887d6dacb--c5cd07c21ebd4994acac885f32733141 b773091b00034adbad92c5433bd7f9fc 3 c5cd07c21ebd4994acac885f32733141--a7db3a62e5ea4873924b98a63188a6af e9cb8b2a621447439d214804f6df2b3e 0655e36782b047b0a30b70d456d1f5d5 RX(2.0*acos(2.0*y - 1.0)) b773091b00034adbad92c5433bd7f9fc--0655e36782b047b0a30b70d456d1f5d5 0655e36782b047b0a30b70d456d1f5d5--e9cb8b2a621447439d214804f6df2b3e

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 c160e93b57424f4ebefc5e6f35bdc997 0 0babe0c08a3d48f6a1045bd9034f2db3 RX(theta₀) c160e93b57424f4ebefc5e6f35bdc997--0babe0c08a3d48f6a1045bd9034f2db3 7aeb2ce84c5247249aa398794ae6aa95 1 94a700c7ed9046baa08fff3ffac217f5 RY(theta₄) 0babe0c08a3d48f6a1045bd9034f2db3--94a700c7ed9046baa08fff3ffac217f5 6eedea7251c44929a2990c58329f27e7 RX(theta₈) 94a700c7ed9046baa08fff3ffac217f5--6eedea7251c44929a2990c58329f27e7 03cbbdfe4d20474c87b9c018ccbeaa11 6eedea7251c44929a2990c58329f27e7--03cbbdfe4d20474c87b9c018ccbeaa11 7cbbd18ef3dd48fc8feda337d8efd842 03cbbdfe4d20474c87b9c018ccbeaa11--7cbbd18ef3dd48fc8feda337d8efd842 bfdf4f67ffea490bb8259e26088cbd90 RX(theta₁₂) 7cbbd18ef3dd48fc8feda337d8efd842--bfdf4f67ffea490bb8259e26088cbd90 2a5bfee7a855473db4a3ac750cbb0c6f RY(theta₁₆) bfdf4f67ffea490bb8259e26088cbd90--2a5bfee7a855473db4a3ac750cbb0c6f fa245cd53de544a1ad3cf2612f53531f RX(theta₂₀) 2a5bfee7a855473db4a3ac750cbb0c6f--fa245cd53de544a1ad3cf2612f53531f e2904af8224e477c83b2f018baa6db78 fa245cd53de544a1ad3cf2612f53531f--e2904af8224e477c83b2f018baa6db78 d819d449f55c4b09b2557f9cb01e60b3 e2904af8224e477c83b2f018baa6db78--d819d449f55c4b09b2557f9cb01e60b3 058ccd8c4baa42a58e31821fd168a31d d819d449f55c4b09b2557f9cb01e60b3--058ccd8c4baa42a58e31821fd168a31d 35bd2d70c6494789ac03de472eee1d90 fc1b759043504299bc78dc6d09d4abd5 RX(theta₁) 7aeb2ce84c5247249aa398794ae6aa95--fc1b759043504299bc78dc6d09d4abd5 d11efdcb8a3d4004b85eabc93b3acc86 2 cb4e7bc6888646e890c3db44472026a6 RY(theta₅) fc1b759043504299bc78dc6d09d4abd5--cb4e7bc6888646e890c3db44472026a6 53382d6430a44aa58f03f9f0bbcf91a5 RX(theta₉) cb4e7bc6888646e890c3db44472026a6--53382d6430a44aa58f03f9f0bbcf91a5 dfcbcaef22004f868d73c384e1563d00 X 53382d6430a44aa58f03f9f0bbcf91a5--dfcbcaef22004f868d73c384e1563d00 dfcbcaef22004f868d73c384e1563d00--03cbbdfe4d20474c87b9c018ccbeaa11 f369d861bb4d44dda88a4a3f898ef3ba dfcbcaef22004f868d73c384e1563d00--f369d861bb4d44dda88a4a3f898ef3ba 70d98729f0964f3b9adee331e6f94ddd RX(theta₁₃) f369d861bb4d44dda88a4a3f898ef3ba--70d98729f0964f3b9adee331e6f94ddd bbe62826f610435b9beef01398bc1c1f RY(theta₁₇) 70d98729f0964f3b9adee331e6f94ddd--bbe62826f610435b9beef01398bc1c1f cc72f656afe249bca161a3823fcf8e3b RX(theta₂₁) bbe62826f610435b9beef01398bc1c1f--cc72f656afe249bca161a3823fcf8e3b 66a652cf733d4259b3d2e816a099389e X cc72f656afe249bca161a3823fcf8e3b--66a652cf733d4259b3d2e816a099389e 66a652cf733d4259b3d2e816a099389e--e2904af8224e477c83b2f018baa6db78 1792f26ad25c452fa9b44065f6ff5b5b 66a652cf733d4259b3d2e816a099389e--1792f26ad25c452fa9b44065f6ff5b5b 1792f26ad25c452fa9b44065f6ff5b5b--35bd2d70c6494789ac03de472eee1d90 15f96076071e41cebc5cc74872abaca6 e0751c8b85044ef8afdf2585c03cdb99 RX(theta₂) d11efdcb8a3d4004b85eabc93b3acc86--e0751c8b85044ef8afdf2585c03cdb99 d1b0e2b4a7a44d58986b1c827a083734 3 b1a3642065434f7b810d2033795c1f29 RY(theta₆) e0751c8b85044ef8afdf2585c03cdb99--b1a3642065434f7b810d2033795c1f29 3e260e99baa0461da3965e91d8c75a34 RX(theta₁₀) b1a3642065434f7b810d2033795c1f29--3e260e99baa0461da3965e91d8c75a34 5ac00067ab0e4f589f3dd03a772e9e6d 3e260e99baa0461da3965e91d8c75a34--5ac00067ab0e4f589f3dd03a772e9e6d 85d5767b45074f55b3491eff46dd1bf3 X 5ac00067ab0e4f589f3dd03a772e9e6d--85d5767b45074f55b3491eff46dd1bf3 85d5767b45074f55b3491eff46dd1bf3--f369d861bb4d44dda88a4a3f898ef3ba 9eb38e8aac0d48c48be449b8f2fb67db RX(theta₁₄) 85d5767b45074f55b3491eff46dd1bf3--9eb38e8aac0d48c48be449b8f2fb67db ef6786e7c2f24b0c8c4506f99e733ecd RY(theta₁₈) 9eb38e8aac0d48c48be449b8f2fb67db--ef6786e7c2f24b0c8c4506f99e733ecd ff4fcf01d4464deda41e0de02f6df2e7 RX(theta₂₂) ef6786e7c2f24b0c8c4506f99e733ecd--ff4fcf01d4464deda41e0de02f6df2e7 5942385347294f1ebd289297b206f865 ff4fcf01d4464deda41e0de02f6df2e7--5942385347294f1ebd289297b206f865 1df3212fe9764d129da3ccb6191c46c0 X 5942385347294f1ebd289297b206f865--1df3212fe9764d129da3ccb6191c46c0 1df3212fe9764d129da3ccb6191c46c0--1792f26ad25c452fa9b44065f6ff5b5b 1df3212fe9764d129da3ccb6191c46c0--15f96076071e41cebc5cc74872abaca6 bd335791d35943d2ae5945f82f3bcc8d 868ec155d3e94b2782b7514adc747243 RX(theta₃) d1b0e2b4a7a44d58986b1c827a083734--868ec155d3e94b2782b7514adc747243 c47e56e56cb1497487e1366171ef4789 RY(theta₇) 868ec155d3e94b2782b7514adc747243--c47e56e56cb1497487e1366171ef4789 e1527c5b2e7f4b139cc87466d963b9b3 RX(theta₁₁) c47e56e56cb1497487e1366171ef4789--e1527c5b2e7f4b139cc87466d963b9b3 6b6c5cb9969c4d2198bc5144faea1e90 X e1527c5b2e7f4b139cc87466d963b9b3--6b6c5cb9969c4d2198bc5144faea1e90 6b6c5cb9969c4d2198bc5144faea1e90--5ac00067ab0e4f589f3dd03a772e9e6d ff1a1472f1ad4c5b823747959262f763 6b6c5cb9969c4d2198bc5144faea1e90--ff1a1472f1ad4c5b823747959262f763 a272f588f5c540f0b328e547f5514dfa RX(theta₁₅) ff1a1472f1ad4c5b823747959262f763--a272f588f5c540f0b328e547f5514dfa aa145305da6a4b898a55c6507e6832f7 RY(theta₁₉) a272f588f5c540f0b328e547f5514dfa--aa145305da6a4b898a55c6507e6832f7 2016da999f19481a9a508e251e6e328e RX(theta₂₃) aa145305da6a4b898a55c6507e6832f7--2016da999f19481a9a508e251e6e328e 1775f34fc195406daf509397ef7ee291 X 2016da999f19481a9a508e251e6e328e--1775f34fc195406daf509397ef7ee291 1775f34fc195406daf509397ef7ee291--5942385347294f1ebd289297b206f865 c5dbd3fd20844f368200f0a3515308b8 1775f34fc195406daf509397ef7ee291--c5dbd3fd20844f368200f0a3515308b8 c5dbd3fd20844f368200f0a3515308b8--bd335791d35943d2ae5945f82f3bcc8d

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_20b6ac2d6b7449de80b0aff951e4a953 Obs. cluster_791ce0b2d2944e3db5e2a085c3191b7b cluster_6ac8c3be286b410ab6144b3c8614bc7d Tower Chebyshev FM cluster_48bd80ab8da54c1687543a0130f0af77 Tower Chebyshev FM cluster_77c4f48313c544369d657dc952d51767 HEA 7c67c42ab8264998922f5e8d69d6ea08 0 00f05d8c74eb4478930ab02d5aa60a47 RX(1.0*acos(x)) 7c67c42ab8264998922f5e8d69d6ea08--00f05d8c74eb4478930ab02d5aa60a47 7ee09b84fb1043778ab42898ed79eb46 1 89b241d20666435ebf19994e5a36ad28 RX(theta₀) 00f05d8c74eb4478930ab02d5aa60a47--89b241d20666435ebf19994e5a36ad28 ed00440a9e1d406bacf8b6c01648b2e2 RY(theta₄) 89b241d20666435ebf19994e5a36ad28--ed00440a9e1d406bacf8b6c01648b2e2 da2a5eee624f452b86194617c22f6f74 RX(theta₈) ed00440a9e1d406bacf8b6c01648b2e2--da2a5eee624f452b86194617c22f6f74 a75f6562e2e144329171b548f7d2f051 da2a5eee624f452b86194617c22f6f74--a75f6562e2e144329171b548f7d2f051 9e6705efa11445e4847c3fbcd06f52cc a75f6562e2e144329171b548f7d2f051--9e6705efa11445e4847c3fbcd06f52cc 6b52b2e7b16d413c9d001f7009eef37b RX(theta₁₂) 9e6705efa11445e4847c3fbcd06f52cc--6b52b2e7b16d413c9d001f7009eef37b 648ab49bcdcf4f36a8d814c2e4af8479 RY(theta₁₆) 6b52b2e7b16d413c9d001f7009eef37b--648ab49bcdcf4f36a8d814c2e4af8479 aa8b683909334533b09703d45c407797 RX(theta₂₀) 648ab49bcdcf4f36a8d814c2e4af8479--aa8b683909334533b09703d45c407797 2734ce41e4e84624aa2e18a56c3b7dcb aa8b683909334533b09703d45c407797--2734ce41e4e84624aa2e18a56c3b7dcb fe970bce65a04cc7b29c5440873c096e 2734ce41e4e84624aa2e18a56c3b7dcb--fe970bce65a04cc7b29c5440873c096e 6eacaac18ebe4dbba8e7afdb55b98809 fe970bce65a04cc7b29c5440873c096e--6eacaac18ebe4dbba8e7afdb55b98809 ef91c0b3637b45d7a946112445731e93 6eacaac18ebe4dbba8e7afdb55b98809--ef91c0b3637b45d7a946112445731e93 d83f21a537344211b2a2c672dbdfd5d3 1a0dae8d626d45e2aee839abb90985e5 RX(2.0*acos(x)) 7ee09b84fb1043778ab42898ed79eb46--1a0dae8d626d45e2aee839abb90985e5 b02e21fd8c9e437997169aefd5ca949f 2 ddcea40397eb45069230a2d41edddfaf RX(theta₁) 1a0dae8d626d45e2aee839abb90985e5--ddcea40397eb45069230a2d41edddfaf aa5a8d72e0d644e7bd8597e6100d28a6 RY(theta₅) ddcea40397eb45069230a2d41edddfaf--aa5a8d72e0d644e7bd8597e6100d28a6 140a0cd1d6d946c9a8b1df6df77c3a16 RX(theta₉) aa5a8d72e0d644e7bd8597e6100d28a6--140a0cd1d6d946c9a8b1df6df77c3a16 576b68ba0c5d474c8d52e0cfcb7b93f3 X 140a0cd1d6d946c9a8b1df6df77c3a16--576b68ba0c5d474c8d52e0cfcb7b93f3 576b68ba0c5d474c8d52e0cfcb7b93f3--a75f6562e2e144329171b548f7d2f051 a183a0033bf049c19beeb98d48aab289 576b68ba0c5d474c8d52e0cfcb7b93f3--a183a0033bf049c19beeb98d48aab289 220c8b63745c459d824819f29e739b94 RX(theta₁₃) a183a0033bf049c19beeb98d48aab289--220c8b63745c459d824819f29e739b94 5db8747d51c945e7a85c8ae7fa10cc00 RY(theta₁₇) 220c8b63745c459d824819f29e739b94--5db8747d51c945e7a85c8ae7fa10cc00 b409915a52344377bdcae5650a66ea18 RX(theta₂₁) 5db8747d51c945e7a85c8ae7fa10cc00--b409915a52344377bdcae5650a66ea18 ac979b41a39049a4bbdbb23531f59d6f X b409915a52344377bdcae5650a66ea18--ac979b41a39049a4bbdbb23531f59d6f ac979b41a39049a4bbdbb23531f59d6f--2734ce41e4e84624aa2e18a56c3b7dcb 7659bb842e16417da59499cadaa3d58f ac979b41a39049a4bbdbb23531f59d6f--7659bb842e16417da59499cadaa3d58f 947556c899b04dbc9f42203d7d3d5e75 AddBlock 7659bb842e16417da59499cadaa3d58f--947556c899b04dbc9f42203d7d3d5e75 947556c899b04dbc9f42203d7d3d5e75--d83f21a537344211b2a2c672dbdfd5d3 4255d505a34e41468be31088c45dc2a2 8c984a3c757b43b5a7e5e468911498ae RX(1.0*acos(2.0*y - 1.0)) b02e21fd8c9e437997169aefd5ca949f--8c984a3c757b43b5a7e5e468911498ae 9a289adf2f404296b30328144ccb92cc 3 e0e26280fda64a78a384070ae929569f RX(theta₂) 8c984a3c757b43b5a7e5e468911498ae--e0e26280fda64a78a384070ae929569f 0dcee763631c42aaaf3a9b84897a5f39 RY(theta₆) e0e26280fda64a78a384070ae929569f--0dcee763631c42aaaf3a9b84897a5f39 d648176cdbb64902820500265708a714 RX(theta₁₀) 0dcee763631c42aaaf3a9b84897a5f39--d648176cdbb64902820500265708a714 e06beacf093745008f1b35c76e5244ec d648176cdbb64902820500265708a714--e06beacf093745008f1b35c76e5244ec 96f2b606803e437a9bd6a3e1ff4981c7 X e06beacf093745008f1b35c76e5244ec--96f2b606803e437a9bd6a3e1ff4981c7 96f2b606803e437a9bd6a3e1ff4981c7--a183a0033bf049c19beeb98d48aab289 96b0fe9302744cbe8684393a583bbb21 RX(theta₁₄) 96f2b606803e437a9bd6a3e1ff4981c7--96b0fe9302744cbe8684393a583bbb21 4a6929e8ed084331a00c520dbb6c92ef RY(theta₁₈) 96b0fe9302744cbe8684393a583bbb21--4a6929e8ed084331a00c520dbb6c92ef 225ad5a4b67b4732a311b0c8de030788 RX(theta₂₂) 4a6929e8ed084331a00c520dbb6c92ef--225ad5a4b67b4732a311b0c8de030788 d8bafaa8a3324a6a80ccf8037fb8550e 225ad5a4b67b4732a311b0c8de030788--d8bafaa8a3324a6a80ccf8037fb8550e 4b01b61222fc473990b1e43f74aa58d4 X d8bafaa8a3324a6a80ccf8037fb8550e--4b01b61222fc473990b1e43f74aa58d4 4b01b61222fc473990b1e43f74aa58d4--7659bb842e16417da59499cadaa3d58f e2d98e62deaa4a47b1df733cbec1b04f 4b01b61222fc473990b1e43f74aa58d4--e2d98e62deaa4a47b1df733cbec1b04f e2d98e62deaa4a47b1df733cbec1b04f--4255d505a34e41468be31088c45dc2a2 be52eed142234c50bebb05299c97f5e7 e795eb099c5f4cb7a2277fe89c10cf6f RX(2.0*acos(2.0*y - 1.0)) 9a289adf2f404296b30328144ccb92cc--e795eb099c5f4cb7a2277fe89c10cf6f 9072d43fc0f94c5194fbcd899d6b16f3 RX(theta₃) e795eb099c5f4cb7a2277fe89c10cf6f--9072d43fc0f94c5194fbcd899d6b16f3 2f64f6d36c0f4daaaf348257e2318b81 RY(theta₇) 9072d43fc0f94c5194fbcd899d6b16f3--2f64f6d36c0f4daaaf348257e2318b81 bdbb72bf4a134816bd9c8c31e3fb681f RX(theta₁₁) 2f64f6d36c0f4daaaf348257e2318b81--bdbb72bf4a134816bd9c8c31e3fb681f d8d5feab02b04451ad01c0f9917e3df1 X bdbb72bf4a134816bd9c8c31e3fb681f--d8d5feab02b04451ad01c0f9917e3df1 d8d5feab02b04451ad01c0f9917e3df1--e06beacf093745008f1b35c76e5244ec b3dcc494968d4d56b1914c51abaa8017 d8d5feab02b04451ad01c0f9917e3df1--b3dcc494968d4d56b1914c51abaa8017 fb2f0fc5c1ad497e889a6989dfa54188 RX(theta₁₅) b3dcc494968d4d56b1914c51abaa8017--fb2f0fc5c1ad497e889a6989dfa54188 e576f9c0a3ba4d74a516dca3ee9286a2 RY(theta₁₉) fb2f0fc5c1ad497e889a6989dfa54188--e576f9c0a3ba4d74a516dca3ee9286a2 24d768409ec349ff87898817ca7c8c2b RX(theta₂₃) e576f9c0a3ba4d74a516dca3ee9286a2--24d768409ec349ff87898817ca7c8c2b e48820d365cc44cb88bbc807415beef2 X 24d768409ec349ff87898817ca7c8c2b--e48820d365cc44cb88bbc807415beef2 e48820d365cc44cb88bbc807415beef2--d8bafaa8a3324a6a80ccf8037fb8550e fd7a649d69254bcd915dcbd2d2c2332d e48820d365cc44cb88bbc807415beef2--fd7a649d69254bcd915dcbd2d2c2332d 85e5670d18ac4faeb07b6854ae85fb51 fd7a649d69254bcd915dcbd2d2c2332d--85e5670d18ac4faeb07b6854ae85fb51 85e5670d18ac4faeb07b6854ae85fb51--be52eed142234c50bebb05299c97f5e7