Simulate graph states in the browser
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

doc.md 3.2KB

6 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. # Graph state server
  2. Graph states are a way of efficiently representing the state of a system of qubits. This tool simulates the behaviour of the graph state and shows an interactive 3D representation of the state. Interaction with the simulation is done either by clicking on things in the web browser or through an API.
  3. ## Using the interface
  4. The state is initialized as a blank canvas without any qubits.
  5. - Click on the grid to make a new qubit
  6. - Hold Ctrl and click on a qubit to act a Hadamard gate
  7. - Click on a qubit to view its properties
  8. - Select a qubit, then shift-click another node to act a CZ gate
  9. - Press space to rotate the grid
  10. Arbitrary 3D structures can be constructed by rotating the grid.
  11. The URL contains a unique ID such as `oranges-arkansas-mexico-fish`. You can share this URL with other people to share your screen and edit collaboratively.
  12. ## Python package
  13. The underlying graph state simulator is based on Anders' and Briegel's method. Full docs for the Python package are [here](https://peteshadbolt.co.uk/static/abp/).
  14. ## API
  15. Here's a complete example of sending a state from Python to the server:
  16. :::python
  17. import requests, json, abp
  18. # Make a new graph and position the nodes
  19. g = abp.NXGraphState(range(10))
  20. g.layout()
  21. # Serialize
  22. data = json.dumps(test_graph().to_json())
  23. # Post to the server
  24. URL = "https://abv.peteshadbolt.co.uk/oranges-arkansas-mexico-fish"
  25. requests.post("{}/graph".format(URL), data=data)
  26. ### Endpoints
  27. - `/<uuid>`: Displays the state using Three.js
  28. - `/<uuid>/graph`:
  29. - `GET` returns JSON representing the state
  30. - `POST` accepts JSON in the same format and overwrites the state in memory
  31. - `/<uuid>/edit`:
  32. - `POST` accepts edit commands such as `cz`, `add_node` etc.
  33. - `doc/`: Shows this page
  34. ### Data format
  35. An HTTP GET to `/<uuid>/graph` will return some JSON.
  36. :::bash
  37. $ curl https://abv.peteshadbolt.co.uk/<uuid>/graph
  38. outputs
  39. :::python
  40. {"node":
  41. {"30":
  42. {"position":
  43. {"y": 3.245091885135617, "x": -1.0335390368621762, "z": 0.12485495696298532}, "vop": 0}, "28":
  44. {"position":
  45. {"y": 0.1811335599620998, "x": 3.7102305790943295, "z": 0.3375519427305571}, "vop": 0}, "29":
  46. {"position":
  47. {"y": -1.834182888403804, "x": 1.5968911365745622, "z": 2.8585980299131886
  48. ...
  49. The top-level keys are `node` and `adj`. These model the node metadata and adjacency matrix respectively.
  50. Each `node` has
  51. - a `position` (`{x:<> y:<> z:<>}`)
  52. - a `vop` (integer, ignore for now)
  53. - and could also have a `color`, `label`, etc.
  54. `adj` uses the same data structure as `networkx` to efficiently represent sparse adjacency matrices. For each key `i` in `adj`, the value of `adj[i]` is itself a map whose keys `j` correspond to the ids of nodes connected to `i`. The value of `adj[i][j]` is a map which is usually empty but which could be used to store metadata about the edge.
  55. Here's an example of a graph `(A-B C)`:
  56. :::python
  57. {'adj': {0: {1: {}}, 1: {0: {}}, 2: {}},
  58. 'node': {
  59. 0: {'position': {'x': 0, 'y': 0, 'z': 0}, 'vop': 0},
  60. 1: {'position': {'x': 1, 'y': 0, 'z': 0}, 'vop': 0},
  61. 2: {'position': {'x': 2, 'y': 0, 'z': 0}, 'vop': 10}}}