| 
				
				
				
				 | 
			
			 | 
			@@ -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) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  |