Browse Source

Improvements in speed, interface

master
Pete Shadbolt 8 years ago
parent
commit
7bbaa85001
6 changed files with 77 additions and 61 deletions
  1. +1
    -1
      abp/__init__.py
  2. +13
    -42
      abp/graphstate.py
  3. +51
    -0
      abp/visiblegraphstate.py
  4. +10
    -0
      profiling/profile_viz.py
  5. +2
    -1
      server/server.py
  6. +0
    -17
      tests/test_client.py

+ 1
- 1
abp/__init__.py View File

@@ -1,4 +1,4 @@
# Alias some stuff to make imports cleaner # Alias some stuff to make imports cleaner
from abp.graphstate import GraphState from abp.graphstate import GraphState
from abp.qi import CircuitModel from abp.qi import CircuitModel
from abp.graphstate import VisibleGraphState
from abp.visiblegraphstate import VisibleGraphState

+ 13
- 42
abp/graphstate.py View File

@@ -6,27 +6,24 @@ import itertools as it
import clifford import clifford
import json import json
import qi 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=[]): 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 """ """ Add a node """
self.ngbh[v] = set() self.ngbh[v] = set()
self.vops[v] = clifford.by_name["hadamard"] self.vops[v] = clifford.by_name["hadamard"]
self.meta[v] = dict()
self.meta[v] = meta


def add_nodes(self, nodes): def add_nodes(self, nodes):
""" Add a buncha nodes """ """ Add a buncha nodes """
@@ -62,10 +59,10 @@ class GraphState(object):


def edgelist(self): def edgelist(self):
""" Describe a graph as an edgelist """ """ 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 i, v in self.ngbh.items()
for n in v) for n in v)
return [tuple(e) for e in edges]
return tuple(edges)


def remove_vop(self, a, avoid): def remove_vop(self, a, avoid):
""" Reduces VOP[a] to the identity """ """ Reduces VOP[a] to the identity """
@@ -230,30 +227,4 @@ class GraphState(object):
return self.ngbh == other.ngbh and self.vops == other.vops 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])

+ 51
- 0
abp/visiblegraphstate.py View File

@@ -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 = []


+ 10
- 0
profiling/profile_viz.py View File

@@ -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()

+ 2
- 1
server/server.py View File

@@ -2,9 +2,10 @@ from websocket_server import WebsocketServer
import threading import threading


clients = [] clients = []
state = "awd"
#state = "awd"


def new_message(client, server, message): def new_message(client, server, message):
print "Sending message ..."
server.send_message_to_all(message) server.send_message_to_all(message)


def new_client(client, server): def new_client(client, server):


+ 0
- 17
tests/test_client.py View File

@@ -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()


Loading…
Cancel
Save