ó
    êZhP=  ã                   ó
  • S r SSKrSSKJr  SSKrSSKJr  SSKJ	r	J
r
Jr  / SQr\
" S5      \R                  " SSS	9SS
 j5       5       r\
" S5      \R                  " SSS	9SS j5       5       r\
" S5      \R                  " SSS	9SS j5       5       r\
" S5      \R                  " SSS	9       SS j5       5       r\
" S5      \R                  " SSS	9SS j5       5       r\
" S5      \R                  " SSS	9SS j5       5       rg)zd
Generators for some directed graphs, including growing network (GN) graphs and
scale-free graphs.

é    N)ÚCounter)Úempty_graph)Údiscrete_sequenceÚpy_random_stateÚweighted_choice)Úgn_graphÚ	gnc_graphÚ	gnr_graphÚrandom_k_out_graphÚscale_free_graphé   T)ÚgraphsÚreturns_graphc                 óª  • [        SU[        R                  S9nUR                  5       (       d  [        R                  " S5      eUc  S nU S:X  a  U$ UR                  SS5        SS/n[        SU 5       HU  nU Vs/ s H
  oq" U5      PM     nn[        SXƒS9S   n	UR                  Xi5        UR                  S5        XY==   S-  ss'   MW     U$ s  snf )aÊ  Returns the growing network (GN) digraph with `n` nodes.

The GN graph is built by adding nodes one at a time with a link to one
previously added node.  The target node for the link is chosen with
probability based on degree.  The default attachment kernel is a linear
function of the degree of a node.

The graph is always a (directed) tree.

Parameters
----------
n : int
    The number of nodes for the generated graph.
kernel : function
    The attachment kernel.
create_using : NetworkX graph constructor, optional (default DiGraph)
    Graph type to create. If graph instance, then cleared before populated.
seed : integer, random_state, or None (default)
    Indicator of random number generation state.
    See :ref:`Randomness<randomness>`.

Examples
--------
To create the undirected GN graph, use the :meth:`~DiGraph.to_directed`
method::

>>> D = nx.gn_graph(10)  # the GN graph
>>> G = D.to_undirected()  # the undirected version

To specify an attachment kernel, use the `kernel` keyword argument::

>>> D = nx.gn_graph(10, kernel=lambda x: x**1.5)  # A_k = k^1.5

References
----------
.. [1] P. L. Krapivsky and S. Redner,
       Organization of Growing Random Networks,
       Phys. Rev. E, 63, 066123, 2001.
é   ©Údefaultú+create_using must indicate a Directed Graphc                 ó   • U $ ©N© )Úxs    Úi/home/gothic/public_html/Fooocus/fooocus_env/lib/python3.13/site-packages/networkx/generators/directed.pyÚkernelÚgn_graph.<locals>.kernelG   s   € ØˆHó    r   é   )ÚdistributionÚseed)	r   ÚnxÚDiGraphÚis_directedÚNetworkXErrorÚadd_edgeÚranger   Úappend)
Únr   Úcreate_usingr   ÚGÚdsÚsourceÚdÚdistÚtargets
             r   r   r      sÊ   € ôT 	�A�|¬R¯Z©ZÑ8€AØ�=‰=�?‰?Ü×ÒÐLÓMÐMà�~ò	ð 	ˆAƒvØˆà‡J�Jˆq�!ÔØ
ˆQˆ€Bä˜˜1–+ˆá#%Ó&¢2˜a��q–	¡2ˆÐ&ä" 1°4ÑCÀAÑFˆØ	�
‰
�6Ô"Ø
�	‰	�!ŒØ
‹
�a‰�
ñ ð €Hùò 's   Á<Cc                 ór  • [        SU[        R                  S9nUR                  5       (       d  [        R                  " S5      eU S:X  a  U$ [        SU 5       HZ  nUR                  SU5      nUR                  5       U:  a   US:w  a  [        UR                  U5      5      nUR                  XV5        M\     U$ )az  Returns the growing network with redirection (GNR) digraph with `n`
nodes and redirection probability `p`.

The GNR graph is built by adding nodes one at a time with a link to one
previously added node.  The previous target node is chosen uniformly at
random.  With probability `p` the link is instead "redirected" to the
successor node of the target.

