| @@ -7,8 +7,9 @@ import json | |||||
| import qi, clifford, util | import qi, clifford, util | ||||
| import random | import random | ||||
| output = open("debug_pete.txt", "w") | |||||
| def debug(x): | def debug(x): | ||||
| pass | |||||
| output.write(str(x)+"\n") | |||||
| class GraphState(object): | class GraphState(object): | ||||
| @@ -41,6 +42,7 @@ class GraphState(object): | |||||
| def del_edge(self, v1, v2): | def del_edge(self, v1, v2): | ||||
| """ Delete an edge between two vertices in the self """ | """ Delete an edge between two vertices in the self """ | ||||
| debug("deling edge") | |||||
| del self.adj[v1][v2] | del self.adj[v1][v2] | ||||
| del self.adj[v2][v1] | del self.adj[v2][v1] | ||||
| @@ -65,7 +67,7 @@ class GraphState(object): | |||||
| def remove_vop(self, a, avoid): | def remove_vop(self, a, avoid): | ||||
| """ Reduces VOP[a] to the identity """ | """ Reduces VOP[a] to the identity """ | ||||
| # TODO: sucks! | |||||
| others = set(self.adj[a]) - {avoid} | others = set(self.adj[a]) - {avoid} | ||||
| swap_qubit = others.pop() if others else avoid | swap_qubit = others.pop() if others else avoid | ||||
| @@ -73,10 +75,16 @@ class GraphState(object): | |||||
| self.print_adj_list_line(a) | self.print_adj_list_line(a) | ||||
| self.print_adj_list_line(avoid) | self.print_adj_list_line(avoid) | ||||
| self.print_adj_list_line(swap_qubit) | self.print_adj_list_line(swap_qubit) | ||||
| debug("using {}".format(clifford.decompositions[self.node[a]["vop"]])) | |||||
| 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"]]): | for v in reversed(clifford.decompositions[self.node[a]["vop"]]): | ||||
| self.local_complementation(a if v == "x" else swap_qubit) | |||||
| if v == "x": | |||||
| self.local_complementation(a, "U ->") | |||||
| else: | |||||
| self.local_complementation(swap_qubit, "V ->") | |||||
| assert self.node[a]["vop"]==0 | assert self.node[a]["vop"]==0 | ||||
| debug("remove_byprod_op: after (v, avoid, vb):") | debug("remove_byprod_op: after (v, avoid, vb):") | ||||
| @@ -84,9 +92,11 @@ class GraphState(object): | |||||
| self.print_adj_list_line(avoid) | self.print_adj_list_line(avoid) | ||||
| self.print_adj_list_line(swap_qubit) | self.print_adj_list_line(swap_qubit) | ||||
| def local_complementation(self, v): | |||||
| assert self.node[a]["vop"] == 0 | |||||
| def local_complementation(self, v, prefix = ""): | |||||
| """ As defined in LISTING 1 of Anders & Briegel """ | """ As defined in LISTING 1 of Anders & Briegel """ | ||||
| debug("V ->Inverting about {}".format(self.get_adj_list_line(v))) | |||||
| debug("{}Inverting about {}".format(prefix, self.get_adj_list_line(v))) | |||||
| for i, j in it.combinations(self.adj[v], 2): | for i, j in it.combinations(self.adj[v], 2): | ||||
| self.toggle_edge(i, j) | self.toggle_edge(i, j) | ||||
| @@ -149,19 +159,15 @@ class GraphState(object): | |||||
| assert ci["non1"]==False or clifford.is_diagonal(self.node[a]["vop"]) | assert ci["non1"]==False or clifford.is_diagonal(self.node[a]["vop"]) | ||||
| assert ci["non2"]==False or clifford.is_diagonal(self.node[b]["vop"]) | assert ci["non2"]==False or clifford.is_diagonal(self.node[b]["vop"]) | ||||
| except AssertionError: | except AssertionError: | ||||
| print ci | |||||
| print self.node[a]["vop"] | |||||
| print self.node[b]["vop"] | |||||
| debug(ci) | |||||
| debug(self.node[a]["vop"]) | |||||
| debug(self.node[b]["vop"]) | |||||
| edge = self.has_edge(a, b) | edge = self.has_edge(a, b) | ||||
| new_edge, self.node[a]["vop"], self.node[ | new_edge, self.node[a]["vop"], self.node[ | ||||
| b]["vop"] = clifford.cz_table[edge, self.node[a]["vop"], self.node[b]["vop"]] | b]["vop"] = clifford.cz_table[edge, self.node[a]["vop"], self.node[b]["vop"]] | ||||
| if new_edge != edge: | if new_edge != edge: | ||||
| self.toggle_edge(a, b) | self.toggle_edge(a, b) | ||||
| if new_edge: | |||||
| debug("adding edge") | |||||
| else: | |||||
| debug("deling edge") | |||||
| debug("cphase_with_table: after") | debug("cphase_with_table: after") | ||||
| self.print_adj_list_line(a) | self.print_adj_list_line(a) | ||||
| @@ -0,0 +1,381 @@ | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| deling edge 0 - 1 | |||||
| deling edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| deling edge 0 - 1 | |||||
| deling edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| deling edge 0 - 1 | |||||
| deling edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| deling edge 0 - 1 | |||||
| deling edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp YC, neighbors | |||||
| Vertex 2: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp YC, neighbors | |||||
| Vertex 2: VOp YC, neighbors | |||||
| deling edge 1 - 2 | |||||
| deling edge | |||||
| cphase_with_table: after: | |||||
| Vertex 1: VOp YC, neighbors | |||||
| Vertex 2: VOp YC, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| deling edge 0 - 1 | |||||
| deling edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors | |||||
| adding edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| using UUUU | |||||
| U ->Inverting about Vertex 1: VOp IA, neighbors 0 | |||||
| U ->Inverting about Vertex 1: VOp YD, neighbors 0 | |||||
| U ->Inverting about Vertex 1: VOp XA, neighbors 0 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 0 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| adding edge | |||||
| cphase_with_table: after: | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp IA, neighbors 1 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp YC, neighbors 1 | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp YC, neighbors 1 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| using UUUU | |||||
| U ->Inverting about Vertex 1: VOp IA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp YD, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp XA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 0 2 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp YC, neighbors 1 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp YC, neighbors 1 | |||||
| adding edge | |||||
| cphase_with_table: after: | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp XF, neighbors 1 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp XF, neighbors 1 | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp XF, neighbors 1 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| using V | |||||
| V ->Inverting about Vertex 0: VOp IA, neighbors 1 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp XF, neighbors 1 | |||||
| Vertex 0: VOp YD, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp XF, neighbors 1 | |||||
| adding edge | |||||
| cphase_with_table: after: | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| Vertex 0: VOp YD, neighbors 1 | |||||
| using V | |||||
| V ->Inverting about Vertex 0: VOp YD, neighbors 1 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| Vertex 0: VOp XA, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| adding edge | |||||
| cphase_with_table: after: | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp IF, neighbors 1 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp XA, neighbors 1 | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 0: VOp XA, neighbors 1 | |||||
| Vertex 2: VOp IF, neighbors 1 | |||||
| using V | |||||
| V ->Inverting about Vertex 2: VOp IF, neighbors 1 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 0: VOp XA, neighbors 1 | |||||
| Vertex 2: VOp YC, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp XA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| deling edge 0 - 1 | |||||
| deling edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp ZA, neighbors 2 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp ZA, neighbors 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp ZA, neighbors 2 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 2: VOp IA, neighbors 1 | |||||
| using VV | |||||
| V ->Inverting about Vertex 2: VOp IA, neighbors 1 | |||||
| V ->Inverting about Vertex 2: VOp YD, neighbors 1 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| adding edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| using UUUU | |||||
| U ->Inverting about Vertex 1: VOp IA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp YD, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp XA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 0 2 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| deling edge 0 - 1 | |||||
| deling edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| using UUUU | |||||
| U ->Inverting about Vertex 1: VOp IA, neighbors 2 | |||||
| U ->Inverting about Vertex 1: VOp YD, neighbors 2 | |||||
| U ->Inverting about Vertex 1: VOp XA, neighbors 2 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 2 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| adding edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp YC, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 0: VOp YC, neighbors 1 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| using UUUU | |||||
| U ->Inverting about Vertex 1: VOp IA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp YD, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp XA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 0 2 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 0: VOp YC, neighbors 1 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp YC, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| adding edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp IF, neighbors 1 | |||||
| Vertex 1: VOp YB, neighbors 0 2 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp YB, neighbors 0 2 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp YB, neighbors 0 2 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| Vertex 0: VOp IF, neighbors 1 | |||||
| using VVV | |||||
| V ->Inverting about Vertex 0: VOp IF, neighbors 1 | |||||
| V ->Inverting about Vertex 0: VOp YC, neighbors 1 | |||||
| V ->Inverting about Vertex 0: VOp XF, neighbors 1 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| deling edge 1 - 2 | |||||
| deling edge | |||||
| cphase_with_table: after: | |||||
| Vertex 1: VOp ZA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| Vertex 1: VOp ZA, neighbors 0 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| Vertex 1: VOp ZA, neighbors 0 | |||||
| adding edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp IF, neighbors 1 | |||||
| Vertex 1: VOp YB, neighbors 0 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp YB, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp YB, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| Vertex 0: VOp IF, neighbors 1 | |||||
| using VVV | |||||
| V ->Inverting about Vertex 0: VOp IF, neighbors 1 | |||||
| V ->Inverting about Vertex 0: VOp YC, neighbors 1 | |||||
| V ->Inverting about Vertex 0: VOp XF, neighbors 1 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| adding edge | |||||
| cphase_with_table: after: | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp IA, neighbors 1 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| Vertex 1: VOp YC, neighbors 0 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp YC, neighbors 0 2 | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| Vertex 2: VOp IA, neighbors 1 | |||||
| using UVVVU | |||||
| U ->Inverting about Vertex 1: VOp YC, neighbors 0 2 | |||||
| V ->Inverting about Vertex 2: VOp YB, neighbors 0 1 | |||||
| V ->Inverting about Vertex 2: VOp XE, neighbors 0 1 | |||||
| V ->Inverting about Vertex 2: VOp ZB, neighbors 0 1 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 2 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| Vertex 0: VOp ZC, neighbors 2 | |||||
| Vertex 2: VOp YC, neighbors 0 1 | |||||
| cphase: left one needs treatment again -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 0: VOp ZC, neighbors 2 | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| Vertex 2: VOp YC, neighbors 0 1 | |||||
| using UUUVU | |||||
| U ->Inverting about Vertex 0: VOp ZC, neighbors 2 | |||||
| V ->Inverting about Vertex 2: VOp ZE, neighbors 0 1 | |||||
| U ->Inverting about Vertex 0: VOp YD, neighbors 1 2 | |||||
| U ->Inverting about Vertex 0: VOp XA, neighbors 1 2 | |||||
| U ->Inverting about Vertex 0: VOp ZD, neighbors 1 2 | |||||
| remove_byprod_op, after: (v, avoid, vb): | |||||
| Vertex 0: VOp IA, neighbors 1 2 | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp XA, neighbors 0 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp IA, neighbors 1 2 | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| deling edge 0 - 1 | |||||
| deling edge | |||||
| cphase_with_table: after: | |||||
| Vertex 0: VOp IA, neighbors 2 | |||||
| Vertex 1: VOp IA, neighbors | |||||
| @@ -0,0 +1,364 @@ | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp YC, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp YC, neighbors | |||||
| Vertex 2: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp YC, neighbors | |||||
| Vertex 2: VOp YC, neighbors | |||||
| cphase_with_table: after | |||||
| Vertex 1: VOp YC, neighbors | |||||
| Vertex 2: VOp YC, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp YC, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| using UUUU | |||||
| U ->Inverting about Vertex 1: VOp IA, neighbors 0 | |||||
| U ->Inverting about Vertex 1: VOp YD, neighbors 0 | |||||
| U ->Inverting about Vertex 1: VOp XA, neighbors 0 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 0 | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| cphase_with_table: after | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp IA, neighbors 1 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp YC, neighbors 1 | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp YC, neighbors 1 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| using UUUU | |||||
| U ->Inverting about Vertex 1: VOp IA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp YD, neighbors 0 2 | |||||
| deling edge | |||||
| U ->Inverting about Vertex 1: VOp XA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 0 2 | |||||
| deling edge | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp YC, neighbors 1 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp YC, neighbors 1 | |||||
| cphase_with_table: after | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp XF, neighbors 1 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp XF, neighbors 1 | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp XF, neighbors 1 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| using V | |||||
| V ->Inverting about Vertex 0: VOp IA, neighbors 1 | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp XF, neighbors 1 | |||||
| Vertex 0: VOp YD, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp XF, neighbors 1 | |||||
| cphase_with_table: after | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| Vertex 0: VOp YD, neighbors 1 | |||||
| using V | |||||
| V ->Inverting about Vertex 0: VOp YD, neighbors 1 | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| Vertex 0: VOp XA, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| cphase_with_table: after | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 2: VOp IF, neighbors 1 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp XA, neighbors 1 | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp XB, neighbors 0 2 | |||||
| Vertex 0: VOp XA, neighbors 1 | |||||
| Vertex 2: VOp IF, neighbors 1 | |||||
| using V | |||||
| V ->Inverting about Vertex 2: VOp IF, neighbors 1 | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 0: VOp XA, neighbors 1 | |||||
| Vertex 2: VOp YC, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp XA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| deling edge | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp ZA, neighbors 2 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp ZA, neighbors 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp ZA, neighbors 2 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 2: VOp IA, neighbors 1 | |||||
| using VV | |||||
| V ->Inverting about Vertex 2: VOp IA, neighbors 1 | |||||
| V ->Inverting about Vertex 2: VOp YD, neighbors 1 | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| using UUUU | |||||
| U ->Inverting about Vertex 1: VOp IA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp YD, neighbors 0 2 | |||||
| deling edge | |||||
| U ->Inverting about Vertex 1: VOp XA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 0 2 | |||||
| deling edge | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| deling edge | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| using UUUU | |||||
| U ->Inverting about Vertex 1: VOp IA, neighbors 2 | |||||
| U ->Inverting about Vertex 1: VOp YD, neighbors 2 | |||||
| U ->Inverting about Vertex 1: VOp XA, neighbors 2 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 2 | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 2: VOp ZC, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp IA, neighbors | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp IA, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp YC, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 0: VOp YC, neighbors 1 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| using UUUU | |||||
| U ->Inverting about Vertex 1: VOp IA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp YD, neighbors 0 2 | |||||
| deling edge | |||||
| U ->Inverting about Vertex 1: VOp XA, neighbors 0 2 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 0 2 | |||||
| deling edge | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 0: VOp YC, neighbors 1 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp YC, neighbors 1 | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp IF, neighbors 1 | |||||
| Vertex 1: VOp YB, neighbors 0 2 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp YB, neighbors 0 2 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp YB, neighbors 0 2 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| Vertex 0: VOp IF, neighbors 1 | |||||
| using VVV | |||||
| V ->Inverting about Vertex 0: VOp IF, neighbors 1 | |||||
| V ->Inverting about Vertex 0: VOp YC, neighbors 1 | |||||
| V ->Inverting about Vertex 0: VOp XF, neighbors 1 | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp XA, neighbors 1 | |||||
| deling edge | |||||
| cphase_with_table: after | |||||
| Vertex 1: VOp ZA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| Vertex 1: VOp ZA, neighbors 0 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| Vertex 1: VOp ZA, neighbors 0 | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp IF, neighbors 1 | |||||
| Vertex 1: VOp YB, neighbors 0 | |||||
| before cphase between 1 and 2 | |||||
| Vertex 1: VOp YB, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| cphase: left vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp YB, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| Vertex 0: VOp IF, neighbors 1 | |||||
| using VVV | |||||
| V ->Inverting about Vertex 0: VOp IF, neighbors 1 | |||||
| V ->Inverting about Vertex 0: VOp YC, neighbors 1 | |||||
| V ->Inverting about Vertex 0: VOp XF, neighbors 1 | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 1: VOp IA, neighbors 0 | |||||
| Vertex 2: VOp IA, neighbors | |||||
| cphase_with_table: after | |||||
| Vertex 1: VOp IA, neighbors 0 2 | |||||
| Vertex 2: VOp IA, neighbors 1 | |||||
| before cphase between 0 and 1 | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| Vertex 1: VOp YC, neighbors 0 2 | |||||
| cphase: right vertex has NONs -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp YC, neighbors 0 2 | |||||
| Vertex 0: VOp ZC, neighbors 1 | |||||
| Vertex 2: VOp IA, neighbors 1 | |||||
| using UVVVU | |||||
| U ->Inverting about Vertex 1: VOp YC, neighbors 0 2 | |||||
| V ->Inverting about Vertex 2: VOp YB, neighbors 0 1 | |||||
| deling edge | |||||
| V ->Inverting about Vertex 2: VOp XE, neighbors 0 1 | |||||
| V ->Inverting about Vertex 2: VOp ZB, neighbors 0 1 | |||||
| deling edge | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 2 | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| Vertex 0: VOp ZC, neighbors 2 | |||||
| Vertex 2: VOp YC, neighbors 0 1 | |||||
| cphase: left one needs treatment again -> putting it to Id | |||||
| remove_byprod_op called: (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| Vertex 0: VOp ZC, neighbors 2 | |||||
| Vertex 2: VOp YC, neighbors 0 1 | |||||
| using UUUU | |||||
| U ->Inverting about Vertex 1: VOp IA, neighbors 2 | |||||
| U ->Inverting about Vertex 1: VOp YD, neighbors 2 | |||||
| U ->Inverting about Vertex 1: VOp XA, neighbors 2 | |||||
| U ->Inverting about Vertex 1: VOp ZD, neighbors 2 | |||||
| remove_byprod_op: after (v, avoid, vb): | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| Vertex 0: VOp ZC, neighbors 2 | |||||
| Vertex 2: VOp YC, neighbors 0 1 | |||||
| cphase_with_table called on: | |||||
| Vertex 0: VOp ZC, neighbors 2 | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| {'was_edge': False, 'non1': True, 'non2': True} | |||||
| 11 | |||||
| 0 | |||||
| cphase_with_table: after | |||||
| Vertex 0: VOp YC, neighbors 2 | |||||
| Vertex 1: VOp IA, neighbors 2 | |||||
| @@ -31,4 +31,5 @@ def anders(): | |||||
| b.print_adj_list() | b.print_adj_list() | ||||
| pete() | pete() | ||||
| anders() | |||||
| @@ -0,0 +1,32 @@ | |||||
| from abp import GraphState | |||||
| from anders_briegel import graphsim | |||||
| from abp import clifford | |||||
| import random, difflib, re | |||||
| from copy import deepcopy | |||||
| def isequal(a, b): | |||||
| """ TODO: Sketchy as you like. Remove this abomination """ | |||||
| aa = a.get_adj_list() | |||||
| bb = b.adj_list() | |||||
| return re.sub("\\s", "", aa) == re.sub("\\s", "", bb) | |||||
| clifford.use_old_cz() | |||||
| N = 3 | |||||
| a = graphsim.GraphRegister(N) | |||||
| b = GraphState(range(N)) | |||||
| previous_state, previous_cz = None, None | |||||
| while isequal(a, b): | |||||
| if random.random()>0.5: | |||||
| j = random.randint(0, N-1) | |||||
| a.hadamard(j) | |||||
| b.act_hadamard(j) | |||||
| else: | |||||
| q = random.randint(0, N-2) | |||||
| if a!=b: | |||||
| a.cphase(q, q+1) | |||||
| b.act_cz(q, q+1) | |||||