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.

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 create_observable, ObservableConfig, Z

observable_config = ObservableConfig(
    detuning=Z,
    interaction = None,
    scale = 2.0,
    shift=-1.0,
)

observable = create_observable(register=4, config=observable_config)
%3 cluster_fcc3712626244639a1b1a24f4b93455b 8a5c3dba92e14663b6ac3d65386da4a0 0 76aa054b23664e199ca8d6dd46b63cee 8a5c3dba92e14663b6ac3d65386da4a0--76aa054b23664e199ca8d6dd46b63cee abbb3395d9204a32b8c821064317b1ca 1 2f83239c44c444338ffa3a55bb2f3bbd 76aa054b23664e199ca8d6dd46b63cee--2f83239c44c444338ffa3a55bb2f3bbd 509728d90cdf49f0b5fb3b43cf9b360e 65175810f1e340e890ae7a4c380d3933 AddBlock abbb3395d9204a32b8c821064317b1ca--65175810f1e340e890ae7a4c380d3933 ac0d76cd6bda400691ed498d4cd9a1cd 2 65175810f1e340e890ae7a4c380d3933--509728d90cdf49f0b5fb3b43cf9b360e 1154f9acb69d4327bde6621e7f7fc83e 3ff38c86788c4e58a3bb4e7370a29e34 ac0d76cd6bda400691ed498d4cd9a1cd--3ff38c86788c4e58a3bb4e7370a29e34 2934fc8c640a4694b572de16ba2e9555 3 3ff38c86788c4e58a3bb4e7370a29e34--1154f9acb69d4327bde6621e7f7fc83e e6946ab5f440448b94f88a163cbb8b59 e0218c675aaa497382ca69e2a43bfe99 2934fc8c640a4694b572de16ba2e9555--e0218c675aaa497382ca69e2a43bfe99 e0218c675aaa497382ca69e2a43bfe99--e6946ab5f440448b94f88a163cbb8b59

We have specified the observable Hamiltonian to be one with \(Z\)-detuning. The result is linearly scaled by 2.0 and shifted by -1.0. The shift or the scale can optionally also be a VariationalParameter

It is also possible to import some common Hamiltonians, such as total_magnetization_config, zz_hamiltonian_config and, ising_hamiltonian_config.

For example, the total magnetization configuration:

from qadence import create_observable
from qadence.constructors import total_magnetization_config

observable_total_magnetization  = create_observable(register=4, config=total_magnetization_config())

Alternatively, you can define the observable as a list of observables, in which case the QNN will output a list of values.

Scaling and Shifting the QNN Output

For any observable, by appropriately choosing the scale \(\alpha\) and shift \(\beta\), you can constrain the QNN output within a desired range. This is particularly useful for normalizing measurements or ensuring that values remain within a meaningful interval for optimization. To accomplish this, you need to determine the maximum and minimum values that the QNN output can take. For an observable, these extreme values are the two extreme eigenvalues \(\lambda_{max}\) and \(\lambda_{min}\) of the concerned Hamiltonian. Using these values, you can set the scale \(\alpha\) and shift \(\beta\) so that the QNN output is mapped to a specific range \([a,b]\):

\[\alpha = \frac{b-a}{\lambda_{max}-\lambda_{min}}\]
\[\beta = \frac{a\lambda_{max}-b\lambda_{min}}{\lambda_{max}-\lambda_{min}}\]

This transformation ensures that:

