diff --git a/abp/graphstate.py b/abp/graphstate.py index a09eec3..25dc4e7 100644 --- a/abp/graphstate.py +++ b/abp/graphstate.py @@ -7,10 +7,6 @@ import json import qi, clifford, util import random -output = open("debug_pete.txt", "w") -def debug(x): - output.write(str(x)+"\n") - class GraphState(object): def __init__(self, nodes=[]): @@ -42,7 +38,6 @@ class GraphState(object): def del_edge(self, v1, v2): """ Delete an edge between two vertices in the self """ - debug("deling edge") del self.adj[v1][v2] del self.adj[v2][v1] @@ -67,36 +62,17 @@ class GraphState(object): def remove_vop(self, a, avoid): """ Reduces VOP[a] to the identity """ - # TODO: sucks! others = set(self.adj[a]) - {avoid} swap_qubit = others.pop() if others else avoid - debug("remove_byprod_op called: (v, avoid, vb):") - self.print_adj_list_line(a) - self.print_adj_list_line(avoid) - self.print_adj_list_line(swap_qubit) - converted = clifford.decompositions[self.node[a]["vop"]] - converted = "".join("U" if x == "x" else "V" for x in converted) - debug("using {}".format(converted)) - for v in reversed(clifford.decompositions[self.node[a]["vop"]]): if v == "x": self.local_complementation(a, "U ->") else: self.local_complementation(swap_qubit, "V ->") - assert self.node[a]["vop"]==0 - - debug("remove_byprod_op: after (v, avoid, vb):") - self.print_adj_list_line(a) - self.print_adj_list_line(avoid) - self.print_adj_list_line(swap_qubit) - - assert self.node[a]["vop"] == 0 - def local_complementation(self, v, prefix = ""): """ As defined in LISTING 1 of Anders & Briegel """ - debug("{}Inverting about {}".format(prefix, self.get_adj_list_line(v))) for i, j in it.combinations(self.adj[v], 2): self.toggle_edge(i, j) @@ -117,23 +93,16 @@ class GraphState(object): def act_cz(self, a, b): """ Act a controlled-phase gate on two qubits """ - debug("before cphase between {} and {}".format(a, b)) - self.print_adj_list_line(a) - self.print_adj_list_line(b) - ci = self.get_connection_info(a, b) if ci["non1"]: - debug("cphase: left vertex has NONs -> putting it to Id") self.remove_vop(a, b) ci = self.get_connection_info(a, b) if ci["non2"]: - debug("cphase: right vertex has NONs -> putting it to Id") self.remove_vop(b, a) ci = self.get_connection_info(a, b) if ci["non1"] and not clifford.is_diagonal(self.node[a]["vop"]): - debug("cphase: left one needs treatment again -> putting it to Id") self.remove_vop(a, b) self.cz_with_table(a, b) @@ -150,32 +119,13 @@ class GraphState(object): def cz_with_table(self, a, b): """ Run the table """ - debug("cphase_with_table called on:") - self.print_adj_list_line(a) - self.print_adj_list_line(b) - ci = self.get_connection_info(a, b) - try: - assert ci["non1"]==False or clifford.is_diagonal(self.node[a]["vop"]) - assert ci["non2"]==False or clifford.is_diagonal(self.node[b]["vop"]) - except AssertionError: - debug(ci) - debug(self.node[a]["vop"]) - debug(self.node[b]["vop"]) - edge = self.has_edge(a, b) new_edge, self.node[a]["vop"], self.node[ b]["vop"] = clifford.cz_table[edge, self.node[a]["vop"], self.node[b]["vop"]] if new_edge != edge: self.toggle_edge(a, b) - debug("cphase_with_table: after") - self.print_adj_list_line(a) - self.print_adj_list_line(b) - - ci = self.get_connection_info(a, b) - assert ci["non1"]==False or clifford.is_diagonal(self.node[a]["vop"]) - assert ci["non2"]==False or clifford.is_diagonal(self.node[b]["vop"]) def measure_z(self, node, force=None): """ Measure the graph in the Z-basis """ @@ -261,18 +211,6 @@ class GraphState(object): rows.append(s) return " \n".join(rows) + " \n" - def get_adj_list_line(self, key): - """ TODO: delete """ - node = self.node[key] - adj = " ".join(map(str, sorted(self.adj[key]))) - vop = clifford.get_name(node["vop"]) - s = "Vertex {}: VOp {}, neighbors {}".format(key, vop, adj) - return s - - def print_adj_list_line(self, key): - debug(self.get_adj_list_line(key)) - - def __eq__(self, other): """ Check equality between graphs """ return self.adj == other.adj and self.node == other.node