|
|
@@ -0,0 +1,61 @@ |
|
|
|
from abp import GraphState, VizClient |
|
|
|
from abp.util import xyz |
|
|
|
import numpy as np |
|
|
|
import time |
|
|
|
import itertools |
|
|
|
import networkx as nx |
|
|
|
import requests |
|
|
|
import json |
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
def raussendorf(N=3): |
|
|
|
""" Generates raussendorf lattice """ |
|
|
|
nodes, edges = lattice(raussendorf_unit_cell, (N, N, N)) |
|
|
|
|
|
|
|
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]) |
|
|
|
|
|
|
|
return psi |
|
|
|
|
|
|
|
|