Browse Source

Nicer pretty-printing

master
Pete Shadbolt 7 years ago
parent
commit
b066129c42
5 changed files with 53 additions and 14 deletions
  1. +1
    -0
      .gitignore
  2. +13
    -4
      abp/build_tables.py
  3. +7
    -1
      abp/clifford.py
  4. +27
    -4
      abp/graphstate.py
  5. +5
    -5
      abp/qi.py

+ 1
- 0
.gitignore View File

@@ -1,3 +1,4 @@
.venv
.anders
.noseids
debug_anders.txt


+ 13
- 4
abp/build_tables.py View File

@@ -177,6 +177,14 @@ def get_cz_table(unitaries):
cz_table[bond, c2, c1] = [newbond, c2p, c1p]
return cz_table

def get_display_table(unitaries):
""" Used to display VOPs in a human readable style """
for u in unitaries:
c = qi.CircuitModel(1)
c.act_local_rotation(0, u)
state = c.state.round(2)
print "{:.2f}, {:.2f}".format(state[0][0], state[1][0])


def compute_everything():
""" Compute all lookup tables """
@@ -221,7 +229,8 @@ def write_javascript(data):


if __name__ == '__main__':
data = compute_everything()
data = human_readable(data)
write_python(data)
write_javascript(data)
get_display_table(get_unitaries())
#data = compute_everything()
#data = human_readable(data)
#write_python(data)
#write_javascript(data)

+ 7
- 1
abp/clifford.py View File

@@ -18,9 +18,15 @@ def use_old_cz():
from anders_cz import cz_table

def get_name(i):
""" Get the human-readable name of this clifford """
""" Get the name of this clifford """
return "IXYZ"[i & 0x03] + "ABCDEF"[i / 4]

def human_name(i):
""" Get the human-readable name of this clifford - slow """
choices = sorted((key for key, value in by_name.items() if value == i), key=len)
return choices[-1]


def is_diagonal(v):
""" TODO: remove this. Checks if a VOP is diagonal or not """
return v in {0, 3, 5, 6}


+ 27
- 4
abp/graphstate.py View File

@@ -220,10 +220,25 @@ class GraphState(object):

def __str__(self):
""" Represent as a string for quick debugging """
node = {key: clifford.get_name(value["vop"])
for key, value in self.node.items()}
nbstr = str(self.adj)
return "graph:\n node: {}\n adj: {}\n".format(node, nbstr)
s = ""
for key in sorted(self.node.keys()):
s += "{}: {}\t".format(key, clifford.get_name(self.node[key]["vop"]).replace("YC", "-"))
if self.adj[key]:
s += str(tuple(self.adj[key].keys())).replace(" ", "")
else:
s += "-"
s += "\n"

return s

#clean = lambda n: str(n["vop"])
#nodes = ("{}: {}".format(key, clean(value)) for key, value in sorted(self.node.items()))
#nodes = "\n".join(nodes)
#return "Nodes:\n{}\n\nEdges:\n{}".format(nodes, "")
#node = {key: clifford.get_name(value["vop"])
#for key, value in self.node.items()}
#nbstr = str(self.adj)
#return "graph:\n node: {}\n adj: {}\n".format(node, nbstr)

def to_json(self, stringify=False):
"""
@@ -275,3 +290,11 @@ class GraphState(object):
""" Check equality between graphs """
return self.adj == other.adj and self.node == other.node

if __name__ == '__main__':
g = GraphState()
g.add_nodes(range(10))
g.add_edge(0, 5)
g.act_local_rotation(6, 10)
print g
print g.to_state_vector()


+ 5
- 5
abp/qi.py View File

@@ -93,9 +93,9 @@ class CircuitModel(object):
where = 1 << qubit
output = np.zeros((self.d, 1), dtype=complex)
for i, v in enumerate(self.state):
q = i & where > 0
q = int(i & where > 0)
output[i] += v * ha[q, q]
output[i ^ where] += v * ha[not q, q]
output[i ^ where] += v * ha[int(not q), q]
self.state = output

def act_local_rotation(self, qubit, u):
@@ -103,9 +103,9 @@ class CircuitModel(object):
where = 1 << qubit
output = np.zeros((self.d, 1), dtype=complex)
for i, v in enumerate(self.state):
q = i & where > 0
q = int(i & where > 0)
output[i] += v * u[q, q] # TODO this is probably wrong
output[i ^ where] += v * u[not q, q]
output[i ^ where] += v * u[int(not q), q]
self.state = output

def __eq__(self, other):
@@ -120,5 +120,5 @@ class CircuitModel(object):
for i in range(self.d):
label = bin(i)[2:].rjust(self.nqubits, "0")
if abs(self.state[i, 0]) > 0.00001:
s += "|{}>: {}\n".format(label, self.state[i, 0].round(3))
s += "|{}>: {:.2f}\n".format(label, self.state[i, 0])
return s

Loading…
Cancel
Save