def rotate(T, embedding, theta=90): """ Rotate the embedding on the same graph to re-distribute qubit assignments. If a perfect fit isn't found, due to disabled qubits, the invalid embedding is still returned. Optional arguments: theta: ({0,90,180,270,360,-90,-180,-270}) Rotation angle. Example: >>> import embera >>> import networkx as nx >>> import dwave_networkx as dnx >>> S = nx.complete_graph(11) >>> T = dnx.chimera_graph(7) >>> embedding = minorminer.find_embedding(S,T) >>> dnx.draw_chimera_embedding(T,embedding,node_size=10) >>> theta = 270 >>> new_embedding = embera.transform.embedding.rotate(T,embedding,theta) >>> dnx.draw_chimera_embedding(T,new_embedding,node_size=10) """ tiling = DWaveNetworkXTiling(T) shape = np.array(tiling.shape) # Define rotations m, n = tiling.shape t = tiling.graph['tile'] if theta in [90, -270]: new_tile = lambda i, j: (j, m - i - 1) new_shore = lambda shore: 0 if shore else 1 new_k = lambda k, shore: t - k - 1 if shore else k elif theta in [180, -180]: new_tile = lambda i, j: (m - i - 1, n - j - 1) new_shore = lambda shore: shore new_k = lambda k, shore: t - k - 1 elif theta in [-90, 270]: new_tile = lambda i, j: (n - j - 1, i) new_shore = lambda shore: 0 if shore else 1 new_k = lambda k, shore: k if shore else t - k - 1 elif theta in [0, 360]: return embedding else: raise ValueError("Value of theta not supported") # Rotate all qubits by chain new_embedding = {} for v, chain in embedding.items(): new_chain = [] for q in chain: k = tiling.get_k(q) tile = tiling.get_tile(q) shore = tiling.get_shore(q) new_coordinates = (new_tile(*tile), new_shore(shore), new_k(k, shore)) new_chain.append(next(tiling.get_qubits(*new_coordinates))) new_embedding[v] = new_chain return new_embedding
def mirror(T, embedding, axis=0): """ Flip the embedding on the same graph to re-distribute qubit assignments. Optional arguments: axis: {0,1} 0 toflip on horizontal and 1 to flip on vertical Example: >>> import embera >>> import networkx as nx >>> import dwave_networkx as dnx >>> S = nx.complete_graph(11) >>> T = dnx.chimera_graph(7) >>> embedding = minorminer.find_embedding(S,T) >>> dnx.draw_chimera_embedding(T,embedding,node_size=10) >>> axis = 1 >>> new_embedding = embera.transform.embedding.mirror(T,embedding,axis) >>> dnx.draw_chimera_embedding(T,new_embedding,node_size=10) """ tiling = DWaveNetworkXTiling(T) shape = np.array(tiling.shape) # Define flips m, n = tiling.shape t = tiling.graph['tile'] if axis is 0: new_tile = lambda i, j: (i, n - j - 1) new_k = lambda k, shore: k if shore else t - k - 1 elif axis is 1: new_tile = lambda i, j: (m - i - 1, j) new_k = lambda k, shore: t - k - 1 if shore else k else: raise ValueError("Value of axis not supported") # Mirror all qubits by chain new_embedding = {} for v, chain in embedding.items(): new_chain = [] for q in chain: k = tiling.get_k(q) tile = tiling.get_tile(q) shore = tiling.get_shore(q) new_coordinates = (new_tile(*tile), shore, new_k(k, shore)) new_chain.append(next(tiling.get_qubits(*new_coordinates))) new_embedding[v] = new_chain return new_embedding