\[ a \leq \alpha \lambda + \beta \leq b,\quad\forall \lambda \in [\lambda_{min},\lambda_{max}] \]

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_7c7e3f48bf4f4081906e83e81be7c480 Tower Chebyshev FM cluster_733489fe8f784fec8630bf868e5f7aad Tower Chebyshev FM 7cae014d4d214706b6b714677dbc50b9 0 cfa1dcdc9a21455ca2d5925eafd26617 RX(1.0*acos(x)) 7cae014d4d214706b6b714677dbc50b9--cfa1dcdc9a21455ca2d5925eafd26617 9bc8fe81457e48a9b09a918470d6f723 1 903df23ee90b4344b88daf5d12045c55 cfa1dcdc9a21455ca2d5925eafd26617--903df23ee90b4344b88daf5d12045c55 3b22ddc917d04e2d88cb7cb02d633426 acd03cb7d1a24841b4f4fb4ed1dad669 RX(2.0*acos(x)) 9bc8fe81457e48a9b09a918470d6f723--acd03cb7d1a24841b4f4fb4ed1dad669 6fd78d39128a44cca2cb1065459062bd 2 acd03cb7d1a24841b4f4fb4ed1dad669--3b22ddc917d04e2d88cb7cb02d633426 f2062b4e7e264dbab55b81e4b8bf4f0b 95c096c8af404c66a5c2fdd907aa0cbf RX(1.0*acos(2.0*y - 1.0)) 6fd78d39128a44cca2cb1065459062bd--95c096c8af404c66a5c2fdd907aa0cbf 10c3719227714e72b6675cfc49a8abe6 3 95c096c8af404c66a5c2fdd907aa0cbf--f2062b4e7e264dbab55b81e4b8bf4f0b 0e5abecddd294568a4efa61fd01b68f4 1bb22c8bf68a49ccb5499df075d06451 RX(2.0*acos(2.0*y - 1.0)) 10c3719227714e72b6675cfc49a8abe6--1bb22c8bf68a49ccb5499df075d06451 1bb22c8bf68a49ccb5499df075d06451--0e5abecddd294568a4efa61fd01b68f4

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 2e4c6d48a69b49328c0b90f1d373b516 0 5b5ffa06cb1f4568a2a8510292278dcb RX(theta₀) 2e4c6d48a69b49328c0b90f1d373b516--5b5ffa06cb1f4568a2a8510292278dcb eb6ab132a6ba4c5a87bcc70b09b1fab2 1 af48f289caf5456fa7f608318eb0c3ba RY(theta₄) 5b5ffa06cb1f4568a2a8510292278dcb--af48f289caf5456fa7f608318eb0c3ba 1f837864518a4e20a0772409b7f35cc3 RX(theta₈) af48f289caf5456fa7f608318eb0c3ba--1f837864518a4e20a0772409b7f35cc3 2915c417447a42ca85be21d0bdbc426e 1f837864518a4e20a0772409b7f35cc3--2915c417447a42ca85be21d0bdbc426e 476e8f25166f4af495ab37dc25802d10 2915c417447a42ca85be21d0bdbc426e--476e8f25166f4af495ab37dc25802d10 59649918ac9e4aac832447d3f8f3d0de RX(theta₁₂) 476e8f25166f4af495ab37dc25802d10--59649918ac9e4aac832447d3f8f3d0de d01f928a868c469ba71b59dab586ac0d RY(theta₁₆) 59649918ac9e4aac832447d3f8f3d0de--d01f928a868c469ba71b59dab586ac0d b213388160ed4f8d9c2df165a0a71fd1 RX(theta₂₀) d01f928a868c469ba71b59dab586ac0d--b213388160ed4f8d9c2df165a0a71fd1 28aa18838c174de48df8f4e5ab5e0767 b213388160ed4f8d9c2df165a0a71fd1--28aa18838c174de48df8f4e5ab5e0767 18dcb11071f547afa6a4da8b10915489 28aa18838c174de48df8f4e5ab5e0767--18dcb11071f547afa6a4da8b10915489 9003b1d2a48947079db2e60a8710f051 18dcb11071f547afa6a4da8b10915489--9003b1d2a48947079db2e60a8710f051 8a6d7a8cc39c4ce58d67d4bc0e8d70a3 592583955b12461f92cd0af3d6f729af RX(theta₁) eb6ab132a6ba4c5a87bcc70b09b1fab2--592583955b12461f92cd0af3d6f729af 65b9e00d8cb047cc86021954065e89bb 2 e50b7b217ae246b49dc900ccb6af1d52 RY(theta₅) 592583955b12461f92cd0af3d6f729af--e50b7b217ae246b49dc900ccb6af1d52 832a28c337f94ce388533a27445264a0 RX(theta₉) e50b7b217ae246b49dc900ccb6af1d52--832a28c337f94ce388533a27445264a0 9d08eb6ca2c94d2ea41c9bf65120d1cb X 832a28c337f94ce388533a27445264a0--9d08eb6ca2c94d2ea41c9bf65120d1cb 9d08eb6ca2c94d2ea41c9bf65120d1cb--2915c417447a42ca85be21d0bdbc426e 9c084a69c0044048a9a472017dc8204a 9d08eb6ca2c94d2ea41c9bf65120d1cb--9c084a69c0044048a9a472017dc8204a 82ef29d9808546728b22ad0d0f65d789 RX(theta₁₃) 9c084a69c0044048a9a472017dc8204a--82ef29d9808546728b22ad0d0f65d789 bd97c29cd0bc408f9065c1264aae6e22 RY(theta₁₇) 82ef29d9808546728b22ad0d0f65d789--bd97c29cd0bc408f9065c1264aae6e22 f05bc8e49088406987c2161fa8169587 RX(theta₂₁) bd97c29cd0bc408f9065c1264aae6e22--f05bc8e49088406987c2161fa8169587 bc8c86058f9d46d28926050f590d9bfd X f05bc8e49088406987c2161fa8169587--bc8c86058f9d46d28926050f590d9bfd bc8c86058f9d46d28926050f590d9bfd--28aa18838c174de48df8f4e5ab5e0767 b60237d11dd042ee87170252d11eee1b bc8c86058f9d46d28926050f590d9bfd--b60237d11dd042ee87170252d11eee1b b60237d11dd042ee87170252d11eee1b--8a6d7a8cc39c4ce58d67d4bc0e8d70a3 1c9e20e48d154fe49e3cbb76802b77e6 bf844281c55b40809bb641a9e39fb2f2 RX(theta₂) 65b9e00d8cb047cc86021954065e89bb--bf844281c55b40809bb641a9e39fb2f2 18c1347b772349d79e2908aec118ce7b 3 c6e2216b56e94b249b66bbc464c5cea5 RY(theta₆) bf844281c55b40809bb641a9e39fb2f2--c6e2216b56e94b249b66bbc464c5cea5 a6c5ffe9464d4201ba0764c446d23292 RX(theta₁₀) c6e2216b56e94b249b66bbc464c5cea5--a6c5ffe9464d4201ba0764c446d23292 30f685e079dc4c6eb5c76e24869df7a2 a6c5ffe9464d4201ba0764c446d23292--30f685e079dc4c6eb5c76e24869df7a2 abd1b5d8e6b348fe9ccdfc90353c9566 X 30f685e079dc4c6eb5c76e24869df7a2--abd1b5d8e6b348fe9ccdfc90353c9566 abd1b5d8e6b348fe9ccdfc90353c9566--9c084a69c0044048a9a472017dc8204a aa89a5e5022e48b4b34e5bfe2f4c2c3d RX(theta₁₄) abd1b5d8e6b348fe9ccdfc90353c9566--aa89a5e5022e48b4b34e5bfe2f4c2c3d 8cde63a4ba1d4daaab46dd097d15b872 RY(theta₁₈) aa89a5e5022e48b4b34e5bfe2f4c2c3d--8cde63a4ba1d4daaab46dd097d15b872 17d59762090f44fb8bc056f0fe5e9187 RX(theta₂₂) 8cde63a4ba1d4daaab46dd097d15b872--17d59762090f44fb8bc056f0fe5e9187 507162d78597439984efcf461ceac3c7 17d59762090f44fb8bc056f0fe5e9187--507162d78597439984efcf461ceac3c7 1941284fa9894d21bda6b32a79365cf7 X 507162d78597439984efcf461ceac3c7--1941284fa9894d21bda6b32a79365cf7 1941284fa9894d21bda6b32a79365cf7--b60237d11dd042ee87170252d11eee1b 1941284fa9894d21bda6b32a79365cf7--1c9e20e48d154fe49e3cbb76802b77e6 530c2d4a2a944835ab7ad4560f971f1a c1d1d9a0fbae4e78bc1573e5585a3a49 RX(theta₃) 18c1347b772349d79e2908aec118ce7b--c1d1d9a0fbae4e78bc1573e5585a3a49 2f7061a39d1d415ba769a8f9e742676b RY(theta₇) c1d1d9a0fbae4e78bc1573e5585a3a49--2f7061a39d1d415ba769a8f9e742676b 2b3465816e6e42c79a398ccfd0d1a845 RX(theta₁₁) 2f7061a39d1d415ba769a8f9e742676b--2b3465816e6e42c79a398ccfd0d1a845 05ca93a45d62475281da48f4535aab5c X 2b3465816e6e42c79a398ccfd0d1a845--05ca93a45d62475281da48f4535aab5c 05ca93a45d62475281da48f4535aab5c--30f685e079dc4c6eb5c76e24869df7a2 a02ca5096b624d14bc02207f25a4bf02 05ca93a45d62475281da48f4535aab5c--a02ca5096b624d14bc02207f25a4bf02 25500ef3e49c44f793dbf321c4378a09 RX(theta₁₅) a02ca5096b624d14bc02207f25a4bf02--25500ef3e49c44f793dbf321c4378a09 5e9f9c8751d04903b7453765b4005054 RY(theta₁₉) 25500ef3e49c44f793dbf321c4378a09--5e9f9c8751d04903b7453765b4005054 2f9d892574604e2a99835c5c6f65ea1b RX(theta₂₃) 5e9f9c8751d04903b7453765b4005054--2f9d892574604e2a99835c5c6f65ea1b 0cc7d88173fb4089b789f0f4bda75190 X 2f9d892574604e2a99835c5c6f65ea1b--0cc7d88173fb4089b789f0f4bda75190 0cc7d88173fb4089b789f0f4bda75190--507162d78597439984efcf461ceac3c7 1f5881bf2349466daa132f27a9fbb010 0cc7d88173fb4089b789f0f4bda75190--1f5881bf2349466daa132f27a9fbb010 1f5881bf2349466daa132f27a9fbb010--530c2d4a2a944835ab7ad4560f971f1a

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_cafe7c3d3b19420db0f87e1ebcb3721a Obs. cluster_a123009a0c7c4c7a808762a196a9f67d cluster_370f9a75c31a49b593033660a35bec63 Tower Chebyshev FM cluster_7a1dd896b526414fa8bd29f474691e2c Tower Chebyshev FM cluster_d64ff50e990b4d0191eedf65755feaab HEA d5a3b5fd53664d0c9afa3e4df7694d94 0 7780bfccd79b4fe891bcd28bdce5759c RX(1.0*acos(x)) d5a3b5fd53664d0c9afa3e4df7694d94--7780bfccd79b4fe891bcd28bdce5759c b48bab6da9254e58b206654c9e3314fa 1 06755dd3b25a498b822247cc89ad9f5a RX(theta₀) 7780bfccd79b4fe891bcd28bdce5759c--06755dd3b25a498b822247cc89ad9f5a f677c9ade29f4e6598b14270cc746f7d RY(theta₄) 06755dd3b25a498b822247cc89ad9f5a--f677c9ade29f4e6598b14270cc746f7d 6d7f295ea1f1422aa2f5c88653d3de42 RX(theta₈) f677c9ade29f4e6598b14270cc746f7d--6d7f295ea1f1422aa2f5c88653d3de42 dbf3afff042d4d11838ea7019a778f46 6d7f295ea1f1422aa2f5c88653d3de42--dbf3afff042d4d11838ea7019a778f46 beb86358d8234e6fb8fcd6611d31a776 dbf3afff042d4d11838ea7019a778f46--beb86358d8234e6fb8fcd6611d31a776 4dee4a3d2a4247ec8f49b9ea87dc057d RX(theta₁₂) beb86358d8234e6fb8fcd6611d31a776--4dee4a3d2a4247ec8f49b9ea87dc057d 3c73b3e5a4ad444393db5c274e431de0 RY(theta₁₆) 4dee4a3d2a4247ec8f49b9ea87dc057d--3c73b3e5a4ad444393db5c274e431de0 62d877ef26db4326b366c7b93180694f RX(theta₂₀) 3c73b3e5a4ad444393db5c274e431de0--62d877ef26db4326b366c7b93180694f 056569fcd5e24ce08fc509b884835cb3 62d877ef26db4326b366c7b93180694f--056569fcd5e24ce08fc509b884835cb3 0a1e9ff1f4c74d7499c8f356052bd73f 056569fcd5e24ce08fc509b884835cb3--0a1e9ff1f4c74d7499c8f356052bd73f fb3ec4df038a434096e366797ed17ddc 0a1e9ff1f4c74d7499c8f356052bd73f--fb3ec4df038a434096e366797ed17ddc 791003a9b0294b38a5eee19dfc4fbba3 fb3ec4df038a434096e366797ed17ddc--791003a9b0294b38a5eee19dfc4fbba3 fb8716704cc8498e95035a88a0acda47 f6bb53ccb5d04917bbcf0db016340d98 RX(2.0*acos(x)) b48bab6da9254e58b206654c9e3314fa--f6bb53ccb5d04917bbcf0db016340d98 5573edd7348a43798e392033cc0d97b9 2 7fb71570e0ce4b758bba5a6ea7b6cd2b RX(theta₁) f6bb53ccb5d04917bbcf0db016340d98--7fb71570e0ce4b758bba5a6ea7b6cd2b 3e244adc66a74db1b75fbb08acd998b8 RY(theta₅) 7fb71570e0ce4b758bba5a6ea7b6cd2b--3e244adc66a74db1b75fbb08acd998b8 267aad07052f4b4e9e09dd4a31ab6e7f RX(theta₉) 3e244adc66a74db1b75fbb08acd998b8--267aad07052f4b4e9e09dd4a31ab6e7f dd9e01ec4a0444debd51de2dac1a3d58 X 267aad07052f4b4e9e09dd4a31ab6e7f--dd9e01ec4a0444debd51de2dac1a3d58 dd9e01ec4a0444debd51de2dac1a3d58--dbf3afff042d4d11838ea7019a778f46 6da2bd88321e46f3b4ffe5a64abb2570 dd9e01ec4a0444debd51de2dac1a3d58--6da2bd88321e46f3b4ffe5a64abb2570 89c02083c955494090b69c4e79c8d666 RX(theta₁₃) 6da2bd88321e46f3b4ffe5a64abb2570--89c02083c955494090b69c4e79c8d666 f14b70fb8d4241caaddc7583f2ca6241 RY(theta₁₇) 89c02083c955494090b69c4e79c8d666--f14b70fb8d4241caaddc7583f2ca6241 53f94b3a79e741f0a3952d7c40029e39 RX(theta₂₁) f14b70fb8d4241caaddc7583f2ca6241--53f94b3a79e741f0a3952d7c40029e39 4b2df950491644d6a1f02ecb1b058f8d X 53f94b3a79e741f0a3952d7c40029e39--4b2df950491644d6a1f02ecb1b058f8d 4b2df950491644d6a1f02ecb1b058f8d--056569fcd5e24ce08fc509b884835cb3 4844419a4b3148cda2efbc70302321cd 4b2df950491644d6a1f02ecb1b058f8d--4844419a4b3148cda2efbc70302321cd cf49ced9ef094242bf3a70c554abb1b4 AddBlock 4844419a4b3148cda2efbc70302321cd--cf49ced9ef094242bf3a70c554abb1b4 cf49ced9ef094242bf3a70c554abb1b4--fb8716704cc8498e95035a88a0acda47 f5437c9d61344bd2a4e9a530a6047136 178dab50ce464bbc853ae9473729e798 RX(1.0*acos(2.0*y - 1.0)) 5573edd7348a43798e392033cc0d97b9--178dab50ce464bbc853ae9473729e798 eb9e7f3242be4bf097847b6019de5045 3 cb65d9922f3745c382d413849db99a17 RX(theta₂) 178dab50ce464bbc853ae9473729e798--cb65d9922f3745c382d413849db99a17 bd376dc4f1394988a21623847c81dfa6 RY(theta₆) cb65d9922f3745c382d413849db99a17--bd376dc4f1394988a21623847c81dfa6 b5b8edaea2ba4ab9a84faf36adabfd87 RX(theta₁₀) bd376dc4f1394988a21623847c81dfa6--b5b8edaea2ba4ab9a84faf36adabfd87 a62d04628bcf4231950e58f72cd4441f b5b8edaea2ba4ab9a84faf36adabfd87--a62d04628bcf4231950e58f72cd4441f 2a6061f67f174e038b7825414710bd76 X a62d04628bcf4231950e58f72cd4441f--2a6061f67f174e038b7825414710bd76 2a6061f67f174e038b7825414710bd76--6da2bd88321e46f3b4ffe5a64abb2570 1561c41dcee34c65ae06462fdf15d0e1 RX(theta₁₄) 2a6061f67f174e038b7825414710bd76--1561c41dcee34c65ae06462fdf15d0e1 100ccf157b0640a6834a20222580e06d RY(theta₁₈) 1561c41dcee34c65ae06462fdf15d0e1--100ccf157b0640a6834a20222580e06d f5636aadcf184e3f9f79572df988c523 RX(theta₂₂) 100ccf157b0640a6834a20222580e06d--f5636aadcf184e3f9f79572df988c523 734d5c3478a24547bf60b5a525b018b6 f5636aadcf184e3f9f79572df988c523--734d5c3478a24547bf60b5a525b018b6 f7ec4258ff4d433c9f19a9db9b76180d X 734d5c3478a24547bf60b5a525b018b6--f7ec4258ff4d433c9f19a9db9b76180d f7ec4258ff4d433c9f19a9db9b76180d--4844419a4b3148cda2efbc70302321cd 47db26edee494e20a14843601ed37650 f7ec4258ff4d433c9f19a9db9b76180d--47db26edee494e20a14843601ed37650 47db26edee494e20a14843601ed37650--f5437c9d61344bd2a4e9a530a6047136 97c20fd581bf4ab18341b73a8b214c6c 777395cf3d434f7896e8a21e2dfed864 RX(2.0*acos(2.0*y - 1.0)) eb9e7f3242be4bf097847b6019de5045--777395cf3d434f7896e8a21e2dfed864 850cecc5de454010b2d18098f3158c60 RX(theta₃) 777395cf3d434f7896e8a21e2dfed864--850cecc5de454010b2d18098f3158c60 23d3607da26c451d960bb812e4817962 RY(theta₇) 850cecc5de454010b2d18098f3158c60--23d3607da26c451d960bb812e4817962 6b100feba34447dbbffe0cf46fb070bb RX(theta₁₁) 23d3607da26c451d960bb812e4817962--6b100feba34447dbbffe0cf46fb070bb c7dc1d328ae347349c38ca238d84e08f X 6b100feba34447dbbffe0cf46fb070bb--c7dc1d328ae347349c38ca238d84e08f c7dc1d328ae347349c38ca238d84e08f--a62d04628bcf4231950e58f72cd4441f 8a6fe35e1df0400a915882515f036144 c7dc1d328ae347349c38ca238d84e08f--8a6fe35e1df0400a915882515f036144 0f48afe4f71c4dd9a3a4431a704eb416 RX(theta₁₅) 8a6fe35e1df0400a915882515f036144--0f48afe4f71c4dd9a3a4431a704eb416 2036bb7fc17f4da3b9edbf9e4473f1b8 RY(theta₁₉) 0f48afe4f71c4dd9a3a4431a704eb416--2036bb7fc17f4da3b9edbf9e4473f1b8 95678ba719604eb1a41de36d91130570 RX(theta₂₃) 2036bb7fc17f4da3b9edbf9e4473f1b8--95678ba719604eb1a41de36d91130570 c558741a01e64af2bcfcc254170083c3 X 95678ba719604eb1a41de36d91130570--c558741a01e64af2bcfcc254170083c3 c558741a01e64af2bcfcc254170083c3--734d5c3478a24547bf60b5a525b018b6 652b5acadefe479b9ecc404b9e8901d9 c558741a01e64af2bcfcc254170083c3--652b5acadefe479b9ecc404b9e8901d9 593204fc176b45e28346dc4e3f668464 652b5acadefe479b9ecc404b9e8901d9--593204fc176b45e28346dc4e3f668464 593204fc176b45e28346dc4e3f668464--97c20fd581bf4ab18341b73a8b214c6c