| @@ -1,4 +1,3 @@ | |||
| # Alias some stuff to make imports cleaner | |||
| from abp.graphstate import GraphState | |||
| from abp.server import Server | |||
| from abp.qi import CircuitModel | |||
| @@ -18,7 +18,11 @@ class GraphState(object): | |||
| self.ngbh = {} | |||
| self.vops = {} | |||
| self.meta = {} | |||
| self.add_nodes(nodes) | |||
| try: | |||
| self.add_nodes(nodes) | |||
| except TypeError: | |||
| self.add_nodes(xrange(nodes)) | |||
| def add_node(self, v): | |||
| """ Add a node """ | |||
| @@ -121,6 +125,7 @@ class GraphState(object): | |||
| self.act_local_rotation_by_name(neighbour, "pz") | |||
| # Set final state as appropriate | |||
| # TODO: cache these lookups. sux | |||
| if res: | |||
| self.act_local_rotation_by_name(node, "px") | |||
| self.act_local_rotation_by_name(node, "hadamard") | |||
| @@ -188,9 +193,9 @@ class GraphState(object): | |||
| ax, ay, az = average(0), average(1), average(2) | |||
| for key, (x, y, z) in pos.items(): | |||
| self.meta[key]["pos"] = { | |||
| "x": round(x - ax, 0), | |||
| "y": round(y - ay, 0), | |||
| "z": round(z - az, 0)} | |||
| "x": x - ax, | |||
| "y": y - ay, | |||
| "z": z - az} | |||
| def to_stabilizer(self): | |||
| """ Get the stabilizer of this graph """ | |||
| @@ -0,0 +1,18 @@ | |||
| from abp import GraphState | |||
| from abp import Client | |||
| import time | |||
| psi = Client() | |||
| psi.draw() | |||
| psi.add_nodes(range(10)) | |||
| psi.draw() | |||
| psi.act_hadamard(0) | |||
| psi.act_hadamard(1) | |||
| psi.draw() | |||
| psi.act_cz(0, 1) | |||
| psi.draw() | |||
| psi.act_cz(0, 1) | |||
| server.draw() | |||
| server.shutdown() | |||
| @@ -1,14 +0,0 @@ | |||
| from abp import GraphState | |||
| from abp import Server | |||
| import time | |||
| server = Server() | |||
| server.start() | |||
| i=0 | |||
| while True: | |||
| server.update(i) | |||
| i += 1 | |||
| time.sleep(1) | |||
| server.shutdown | |||
| @@ -0,0 +1,48 @@ | |||
| import urlparse | |||
| from BaseHTTPServer import BaseHTTPRequestHandler | |||
| from SimpleHTTPServer import SimpleHTTPRequestHandler | |||
| import SocketServer | |||
| import sys, json, time, os | |||
| from graphstate import GraphState | |||
| import requests | |||
| class VizHandler(SimpleHTTPRequestHandler): | |||
| """ Handles requests to the server """ | |||
| def get_state(self): | |||
| """ Get the current graphstate state """ | |||
| self.send_response(200) | |||
| self.send_header('Content-Type', 'application/json') | |||
| self.end_headers() | |||
| self.wfile.write(state.to_json()) | |||
| def do_GET(self, *args, **kwargs): | |||
| """ Someone belled the server """ | |||
| parsed_path = urlparse.urlparse(self.path) | |||
| if parsed_path.path == "/state": | |||
| return self.get_state() | |||
| else: | |||
| return SimpleHTTPRequestHandler.do_GET(self, *args, **kwargs) | |||
| class Server(SocketServer.TCPServer): | |||
| """ Serves the good stuff """ | |||
| allow_reuse_address = True | |||
| def __init__(self, port=8000): | |||
| self.port = port | |||
| self.state = None | |||
| SocketServer.TCPServer.__init__(self, ("127.0.0.1", self.port), VizHandler) | |||
| print "Serving on port {} (Press CTRL-C to quit)".format(self.port) | |||
| self.serve_forever() | |||
| if __name__ == '__main__': | |||
| os.chdir(os.path.join(sys.path[0], "../static")) | |||
| server = Server() | |||
| server.shutdown() | |||
| requests.get("http://localhost:8000/state") | |||
| @@ -0,0 +1,24 @@ | |||
| // Curve settings | |||
| var curveProperties = { | |||
| splineDensity: 10, | |||
| curvature: 100 | |||
| }; | |||
| // Add a curved edge between two points | |||
| function makeEdge(start, end) { | |||
| // Make the geometry of the curve | |||
| var a = new THREE.Vector3(start.x, start.y, start.z); | |||
| var b = new THREE.Vector3(end.x, end.y, end.z); | |||
| var length = new THREE.Vector3().subVectors(a, b).length(); | |||
| var bend = new THREE.Vector3(length / curveProperties.curvature, length / curveProperties.curvature, 0); | |||
| var mid = new THREE.Vector3().add(a).add(b).multiplyScalar(0.5).add(bend); | |||
| var spline = new THREE.CatmullRomCurve3([a, mid, b]); | |||
| var geometry = new THREE.Geometry(); | |||
| var splinePoints = spline.getPoints(curveProperties.splineDensity); | |||
| Array.prototype.push.apply(geometry.vertices, splinePoints); | |||
| // Make the actual Object3d thing | |||
| var line = new THREE.Line(geometry, materials.edge); | |||
| return line; | |||
| } | |||
| @@ -0,0 +1,20 @@ | |||
| function buildGraph(json) { | |||
| // Add all the qubits | |||
| var geometry = new THREE.Geometry(); | |||
| var vertex = new THREE.Vector3(0, 0, 0); | |||
| geometry.vertices.push(vertex); | |||
| var nodes = new THREE.Points(geometry, materials.node); | |||
| // Add all the edges | |||
| var edges = new THREE.Object3D(); | |||
| edges.add(makeEdge({ | |||
| "start": [0, 0, 0], | |||
| "end": [1, 1, 1] | |||
| })); | |||
| // Construct and return | |||
| var graph = new THREE.Object3D(); | |||
| graph.add(nodes); | |||
| graph.add(edges); | |||
| return graph; | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| //TODO Move to THREE.gridhelper | |||
| // Make a grid | |||
| function makeGrid(side, n, color) { | |||
| var markers = new THREE.Object3D(); | |||
| var gridStyle = { | |||
| color: color, | |||
| transparent: true, | |||
| linewidth: 1, | |||
| opacity: 0.5 | |||
| }; | |||
| var material = new THREE.LineBasicMaterial(gridStyle); | |||
| for (var i = -n / 2; i <= n / 2; ++i) { | |||
| var geometry = new THREE.Geometry(); | |||
| geometry.vertices.push(new THREE.Vector3(side * i / n, -side / 2, 0)); | |||
| geometry.vertices.push(new THREE.Vector3(side * i / n, side / 2, 0)); | |||
| var line = new THREE.Line(geometry, material); | |||
| var line90 = line.clone(); | |||
| line90.rotation.z = Math.PI / 2; | |||
| markers.add(line); | |||
| markers.add(line90); | |||
| } | |||
| markers.name = "grid"; | |||
| return markers; | |||
| } | |||
| @@ -0,0 +1,25 @@ | |||
| <!DOCTYPE html> | |||
| <html lang="en"> | |||
| <head> | |||
| <meta charset="utf-8"> | |||
| <title>abp</title> | |||
| <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=1" /> | |||
| <link rel="stylesheet" href="main.css"> | |||
| </head> | |||
| <body> | |||
| <script type="text/javascript" src="three.js"></script> | |||
| <script type="text/javascript" src="libs.js"></script> | |||
| <script type="text/javascript" src="materials.js"></script> | |||
| <script type="text/javascript" src="poll.js"></script> | |||
| <script type="text/javascript" src="grid.js"></script> | |||
| <script type="text/javascript" src="curve.js"></script> | |||
| <script type="text/javascript" src="main.js"></script> | |||
| <img id="ball" src="data:image/png;base64,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"/ | |||
| style=display:none;> | |||
| <div id=infoholder class=hidden> | |||
| </div> | |||
| </body> | |||
| </html> | |||
| @@ -0,0 +1,46 @@ | |||
| // Gets a reference to the node nearest to the mouse cursor | |||
| function nearestNode() { | |||
| raycaster.setFromCamera(mouse, camera); | |||
| for (var i = 0; i < nodeGeometry.vertices.length; ++i) { | |||
| if (raycaster.ray.distanceSqToPoint(nodeGeometry.vertices[i]) < 0.01) { | |||
| return i; | |||
| } | |||
| } | |||
| return undefined; | |||
| } | |||
| // Find out: what is the mouse pointing at? | |||
| function checkIntersections() { | |||
| var new_selection = nearestNode(); | |||
| if (new_selection != selection) { | |||
| selection = new_selection; | |||
| info.className = selection ? "visible" : "hidden"; | |||
| info.innerHTML = selection ? nodeGeometry.labels[new_selection] : info.innerHTML; | |||
| render(); | |||
| } | |||
| } | |||
| // Update the mouse position tracker | |||
| function onMouseMove(event) { | |||
| mouse.wasClick = false; | |||
| mouse.absx = event.clientX; | |||
| mouse.absy = event.clientY; | |||
| mouse.x = (event.clientX / window.innerWidth) * 2 - 1; | |||
| mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; | |||
| w = 200; | |||
| h = 15; | |||
| info.style.top = mouse.absy - h - 40 + "px"; | |||
| info.style.left = mouse.absx - w / 2 + "px"; | |||
| checkIntersections(); | |||
| } | |||
| // Add qubits or whatever | |||
| function onClick(event){ | |||
| if (!selection){return;} | |||
| console.log(nodeGeometry.vertices[selection]); | |||
| qubits.geometry.dynamic = true; | |||
| qubits.geometry.vertices.push(nodeGeometry.vertices[selection].clone()); | |||
| qubits.geometry.verticesNeedUpdate = true; | |||
| } | |||
| @@ -0,0 +1,20 @@ | |||
| html, body { margin: 0; padding: 0; overflow: hidden; font-size: 10pt; font-family: "courier new"; } | |||
| #infoholder { | |||
| background: black; color:white; padding: 5px; margin:0px; position: absolute; top:5px; left:5px; font-family:"courier new"; text-align: center; font-size:10pt; | |||
| height:15px; | |||
| border-radius:3px; | |||
| } | |||
| .visible { | |||
| visibility: visible; | |||
| opacity: 1; | |||
| transform: scale(1); | |||
| transition: opacity .08s linear, transform .08s linear; | |||
| } | |||
| .hidden { | |||
| visibility: hidden; | |||
| opacity: 0; | |||
| transform: scale(.5); | |||
| transition: visibility .08s, opacity .08s linear, transform .08s linear; | |||
| } | |||
| @@ -0,0 +1,82 @@ | |||
| // IE9 | |||
| if (typeof console === "undefined") { | |||
| var console = { | |||
| log: function(logMsg) {} | |||
| }; | |||
| } | |||
| var controls, renderer, raycaster, scene, selection, camera; | |||
| // Run on startup | |||
| window.onload = init; | |||
| // Clear the whole scene | |||
| function makeScene() { | |||
| var myScene = new THREE.Scene(); | |||
| var grid1 = makeGrid(10, 10, "lightgray"); | |||
| grid1.position.z = -5; | |||
| myScene.add(grid1); | |||
| var grid2 = makeGrid(10, 10, "lightgray"); | |||
| grid2.rotation.x = Math.PI/2; | |||
| grid2.position.y = -5; | |||
| myScene.add(grid2); | |||
| var grid3 = makeGrid(10, 10, "lightgray"); | |||
| grid3.rotation.y = Math.PI/2; | |||
| grid3.position.x = -5; | |||
| myScene.add(grid3); | |||
| return myScene; | |||
| } | |||
| // Render the current frame to the screen | |||
| function render() { | |||
| renderer.render(scene, camera); | |||
| } | |||
| // This is the main control loop | |||
| function loopForever() { | |||
| controls.update(); | |||
| requestAnimationFrame(loopForever); | |||
| } | |||
| // This just organises kickoff | |||
| function startMainLoop() { | |||
| scene = makeScene(); | |||
| controls.addEventListener("change", render); | |||
| //poll(); | |||
| loopForever(); | |||
| } | |||
| // Called on startup | |||
| function init() { | |||
| // Measure things, get references | |||
| var width = window.innerWidth; | |||
| var height = window.innerHeight; | |||
| // Renderer | |||
| renderer = new THREE.WebGLRenderer({"antialias":true}); | |||
| renderer.setSize(width, height); | |||
| renderer.setClearColor(0xffffff, 1); | |||
| document.querySelector("body").appendChild(renderer.domElement); | |||
| // Time to load the materials | |||
| loadMaterials(); | |||
| // Camera, controls, raycaster | |||
| camera = new THREE.PerspectiveCamera(45, width / height, 0.3, 100); | |||
| controls = new THREE.OrbitControls(camera); | |||
| // Center the camera | |||
| controls.center.set(0, 0, 0); | |||
| controls.rotateSpeed = 0.2; | |||
| camera.position.set(0, 0, 20); | |||
| // Start polling | |||
| //setInterval(poll, 1000); | |||
| // Run | |||
| startMainLoop(); | |||
| } | |||
| @@ -0,0 +1,34 @@ | |||
| var textures = {}; | |||
| var materials = {}; | |||
| // Load the site texture from the data URI | |||
| function loadMaterials(argument) { | |||
| textures.sprite = new THREE.Texture(document.getElementById("ball")); | |||
| textures.sprite.needsUpdate = true; | |||
| var lineStyle = { | |||
| color: "gray", | |||
| transparent: false, | |||
| linewidth: 1 | |||
| }; | |||
| materials.edge = new THREE.LineBasicMaterial(lineStyle); | |||
| var pointStyle = { | |||
| color: 0xcccccc, | |||
| size: 0.1, | |||
| map: textures.sprite, | |||
| alphaTest: 0.5, | |||
| transparent: true, | |||
| }; | |||
| materials.point = new THREE.PointsMaterial(pointStyle); | |||
| var qubitStyle = { | |||
| size: 0.8, | |||
| map: textures.sprite, | |||
| alphaTest: 0.5, | |||
| transparent: true, | |||
| color: "red" | |||
| }; | |||
| materials.qubit = new THREE.PointsMaterial(qubitStyle); | |||
| } | |||
| @@ -0,0 +1,46 @@ | |||
| var url = "ws://localhost:8000/"; | |||
| function doConnect() { | |||
| websocket = new WebSocket(url); | |||
| websocket.onopen = onOpen; | |||
| websocket.onclose = onClose; | |||
| websocket.onmessage = onMessage; | |||
| websocket.onerror = onError; | |||
| } | |||
| function onOpen(evt) { | |||
| writeToScreen("connected\n"); | |||
| doSend("Hello from the browser"); | |||
| } | |||
| function onClose(evt) { | |||
| writeToScreen("disconnected\n"); | |||
| } | |||
| function onMessage(evt) { | |||
| writeToScreen("response: " + evt.data + '\n'); | |||
| } | |||
| function onError(evt) { | |||
| writeToScreen('error: ' + evt.data + '\n'); | |||
| websocket.close(); | |||
| } | |||
| function doSend(message) { | |||
| writeToScreen("sent: " + message + '\n'); | |||
| websocket.send(message); | |||
| } | |||
| function writeToScreen(message) { | |||
| console.log(message); | |||
| } | |||
| function init() { | |||
| doConnect(); | |||
| } | |||
| function doDisconnect() { | |||
| websocket.close(); | |||
| } | |||
| window.addEventListener("load", init, false); | |||
| @@ -0,0 +1,14 @@ | |||
| from setuptools import setup, find_packages | |||
| setup( | |||
| name = "abp", | |||
| version = "0.1", | |||
| packages = find_packages(), | |||
| test_suite = 'tests', | |||
| author = "Pete Shadbolt", | |||
| author_email = "hello@peteshadbolt.co.uk", | |||
| description = "Implements Anders and Briegel in Python", | |||
| license = "MIT", | |||
| keywords = "quantum", | |||
| url = "https://github.com/peteshadbolt/abp/" | |||
| ) | |||