o
    £&?e•  ã                   @   sl   d Z ddlZddlmZ ddlmZ ddgZedƒejdddd	d„ƒƒZ	ed
ƒej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Úpartial_duplication_graphÚduplication_divergence_graphé   )Zgraphsc           
      C   sº   |dk s|dks|dk s|dkrd}t |ƒ‚|| krt dƒ‚t |¡}t|| ƒD ]2}| d|d ¡}| |¡ tt ||¡ƒD ]}	| ¡ |k rM| 	||	¡ q?| ¡ |k rZ| 	||¡ q(|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>`.

    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>

    r   é   z3partial duplication graph must have 0 <= p, q <= 1.z+partial duplication graph must have n <= N.)
r   ÚnxZcomplete_graphÚrangeÚrandintÚadd_nodeÚlistZall_neighborsÚrandomÚadd_edge)
ÚNÚnÚpÚqÚseedÚmsgÚGÚnew_nodeZsrc_nodeZneighbor_node© r   ú`/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/networkx/generators/duplication.pyr      s"    1

€€é   c           	      C   sÈ   |dks|dk rd|› d}t  |¡‚| dk rd}t  |¡‚t  ¡ }| dd¡ d}|| k rb| t|ƒ¡}| |¡ d}| |¡D ]}| ¡ |k rQ| ||¡ d}qA|sZ| 	|¡ n|d7 }|| k s.|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>`.

    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 2FT)
r   r   ZGraphr   Úchoicer   r   Z	neighborsr   Úremove_node)	r   r   r   r   r   ÚiZrandom_nodeÚflagZnbrr   r   r   r   Z   s.   +


€ï)N)Ú__doc__Znetworkxr   Znetworkx.exceptionr   Znetworkx.utilsr   Ú__all__Ú	_dispatchr   r   r   r   r   r   Ú<module>   s    
I
