§
    bŠtjÇ  ã                   óþ   — d Z ddlZddlmZ ddlmZ ddlmZ ddgZ	 ed¦  «         ej
        dd	¬
¦  «        dddœd„¦   «         ¦   «         Z ed¦  «         ej
        dd	¬
¦  «        dddœd„¦   «         ¦   «         ZdS )zøFunctions for generating graphs based on the "duplication" method.

These graph generators start with a small initial graph then duplicate
nodes and (partially) duplicate their edges. These functions are
generally inspired by biological networks.

é    N)ÚNetworkXError)Úpy_random_state)Úcheck_create_usingÚpartial_duplication_graphÚduplication_divergence_graphé   T)ÚgraphsÚreturns_graph©Úcreate_usingc                óT  — t          |dd¬¦  «        }|dk     s|dk    s|dk     s|dk    rd}t          |¦  «        ‚|| k    rt          d¦  «        ‚t          j        ||¦  «        }t	          || ¦  «        D ]±}|                     d|dz
  ¦  «        }	|                     |¦  «         t          t          j        ||	¦  «        ¦  «        D ]0}
| 	                    ¦   «         |k     r| 
                    ||
¦  «         Œ1| 	                    ¦   «         |k     r| 
                    ||	¦  «         Œ²|S )aµ  Returns a random graph using the partial duplication model.

    Parameters
    ----------
    N : int
        The total number of nodes in the final graph.

    n : int
        The number of nodes in the initial clique.

    p : float
        The probability of joining each neighbor of a node to the
        duplicate node. Must be a number in the between zero and one,
        inclusive.

    q : float
        The probability of joining the source node to the duplicate
        node. Must be a number in the between zero and one, inclusive.

    seed : integer, random_state, or None (default)
        Indicator of random number generation state.
        See :ref:`Randomness<randomness>`.

    create_using : Graph constructor, optional (default=nx.Graph)
        Graph type to create. If graph instance, then cleared before populated.
        Multigraph and directed types are not supported and raise a ``NetworkXError``.

    Notes
    -----
    A graph of nodes is grown by creating a fully connected graph
    of size `n`. The following procedure is then repeated until
    a total of `N` nodes have been reached.

    1. A random node, *u*, is picked and a new node, *v*, is created.
    2. For each neighbor of *u* an edge from the neighbor to *v* is created
       with probability `p`.
    3. An edge from *u* to *v* is created with probability `q`.

    This algorithm appears in [1].

    This implementation allows the possibility of generating
    disconnected graphs.

    References
    ----------
    .. [1] Knudsen Michael, and Carsten Wiuf. "A Markov chain approach to
           randomly grown graphs." Journal of Applied Mathematics 2008.
           <https://doi.org/10.1155/2008/190836>

    F©ÚdirectedÚ
multigraphr   é   z3partial duplication graph must have 0 <= p, q <= 1.z+partial duplication graph must have n <= N.)r   r   ÚnxÚcomplete_graphÚrangeÚrandintÚadd_nodeÚlistÚall_neighborsÚrandomÚadd_edge)ÚNÚnÚpÚqÚseedr   ÚmsgÚGÚnew_nodeÚsrc_nodeÚnbr_nodes              ú]/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/networkx/generators/duplication.pyr   r      s6  € õj & l¸UÈuÐUÑUÔU€LØˆ1‚u€u��A’�˜˜Qš˜ ! a¢% %ØCˆÝ˜CÑ Ô Ð Øˆ1‚u€uÝÐIÑJÔJÐJå
Ô˜!˜\Ñ*Ô*€AÝ˜!˜Q‘K”Kð +ð +ˆà—<’<  8¨a¡<Ñ0Ô0ˆð 	
�
Š
�8ÑÔÐõ �RÔ-¨a°Ñ:Ô:Ñ;Ô;ð 	/ð 	/ˆHà�{Š{‰}Œ}˜qÒ Ð Ø—
’
˜8 XÑ.Ô.Ð.øð �;Š;‰=Œ=˜1ÒÐØ�JŠJ�x Ñ*Ô*Ð*øØ€Hó    é   c                ó\  — |dk    s|dk     rd|› d�}t          j        |¦  «        ‚| dk     rd}t          j        |¦  «        ‚t          |dd¬¦  «        }t          j        |¬	¦  «        }|                     dd¦  «         d}|| k     r¤|                     t          |¦  «        ¦  «        }|                     |¦  «         d}|                     |¦  «        D ]2}	| 	                    ¦   «         |k     r|                     ||	¦  «         d
}Œ3|s| 
                    |¦  «         n|dz  }|| k     °¤|S )a  Returns an undirected graph using the duplication-divergence model.

    A graph of `n` nodes is created by duplicating the initial nodes
    and retaining edges incident to the original nodes with a retention
    probability `p`.

    Parameters
    ----------
    n : int
        The desired number of nodes in the graph.
    p : float
        The probability for retaining the edge of the replicated node.
    seed : integer, random_state, or None (default)
        Indicator of random number generation state.
        See :ref:`Randomness<randomness>`.
    create_using : Graph constructor, optional (default=nx.Graph)
        Graph type to create. If graph instance, then cleared before populated.
        Multigraph and directed types are not supported and raise a ``NetworkXError``.

    Returns
    -------
    G : Graph

    Raises
    ------
    NetworkXError
        If `p` is not a valid probability.
        If `n` is less than 2.

    Notes
    -----
    This algorithm appears in [1].

    This implementation disallows the possibility of generating
    disconnected graphs.

    References
    ----------
    .. [1] I. Ispolatov, P. L. Krapivsky, A. Yuryev,
       "Duplication-divergence model of protein interaction network",
       Phys. Rev. E, 71, 061911, 2005.

    r   r   zNetworkXError p=z is not in [0,1].r'   z$n must be greater than or equal to 2Fr   r   T)r   r   r   Úempty_graphr   Úchoicer   r   Ú	neighborsr   Úremove_node)
r   r   r   r   r    r!   ÚiÚrandom_nodeÚflagÚnbrs
             r%   r   r   a   sM  € ð\ 	ˆ1‚u€u��A’�Ø5 Ð5Ð5Ð5ˆÝÔ˜sÑ#Ô#Ð#Øˆ1‚u€uØ4ˆÝÔ˜sÑ#Ô#Ð#å% l¸UÈuÐUÑUÔU€LÝ
Œ LÐ1Ñ1Ô1€Að ‡J‚Jˆq�!ÑÔÐØ	€AØ
ˆaŠ%ˆ%à—k’k¥$ q¡'¤'Ñ*Ô*ˆà	�
Š
�1‰ŒˆàˆØ—;’;˜{Ñ+Ô+ð 	ð 	ˆCØ�{Š{‰}Œ}˜qÒ Ð à—
’
˜1˜cÑ"Ô"Ð"Ø�øØð 	à�MŠM˜!ÑÔÐÐð �‰FˆAð# ˆaŠ%ˆ%ð$ €Hr&   )N)Ú__doc__Únetworkxr   Únetworkx.exceptionr   Únetworkx.utilsr   Únetworkx.utils.miscr   Ú__all__Ú_dispatchabler   r   © r&   r%   ú<module>r9      s  ððð ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø *Ð *Ð *Ð *Ð *Ð *Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2à&Ð(FÐ
G€ð €�ÑÔØ€Ô˜¨TÐ2Ñ2Ô2ðKÀTð Kð Kð Kð Kñ 3Ô2ñ ÔðKð\ €�ÑÔØ€Ô˜¨TÐ2Ñ2Ô2ðKÀ$ð Kð Kð Kð Kñ 3Ô2ñ ÔðKð Kð Kr&   