| @@ -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)) | |||
| @@ -6,6 +6,7 @@ import itertools as it | |||
| import clifford | |||
| import json | |||
| import qi | |||
| import shelve | |||
| try: | |||
| import networkx as nx | |||
| except ImportError: | |||
| @@ -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) | |||
| @@ -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/<int: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/<int:node>/<int:operation>") | |||
| 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/<int:a>/<int:b>") | |||
| 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") | |||
| @@ -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(); | |||
| @@ -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; | |||
| @@ -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""" | |||
| @@ -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() | |||