diff --git a/abp/client.py b/abp/client.py index 4c5b839..7d127cb 100644 --- a/abp/client.py +++ b/abp/client.py @@ -1,6 +1,10 @@ import requests import abp, json +class ClientError(Exception): + def __init__(self, message): + self.message = message + class Client(object): def __init__(self, host="localhost", port=5000, clear=False): self.session = requests.Session() @@ -11,7 +15,9 @@ class Client(object): def get(self, endpoint): url =self.root+endpoint response = self.session.get(url) - assert response.status_code == 200 + if response.status_code == 404: + message = "404. Check that the server is running!".format(self.root, endpoint) + raise ClientError(message) return response.content def get_state(self): @@ -21,7 +27,10 @@ class Client(object): return output def set_state(self, state): - return self.session.post(self.root+"/state", data=state.to_json()) + response = self.session.post(self.root+"/state", data=state.to_json()) + if not response.status_code == 200: + print response.status_code + return response.content def add_node(self, node): return self.get("/add_node/{}".format(node)) diff --git a/abp/graphstate.py b/abp/graphstate.py index a2de423..81cec6a 100644 --- a/abp/graphstate.py +++ b/abp/graphstate.py @@ -6,6 +6,7 @@ import itertools as it import clifford import json import qi +import shelve try: import networkx as nx except ImportError: diff --git a/examples/client.py b/examples/client.py index 77a06e4..e73d664 100644 --- a/examples/client.py +++ b/examples/client.py @@ -5,17 +5,14 @@ import time client = abp.Client(clear=True) client.add_node(0) -time.sleep(2) client.add_node(1) client.add_node(99) -time.sleep(2) client.act_local_rotation(0, 10) client.act_local_rotation(1, 10) client.act_local_rotation(99, 10) client.act_cz(0, 1) client.act_cz(0, 99) client.act_cz(1, 99) -time.sleep(2) for i in range(10): client.add_node(i+10) client.act_local_rotation(i+10, 10) diff --git a/server/server.py b/server/server.py index c3ca86b..5d2378b 100644 --- a/server/server.py +++ b/server/server.py @@ -1,7 +1,8 @@ -from flask import Flask, request, render_template, jsonify +from flask import Flask, request, render_template, jsonify, g from werkzeug.contrib.cache import SimpleCache import json import abp +import argparse #TODO: only send deltas @@ -10,6 +11,15 @@ cache = SimpleCache(default_timeout = 10000) cache.set("state", abp.GraphState()) app = Flask(__name__) +@app.before_request +def before_request(): + g.state = cache.get("state") + +@app.after_request +def after_request(response): + cache.set("state", g.state) + return response + @app.route("/") def index(): return render_template("index.html") @@ -17,59 +27,54 @@ def index(): @app.route("/state", methods = ["GET", "POST"]) def state(): if request.method == "GET": - state = cache.get("state") - output = state.to_json() - output["update_required"] = cache.get("update") - cache.set("update", False) + output = g.state.to_json() + output["needs_update"] = cache.get("needs_update") + cache.set("needs_update", False) return jsonify(output) elif request.method == "POST": - cache.set("update", True) - graphstate = abp.GraphState() - graphstate.from_json(json.loads(request.data)) - cache.set("state", graphstate) + g.state = abp.GraphState() + g.state.from_json(json.loads(request.data)) + cache.set("needs_update", True) return jsonify({"update": "ok"}) @app.route("/add_node/") def add_node(node): """ Add a node to the graph """ - graphstate = cache.get("state") - graphstate.add_node(node) - graphstate.layout() - cache.set("update", True) - cache.set("state", graphstate) + g.state.add_node(node) + g.state.layout() + cache.set("needs_update", True) return jsonify({"add_node": "okay"}) @app.route("/act_local_rotation//") def act_local_rotation(node, operation): """ Add a node to the graph """ # TODO: try to lookup the operation first - graphstate = cache.get("state") - graphstate.act_local_rotation(node, operation) - cache.set("update", True) - cache.set("state", graphstate) + g.state.act_local_rotation(node, operation) + cache.set("needs_update", True) return jsonify({"act_local_rotation": "okay"}) @app.route("/act_cz//") def act_cz(a, b): """ Add a node to the graph """ - graphstate = cache.get("state") - graphstate.act_cz(a, b) - graphstate.layout() - cache.set("update", True) - cache.set("state", graphstate) + g.state.act_cz(a, b) + g.state.layout() + cache.set("needs_update", True) return jsonify({"act_cz": "okay"}) @app.route("/clear") def clear(): """ Clear the current state """ - graphstate = abp.GraphState() - cache.set("update", True) - cache.set("state", graphstate) + g.state = abp.GraphState() + cache.set("needs_update", True) return jsonify({"clear": "okay"}) if __name__ == "__main__": - app.debug = True + parser = argparse.ArgumentParser() + parser.add_argument("-d", "--debug", help="Run in debug mode", action="store_true", default=False) + args = parser.parse_args() + app.debug = args.debug + app.run(host="0.0.0.0") diff --git a/server/static/main.js b/server/static/main.js index 513cce5..5469d59 100644 --- a/server/static/main.js +++ b/server/static/main.js @@ -49,6 +49,14 @@ function startMainLoop() { loopForever(); } +// Someone resized the window +function onWindowResize(evt){ + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + renderer.setSize(window.innerWidth, window.innerHeight); + render(); +} + // Called on startup function init() { @@ -61,6 +69,7 @@ function init() { renderer.setSize(width, height); renderer.setClearColor(0xffffff, 1); document.querySelector("body").appendChild(renderer.domElement); + window.addEventListener("resize", onWindowResize, false); // Time to load the materials loadMaterials(); @@ -75,7 +84,7 @@ function init() { camera.position.set(0, 0, 20); // Start polling - setInterval(poll, 500); + setInterval(poll, 1000); // Run startMainLoop(); diff --git a/server/static/poll.js b/server/static/poll.js index ff2f0fd..7852590 100644 --- a/server/static/poll.js +++ b/server/static/poll.js @@ -17,7 +17,7 @@ function poll() { } function updateScene(state) { - //if (state.update_required === false){return;} + if (state.needs_update === false){return;} var oldState = scene.getObjectByName("graphstate"); scene.remove(oldState); oldState = null; diff --git a/tests/test_against_circuit_model.py b/tests/test_against_circuit_model.py index 096681a..ffe90ad 100644 --- a/tests/test_against_circuit_model.py +++ b/tests/test_against_circuit_model.py @@ -5,7 +5,7 @@ import numpy as np import random from tqdm import tqdm -REPEATS = 100 +REPEATS = 1 def test_single_qubit(n=1): """ A multi qubit test with Hadamards only""" diff --git a/tests/test_client.py b/tests/test_client.py new file mode 100644 index 0000000..12d360b --- /dev/null +++ b/tests/test_client.py @@ -0,0 +1,17 @@ +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() +