| @@ -1,6 +1,10 @@ | |||||
| import requests | import requests | ||||
| import abp, json | import abp, json | ||||
| class ClientError(Exception): | |||||
| def __init__(self, message): | |||||
| self.message = message | |||||
| class Client(object): | class Client(object): | ||||
| def __init__(self, host="localhost", port=5000, clear=False): | def __init__(self, host="localhost", port=5000, clear=False): | ||||
| self.session = requests.Session() | self.session = requests.Session() | ||||
| @@ -11,7 +15,9 @@ class Client(object): | |||||
| def get(self, endpoint): | def get(self, endpoint): | ||||
| url =self.root+endpoint | url =self.root+endpoint | ||||
| response = self.session.get(url) | 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 | return response.content | ||||
| def get_state(self): | def get_state(self): | ||||
| @@ -21,7 +27,10 @@ class Client(object): | |||||
| return output | return output | ||||
| def set_state(self, state): | 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): | def add_node(self, node): | ||||
| return self.get("/add_node/{}".format(node)) | return self.get("/add_node/{}".format(node)) | ||||
| @@ -6,6 +6,7 @@ import itertools as it | |||||
| import clifford | import clifford | ||||
| import json | import json | ||||
| import qi | import qi | ||||
| import shelve | |||||
| try: | try: | ||||
| import networkx as nx | import networkx as nx | ||||
| except ImportError: | except ImportError: | ||||
| @@ -5,17 +5,14 @@ import time | |||||
| client = abp.Client(clear=True) | client = abp.Client(clear=True) | ||||
| client.add_node(0) | client.add_node(0) | ||||
| time.sleep(2) | |||||
| client.add_node(1) | client.add_node(1) | ||||
| client.add_node(99) | client.add_node(99) | ||||
| time.sleep(2) | |||||
| client.act_local_rotation(0, 10) | client.act_local_rotation(0, 10) | ||||
| client.act_local_rotation(1, 10) | client.act_local_rotation(1, 10) | ||||
| client.act_local_rotation(99, 10) | client.act_local_rotation(99, 10) | ||||
| client.act_cz(0, 1) | client.act_cz(0, 1) | ||||
| client.act_cz(0, 99) | client.act_cz(0, 99) | ||||
| client.act_cz(1, 99) | client.act_cz(1, 99) | ||||
| time.sleep(2) | |||||
| for i in range(10): | for i in range(10): | ||||
| client.add_node(i+10) | client.add_node(i+10) | ||||
| client.act_local_rotation(i+10, 10) | client.act_local_rotation(i+10, 10) | ||||
| @@ -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 | from werkzeug.contrib.cache import SimpleCache | ||||
| import json | import json | ||||
| import abp | import abp | ||||
| import argparse | |||||
| #TODO: only send deltas | #TODO: only send deltas | ||||
| @@ -10,6 +11,15 @@ cache = SimpleCache(default_timeout = 10000) | |||||
| cache.set("state", abp.GraphState()) | cache.set("state", abp.GraphState()) | ||||
| app = Flask(__name__) | 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("/") | @app.route("/") | ||||
| def index(): | def index(): | ||||
| return render_template("index.html") | return render_template("index.html") | ||||
| @@ -17,59 +27,54 @@ def index(): | |||||
| @app.route("/state", methods = ["GET", "POST"]) | @app.route("/state", methods = ["GET", "POST"]) | ||||
| def state(): | def state(): | ||||
| if request.method == "GET": | 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) | return jsonify(output) | ||||
| elif request.method == "POST": | 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"}) | return jsonify({"update": "ok"}) | ||||
| @app.route("/add_node/<int:node>") | @app.route("/add_node/<int:node>") | ||||
| def add_node(node): | def add_node(node): | ||||
| """ Add a node to the graph """ | """ 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"}) | return jsonify({"add_node": "okay"}) | ||||
| @app.route("/act_local_rotation/<int:node>/<int:operation>") | @app.route("/act_local_rotation/<int:node>/<int:operation>") | ||||
| def act_local_rotation(node, operation): | def act_local_rotation(node, operation): | ||||
| """ Add a node to the graph """ | """ Add a node to the graph """ | ||||
| # TODO: try to lookup the operation first | # 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"}) | return jsonify({"act_local_rotation": "okay"}) | ||||
| @app.route("/act_cz/<int:a>/<int:b>") | @app.route("/act_cz/<int:a>/<int:b>") | ||||
| def act_cz(a, b): | def act_cz(a, b): | ||||
| """ Add a node to the graph """ | """ 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"}) | return jsonify({"act_cz": "okay"}) | ||||
| @app.route("/clear") | @app.route("/clear") | ||||
| def clear(): | def clear(): | ||||
| """ Clear the current state """ | """ 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"}) | return jsonify({"clear": "okay"}) | ||||
| if __name__ == "__main__": | 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") | app.run(host="0.0.0.0") | ||||
| @@ -49,6 +49,14 @@ function startMainLoop() { | |||||
| loopForever(); | 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 | // Called on startup | ||||
| function init() { | function init() { | ||||
| @@ -61,6 +69,7 @@ function init() { | |||||
| renderer.setSize(width, height); | renderer.setSize(width, height); | ||||
| renderer.setClearColor(0xffffff, 1); | renderer.setClearColor(0xffffff, 1); | ||||
| document.querySelector("body").appendChild(renderer.domElement); | document.querySelector("body").appendChild(renderer.domElement); | ||||
| window.addEventListener("resize", onWindowResize, false); | |||||
| // Time to load the materials | // Time to load the materials | ||||
| loadMaterials(); | loadMaterials(); | ||||
| @@ -75,7 +84,7 @@ function init() { | |||||
| camera.position.set(0, 0, 20); | camera.position.set(0, 0, 20); | ||||
| // Start polling | // Start polling | ||||
| setInterval(poll, 500); | |||||
| setInterval(poll, 1000); | |||||
| // Run | // Run | ||||
| startMainLoop(); | startMainLoop(); | ||||
| @@ -17,7 +17,7 @@ function poll() { | |||||
| } | } | ||||
| function updateScene(state) { | function updateScene(state) { | ||||
| //if (state.update_required === false){return;} | |||||
| if (state.needs_update === false){return;} | |||||
| var oldState = scene.getObjectByName("graphstate"); | var oldState = scene.getObjectByName("graphstate"); | ||||
| scene.remove(oldState); | scene.remove(oldState); | ||||
| oldState = null; | oldState = null; | ||||
| @@ -5,7 +5,7 @@ import numpy as np | |||||
| import random | import random | ||||
| from tqdm import tqdm | from tqdm import tqdm | ||||
| REPEATS = 100 | |||||
| REPEATS = 1 | |||||
| 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""" | ||||
| @@ -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() | |||||