コード例 #1
0
ファイル: embedding.py プロジェクト: joseppinilla/embera
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
コード例 #2
0
ファイル: embedding.py プロジェクト: joseppinilla/embera
def translate(T, embedding, origin=(0, 0)):
    """ Transport the embedding on the same graph to re-distribute qubit
        assignments.

        Optional arguments:
            origin: (tuple)
                A tuple of tile coordinates pointing to where the left-uppermost
                occupied tile in the embedding should move to. All other tiles
                are moved relative to the origin.

        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)
            >>> origin = (2,3)
            >>> new_embedding = embera.transform.embedding.translate(T,embedding,origin)
            >>> dnx.draw_chimera_embedding(T,new_embedding,node_size=10)
    """
    tiling = DWaveNetworkXTiling(T)
    shape = tiling.shape
    # Initialize offset
    offset = shape
    # Find margins
    for v, chain in embedding.items():
        for q in chain:
            tile = np.array(tiling.get_tile(q))
            offset = [min(t, o) for t, o in zip(tile, offset)]
    # Define flips
    m, n = tiling.shape
    t = tiling.graph['tile']
    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_tile = tuple(
                np.array(tile) - np.array(offset) + np.array(origin))
            new_q = tiling.set_tile(q, new_tile)
            new_chain.append(new_q)
        new_embedding[v] = new_chain

    return new_embedding
コード例 #3
0
ファイル: embedding.py プロジェクト: joseppinilla/embera
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