K idZddlZddlmZddlmZddlmZddgZ edejdd ddd d Z ed ejdd ddd dZ y)zFunctions 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_usingpartial_duplication_graphduplication_divergence_graphT)graphs returns_graph create_usingct|dd}|dks|dkDs |dks|dkDr d}t|||kDr tdtj||}t ||D]}|j d|dz } |j |ttj|| D](} |j|ks|j|| *|j|ks|j|| |S)aReturns 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`. 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. Fdirected multigraphrz3partial duplication graph must have 0 <= p, q <= 1.z+partial duplication graph must have n <= N.) rrnxcomplete_graphrangerandintadd_nodelist all_neighborsrandomadd_edge) Nnpqseedr msgGnew_nodesrc_nodenbr_nodes e/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/networkx/generators/duplication.pyrrsj&lUuUL1uAQ!a%CC  1uIJJ !\*A!QK+<<8a<0 8R--a:; /H{{}q  8X. / ;;=1  JJx *+ Hc|dkDs|dkrd|d}tj||dkrd}tj|t|dd}tj| }|j ddd}||kr|j t |}|j|d}|j|D]*} |j|ks|j || d },|s|j|n|dz }||kr|S) aReturns 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`. 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. rrzNetworkXError p=z is not in [0,1].r'z$n must be greater than or equal to 2Frr T) rrr empty_graphrchoicerr neighborsr remove_node) rrrr r r!i random_nodeflagnbrs r%rras\ 1uA #45s##1u4s##%lUuUL L1AJJq! A a%kk$q'*  1 ;;{+ C{{}q  1c"    MM!  FA# a%$ Hr&)N) __doc__networkxrnetworkx.exceptionrnetworkx.utilsrnetworkx.utils.miscr__all__ _dispatchablerrr&r%r9s,*2 &(F GT2K TK 3K \T2K $K 3K r&