Browse Source

Switch off some tests if not using legacy table

master
Pete Shadbolt 8 years ago
parent
commit
bfdc66494d
4 changed files with 47 additions and 56 deletions
  1. +23
    -23
      abp/clifford.py
  2. +13
    -5
      tests/test_against_anders_and_briegel.py
  3. +9
    -15
      tests/test_against_circuit_model.py
  4. +2
    -13
      tests/test_cphase_against_anders.py

+ 23
- 23
abp/clifford.py View File

@@ -1,18 +1,17 @@
#!/usr/bin/python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-


""" """
This program generates lookup tables
This program generates lookup tables and handles the Clifford group
""" """


import os, json
import os, json, tempfile, os, sys, json, string
from functools import reduce from functools import reduce
import itertools as it import itertools as it
import qi
import numpy as np import numpy as np
import tempfile
from tqdm import tqdm from tqdm import tqdm
import os, sys, json, string
import argparse

import qi


decompositions = ("xxxx", "xx", "zzxx", "zz", "zxx", "z", "zzz", "xxz", decompositions = ("xxxx", "xx", "zzxx", "zz", "zxx", "z", "zzz", "xxz",
"xzx", "xzxxx", "xzzzx", "xxxzx", "xzz", "zzx", "xxx", "x", "xzx", "xzxxx", "xzzzx", "xxxzx", "xzz", "zzx", "xxx", "x",
@@ -32,7 +31,8 @@ def find_clifford(needle, haystack):
return i return i
raise IndexError raise IndexError


def find_cz(bond, c1, c2, commuters, state_table, ab_cz_table):

def find_cz(bond, c1, c2, commuters, state_table):
""" Find the output of a CZ operation """ """ Find the output of a CZ operation """
# Figure out the target state # Figure out the target state
target = qi.cz.dot(state_table[bond, c1, c2]) target = qi.cz.dot(state_table[bond, c1, c2])
@@ -66,7 +66,7 @@ def get_unitaries():
def get_by_name(unitaries): def get_by_name(unitaries):
""" Get a lookup table of cliffords by name """ """ Get a lookup table of cliffords by name """
a = {name: find_clifford(u, unitaries) a = {name: find_clifford(u, unitaries)
for name, u in qi.by_name.items()}
for name, u in qi.by_name.items()}
b = {get_name(i): i for i in range(24)} b = {get_name(i): i for i in range(24)}
a.update(b) a.update(b)
return a return a
@@ -106,7 +106,6 @@ def get_cz_table(unitaries):
# Get a cached state table and a list of gates which commute with CZ # Get a cached state table and a list of gates which commute with CZ
commuters = get_commuters(unitaries) commuters = get_commuters(unitaries)
state_table = get_state_table(unitaries) state_table = get_state_table(unitaries)
ab_cz_table = get_ab_cz_table()


# And now build the CZ table # And now build the CZ table
cz_table = np.zeros((2, 24, 24, 3), dtype=int) cz_table = np.zeros((2, 24, 24, 3), dtype=int)
@@ -115,36 +114,38 @@ def get_cz_table(unitaries):
# CZ is symmetric so we only need combinations # CZ is symmetric so we only need combinations
for bond, (c1, c2) in tqdm(rows, desc="Building CZ table"): for bond, (c1, c2) in tqdm(rows, desc="Building CZ table"):
newbond, c1p, c2p = find_cz( newbond, c1p, c2p = find_cz(
bond, c1, c2, commuters, state_table, ab_cz_table)
bond, c1, c2, commuters, state_table)
cz_table[bond, c1, c2] = [newbond, c1p, c2p] cz_table[bond, c1, c2] = [newbond, c1p, c2p]
cz_table[bond, c2, c1] = [newbond, c2p, c1p] cz_table[bond, c2, c1] = [newbond, c2p, c1p]
return cz_table return cz_table




def get_ab_cz_table():
""" Load anders and briegel's CZ table """
filename = "anders_briegel/cphase.tbl"
filename = os.path.join(os.path.dirname(sys.path[0]), filename)
with open(filename) as f:
s = f.read().translate(string.maketrans("{}", "[]"))
return np.array(json.loads(s))


# First try to load tables from cache. If that fails, build them from # First try to load tables from cache. If that fails, build them from
# scratch and store
# scratch and store in /tmp/
os.chdir(tempfile.gettempdir()) os.chdir(tempfile.gettempdir())
try: try:
if __name__ == "__main__": if __name__ == "__main__":
raise IOError raise IOError

# Parse command line args
parser = argparse.ArgumentParser()
parser.add_argument("-l", "--legacy", help="Use legacy CZ table", action="store_true", default=False)
args = parser.parse_args()
legacy_cz = args.legacy

unitaries = np.load("unitaries.npy") unitaries = np.load("unitaries.npy")
conjugation_table = np.load("conjugation_table.npy") conjugation_table = np.load("conjugation_table.npy")
times_table = np.load("times_table.npy") times_table = np.load("times_table.npy")
cz_table = np.load("cz_table.npy")
# cz_table = get_ab_cz_table()
if legacy_cz:
import anders_cz
cz_table = anders_cz.cz_table
else:
cz_table = np.load("cz_table.npy")


with open("by_name.json") as f: with open("by_name.json") as f:
by_name = json.load(f) by_name = json.load(f)



print "Loaded tables from cache" print "Loaded tables from cache"
except IOError: except IOError:
# Spend time building the tables # Spend time building the tables
@@ -153,7 +154,6 @@ except IOError:
conjugation_table = get_conjugation_table(unitaries) conjugation_table = get_conjugation_table(unitaries)
times_table = get_times_table(unitaries) times_table = get_times_table(unitaries)
cz_table = get_cz_table(unitaries) cz_table = get_cz_table(unitaries)
#cz_table = get_ab_cz_table()


# Write it all to disk # Write it all to disk
np.save("unitaries.npy", unitaries) np.save("unitaries.npy", unitaries)


+ 13
- 5
tests/test_against_anders_and_briegel.py View File

@@ -1,5 +1,6 @@
from abp.graphstate import GraphState from abp.graphstate import GraphState
from anders_briegel import graphsim from anders_briegel import graphsim
from abp import clifford
import random import random
import difflib import difflib
import re import re
@@ -44,8 +45,13 @@ def test_local_rotations():
compare(a, b) compare(a, b)




def test_cz_table():
def test_cz_table(N=10):
""" Test the CZ table """ """ Test the CZ table """

# Don't test if we are using Pete's CZ table - doesn't make sense
if not clifford.legacy_cz:
return

for j in range(24): for j in range(24):
a = graphsim.GraphRegister(2) a = graphsim.GraphRegister(2)
b = GraphState() b = GraphState()
@@ -65,9 +71,8 @@ def test_cz_table():






def test_with_cphase_gates_hadamard_only():
def test_with_cphase_gates_hadamard_only(N=10):
""" Hadamrds and CPHASEs, deterministic """ """ Hadamrds and CPHASEs, deterministic """
N=10


a = graphsim.GraphRegister(N) a = graphsim.GraphRegister(N)
b = GraphState() b = GraphState()
@@ -84,9 +89,12 @@ def test_with_cphase_gates_hadamard_only():
compare(a, b) compare(a, b)




def test_all():
def test_all(N=10):
""" Test all gates at random """ """ Test all gates at random """
N=10

# Don't test if we are using Pete's CZ table - doesn't make sense
if not clifford.legacy_cz:
return


a = graphsim.GraphRegister(N) a = graphsim.GraphRegister(N)
b = GraphState() b = GraphState()


+ 9
- 15
tests/test_against_circuit_model.py View File

@@ -9,7 +9,7 @@ REPEATS = 100


def test_single_qubit(n=1): def test_single_qubit(n=1):
""" A multi qubit test with Hadamards only""" """ A multi qubit test with Hadamards only"""
for repeat in tqdm(range(REPEATS), desc="Testing against circuit model") :
for repeat in tqdm(range(REPEATS), desc="Testing against circuit model"):
g = GraphState([0]) g = GraphState([0])
c = CircuitModel(1) c = CircuitModel(1)


@@ -23,7 +23,7 @@ def test_single_qubit(n=1):


def test_hadamard_only_multiqubit(n=6): def test_hadamard_only_multiqubit(n=6):
""" A multi qubit test with Hadamards only""" """ A multi qubit test with Hadamards only"""
for repeat in tqdm(range(REPEATS), desc="Testing against circuit model") :
for repeat in tqdm(range(REPEATS), desc="Testing against circuit model"):
g = GraphState(range(n)) g = GraphState(range(n))
c = CircuitModel(n) c = CircuitModel(n)


@@ -54,21 +54,15 @@ def test_all_multiqubit(n=4):


assert g.to_state_vector() == c assert g.to_state_vector() == c


for repeat in tqdm(range(REPEATS), desc="Testing against circuit model") :
a, b = np.random.randint(0, n-1, 2)
for repeat in tqdm(range(REPEATS), desc="Testing against circuit model"):
a, b = np.random.randint(0, n - 1, 2)
if a != b: if a != b:
g.act_cz(a, b) g.act_cz(a, b)
c.act_cz(a, b) c.act_cz(a, b)
assert np.allclose(np.sum(np.abs(c.state)**2), 1)
assert np.allclose(np.sum(np.abs(g.to_state_vector().state)**2), 1)

if not g.to_state_vector() == c:
print g
print a, b
print "Circuit:"
print g.to_state_vector()
print "Graph:"
print c
raise ValueError
assert np.allclose(np.sum(np.abs(c.state) ** 2), 1)
assert np.allclose(
np.sum(np.abs(g.to_state_vector().state) ** 2), 1)

assert g.to_state_vector() == c


assert g.to_state_vector() == c assert g.to_state_vector() == c

+ 2
- 13
tests/test_cphase_against_anders.py View File

@@ -1,26 +1,15 @@
import json import json
import numpy as np import numpy as np
from abp import clifford, qi
import sys import sys
import os import os
import itertools as it import itertools as it
from string import maketrans from string import maketrans


def get_ab_cz_table():
""" Load anders and briegel's CZ table """
filename = "anders_briegel/cphase.tbl"
filename = os.path.join(os.path.dirname(sys.path[0]), filename)
with open(filename) as f:
s = f.read().translate(maketrans("{}", "[]"))
return np.array(json.loads(s))


from abp import clifford, qi, anders_cz


def test_cz_table(): def test_cz_table():
""" Does our clifford code work with anders & briegel's table? """ """ Does our clifford code work with anders & briegel's table? """
state_table = clifford.get_state_table(clifford.unitaries) state_table = clifford.get_state_table(clifford.unitaries)
ab_cz_table = get_ab_cz_table()
ab_cz_table = anders_cz.cz_table


rows = it.product([0, 1], it.combinations_with_replacement(range(24), 2)) rows = it.product([0, 1], it.combinations_with_replacement(range(24), 2))
for bond, (c1, c2) in rows: for bond, (c1, c2) in rows:


Loading…
Cancel
Save