| @@ -11,9 +11,9 @@ from tqdm import tqdm | |||||
| from functools import reduce | from functools import reduce | ||||
| import itertools as it | import itertools as it | ||||
| DECOMPOSITIONS = ("xxxx", "xx", "zzxx", "zz", "zxx", "z", "zzz", "xxz", | |||||
| "xzx", "xzxxx", "xzzzx", "xxxzx", "xzz", "zzx", "xxx", "x", | |||||
| "zzzx", "xxzx", "zx", "zxxx", "xxxz", "xzzz", "xz", "xzxx") | |||||
| decompositions = ("xxxx", "xx", "zzxx", "zz", "zxx", "z", "zzz", "xxz", | |||||
| "xzx", "xzxxx", "xzzzx", "xxxzx", "xzz", "zzx", "xxx", "x", | |||||
| "zzzx", "xxzx", "zx", "zxxx", "xxxz", "xzzz", "xz", "xzxx") | |||||
| def find_clifford(needle, haystack): | def find_clifford(needle, haystack): | ||||
| @@ -70,7 +70,7 @@ def get_conjugation_table(unitaries): | |||||
| def get_times_table(unitaries): | def get_times_table(unitaries): | ||||
| """ Construct the times-table """ | """ Construct the times-table """ | ||||
| return np.array([[find_clifford(u.dot(v), unitaries) for v in unitaries] | return np.array([[find_clifford(u.dot(v), unitaries) for v in unitaries] | ||||
| for u in tqdm(unitaries)]) | |||||
| for u in tqdm(unitaries)]) | |||||
| def get_state_table(): | def get_state_table(): | ||||
| @@ -79,11 +79,10 @@ def get_state_table(): | |||||
| for bond, i, j in it.product([0, 1], range(24), range(24)): | for bond, i, j in it.product([0, 1], range(24), range(24)): | ||||
| state = qi.bond if bond else qi.nobond | state = qi.bond if bond else qi.nobond | ||||
| kp = np.kron(unitaries[i], unitaries[j]) | kp = np.kron(unitaries[i], unitaries[j]) | ||||
| state_table[bond, i, j,:] = np.dot(kp, state).T | |||||
| state_table[bond, i, j, :] = np.dot(kp, state).T | |||||
| return state_table | return state_table | ||||
| def get_cz_table(unitaries): | def get_cz_table(unitaries): | ||||
| """ Compute the lookup table for the CZ (A&B eq. 9) """ | """ Compute the lookup table for the CZ (A&B eq. 9) """ | ||||
| commuters = (qi.id, qi.px, qi.pz, qi.ph, hermitian_conjugate(qi.ph)) | commuters = (qi.id, qi.px, qi.pz, qi.ph, hermitian_conjugate(qi.ph)) | ||||
| @@ -95,8 +94,19 @@ def get_cz_table(unitaries): | |||||
| cz_table[bond, c1, c2] = find_cz(bond, c1, c2, commuters, state_table) | cz_table[bond, c1, c2] = find_cz(bond, c1, c2, commuters, state_table) | ||||
| return cz_table | return cz_table | ||||
| if __name__ == '__main__': | |||||
| unitaries = get_unitaries(DECOMPOSITIONS) | |||||
| if not __name__ == "__main__": | |||||
| try: | |||||
| unitaries = np.load("tables/unitaries.npy") | |||||
| conjugation_table = np.load("tables/conjugation_table.npy") | |||||
| times_table = np.load("tables/times_table.npy") | |||||
| cz_table = np.load("tables/cz_table.npy") | |||||
| except IOError: | |||||
| print "Precomputed tables not found, try running `python make_tables.py`" | |||||
| if __name__ == "__main__": | |||||
| unitaries = get_unitaries(decompositions) | |||||
| conjugation_table = get_conjugation_table(unitaries) | conjugation_table = get_conjugation_table(unitaries) | ||||
| times_table = get_times_table(unitaries) | times_table = get_times_table(unitaries) | ||||
| cz_table = get_cz_table(unitaries) | cz_table = get_cz_table(unitaries) | ||||
| @@ -104,4 +114,4 @@ if __name__ == '__main__': | |||||
| np.save("tables/unitaries.npy", unitaries) | np.save("tables/unitaries.npy", unitaries) | ||||
| np.save("tables/conjugation_table.npy", conjugation_table) | np.save("tables/conjugation_table.npy", conjugation_table) | ||||
| np.save("tables/times_table.npy", times_table) | np.save("tables/times_table.npy", times_table) | ||||
| np.save("cz_table.npy", cz_table) | |||||
| np.save("tables/cz_table.npy", cz_table) | |||||