|  |  | @@ -1,61 +0,0 @@ | 
		
	
		
			
			|  |  |  | """ | 
		
	
		
			
			|  |  |  | This is a sketch of a consistent language for defining resource states and lattices. | 
		
	
		
			
			|  |  |  | """ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | import networkx as nx | 
		
	
		
			
			|  |  |  | from abp.fancy import GraphState | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | def union(*graphs): | 
		
	
		
			
			|  |  |  | """ Assumes that all graphs are completely independent and uniquely labelled """ | 
		
	
		
			
			|  |  |  | output = nx.Graph() | 
		
	
		
			
			|  |  |  | output.node = dict(i for g in graphs for i in g.node.items()) | 
		
	
		
			
			|  |  |  | output.adj = dict(i for g in graphs for i in g.adj.items()) | 
		
	
		
			
			|  |  |  | return output | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | def relabel(g, label): | 
		
	
		
			
			|  |  |  | """ Shorthand relabel """ | 
		
	
		
			
			|  |  |  | return nx.relabel_nodes(g, lambda x: (label, x)) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | def fuse(psi, na, nb): | 
		
	
		
			
			|  |  |  | """ Deterministic fusion for testing purposes """ | 
		
	
		
			
			|  |  |  | neighbors_a, neighbors_b = psi.neighbors(na), psi.neighbors(nb) | 
		
	
		
			
			|  |  |  | new_edges = ((i, j) for i in neighbors_a for j in neighbors_b if i != j) | 
		
	
		
			
			|  |  |  | psi.add_edges_from(new_edges) | 
		
	
		
			
			|  |  |  | psi.remove_nodes_from((na, nb)) | 
		
	
		
			
			|  |  |  | return psi | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | def ghz(label): | 
		
	
		
			
			|  |  |  | """ A 3-GHZ state """ | 
		
	
		
			
			|  |  |  | psi = nx.Graph(((0, 1), (1, 2))) | 
		
	
		
			
			|  |  |  | return relabel(psi, label) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | def microcluster(label): | 
		
	
		
			
			|  |  |  | """ A microcluster """ | 
		
	
		
			
			|  |  |  | psi = union(ghz(0), ghz(1), ghz(2)) | 
		
	
		
			
			|  |  |  | psi = fuse(psi, (0, 1), (1, 0)) | 
		
	
		
			
			|  |  |  | psi = fuse(psi, (1, 2), (2, 1)) | 
		
	
		
			
			|  |  |  | return relabel(psi, label) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | def unit_cell(label): | 
		
	
		
			
			|  |  |  | """ A simple ring-like unit cell """ | 
		
	
		
			
			|  |  |  | psi = union(microcluster(0), microcluster(1), microcluster(2), microcluster(3)) | 
		
	
		
			
			|  |  |  | psi = fuse(psi, (0, (0, 2)), (1, (2, 2))) | 
		
	
		
			
			|  |  |  | psi = fuse(psi, (1, (0, 2)), (2, (2, 2))) | 
		
	
		
			
			|  |  |  | psi = fuse(psi, (2, (0, 2)), (3, (2, 2))) | 
		
	
		
			
			|  |  |  | psi = fuse(psi, (3, (0, 2)), (0, (2, 2))) | 
		
	
		
			
			|  |  |  | return relabel(psi, label) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | def position(node): | 
		
	
		
			
			|  |  |  | print node | 
		
	
		
			
			|  |  |  | return {} | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | def annotate(g, f): | 
		
	
		
			
			|  |  |  | """ Annotate a graph """ | 
		
	
		
			
			|  |  |  | for node in g.nodes(): | 
		
	
		
			
			|  |  |  | g.node[node].update(f(node)) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if __name__ == '__main__': | 
		
	
		
			
			|  |  |  | psi = union(unit_cell((0, 0)), unit_cell((2, 0))) | 
		
	
		
			
			|  |  |  | annotate(psi, position) | 
		
	
		
			
			|  |  |  | g = GraphState(psi) | 
		
	
		
			
			|  |  |  | 
 |