| @@ -93,13 +93,16 @@ def get_state_table(unitaries): | |||||
| 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) """ | ||||
| # This is the set of Cliffords which commute with CZ | |||||
| commuters = (qi.id, qi.px, qi.pz, qi.ph, qi.hermitian_conjugate(qi.ph)) | commuters = (qi.id, qi.px, qi.pz, qi.ph, qi.hermitian_conjugate(qi.ph)) | ||||
| commuters = [find_clifford(u, unitaries) for u in commuters] | commuters = [find_clifford(u, unitaries) for u in commuters] | ||||
| # Get a cached state table | |||||
| state_table = get_state_table(unitaries) | state_table = get_state_table(unitaries) | ||||
| # TODO: it's symmetric. this can be much faster | |||||
| # And now build the CZ table | |||||
| cz_table = np.zeros((2, 24, 24, 3)) | cz_table = np.zeros((2, 24, 24, 3)) | ||||
| rows = list(it.product([0, 1], it.combinations(range(24), 2))) | |||||
| rows = list(it.product([0, 1], it.combinations(range(24), 2))) # CZ is symmetric so we only need combinations | |||||
| for bond, (c1, c2) in tqdm(rows, desc="Building CZ table"): | for bond, (c1, c2) in tqdm(rows, desc="Building CZ table"): | ||||
| newbond, c1p, c2p = find_cz(bond, c1, c2, commuters, state_table) | newbond, c1p, c2p = find_cz(bond, c1, c2, commuters, state_table) | ||||
| cz_table[bond, c1, c2] = [newbond, c1p, c2p] | cz_table[bond, c1, c2] = [newbond, c1p, c2p] | ||||
| @@ -108,7 +111,7 @@ def get_cz_table(unitaries): | |||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||
| # Spend time loading the stuff | |||||
| # Spend time building the tables | |||||
| unitaries = get_unitaries() | unitaries = get_unitaries() | ||||
| by_name = get_by_name(unitaries) | by_name = get_by_name(unitaries) | ||||
| conjugation_table = get_conjugation_table(unitaries) | conjugation_table = get_conjugation_table(unitaries) | ||||