|
@@ -1,82 +1 @@ |
|
|
from clifford import * |
|
|
|
|
|
|
|
|
|
|
|
""" |
|
|
|
|
|
Porting Anders and Briegel to Python |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
stab_rep = {None: "-", 0: "I", 1: "X", 2: "Y", 3:"Z"} |
|
|
|
|
|
|
|
|
|
|
|
class Stabilizer(object): |
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, graph): |
|
|
|
|
|
n = graph.nqubits |
|
|
|
|
|
self.paulis = [[None for i in range(n)] for j in range(n)] |
|
|
|
|
|
self.rowsigns = [None for i in range(n)] |
|
|
|
|
|
|
|
|
|
|
|
for i in range(n): |
|
|
|
|
|
self.rowsigns[i] = 0 % 4 |
|
|
|
|
|
for j in range(n): |
|
|
|
|
|
if i == j: |
|
|
|
|
|
self.paulis[i][j] = lco_x |
|
|
|
|
|
elif j in graph.vertices[i].neighbors: |
|
|
|
|
|
self.paulis[i][j] = lco_z |
|
|
|
|
|
else: |
|
|
|
|
|
self.paulis[i][j] = lco_id |
|
|
|
|
|
|
|
|
|
|
|
self.conjugate(i, j, graph.vertices[j].vertex_operator) |
|
|
|
|
|
|
|
|
|
|
|
def conjugate(self, i, j, vertex_operator): |
|
|
|
|
|
self.rowsigns[j] = self.rowsigns[j] + \ |
|
|
|
|
|
self.paulis[i][j].conjugate(vertex_operator) |
|
|
|
|
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
|
|
return "\n".join(" ".join(stab_rep[x] for x in row) for row in self.paulis) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Vertex(object): |
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, index): |
|
|
|
|
|
self.index = index |
|
|
|
|
|
self.vertex_operator = lco_h |
|
|
|
|
|
self.neighbors = set() |
|
|
|
|
|
|
|
|
|
|
|
def edgelist(self): |
|
|
|
|
|
return [set((self.index, n)) for n in self.neighbors] |
|
|
|
|
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
|
|
return "{}".format(", ".join(map(str, self.neighbors))) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GraphRegister(object): |
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, n): |
|
|
|
|
|
self.nqubits = n |
|
|
|
|
|
self.vertices = [Vertex(i) for i in xrange(n)] |
|
|
|
|
|
|
|
|
|
|
|
def add_edge(self, v1, v2): |
|
|
|
|
|
self.vertices[v1].neighbors.add(v2) |
|
|
|
|
|
self.vertices[v2].neighbors.add(v1) |
|
|
|
|
|
|
|
|
|
|
|
def del_edge(self, v1, v2): |
|
|
|
|
|
self.vertices[v1].neighbors.remove(v2) |
|
|
|
|
|
self.vertices[v2].neighbors.remove(v1) |
|
|
|
|
|
|
|
|
|
|
|
def toggle_edge(self, v1, v2): |
|
|
|
|
|
if v2 in self.vertices[v1].neighbors: |
|
|
|
|
|
self.del_edge(v1, v2) |
|
|
|
|
|
else: |
|
|
|
|
|
self.add_edge(v1, v2) |
|
|
|
|
|
|
|
|
|
|
|
def edgelist(self): |
|
|
|
|
|
return map(tuple, frozenset(frozenset((v.index, n)) |
|
|
|
|
|
for v in self.vertices |
|
|
|
|
|
for n in v.neighbors)) |
|
|
|
|
|
|
|
|
|
|
|
def __str__(self, ): |
|
|
|
|
|
return "graph:\n"+"\n".join(str(v) for v in self.vertices if len(v.neighbors) > 0) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
|
|
g = GraphRegister(10) |
|
|
|
|
|
g.toggle_edge(0, 1) |
|
|
|
|
|
print g |
|
|
|
|
|
|
|
|
nothing |