-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Better QFT Compilation python prototyping (#269)
- Loading branch information
1 parent
481b699
commit d59f447
Showing
9 changed files
with
234 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
from cProfile import label | ||
from lsqecc.gates.compress_rotation_approximations import partition_gate_sequence | ||
from lsqecc.pauli_rotations.rotation import CachedRotationApproximations | ||
from lsqecc.gates.pi_over_2_to_the_n_rz_gate_approximations import get_pi_over_2_to_the_n_rz_gate | ||
import numpy as np | ||
import matplotlib.pyplot as plt | ||
|
||
# test_sequence_1 = "SSSXHSTHTHSTHTH" | ||
# test_sequence_2 = "SHSSXH" | ||
# test_sequence_3 = "HSSTTSHSH" | ||
test_sequence = CachedRotationApproximations.get_pi_over_2_to_the_n_rz_gate(3) | ||
sequences_Z = partition_gate_sequence(test_sequence) | ||
sequences_X = partition_gate_sequence("H" + test_sequence + "H") | ||
|
||
print("The gate for a Z rotation are:\n") | ||
print(f"The number of gates without compression in Gate Frame of is {len(test_sequence)} ") | ||
print( | ||
f"Number of gates without compressiopn in Pauli Frame is {len(test_sequence) + 2*test_sequence.count('H')}" | ||
) | ||
print(f"The number of partitions (Compressed list of gates) is {len(sequences_Z)}") | ||
|
||
print("The gate for a X rotation are:\n") | ||
print(f"The number of gates without compression in Gate Frame of is {len(test_sequence)+2} ") | ||
print( | ||
f"Number of gates without compressiopn in Pauli Frame is {len(test_sequence) + 2*test_sequence.count('H') + 6}" | ||
) | ||
print(f"The number of partitions (Compressed list of gates) is {len(sequences_X)}") | ||
|
||
|
||
# for seq in sequences: | ||
# print(f"{seq}") | ||
|
||
# Most common ones are HTH and HSTH |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
from lsqecc.pauli_rotations.rotation import PauliRotation, PauliOperator | ||
from fractions import Fraction | ||
|
||
Z = PauliOperator.Z | ||
uncompressed_list = PauliRotation.from_list([Z], Fraction(1, 16)).to_basic_form_decomposition( | ||
compress_rotations=False | ||
) | ||
print(len(uncompressed_list)) | ||
compressed_list = PauliRotation.from_list([Z], Fraction(1, 16)).to_basic_form_decomposition( | ||
compress_rotations=True | ||
) | ||
print(len(compressed_list)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
def partition_gate_sequence(gate_approximation: str): | ||
partitioned_sequence = list() | ||
partition = "" | ||
in_x_basis = False | ||
|
||
# note: The sequence 'HXH' is not covered by this function. | ||
# But this also not encountered in the cached rotations | ||
for index, gate in enumerate(gate_approximation): | ||
if gate in {"S", "T"}: | ||
partition += gate | ||
elif gate == "X": | ||
if not len(partition): # empty partition | ||
pass | ||
elif partition[0] == "H": | ||
partitioned_sequence.append(partition[0]) | ||
partitioned_sequence.append(partition[1:]) | ||
else: | ||
partitioned_sequence.append(partition) | ||
partitioned_sequence.append(gate) | ||
partition = "" | ||
|
||
elif gate == "H": | ||
if not in_x_basis: | ||
if not len(partition) == 0: | ||
partitioned_sequence.append(partition) | ||
partition = gate | ||
if index == len(gate_approximation) - 1: | ||
partitioned_sequence.append(partition) | ||
in_x_basis = True | ||
else: | ||
partition += gate | ||
in_x_basis = False | ||
partitioned_sequence.append(partition) | ||
partition = "" | ||
|
||
return partitioned_sequence |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
76 changes: 76 additions & 0 deletions
76
src/lsqecc/resource_estimation/gate_count_compression_analysis.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
import matplotlib.pyplot as plt | ||
import numpy as np | ||
|
||
from lsqecc.gates.compress_rotation_approximations import partition_gate_sequence | ||
from lsqecc.gates.pi_over_2_to_the_n_rz_gate_approximations import ( | ||
get_pi_over_2_to_the_n_rz_gate, | ||
) | ||
|
||
gate_counts_Z = np.zeros((len(get_pi_over_2_to_the_n_rz_gate[3:]), 3)) | ||
for index, gate_sequence in enumerate(get_pi_over_2_to_the_n_rz_gate[3:]): | ||
compressed_sequence = partition_gate_sequence(gate_sequence) | ||
gate_counts_Z[index, 0] = len(gate_sequence) | ||
gate_counts_Z[index, 1] = len(gate_sequence) + 2 * gate_sequence.count("H") | ||
gate_counts_Z[index, 2] = len(compressed_sequence) | ||
|
||
gate_counts_X = np.zeros((len(get_pi_over_2_to_the_n_rz_gate[3:]), 3)) | ||
for index, gate_sequence in enumerate(get_pi_over_2_to_the_n_rz_gate[3:]): | ||
compressed_sequence = partition_gate_sequence("H" + gate_sequence + "H") | ||
gate_counts_X[index, 0] = len(gate_sequence) | ||
gate_counts_X[index, 1] = len(gate_sequence) + 2 * gate_sequence.count("H") + 6 | ||
gate_counts_X[index, 2] = len(compressed_sequence) | ||
|
||
|
||
compression_ratio_mean_Z = np.mean(np.divide(gate_counts_Z[:, 1], gate_counts_Z[:, 2])) | ||
compression_ratio_mean_X = np.mean(np.divide(gate_counts_X[:, 1], gate_counts_X[:, 2])) | ||
|
||
|
||
plt.figure(figsize=(16, 9)) | ||
plt.plot( | ||
np.arange(0, len(get_pi_over_2_to_the_n_rz_gate[3:])), | ||
gate_counts_Z[:, 0], | ||
label="Uncompressed Gate Count: Gate Frame", | ||
) | ||
plt.plot( | ||
np.arange(0, len(get_pi_over_2_to_the_n_rz_gate[3:])), | ||
gate_counts_Z[:, 1], | ||
label="Uncompressed Gate Count: Pauli Frame", | ||
) | ||
plt.plot( | ||
np.arange(0, len(get_pi_over_2_to_the_n_rz_gate[3:])), | ||
gate_counts_Z[:, 2], | ||
label="Compressed Gate Count: Pauli Frame", | ||
) | ||
plt.xlabel("Rotation amount (in powers of 2)") | ||
plt.ylabel("Gate Count") | ||
plt.title( | ||
"Compression of Z Rotation gates in Pauli Frame \n" | ||
+ f" Mean Compression Ratio = ={compression_ratio_mean_Z}" | ||
) | ||
plt.legend() | ||
# plt.savefig("assets/compression_Z_rotations.png") | ||
|
||
plt.figure(figsize=(16, 9)) | ||
plt.plot( | ||
np.arange(0, len(get_pi_over_2_to_the_n_rz_gate[3:])), | ||
gate_counts_X[:, 0], | ||
label="Uncompressed Gate Count: Gate Frame", | ||
) | ||
plt.plot( | ||
np.arange(0, len(get_pi_over_2_to_the_n_rz_gate[3:])), | ||
gate_counts_X[:, 1], | ||
label="Uncompressed Gate Count: Pauli Frame", | ||
) | ||
plt.plot( | ||
np.arange(0, len(get_pi_over_2_to_the_n_rz_gate[3:])), | ||
gate_counts_X[:, 2], | ||
label="Compressed Gate Count: Pauli Frame", | ||
) | ||
plt.xlabel("Rotation amount (in powers of 2)") | ||
plt.ylabel("Gate Count") | ||
plt.title( | ||
"Compression of X Rotation gates in Pauli Frame \n" | ||
+ f"Mean Compression Ratio = ={compression_ratio_mean_X}" | ||
) | ||
plt.legend() | ||
# plt.savefig("assets/compression_X_rotations.png") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
from typing import List | ||
|
||
import pytest | ||
|
||
from lsqecc.gates.compress_rotation_approximations import partition_gate_sequence | ||
|
||
|
||
class TestGateCompression: | ||
@pytest.mark.parametrize( | ||
"gate_string, partitioned_gates", | ||
[ | ||
("SSSXHSTHTHSTHTH", ["SSS", "X", "HSTH", "T", "HSTH", "T", "H"]), | ||
("SHSSXH", ["S", "H", "SS", "X", "H"]), | ||
("HSSTTSHSX", ["HSSTTSH", "S", "X"]), | ||
("STXH", ["ST", "X", "H"]), | ||
], | ||
) | ||
def test_partition_gate_sequence(self, gate_string: str, partitioned_gates: List[str]): | ||
func_output = partition_gate_sequence(gate_string) | ||
assert len(partitioned_gates) == len(func_output) | ||
assert func_output == partitioned_gates |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 change: 1 addition & 0 deletions
1
..._test/test_to_basic_form_decomposition_with_approximation_and_compression/list_repr_X.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[1/4: [Z], 1/4: [X], 1/4: [Z], 3/4: [Z], 1/2: [X], 1/4: [Z], 1/4: [X], 1/4: [Z], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/4: [Z], 1/4: [Z], 1/4: [X], 1/4: [Z]] |
1 change: 1 addition & 0 deletions
1
..._test/test_to_basic_form_decomposition_with_approximation_and_compression/list_repr_Z.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[3/4: [Z], 1/2: [X], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 3/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 1/8: [Z], 3/8: [X], 3/8: [Z], 3/8: [X], 1/8: [Z], 1/8: [X], 3/8: [Z], 1/8: [X], 3/8: [Z]] |