The graph is always a (directed) tree.

Parameters
----------
n : int
    The number of nodes for the generated graph.
p : float
    The redirection probability.
create_using : NetworkX graph constructor, optional (default DiGraph)
    Graph type to create. If graph instance, then cleared before populated.
seed : integer, random_state, or None (default)
    Indicator of random number generation state.
    See :ref:`Randomness<randomness>`.

Examples
--------
To create the undirected GNR graph, use the :meth:`~DiGraph.to_directed`
method::

>>> D = nx.gnr_graph(10, 0.5)  # the GNR graph
>>> G = D.to_undirected()  # the undirected version

References
----------
.. [1] P. L. Krapivsky and S. Redner,
       Organization of Growing Random Networks,
       Phys. Rev. E, 63, 066123, 2001.
r   r   r   r   )r   r    r!   r"   r#   r%   Ú	randrangeÚrandomÚnextÚ
successorsr$   )r'   Úpr(   r   r)   r+   r.   s          r   r
   r
   [   sš   € ôN 	�A�|¬R¯Z©ZÑ8€AØ�=‰=�?‰?Ü×ÒÐLÓMÐMàˆAƒvØˆä˜˜1–+ˆØ—‘  6Ó*ˆØ�;‰;‹=˜1Ó ¨1£Ü˜!Ÿ,™, vÓ.Ó/ˆFØ	�
‰
�6Ö"ñ	 ð
 €Hr   r   c                 ó\  • [        SU[        R                  S9nUR                  5       (       d  [        R                  " S5      eU S:X  a  U$ [        SU 5       HO  nUR                  SU5      nUR                  U5       H  nUR                  XF5        M     UR                  XE5        MQ     U$ )aÜ  Returns the growing network with copying (GNC) digraph with `n` nodes.

The GNC graph is built by adding nodes one at a time with a link to one
previously added node (chosen uniformly at random) and to all of that
node's successors.

Parameters
----------
n : int
    The number of nodes for the generated graph.
create_using : NetworkX graph constructor, optional (default DiGraph)
    Graph type to create. If graph instance, then cleared before populated.
seed : integer, random_state, or None (default)
    Indicator of random number generation state.
    See :ref:`Randomness<randomness>`.

References
----------
.. [1] P. L. Krapivsky and S. Redner,
       Network Growth by Copying,
       Phys. Rev. E, 71, 036118, 2005k.},
r   r   r   r   )	r   r    r!   r"   r#   r%   r0   r3   r$   )r'   r(   r   r)   r+   r.   Úsuccs          r   r	   r	   ‘   s‘   € ô2 	�A�|¬R¯Z©ZÑ8€AØ�=‰=�?‰?Ü×ÒÐLÓMÐMàˆAƒvØˆä˜˜1–+ˆØ—‘  6Ó*ˆØ—L‘L Ö(ˆDØ�J‰J�vÖ$ñ )à	�
‰
�6Ö"ñ	 ð
 €Hr   é   c                 óÌ  ^• U4S jnUbI  [        US5      (       a8  [        U[        R                  5      (       d  [        R                  " S5      eUn	O[        R                  " / SQ5      n	US::  a  [        S5      eUS::  a  [        S5      eUS::  a  [        S5      e[        X-   U-   S	-
  5      S
:¼  a  [        S5      eUS:  a  [        S5      eUS:  a  [        S5      e[        S U	R                  5        5       / 5      n
[        S U	R                  5        5       / 5      n[        U	R                  5       5      nU V s/ s H&  n [        U [        R                  5      (       d  M$  U PM(     nn [        U5      S:”  a  [        S U 5       5      S-   nOSn[        U	5      W :  a¸  TR!                  5       nXñ:  a"  UnUS-  nUR#                  U5        U" X¼U5      nO<XñU-   :  a  U" X¬U5      nU" X¼U5      nO!U" X¬U5      nUnUS-  nUR#                  U5        U	R%                  UU5        U
R#                  U5        UR#                  U5        [        U	5      U :  a  M¸  U	$ s  sn f )u»  Returns a scale-free directed graph.

Parameters
----------
n : integer
    Number of nodes in graph
alpha : float
    Probability for adding a new node connected to an existing node
    chosen randomly according to the in-degree distribution.
beta : float
    Probability for adding an edge between two existing nodes.
    One existing node is chosen randomly according the in-degree
    distribution and the other chosen randomly according to the out-degree
    distribution.
gamma : float
    Probability for adding a new node connected to an existing node
    chosen randomly according to the out-degree distribution.
delta_in : float
    Bias for choosing nodes from in-degree distribution.
delta_out : float
    Bias for choosing nodes from out-degree distribution.
seed : integer, random_state, or None (default)
    Indicator of random number generation state.
    See :ref:`Randomness<randomness>`.
initial_graph : MultiDiGraph instance, optional
    Build the scale-free graph starting from this initial MultiDiGraph,
    if provided.

Returns
-------
MultiDiGraph

Examples
--------
Create a scale-free graph on one hundred nodes::

>>> G = nx.scale_free_graph(100)

Notes
-----
The sum of `alpha`, `beta`, and `gamma` must be 1.

References
----------
.. [1] B. BollobÃ¡s, C. Borgs, J. Chayes, and O. Riordan,
       Directed scale-free graphs,
       Proceedings of the fourteenth annual ACM-SIAM Symposium on
       Discrete Algorithms, 132--139, 2003.
c                 ó¸   >• US:”  aC  [        U5      U-  nX3[        U 5      -   -  nTR                  5       U:  a  TR                  U5      $ TR                  U 5      $ )Nr   )Úlenr1   Úchoice)Ú
candidatesÚ	node_listÚdeltaÚbias_sumÚp_deltar   s        €r   Ú_choose_nodeÚ&scale_free_graph.<locals>._choose_node÷   sU   ø€ Ø�1‹9Ü˜9“~¨Ñ-ˆHØ¬S°«_Ñ"<Ñ=ˆGØ�{‰{‹}˜wÓ&Ø—{‘{ 9Ó-Ð-Ø�{‰{˜:Ó&Ð&r   Ú_adjz%initial_graph must be a MultiDiGraph.))r   r   )r   r   )r   r   r   zalpha must be > 0.zbeta must be > 0.zgamma must be > 0.g      ð?g•Ö&è.>zalpha+beta+gamma must equal 1.zdelta_in must be >= 0.zdelta_out must be >= 0.c              3   ó0   #   • U  H  u  pX!/-  v •  M     g 7fr   r   ©Ú.0ÚidxÚcounts      r   Ú	<genexpr>Ú#scale_free_graph.<locals>.<genexpr>  s   é € Ð=ªn¡
 ˆe�eŽmªnùó   ‚c              3   ó0   #   • U  H  u  pX!/-  v •  M     g 7fr   r   rE   s      r   rI   rJ     s   é € Ð<ªm¡
 ˆe�eŽmªmùrK   c              3   óL   #   • U  H  n[        UR                  5      v •  M     g 7fr   )ÚintÚreal)rF   r'   s     r   rI   rJ   "  s   é € Ð8ª- Q”S˜Ÿ™—[�[ª-ùs   ‚"$r   )ÚhasattrÚ
isinstancer    ÚMultiDiGraphr#   Ú
ValueErrorÚabsÚsumÚ
out_degreeÚ	in_degreeÚlistÚnodesÚnumbersÚNumberr:   Úmaxr1   r&   r$   )r'   ÚalphaÚbetaÚgammaÚdelta_inÚ	delta_outr   Úinitial_graphrA   r)   ÚvsÚwsr=   Únumeric_nodesÚcursorÚrÚvÚws         `           r   r   r   ¹   sC  ø€ õ|'ð Ñ ¤W¨]¸F×%CÑ%CÜ˜-¬¯©×9Ñ9Ü×"Ò"Ð#JÓKÐKØ‰ô �OŠOÒ4Ó5ˆà�ƒzÜÐ-Ó.Ð.ØˆqƒyÜÐ,Ó-Ð-Ø�ƒzÜÐ-Ó.Ð.ä
ˆ5‰<˜%Ñ #Ñ%Ó&¨$Ó.ÜÐ9Ó:Ð:à�!ƒ|ÜÐ1Ó2Ð2à�1ƒ}ÜÐ2Ó3Ð3ô 
Ñ=¨a¯l©l¬nÓ=¸rÓ	B€BÜ	Ñ<¨a¯k©k¬mÓ<¸bÓ	A€Bô �Q—W‘W“Y“€Iñ !*ÓK¢	˜1¬Z¸¼7¿>¹>×-J—Q¡	€MÐKÜ
ˆ=Ó˜AÓäÑ8©-Ó8Ó8¸1Ñ<‰ð ˆä
ˆa‹&�1‹*Ø�K‰K‹Mˆð ‹9ð ˆAØ�a‰KˆFà×Ñ˜QÔá˜R¨HÓ5‰Aà˜‘Óñ ˜R¨IÓ6ˆAá˜R¨HÓ5‰Añ
 ˜R¨IÓ6ˆAàˆAØ�a‰KˆFà×Ñ˜QÔð 	
�
‰
�1�aÔð 	�	‰	�!ŒØ
�	‰	�!ŒôI ˆa‹&�1�*ðL €Hùò] Ls   Å#I!Å)I!é   c                 ó*  ^^^^	• U(       a  [         R                  " 5       nUUU4S jnO[         R                  " 5       nUUU4S jn[         R                  " X5      n[	        U5      nU H%  m	UR                  U	4S jU" T	U5       5       5        M'     U$ )a·  Returns a random `k`-out graph with uniform attachment.

A random `k`-out graph with uniform attachment is a multidigraph
generated by the following algorithm. For each node *u*, choose
`k` nodes *v* uniformly at random (with replacement). Add a
directed edge joining *u* to *v*.

Parameters
----------
n : int
    The number of nodes in the returned graph.

k : int
    The out-degree of each node in the returned graph.

self_loops : bool
    If True, self-loops are allowed when generating the graph.

with_replacement : bool
    If True, neighbors are chosen with replacement and the
    returned graph will be a directed multigraph. Otherwise,
    neighbors are chosen without replacement and the returned graph
    will be a directed graph.

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

Returns
-------
NetworkX graph
    A `k`-out-regular directed graph generated according to the
    above algorithm. It will be a multigraph if and only if
    `with_replacement` is True.

Raises
------
ValueError
    If `with_replacement` is False and `k` is greater than
    `n`.

See also
--------
random_k_out_graph

Notes
-----
The return digraph or multidigraph may not be strongly connected, or
even weakly connected.

If `with_replacement` is True, this function is similar to
:func:`random_k_out_graph`, if that function had parameter `alpha`
set to positive infinity.

c                 óL   >^• T(       d  TU 1-
  mUU4S j[        T5       5       $ )Nc              3   óX   >#   • U  H  nTR                  [        T5      5      v •  M!     g 7fr   )r;   rX   )rF   ÚirY   r   s     €€r   rI   Ú=random_uniform_k_out_graph.<locals>.sample.<locals>.<genexpr>�  s!   øé € Ð?²h°�D—K‘K¤ U£×,Ð,²hùs   ƒ'*)r%   ©rh   rY   Úkr   Ú
self_loopss    `€€€r   ÚsampleÚ*random_uniform_k_out_graph.<locals>.sample�  s    ù€ ÞØ  ™�Ý?´e¸A´hÓ?Ð?r   c                 óR   >• T(       d  X1-
  nTR                  [        U5      T5      $ r   )rs   rX   rp   s     €€€r   rs   rt   •  s$   ø€ ÞØ ™�Ø—;‘;œt E›{¨AÓ.Ð.r   c              3   ó,   >#   • U  H	  nTU4v •  M     g 7fr   r   )rF   rh   Úus     €r   rI   Ú-random_uniform_k_out_graph.<locals>.<genexpr>�  s   øé € Ð:Ò)9 A˜!˜Q�Ò)9ùs   ƒ)r    rR   r!   r   ÚsetÚadd_edges_from)
r'   rq   rr   Úwith_replacementr   r(   rs   r)   rY   rw   s
    `` `    @r   Úrandom_uniform_k_out_graphr|   P  sv   û€ öt Ü—’Ó(ˆ÷	@ð 	@ô —z’z“|ˆ÷	/ô
 	�Š�qÓ'€AÜ�‹F€EÛˆØ	×ÑÔ:©°°5Ô)9Ó:Ö:ñ à€Hr   c           	      óî  • US:  a  [        S5      e[        R                  " U [        R                  S9n[	        U Vs0 s H  ofU_M     sn5      n[        X-  5       Hˆ  nUR                  UR                  5        VV	s/ s H  u  piX‘:  d  M  UPM     sn	n5      n
U(       d  [	        X§U
   05      nO
[	        5       n[        X{-
  US9nUR                  X¦5        Xv==   S-  ss'   MŠ     U$ s  snf s  sn	nf )a{  Returns a random `k`-out graph with preferential attachment.

A random `k`-out graph with preferential attachment is a
multidigraph generated by the following algorithm.

1. Begin with an empty digraph, and initially set each node to have
   weight `alpha`.
2. Choose a node `u` with out-degree less than `k` uniformly at
   random.
3. Choose a node `v` from with probability proportional to its
   weight.
4. Add a directed edge from `u` to `v`, and increase the weight
   of `v` by one.
5. If each node has out-degree `k`, halt, otherwise repeat from
   step 2.

For more information on this model of random graph, see [1].

Parameters
----------
n : int
    The number of nodes in the returned graph.

k : int
    The out-degree of each node in the returned graph.

alpha : float
    A positive :class:`float` representing the initial weight of
    each vertex. A higher number means that in step 3 above, nodes
    will be chosen more like a true uniformly random sample, and a
    lower number means that nodes are more likely to be chosen as
    their in-degree increases. If this parameter is not positive, a
    :exc:`ValueError` is raised.

self_loops : bool
    If True, self-loops are allowed when generating the graph.

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

Returns
-------
:class:`~networkx.classes.MultiDiGraph`
    A `k`-out-regular multidigraph generated according to the above
    algorithm.

Raises
------
ValueError
    If `alpha` is not positive.

Notes
-----
The returned multidigraph may not be strongly connected, or even
weakly connected.

References
----------
[1]: Peterson, Nicholas R., and Boris Pittel.
     "Distance between two random `k`-out digraphs, with and without
     preferential attachment."
     arXiv preprint arXiv:1311.5961 (2013).
     <https://arxiv.org/abs/1311.5961>

r   zalpha must be positive)r(   )r   r   )
rS   r    r   rR   r   r%   r;   rV   r   r$   )r'   rq   r]   rr   r   r)   rh   Úweightsrn   r,   rw   Ú
adjustments               r   r   r   ¡  sÑ   € ðJ ˆqƒyÜÐ1Ó2Ð2Ü
�Š�q¤r§¡Ñ7€AÜ©Ó+ª A˜%’x©Ñ+Ó,€GÜ�1‘5Ž\ˆØ�K‰K q§|¡|¤~Ô?¢~™t˜q¸¹Ÿ¡~Ò?Ó@ˆö Ü  !¨Q¡Z Ó1‰Jä ›ˆJÜ˜GÑ0°tÑ<ˆØ	�
‰
�1ÔØ‹
�a‰�
ñ ð €Hùò ,ùã?s   ¾C,Á?C1ÂC1)NNN)NN)g=
×£p=Ú?gHáz®Gá?gš™™™™™©?gš™™™™™É?r   NN)TTN)TN)Ú__doc__rZ   Úcollectionsr   Únetworkxr    Únetworkx.generators.classicr   Únetworkx.utilsr   r   r   Ú__all__Ú_dispatchabler   r
   r	   r   r|   r   r   r   r   Ú<module>r‡      s[  ðñó Ý ã Ý 3ß NÑ Nò€ñ �ÓØ×Ò˜¨TÑ2ó?ó 3ó ð?ñD �ÓØ×Ò˜¨TÑ2ó1ó 3ó ð1ñh �ÓØ×Ò˜¨TÑ2ó#ó 3ó ð#ñL �ÓØ×Ò˜¨TÑ2ð Ø	Ø
ØØØ	ØóRó 3ó ðRñj �ÓØ×Ò˜¨TÑ2óLó 3ó ðLñ^ �ÓØ×Ò˜¨TÑ2óRó 3ó ñRr   