.. _general_embedding:

=================
General Embedding
=================

General embedding refers to embedding that may be useful for any type of graph.

.. include:: ../README.rst
  :start-after: general-embedding-start-marker
  :end-before: general-embedding-end-marker

.. autofunction:: minorminer.find_embedding

....

Examples
========

This example minor embeds a triangular source K3 graph onto a square target graph.

.. code-block:: python

    from minorminer import find_embedding

    # A triangle is a minor of a square.
    triangle = [(0, 1), (1, 2), (2, 0)]
    square = [(0, 1), (1, 2), (2, 3), (3, 0)]

    # Find an assignment of sets of square variables to the triangle variables
    embedding = find_embedding(triangle, square, random_seed=10)
    print(len(embedding))  # 3, one set for each variable in the triangle
    print(embedding)
    # We don't know which variables will be assigned where, here are a
    # couple possible outputs:
    # [[0, 1], [2], [3]]
    # [[3], [1, 0], [2]]

.. figure:: ../_images/Embedding_TriangularSquare.png
    :name: Embedding_TriangularSquare
    :scale: 60 %
    :alt: Embedding a triangular source graph into a square target graph

    Embedding a :math:`K_3` source graph into a square target graph by chaining two
    target nodes to represent one source node.

....

This minorminer execution of the example requires that source variable 0 always
be assigned to target node 2.

.. code-block:: python

    embedding = find_embedding(triangle, square, fixed_chains={0: [2]})
    print(embedding)
    # [[2], [3, 0], [1]]
    # [[2], [1], [0, 3]]
    # And more, but all of them start with [2]

....

This minorminer execution of the example suggests that source variable 0 be
assigned to target node 2 as a starting point for finding an embedding.

.. code-block:: python

    embedding = find_embedding(triangle, square, initial_chains={0: [2]})
    print(embedding)
    # [[2], [0, 3], [1]]
    # [[0], [3], [1, 2]]
    # Output where source variable 0 has switched to a different target node is possible.

....

This example minor embeds a fully connected K6 graph into a 30-node random
regular graph of degree 3.

.. code-block:: python

    import networkx as nx

    clique = nx.complete_graph(6).edges()
    target_graph = nx.random_regular_graph(d=3, n=30).edges()

    embedding = find_clique_embedding(clique, target_graph)

    print(embedding)
    # There are many possible outputs, and sometimes it might fail
    # and return an empty list
    # One run returned the following embedding:
    {0: [10, 9, 19, 8],
    1: [18, 7, 0, 12, 27],
    2: [1, 17, 22],
    3: [16, 28, 4, 21, 15, 23, 25],
    4: [11, 24, 13],
    5: [2, 14, 26, 5, 3]}

.. figure:: ../_images/Embedding_K6Random3.png
    :name: Embedding_K6Random3
    :scale: 80 %
    :alt: Embedding a K6 graph into a 30-node random graph

    Embedding a :math:`K_6` source graph (upper left) into a 30-node random target graph of
    degree 3 (upper right) by chaining several target nodes to represent one source node (bottom).
    The graphic of the embedding clusters chains representing nodes in the source graph: the
    cluster of red nodes is a chain of target nodes that represent source node 0, the orange
    nodes represent source node 1, and so on.
