
    \Mh                         d Z ddlZddlmZ ddgZ ed           ed           ej        d	          dd                                    Z ej        dd          d             ZdS )zTFunctions related to the Mycielski Operation and the Mycielskian family
of graphs.

    N)not_implemented_formycielskianmycielski_graphdirected
multigraphT)returns_graph   c                    t          j        |           }t          |          D ]}|                                |                    t          dz                       t          |                                          }|                    fd|D                        |                    fd|D                        |                    dz             |                    fdt                    D                        |S )a^  Returns the Mycielskian of a simple, undirected graph G

    The Mycielskian of graph preserves a graph's triangle free
    property while increasing the chromatic number by 1.

    The Mycielski Operation on a graph, :math:`G=(V, E)`, constructs a new
    graph with :math:`2|V| + 1` nodes and :math:`3|E| + |V|` edges.

    The construction is as follows:

    Let :math:`V = {0, ..., n-1}`. Construct another vertex set
    :math:`U = {n, ..., 2n}` and a vertex, `w`.
    Construct a new graph, `M`, with vertices :math:`U \bigcup V \bigcup w`.
    For edges, :math:`(u, v) \in E` add edges :math:`(u, v), (u, v + n)`, and
    :math:`(u + n, v)` to M. Finally, for all vertices :math:`u \in U`, add
    edge :math:`(u, w)` to M.

    The Mycielski Operation can be done multiple times by repeating the above
    process iteratively.

    More information can be found at https://en.wikipedia.org/wiki/Mycielskian

    Parameters
    ----------
    G : graph
        A simple, undirected NetworkX graph
    iterations : int
        The number of iterations of the Mycielski operation to
        perform on G. Defaults to 1. Must be a non-negative integer.

    Returns
    -------
    M : graph
        The Mycielskian of G after the specified number of iterations.

    Notes
    -----
    Graph, node, and edge data are not necessarily propagated to the new graph.

       c              3   ,   K   | ]\  }}||z   fV  d S N .0uvns      ]/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/networkx/generators/mycielski.py	<genexpr>zmycielskian.<locals>.<genexpr>?   s/      ::1!QU::::::    c              3   ,   K   | ]\  }}|z   |fV  d S r   r   r   s      r   r   zmycielskian.<locals>.<genexpr>@   s/      ::1!a%::::::r   c              3   ,   K   | ]}|z   d z  fV  dS )r   Nr   )r   r   r   s     r   r   zmycielskian.<locals>.<genexpr>B   s/      ::A!a%Q::::::r   )	nxconvert_node_labels_to_integersrangenumber_of_nodesadd_nodes_fromlistedgesadd_edges_fromadd_node)G
iterationsMi	old_edgesr   s        @r   r   r      s   Z 	*1--A: ; ;	q!a%)))OO		::::	::::::	::::	::::::	

1q5	::::q:::::::Hr   )graphsr   c                     | dk     rt          j        d          | dk    rt          j        d          S t          t          j        d          | dz
            S )a  Generator for the n_th Mycielski Graph.

    The Mycielski family of graphs is an infinite set of graphs.
    :math:`M_1` is the singleton graph, :math:`M_2` is two vertices with an
    edge, and, for :math:`i > 2`, :math:`M_i` is the Mycielskian of
    :math:`M_{i-1}`.

    More information can be found at
    http://mathworld.wolfram.com/MycielskiGraph.html

    Parameters
    ----------
    n : int
        The desired Mycielski Graph.

    Returns
    -------
    M : graph
        The n_th Mycielski Graph

    Notes
    -----
    The first graph in the Mycielski sequence is the singleton graph.
    The Mycielskian of this graph is not the :math:`P_2` graph, but rather the
    :math:`P_2` graph with an extra, isolated vertex. The second Mycielski
    graph is the :math:`P_2` graph, so the first two are hard coded.
    The remaining graphs are generated using the Mycielski operation.

    r	   zmust satisfy n >= 1r   )r   NetworkXErrorempty_graphr   
path_graph)r   s    r   r   r   G   sY    @ 	1uu4555Avv~a    2=++QU333r   )r	   )	__doc__networkxr   networkx.utilsr   __all___dispatchabler   r   r   r   r   <module>r1      s    
     . . . . . .+
, Z  \""%%%5 5 5 &% #" ! 5p T222&4 &4 32&4 &4 &4r   