| @@ -10,6 +10,7 @@ from functools import reduce | |||||
| import itertools as it | import itertools as it | ||||
| import qi | import qi | ||||
| import numpy as np | import numpy as np | ||||
| import tempfile | |||||
| from tqdm import tqdm | from tqdm import tqdm | ||||
| from clifford import decompositions | from clifford import decompositions | ||||
| @@ -25,7 +26,7 @@ def find_clifford(needle, haystack): | |||||
| def normalize_global_phase(m): | def normalize_global_phase(m): | ||||
| """ Normalize the global phase of a matrix """ | """ Normalize the global phase of a matrix """ | ||||
| v = [x for x in m.flatten() if np.abs(x)>0.001][0] | |||||
| v = (x for x in m.flatten() if np.abs(x)>0.001).next() | |||||
| phase = np.arctan2(v.imag, v.real) % np.pi | phase = np.arctan2(v.imag, v.real) % np.pi | ||||
| rot = np.exp(-1j*phase) | rot = np.exp(-1j*phase) | ||||
| return rot * m if rot * v > 0 else -rot*m | return rot * m if rot * v > 0 else -rot*m | ||||
| @@ -34,7 +35,6 @@ def normalize_global_phase(m): | |||||
| def find_cz(bond, c1, c2, commuters, state_table): | def find_cz(bond, c1, c2, commuters, state_table): | ||||
| """ Find the output of a CZ operation """ | """ Find the output of a CZ operation """ | ||||
| # Figure out the target state | # Figure out the target state | ||||
| state = qi.bond if bond else qi.nobond | |||||
| target = qi.cz.dot(state_table[bond, c1, c2]) | target = qi.cz.dot(state_table[bond, c1, c2]) | ||||
| target = normalize_global_phase(target) | target = normalize_global_phase(target) | ||||
| @@ -44,8 +44,7 @@ def find_cz(bond, c1, c2, commuters, state_table): | |||||
| # Find a match | # Find a match | ||||
| for bond, c1p, c2p in it.product([0, 1], s1, s2): | for bond, c1p, c2p in it.product([0, 1], s1, s2): | ||||
| trial = state_table[bond, c1p, c2p] | |||||
| if np.allclose(target, trial): | |||||
| if np.allclose(target, state_table[bond, c1p, c2p]): | |||||
| return bond, c1p, c2p | return bond, c1p, c2p | ||||
| # Didn't find anything - this should never happen | # Didn't find anything - this should never happen | ||||
| @@ -100,9 +99,11 @@ def get_cz_table(unitaries): | |||||
| # TODO: it's symmetric. this can be much faster | # TODO: it's symmetric. this can be much faster | ||||
| cz_table = np.zeros((2, 24, 24, 3)) | cz_table = np.zeros((2, 24, 24, 3)) | ||||
| rows = list(it.product([0, 1], range(24), range(24))) | |||||
| for bond, c1, c2 in tqdm(rows, desc="Building CZ table"): | |||||
| cz_table[bond, c1, c2] = find_cz(bond, c1, c2, commuters, state_table) | |||||
| rows = list(it.product([0, 1], it.combinations(range(24), 2))) | |||||
| for bond, (c1, c2) in tqdm(rows, desc="Building CZ table"): | |||||
| newbond, c1p, c2p = find_cz(bond, c1, c2, commuters, state_table) | |||||
| cz_table[bond, c1, c2] = [newbond, c1p, c2p] | |||||
| cz_table[bond, c2, c1] = [newbond, c2p, c1p] | |||||
| return cz_table | return cz_table | ||||
| @@ -115,15 +116,11 @@ if __name__ == "__main__": | |||||
| cz_table = get_cz_table(unitaries) | cz_table = get_cz_table(unitaries) | ||||
| # Write it all to disk | # Write it all to disk | ||||
| #print __file__ | |||||
| #directory = os.path.dirname(os.path.realpath(__file__)) | |||||
| #print directory | |||||
| #where = os.path.join(directory, "tables/") | |||||
| #os.chdir(where) | |||||
| #np.save("unitaries.npy", unitaries) | |||||
| #np.save("conjugation_table.npy", conjugation_table) | |||||
| #np.save("times_table.npy", times_table) | |||||
| # np.save("cz_table.npy", cz_table) | |||||
| #with open("by_name.json", "wb") as f: | |||||
| #json.dump(by_name, f) | |||||
| where = tempfile.gettempdir() | |||||
| np.save("unitaries.npy", unitaries) | |||||
| np.save("conjugation_table.npy", conjugation_table) | |||||
| np.save("times_table.npy", times_table) | |||||
| np.save("cz_table.npy", cz_table) | |||||
| with open("by_name.json", "wb") as f: | |||||
| json.dump(by_name, f) | |||||