Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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