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