From 7bbaa850012759c744e986ccc6934ac17e40ed45 Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Tue, 17 May 2016 00:39:20 +0100 Subject: [PATCH] Improvements in speed, interface --- abp/__init__.py | 2 +- abp/graphstate.py | 55 ++++++++++------------------------------ abp/visiblegraphstate.py | 51 +++++++++++++++++++++++++++++++++++++ profiling/profile_viz.py | 10 ++++++++ server/server.py | 3 ++- tests/test_client.py | 17 ------------- 6 files changed, 77 insertions(+), 61 deletions(-) create mode 100644 abp/visiblegraphstate.py create mode 100644 profiling/profile_viz.py delete mode 100644 tests/test_client.py diff --git a/abp/__init__.py b/abp/__init__.py index a3b1ee4..b5e9b1f 100644 --- a/abp/__init__.py +++ b/abp/__init__.py @@ -1,4 +1,4 @@ # Alias some stuff to make imports cleaner from abp.graphstate import GraphState from abp.qi import CircuitModel -from abp.graphstate import VisibleGraphState +from abp.visiblegraphstate import VisibleGraphState diff --git a/abp/graphstate.py b/abp/graphstate.py index 79f1041..01df63a 100644 --- a/abp/graphstate.py +++ b/abp/graphstate.py @@ -6,27 +6,24 @@ import itertools as it import clifford import json import qi -import networkx as nx -from websocket import create_connection -import atexit +try: + import networkx as nx +except ImportError: + print "Could not import networkx." -class GraphState(object): + +class GraphState(): def __init__(self, nodes=[]): - self.ngbh = {} - self.vops = {} - self.meta = {} - try: - self.add_nodes(nodes) - except TypeError: - self.add_nodes(xrange(nodes)) - - def add_node(self, v): + self.ngbh, self.vops, self.meta = {}, {}, {} + self.add_nodes(nodes) + + def add_node(self, v, meta={}): """ Add a node """ self.ngbh[v] = set() self.vops[v] = clifford.by_name["hadamard"] - self.meta[v] = dict() + self.meta[v] = meta def add_nodes(self, nodes): """ Add a buncha nodes """ @@ -62,10 +59,10 @@ class GraphState(object): def edgelist(self): """ Describe a graph as an edgelist """ - edges = frozenset(tuple(sorted((i, n))) + edges = set(tuple(sorted((i, n))) for i, v in self.ngbh.items() for n in v) - return [tuple(e) for e in edges] + return tuple(edges) def remove_vop(self, a, avoid): """ Reduces VOP[a] to the identity """ @@ -230,30 +227,4 @@ class GraphState(object): return self.ngbh == other.ngbh and self.vops == other.vops -class VisibleGraphState(GraphState): - - def __init__(self, *args, **kwargs): - GraphState.__init__(self, *args, **kwargs) - self.ws = create_connection("ws://localhost:5001") - atexit.register(self.ws.close) - self.send("clear") - - def send(self, method, *args, **kwargs): - kwargs.update({"method": method}) - self.ws.send(json.dumps(kwargs)) - - def add_node(self, node): - GraphState.add_node(self, node) - self.send("add_node", node=node) - - def add_edge(self, start, end): - GraphState.add_edge(self, start, end) - self.send("add_edge", start=start, end=end) - - def del_edge(self, start, end): - GraphState.del_edge(self, start, end) - self.send("del_edge", start=start, end=end) - def act_local_rotation(self, node, operation): - GraphState.del_edge(self, start, end) - self.send("update_vop", node=node, vop=self.vops[node]) diff --git a/abp/visiblegraphstate.py b/abp/visiblegraphstate.py new file mode 100644 index 0000000..3b2a16e --- /dev/null +++ b/abp/visiblegraphstate.py @@ -0,0 +1,51 @@ +""" +Allows us to visualize the state in a browser +""" + +import atexit +import threading +import time +from websocket import create_connection +from graphstate import GraphState +import json + +class VisibleGraphState(GraphState): + + def __init__(self, *args, **kwargs): + GraphState.__init__(self, *args, **kwargs) + self.ws = create_connection("ws://localhost:5001") + self.diff = [] + atexit.register(self.shutdown) + self.ws.send(json.dumps({"method":"clear"})) + + def shutdown(self): + if len(self.diff)>0: + self.update() + self.ws.close() + + def send(self, method, *args, **kwargs): + kwargs.update({"method": method}) + self.diff.append(kwargs) + + def add_node(self, node, meta = {}): + GraphState.add_node(self, node, meta) + self.send("add_node", node=node, meta=meta) + + def add_edge(self, start, end): + GraphState.add_edge(self, start, end) + self.send("add_edge", start=start, end=end) + + def del_edge(self, start, end): + GraphState.del_edge(self, start, end) + self.send("del_edge", start=start, end=end) + + def act_local_rotation(self, node, operation): + GraphState.act_local_rotation(self, node, operation) + self.send("update_vop", node = node, vop = self.vops[node]) + + def update(self): + #data = json.dumps({"diff": self.diff, "state":self.to_json()}) + data = json.dumps({"diff": self.diff}) + self.ws.send(data) + self.diff = [] + diff --git a/profiling/profile_viz.py b/profiling/profile_viz.py new file mode 100644 index 0000000..1ff1242 --- /dev/null +++ b/profiling/profile_viz.py @@ -0,0 +1,10 @@ +from abp import VisibleGraphState + +s = VisibleGraphState() +for i in range(1000): + s.add_node(i) + s.act_local_rotation(i, "hadamard") +s.update() +for i in range(1000-1): + s.act_cz(i, i+1) +s.update() diff --git a/server/server.py b/server/server.py index 3f32e80..9e77fbf 100644 --- a/server/server.py +++ b/server/server.py @@ -2,9 +2,10 @@ from websocket_server import WebsocketServer import threading clients = [] -state = "awd" +#state = "awd" def new_message(client, server, message): + print "Sending message ..." server.send_message_to_all(message) def new_client(client, server): diff --git a/tests/test_client.py b/tests/test_client.py deleted file mode 100644 index 77c8d16..0000000 --- a/tests/test_client.py +++ /dev/null @@ -1,17 +0,0 @@ -import requests -import abp, json -import time - - -def test_client(): - client = abp.Client(clear=True) - - client.clear() - for i in range(100): - client.add_node(i) - client.act_local_rotation(i, 10) - for i in range(100-1): - client.act_cz(i, i+1) - - print client.get_state() -