From 54bc27c327a1d956886fb4d8dbe61ca231e241b4 Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Mon, 23 May 2016 23:31:32 +0100 Subject: [PATCH] Tidy --- abp/clifford.py | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/abp/clifford.py b/abp/clifford.py index 702f7df..c077b81 100644 --- a/abp/clifford.py +++ b/abp/clifford.py @@ -15,15 +15,17 @@ 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 conjugate(operator, unitary): """ Returns transform * vop * transform^dagger and a phase in {+1, -1} """ return measurement_table[operator, unitary] + def use_old_cz(): """ Use the CZ table from A&B's code """ global cz_table from anders_cz import cz_table - + def get_name(i): """ Get the human-readable name of this clifford """ @@ -101,15 +103,18 @@ def get_state_table(unitaries): np.dot(kp, state).T) return state_table + def get_measurement_entry(operator, unitary): - """ - Any Clifford group unitary will map an operator A in {I, X, Y, Z} + """ + Any Clifford group unitary will map an operator A in {I, X, Y, Z} to an operator B in +-{I, X, Y, Z}. This finds that mapping. """ - matrices = ({"x": qi.msqx, "z": qi.sqz}[c] for c in decompositions[unitary]) + matrices = ({"x": qi.msqx, "z": qi.sqz}[c] + for c in decompositions[unitary]) unitary = reduce(np.dot, matrices, np.eye(2, dtype=complex)) operator = qi.operators[operator] - new_operator = reduce(np.dot, (unitary, operator, qi.hermitian_conjugate(unitary))) + new_operator = reduce( + np.dot, (unitary, operator, qi.hermitian_conjugate(unitary))) for i, o in enumerate(qi.operators): if np.allclose(o, new_operator): @@ -119,14 +124,16 @@ def get_measurement_entry(operator, unitary): raise IndexError + def get_measurement_table(): - """ - Compute a table of transform * operation * transform^dagger + """ + Compute a table of transform * operation * transform^dagger This is pretty unintelligible right now, we should probably compute the phase from unitaries instead """ measurement_table = np.zeros((4, 24, 2), dtype=complex) for operator, unitary in it.product(range(4), range(24)): - measurement_table[operator, unitary] = [operator, unitary] + measurement_table[operator, unitary] = get_measurement_entry( + operator, unitary) return measurement_table @@ -160,24 +167,26 @@ def write_javascript_tables(): path = os.path.dirname(sys.argv[0]) path = os.path.split(path)[0] with open(os.path.join(path, "static/scripts/tables.js"), "w") as f: - f.write("var tables = {\n"); - f.write("\tdecompositions : {},\n"\ + f.write("var tables = {\n") + f.write("\tdecompositions : {},\n" .format(json.dumps(decompositions))) - f.write("\tconjugation_table : {},\n"\ + f.write("\tconjugation_table : {},\n" .format(json.dumps(conjugation_table.tolist()))) - f.write("\ttimes_table : {},\n"\ + f.write("\ttimes_table : {},\n" .format(json.dumps(times_table.tolist()))) - f.write("\tcz_table : {},\n"\ + f.write("\tcz_table : {},\n" .format(json.dumps(cz_table.tolist()))) - f.write("\tclifford : {}\n"\ + f.write("\tclifford : {}\n" .format(json.dumps(by_name))) - f.write("};"); + f.write("};") + def temp(filename): """ Get a temporary path """ tempdir = tempfile.gettempdir() return os.path.join(tempdir, filename) + def compute_everything(): """ Compute all lookup tables """ global unitaries, by_name, conjugation_table, times_table, cz_table, measurement_table @@ -188,6 +197,7 @@ def compute_everything(): cz_table = get_cz_table(unitaries) measurement_table = get_measurement_table() + def save_to_disk(): """ Save all tables to disk """ global unitaries, by_name, conjugation_table, times_table, cz_table, measurement_table @@ -200,6 +210,7 @@ def save_to_disk(): with open(temp("by_name.json"), "wb") as f: json.dump(by_name, f) + def load_from_disk(): """ Load all the tables from disk """ global unitaries, by_name, conjugation_table, times_table, cz_table, measurement_table