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.
The state is initialized as a blank canvas without any qubits.
Arbitrary 3D structures can be constructed by rotating the grid.
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.
The underlying graph state simulator is based on Anders’ and Briegel's method. Full docs for the Python package are here.
Here's a complete example of sending a state from Python to the server:
:::python
import requests, json, abp
# Make a new graph and position the nodes
g = abp.NXGraphState(range(10))
g.layout()
# Serialize
data = json.dumps(test_graph().to_json())
# Post to the server
URL = "https://abv.peteshadbolt.co.uk/oranges-arkansas-mexico-fish"
requests.post("{}/graph".format(URL), data=data)
/<uuid>: Displays the state using Three.js/<uuid>/graph:
GET returns JSON representing the statePOST accepts JSON in the same format and overwrites the state in memory/<uuid>/edit:
POST accepts edit commands such as cz, add_node etc.doc/: Shows this pageAn HTTP GET to /<uuid>/graph will return some JSON.
$ curl https://abv.peteshadbolt.co.uk/<uuid>/graph
{
"adj": {
"(0, 0, 1)": {
"(0, 1, 1)": {},
"(1, 0, 1)": {}
},
"(0, 0, 3)": {
"(0, 1, 3)": {},
"(1, 0, 3)": {}
},
"(0, 0, 5)": {
"(0, 1, 5)": {},
"(1, 0, 5)": {}
},
"(0, 1, 0)": {
"(0, 1, 1)": {},
"(1, 1, 0)": {}
},
"(0, 1, 1)": {
"(0, 0, 1)": {},
...
The top-level keys are node and adj. These model the node metadata and adjacency matrix respectively.
Each node has
position ({x:<> y:<> z:<>})vop (integer, ignore for now)color, label, etc.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.
Here's an example of a graph (A-B C):
:::python
{'adj': {0: {1: {}}, 1: {0: {}}, 2: {}},
'node': {
0: {'position': {'x': 0, 'y': 0, 'z': 0}, 'vop': 0},
1: {'position': {'x': 1, 'y': 0, 'z': 0}, 'vop': 0},
2: {'position': {'x': 2, 'y': 0, 'z': 0}, 'vop': 10}}}