@@ -105,7 +105,6 @@ def get_cz_table(unitaries): | |||||
""" Compute the lookup table for the CZ (A&B eq. 9) """ | """ Compute the lookup table for the CZ (A&B eq. 9) """ | ||||
# 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) | ||||
print commuters | |||||
state_table = get_state_table(unitaries) | state_table = get_state_table(unitaries) | ||||
# And now build the CZ table | # And now build the CZ table | ||||
@@ -10,12 +10,20 @@ try: | |||||
from networkx import Graph as NXGraph | from networkx import Graph as NXGraph | ||||
except ImportError: | except ImportError: | ||||
NXGraph = object | NXGraph = object | ||||
try: | |||||
import websocket | |||||
from socket import error as socket_error | |||||
import time, atexit | |||||
except ImportError: | |||||
websocket = None | |||||
class GraphState(NXGraph): | class GraphState(NXGraph): | ||||
def __init__(self, nodes=[]): | |||||
def __init__(self, nodes=[], connect_to_server=True): | |||||
self.adj, self.node = {}, {} | self.adj, self.node = {}, {} | ||||
self.add_nodes(nodes) | self.add_nodes(nodes) | ||||
if connect_to_server: | |||||
self.connect_to_server() | |||||
def add_node(self, v, **kwargs): | def add_node(self, v, **kwargs): | ||||
""" Add a node """ | """ Add a node """ | ||||
@@ -198,3 +206,27 @@ class GraphState(NXGraph): | |||||
""" Check equality between graphs """ | """ Check equality between graphs """ | ||||
return self.adj == other.adj and self.node == other.node | return self.adj == other.adj and self.node == other.node | ||||
def connect_to_server(self, uri = "ws://localhost:5000"): | |||||
""" Attempt to connect to the websocket server """ | |||||
if not websocket: | |||||
return | |||||
try: | |||||
self.ws = websocket.create_connection(uri) | |||||
atexit.register(self.shutdown) | |||||
except socket_error: | |||||
#print "Could not establish connection to server ({}).".format(uri) | |||||
self.ws = None | |||||
def shutdown(self): | |||||
""" Close the connection to the websocket """ | |||||
self.update() | |||||
self.ws.close() | |||||
def update(self, delay = 0.5): | |||||
""" Call this function when you are ready to send data to the browser """ | |||||
if not self.ws: | |||||
return | |||||
data = json.dumps(self.to_json()) | |||||
self.ws.send(data) | |||||
time.sleep(delay) |
@@ -1,29 +0,0 @@ | |||||
""" | |||||
Allows us to visualize the state in a browser | |||||
""" | |||||
import atexit, json, time | |||||
from graphstate import GraphState | |||||
from websocket import create_connection | |||||
class VisibleGraphState(GraphState): | |||||
""" Overloads the graph state with methods for sending to the browser over a websocket """ | |||||
def __init__(self, *args, **kwargs): | |||||
""" Constructor """ | |||||
GraphState.__init__(self, *args, **kwargs) | |||||
self.ws = create_connection("ws://localhost:5000") | |||||
atexit.register(self.shutdown) | |||||
def shutdown(self): | |||||
""" The client should shut down automatically on close """ | |||||
self.update() | |||||
self.ws.close() | |||||
def update(self, delay = 0.5): | |||||
""" Call this function when you are ready to send data to the browser """ | |||||
data = json.dumps(self.to_json()) | |||||
self.ws.send(data) | |||||
time.sleep(delay) | |||||
@@ -1,4 +1,4 @@ | |||||
from abp.viz import VisibleGraphState | |||||
from abp.graphstate import GraphState | |||||
from abp.util import xyz | from abp.util import xyz | ||||
import numpy as np | import numpy as np | ||||
import time | import time | ||||
@@ -32,7 +32,7 @@ def lattice(unit_cell, size): | |||||
# s = VisibleGraphState() | # s = VisibleGraphState() | ||||
nodes, edges = lattice(square_unit_cell, (4, 4)) | nodes, edges = lattice(square_unit_cell, (4, 4)) | ||||
psi = VisibleGraphState() | |||||
psi = GraphState() | |||||
for node in nodes: | for node in nodes: | ||||
psi.add_node(str(node), position=xyz(node[0], node[1])) | psi.add_node(str(node), position=xyz(node[0], node[1])) | ||||
psi.act_hadamard(str(node)) | psi.act_hadamard(str(node)) | ||||
@@ -0,0 +1 @@ | |||||
qcengine |
@@ -3,6 +3,7 @@ abj.node = {}; | |||||
abj.adj = {}; | abj.adj = {}; | ||||
abj.add_node = function(node, meta) { | abj.add_node = function(node, meta) { | ||||
if (meta === undefined){meta = {};} | |||||
abj.adj[node] = {}; | abj.adj[node] = {}; | ||||
abj.node[node] = {}; | abj.node[node] = {}; | ||||
abj.node[node].vop = tables.clifford.hadamard; | abj.node[node].vop = tables.clifford.hadamard; | ||||
@@ -143,3 +144,4 @@ abj.order = function(){ | |||||
return Object.keys(abj.node).length; | return Object.keys(abj.node).length; | ||||
}; | }; | ||||
@@ -0,0 +1,4 @@ | |||||
QUnit.test( "Adding nodes", function( assert ) { | |||||
abj.add_node(0); | |||||
assert.ok(abj.node[0].vop === 10, JSON.stringify(abj.node)); | |||||
}); |
@@ -0,0 +1,299 @@ | |||||
/*! | |||||
* QUnit 1.23.1 | |||||
* https://qunitjs.com/ | |||||
* | |||||
* Copyright jQuery Foundation and other contributors | |||||
* Released under the MIT license | |||||
* https://jquery.org/license | |||||
* | |||||
* Date: 2016-04-12T17:29Z | |||||
*/ | |||||
/** Font Family and Sizes */ | |||||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult { | |||||
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; | |||||
} | |||||
#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } | |||||
#qunit-tests { font-size: smaller; } | |||||
/** Resets */ | |||||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { | |||||
margin: 0; | |||||
padding: 0; | |||||
} | |||||
/** Header */ | |||||
#qunit-header { | |||||
padding: 0.5em 0 0.5em 1em; | |||||
color: #FFFFFF; | |||||
background-color: #000000; | |||||
font-size: 1.5em; | |||||
line-height: 1em; | |||||
font-weight: 400; | |||||
} | |||||
#qunit-header a { | |||||
text-decoration: none; | |||||
color: #FFFFFF; | |||||
} | |||||
#qunit-header a:hover, | |||||
#qunit-header a:focus { | |||||
color: #FFF; | |||||
} | |||||
#qunit-testrunner-toolbar label { | |||||
display: inline-block; | |||||
padding: 0 0.5em 0 0.1em; | |||||
} | |||||
#qunit-banner { | |||||
height: 5px; | |||||
} | |||||
#qunit-testrunner-toolbar { | |||||
padding: 0.5em 1em 0.5em 1em; | |||||
color: #5E740B; | |||||
background-color: #EEE; | |||||
overflow: hidden; | |||||
} | |||||
#qunit-filteredTest { | |||||
padding: 0.5em 1em 0.5em 1em; | |||||
background-color: #F4FF77; | |||||
color: #366097; | |||||
} | |||||
#qunit-userAgent { | |||||
padding: 0.5em 1em 0.5em 1em; | |||||
background-color: #000000; | |||||
color: #FFF; | |||||
} | |||||
#qunit-modulefilter-container { | |||||
float: right; | |||||
padding: 0.2em; | |||||
} | |||||
.qunit-url-config { | |||||
display: inline-block; | |||||
padding: 0.1em; | |||||
} | |||||
.qunit-filter { | |||||
display: block; | |||||
float: right; | |||||
margin-left: 1em; | |||||
} | |||||
/** Tests: Pass/Fail */ | |||||
#qunit-tests { | |||||
list-style-position: inside; | |||||
} | |||||
#qunit-tests li { | |||||
padding: 0.4em 1em 0.4em 1em; | |||||
border-bottom: 1px solid #FFF; | |||||
list-style-position: inside; | |||||
} | |||||
#qunit-tests > li { | |||||
display: none; | |||||
} | |||||
#qunit-tests li.running, | |||||
#qunit-tests li.pass, | |||||
#qunit-tests li.fail, | |||||
#qunit-tests li.skipped { | |||||
display: list-item; | |||||
} | |||||
#qunit-tests.hidepass { | |||||
position: relative; | |||||
} | |||||
#qunit-tests.hidepass li.running, | |||||
#qunit-tests.hidepass li.pass { | |||||
visibility: hidden; | |||||
position: absolute; | |||||
width: 0; | |||||
height: 0; | |||||
padding: 0; | |||||
border: 0; | |||||
margin: 0; | |||||
} | |||||
#qunit-tests li strong { | |||||
cursor: pointer; | |||||
} | |||||
#qunit-tests li.skipped strong { | |||||
cursor: default; | |||||
} | |||||
#qunit-tests li a { | |||||
padding: 0.5em; | |||||
color: #C2CCD1; | |||||
text-decoration: none; | |||||
} | |||||
#qunit-tests li p a { | |||||
padding: 0.25em; | |||||
color: #6B6464; | |||||
} | |||||
#qunit-tests li a:hover, | |||||
#qunit-tests li a:focus { | |||||
color: #000; | |||||
} | |||||
#qunit-tests li .runtime { | |||||
float: right; | |||||
font-size: smaller; | |||||
} | |||||
.qunit-assert-list { | |||||
margin-top: 0.5em; | |||||
padding: 0.5em; | |||||
background-color: #FFF; | |||||
} | |||||
.qunit-source { | |||||
margin: 0.6em 0 0.3em; | |||||
} | |||||
.qunit-collapsed { | |||||
display: none; | |||||
} | |||||
#qunit-tests table { | |||||
border-collapse: collapse; | |||||
margin-top: 0.2em; | |||||
} | |||||
#qunit-tests th { | |||||
text-align: right; | |||||
vertical-align: top; | |||||
padding: 0 0.5em 0 0; | |||||
} | |||||
#qunit-tests td { | |||||
vertical-align: top; | |||||
} | |||||
#qunit-tests pre { | |||||
margin: 0; | |||||
white-space: pre-wrap; | |||||
word-wrap: break-word; | |||||
} | |||||
#qunit-tests del { | |||||
background-color: #E0F2BE; | |||||
color: #374E0C; | |||||
text-decoration: none; | |||||
} | |||||
#qunit-tests ins { | |||||
background-color: #FFCACA; | |||||
color: #500; | |||||
text-decoration: none; | |||||
} | |||||
/*** Test Counts */ | |||||
#qunit-tests b.counts { color: #000; } | |||||
#qunit-tests b.passed { color: #5E740B; } | |||||
#qunit-tests b.failed { color: #710909; } | |||||
#qunit-tests li li { | |||||
padding: 5px; | |||||
background-color: #FFF; | |||||
border-bottom: none; | |||||
list-style-position: inside; | |||||
} | |||||
/*** Passing Styles */ | |||||
#qunit-tests li li.pass { | |||||
color: #3C510C; | |||||
background-color: #FFF; | |||||
border-left: 10px solid #C6E746; | |||||
} | |||||
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; } | |||||
#qunit-tests .pass .test-name { color: #366097; } | |||||
#qunit-tests .pass .test-actual, | |||||
#qunit-tests .pass .test-expected { color: #999; } | |||||
#qunit-banner.qunit-pass { background-color: #C6E746; } | |||||
/*** Failing Styles */ | |||||
#qunit-tests li li.fail { | |||||
color: #710909; | |||||
background-color: #FFF; | |||||
border-left: 10px solid #EE5757; | |||||
white-space: pre; | |||||
} | |||||
#qunit-tests .fail { color: #000; background-color: #EE5757; } | |||||
#qunit-tests .fail .test-name, | |||||
#qunit-tests .fail .module-name { color: #000; } | |||||
#qunit-tests .fail .test-actual { color: #EE5757; } | |||||
#qunit-tests .fail .test-expected { color: #008000; } | |||||
#qunit-banner.qunit-fail { background-color: #EE5757; } | |||||
/*** Skipped tests */ | |||||
#qunit-tests .skipped { | |||||
background-color: #EBECE9; | |||||
} | |||||
#qunit-tests .qunit-skipped-label { | |||||
background-color: #F4FF77; | |||||
display: inline-block; | |||||
font-style: normal; | |||||
color: #366097; | |||||
line-height: 1.8em; | |||||
padding: 0 0.5em; | |||||
margin: -0.4em 0.4em -0.4em 0; | |||||
} | |||||
/** Result */ | |||||
#qunit-testresult { | |||||
padding: 0.5em 1em 0.5em 1em; | |||||
color: #2B81AF; | |||||
background-color: #D2E0E6; | |||||
border-bottom: 1px solid #FFF; | |||||
} | |||||
#qunit-testresult .module-name { | |||||
font-weight: 700; | |||||
} | |||||
/** Fixture */ | |||||
#qunit-fixture { | |||||
position: absolute; | |||||
top: -10000px; | |||||
left: -10000px; | |||||
width: 1000px; | |||||
height: 1000px; | |||||
} |
@@ -0,0 +1,23 @@ | |||||
<!DOCTYPE html> | |||||
<html> | |||||
<head> | |||||
<meta charset="utf-8"> | |||||
<meta name="viewport" content="width=device-width"> | |||||
<title>Testing A&B</title> | |||||
<link rel="stylesheet" href="test.css"> | |||||
</head> | |||||
<body> | |||||
<script src="scripts/qcengine/qcengine_bitfield.js"></script> | |||||
<script src="scripts/qcengine/qcengine_reg.js"></script> | |||||
<script src="scripts/qcengine/qcengine_int.js"></script> | |||||
<script src="scripts/qcengine/qcengine_basicops.js"></script> | |||||
<script src="scripts/qcengine/qcengine_setup.js"></script> | |||||
<script src="scripts/tables.js"></script> | |||||
<script src="scripts/anders_briegel.js"></script> | |||||
<div id="qunit"></div> | |||||
<div id="qunit-fixture"></div> | |||||
<script src="https://code.jquery.com/qunit/qunit-1.23.1.js"></script> | |||||
<script src="scripts/tests.js"></script> | |||||
</body> | |||||
</html> |
@@ -9,6 +9,4 @@ def simple_test(): | |||||
g.act_hadamard(0) | g.act_hadamard(0) | ||||
g.act_hadamard(1) | g.act_hadamard(1) | ||||
g.act_cz(0, 1) | g.act_cz(0, 1) | ||||
print g.node[0]["position"] | |||||
print nx.to_edgelist(g) | |||||