| @@ -0,0 +1,57 @@ | |||||
| from abp import GraphState, VizClient | |||||
| from abp.util import xyz | |||||
| import numpy as np | |||||
| import time | |||||
| import itertools | |||||
| import networkx as nx | |||||
| raussendorf_unit_cell = ( | |||||
| ((1, 0, 0), (1, 1, 0)), ((0, 1, 0), (1, 1, 0)), | |||||
| ((1, 2, 0), (1, 1, 0)), ((2, 1, 0), (1, 1, 0)), | |||||
| ((1, 2, 2), (1, 1, 2)), ((0, 1, 2), (1, 1, 2)), | |||||
| ((1, 0, 2), (1, 1, 2)), ((2, 1, 2), (1, 1, 2)), | |||||
| ((0, 1, 0), (0, 1, 1)), ((0, 0, 1), (0, 1, 1)), | |||||
| ((0, 1, 2), (0, 1, 1)), ((0, 2, 1), (0, 1, 1)), | |||||
| ((2, 1, 0), (2, 1, 1)), ((2, 0, 1), (2, 1, 1)), | |||||
| ((2, 1, 2), (2, 1, 1)), ((2, 2, 1), (2, 1, 1)), | |||||
| ((1, 0, 0), (1, 0, 1)), ((0, 0, 1), (1, 0, 1)), | |||||
| ((1, 0, 2), (1, 0, 1)), ((2, 0, 1), (1, 0, 1)), | |||||
| ((1, 2, 0), (1, 2, 1)), ((0, 2, 1), (1, 2, 1)), | |||||
| ((1, 2, 2), (1, 2, 1)), ((2, 2, 1), (1, 2, 1))) | |||||
| def add_offset(vector, offset): | |||||
| """ Offset a vector in n-dimensional space """ | |||||
| return tuple(v + o*2 for v, o in zip(vector, offset)) | |||||
| def offset_unit_cell(unit_cell, offset): | |||||
| """ Offset a unit cell """ | |||||
| return {(add_offset(a, offset), add_offset(b, offset)) for a, b in unit_cell} | |||||
| def lattice(unit_cell, size): | |||||
| """ Generate a lattice from a unit cell """ | |||||
| edges = set() | |||||
| for offset in itertools.product(*map(range, size)): | |||||
| edges |= offset_unit_cell(unit_cell, offset) | |||||
| nodes = set(itertools.chain(*edges)) | |||||
| return nodes, edges | |||||
| nodes, edges = lattice(raussendorf_unit_cell, (2, 2, 3 )) | |||||
| psi = GraphState() | |||||
| for node in nodes: | |||||
| x, y, z = node | |||||
| color = "red" if (x+y+z) % 2 > 0 else "black" | |||||
| print color | |||||
| psi.add_qubit(node, position=xyz(*node), color=color) | |||||
| psi.act_hadamard(node) | |||||
| for edge in edges: | |||||
| psi.act_cz(edge[0], edge[1]) | |||||
| v = VizClient() | |||||
| v.update(psi) | |||||