Browse Source

Well this is bull shit

master
Pete Shadbolt 7 years ago
parent
commit
b67db178b2
4 changed files with 57 additions and 49 deletions
  1. +3
    -0
      abp/clifford.py
  2. +23
    -6
      abp/graphstate.py
  3. +17
    -38
      scripts/wtf.py
  4. +14
    -5
      tests/test_against_anders_and_briegel.py

+ 3
- 0
abp/clifford.py View File

@@ -223,6 +223,9 @@ def load_from_disk():
with open(temp("by_name.json")) as f:
by_name = json.load(f)

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

if __name__ == "__main__":
compute_everything()


+ 23
- 6
abp/graphstate.py View File

@@ -90,14 +90,31 @@ class GraphState(object):

def act_cz(self, a, b):
""" Act a controlled-phase gate on two qubits """
#TODO: inefficient
if set(self.adj[a]) - {b}:
ci = self.get_connection_info(a, b)
if ci["non1"]:
self.remove_vop(a, b)
if set(self.adj[b]) - {a}:

ci = self.get_connection_info(a, b)
if ci["non2"]:
self.remove_vop(b, a)
if set(self.adj[a]) - {b}:
self.remove_vop(a, b)
edge = int(self.has_edge(a, b))

ci = self.get_connection_info(a, b)
if ci["non1"] and not clifford.is_diagonal(self.node[a]["vop"]):
self.remove_vop(b, a)
self.cz_with_table(a, b, ci["was_edge"])

def get_connection_info(self, a, b):
if self.has_edge(a, b):
return {"was_edge": True,
"non1": len(self.node.get(a, [])) > 0,
"non2": len(self.node.get(b, [])) > 0}
else:
return {"was_edge": False,
"non1": len(self.node.get(a, [])) > 1,
"non2": len(self.node.get(b, [])) > 1}

def cz_with_table(self, a, b, edge):
""" Run the table """
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:


+ 17
- 38
scripts/wtf.py View File

@@ -1,46 +1,25 @@
from abp import clifford, qi
from abp import clifford, qi, GraphState
from anders_briegel import graphsim
import numpy as np
import itertools as it

def conj_hack(operator, unitary):
""" TODO: make this meaningful / legible """
assert operator in set(xrange(4))
op = clifford.times_table[unitary, operator]
op = clifford.times_table[op, clifford.conjugation_table[unitary]]
is_id_or_operator = (unitary % 4 == 0) or (unitary % 4 == operator)
is_non_pauli = (unitary >= 4) and (unitary <= 15)
phase = ((-1, 1), (1, -1))[is_id_or_operator][is_non_pauli]
if operator == 0:
phase = 1
return op, phase
a = GraphState()
a.node = {0: {'vop': 1}, 1: {'vop': 0}, 2: {'vop': 3}}
a.adj = {0: {1: {}, 2: {}}, 1: {0: {}}, 2: {0: {}}}

def conj(operator, unitary):
""" Better """
matrices = ({"x": qi.msqx, "z": qi.sqz}[c] for c in clifford.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)))
a.act_cz(1,2)
print a.adj_list()

for i, o in enumerate(qi.operators):
if np.allclose(o, new_operator):
return i, 1
elif np.allclose(o, -new_operator):
return i, -1

raise IndexError

b = graphsim.GraphRegister(3)
b.hadamard(0)
b.hadamard(1)
b.hadamard(2)
b.cphase(0, 1)
b.cphase(0, 2)
b.local_op(0, graphsim.LocCliffOp(1))
b.local_op(2, graphsim.LocCliffOp(3))

for operator, unitary in it.product(range(4), range(24)):
assert conj(operator, unitary) == conj_hack(operator, unitary)

#new = np.dot(u, np.dot(o, qi.hermitian_conjugate(u)))
#which = clifford.find_clifford(new, clifford.unitaries[:4])
#assert which in xrange(4)
#whichm = [qi.id, qi.px, qi.py, qi.pz][which]
#if np.allclose(new, whichm):
#return which, 1
#elif np.allclose(new, -whichm):
#return which, -1
#else:
#raise IndexError

b.cphase(1,2)
b.print_adj_list()

+ 14
- 5
tests/test_against_anders_and_briegel.py View File

@@ -5,6 +5,7 @@ from abp import clifford
import random
import difflib
import re
from copy import deepcopy

def compare(a, b):
""" TODO: Sketchy as you like. Remove this abomination """
@@ -116,17 +117,17 @@ def test_with_cphase_gates_hadamard_only(N=10):

compare(a, b)


def test_all(N=3):
""" Test all gates at random """
#TODO: Currently fails. Why???

clifford.use_old_cz()


a = graphsim.GraphRegister(N)
b = GraphState(range(N))
for i in range(1000):
previous_state, previous_cz = None, None
while isequal(a, b):
if random.random()>0.5:
j = random.randint(0, N-1)
a.hadamard(j)
@@ -135,7 +136,15 @@ def test_all(N=3):
q = random.randint(0, N-2)
a.cphase(q, q+1)
b.act_cz(q, q+1)
compare(a, b)
#print b
previous_state = deepcopy(b)
previous_cz = q, q+1

print "Initial state:"
print previous_state.node
print previous_state.adj
print "CZ:", previous_cz
print "Pete state:\n", a.get_adj_list()
print "Anders state:\n", b.adj_list()




Loading…
Cancel
Save