
    VhI                        d Z ddlZddlZej                  ej
                  ej                  ej                  gZej                  j                  de      ej                  j                  dd      d               Zej                  j                  de      ej                  j                  ddd	g      d
               Zej                  j                  de      ej                  j                  dd      d               Zej                  j                  de      d        Zej                  j                  de      ej                  j                  dd      ej                  j                  dd      d                      Zej                  j                  dej                  ej                  ej                  g      ej                  j                  dg d      d               Z G d d      Zej                  j                  dddg      d        Zd Zd Zd Zd Zej                  j                  dej
                  ddd d!fej
                  ddd"d!fej                  ddd d!fej                  ddd"d!fej.                  d#d$d%fej0                  d#d$d d&fej0                  d#d$d"d&fej2                  d'd(d)d*fej4                  d'd(d)d*fej6                  d'd(d)d*fej8                  d(dd+fej:                  d,d-d%fej<                  d,d-d.d)d/fej>                  d,d-d)dd0fej@                  d,d-d)d1fejB                  d,d)dd2fejD                  d3d4d5gifejF                  d6d7d8d9fejH                  d6d: d; d<fg      ej                  j                  d=d d"g      d>               Z%ej                  j                  dd"d g      ej                  j                  d?ej
                  ej                  f      d@               Z&ej                  j                  d?ej0                  ej.                  f      ej                  j                  dAejN                  ejP                  ejR                  f      dB               Z*ej                  j                  d?ej2                  ej4                  ej6                  f      ej                  j                  dAejN                  ejP                  ejR                  f      dC               Z+ej                  j                  dAejN                  ejP                  ejR                  f      dD        Z,ej                  j                  dAejN                  ejP                  ejR                  f      dE        Z-ej                  j                  dAejN                  ejP                  ejR                  f      dF        Z.ej                  j                  dAejN                  ejP                  ejR                  f      dG        Z/ej                  j                  dAejN                  ejP                  ejR                  f      dH        Z0ej                  j                  dAejN                  ejP                  ejR                  f      dI        Z1ej                  j                  dAejN                  ejP                  ejR                  f      dJ        Z2ej                  j                  dAejN                  ejP                  ejR                  f      dK        Z3ej                  j                  dAejN                  ejP                  ejR                  f      dL        Z4y)MzCUnit tests for the :mod:`networkx.generators.random_graphs` module.    N	generatordirected)TFc                      | dd|      }t        |      dk(  sJ |j                         dk(  sJ |j                         |k(  sJ y)zMIf the edge probability `p` is <=0, the resulting graph should have no edges.
   皙r   r   Nlennumber_of_edgesis_directedr   r   Gs      \/home/dcms/DCMS/lib/python3.12/site-packages/networkx/generators/tests/test_random_graphs.py-test_gnp_generators_negative_edge_probabilityr      sM     	"dX.Aq6R<<!###==?h&&&    )r   expected_num_edges)F-   )TZ   c                      | dd|      }t        |      dk(  sJ |j                         |k(  sJ |j                         |k(  sJ y)zKIf the edge probability `p` is >=1, the resulting graph should be complete.r   g?r   Nr	   )r   r   r   r   s       r   3test_gnp_generators_greater_than_1_edge_probabilityr      sN     	"cH-Aq6R<<"4444==?h&&&r   c                 d     | dd|      }t        |      dk(  sJ |j                         |k(  sJ y)zIIf the edge probability `p` is >0 and <1, test only the basic properties.r   皙?r   N)r
   r   r   s      r   test_gnp_generators_basicr   (   s6     	"cH-Aq6R<<==?h&&&r   c                      d}t         fdt        |      D              }t        |t        |      z  dz
        |dz  dz  k  sJ y)zUIf the edge probability `p` is close to 1, the resulting graph should have all edges.d   c              3   P   K   | ]  } d dd      j                           yw)r   gwJ?Tr   N)r   ).0_r   s     r   	<genexpr>z7test_gnp_generators_for_p_close_to_1.<locals>.<genexpr>5   s(      DE	"g-==?s   #&r   g       @N)sumrangeabsfloat)r   runsedgess   `  r   $test_gnp_generators_for_p_close_to_1r&   1   sQ     D INt E uuT{"R'(D3J,<<<<r   p)皙?皙?c                    d}d}t        |      D cg c]  }dg|z  
 }}t        |      D ]D  } | |||      }|j                  D ](  \  }	}
||	   |
xx   dz  cc<   |r||
   |	xx   dz  cc<   * F t        |      D ]J  }	t        |      D ]:  }
|	|
k(  r||	   |
   dk(  rJ t        ||	   |
   t        |      z  |z
        dk  r:J  L yc c}w )zOTest that gnp generators generate edges according to the their probability `p`.i     r   r      gQ?N)r!   r%   r"   r#   )r   r'   r   r$   nr   edge_countsir   vws              r   $test_gnp_generators_edge_probabilityr2   ;   s	   
 D	A$)!H-qA37-K-4[ 'aX.GG 	'DAqN1"Aq!Q&!	'' 1X Hq 	HAAv"1~a(A--- ;q>!,uT{:Q>?4GGG	HH .s   C)seedr   r   ))*   Fi  )r4   Ti	  ):  Fi  )r5   Ti	  c                      | dd||      }t        |      dk(  sJ |j                         |k(  sJ |j                         |k(  sJ y)z:Test that aliases give the same result with the same seed.r         ?)r3   r   Nr	   )r   r3   r   r   r   s        r   test_gnp_random_graph_aliasesr8   S   sP     	#t$:Aq6S=="4444==?h&&&r   c                   :    e Zd Zd Zd	dZd
dZd Zd Zd Zd Z	y)TestGeneratorsRandomc                 
   d}t        j                  dd|      t        j                  dd|d      t        j                  dd|      t        j                  dd|      t        j                  dd|      j	                         dk(  sJ t        j                  dd|t        j
                  d	            j	                         d
k(  sJ t        j                  dddd|      j	                         dk(  sJ t        j                  dddd|      j	                         dk(  sJ t        j                  dddd|      j	                         dk(  sJ t        j                  dddd|      j	                         dkD  sJ j	                         dk  sJ t        j                  dddd|      j	                         dkD  sJ j	                         dk  sJ t        j                  ddd|      t        j                  ddd|      j	                         dk(  sJ t        j                  dd|      t        j                  t         j                  t         j                  dd       t        j                  t         j                  t         j                  dd       ddg}t        j                  ||      d fd}t        j                  ddd|      t        fdj                         D              dkD  sJ  |      sJ t        j                  t         j                  t         j                  ddd|       t        j                  t         j                  t         j                  ddd|       t        j                  t         j                  t         j                  ddd|       t        j                  ddd|             sJ t        j                   dddd      }t        j"                  dddd      y ) Nr4   r      Tr   r,      i#  r+   i'  r   c         ?   i,  i  333333?   g      ?        r      !   r   r<   r)   r<   (   r)   c                     | D cg c]  }| j                  |      dk\  s| }}|D ]E  }| j                  |      D cg c]  }| j                  |      dk\  s| }}t        |      dk  rE y yc c}w c c}w )z
            A tree is a caterpillar iff all nodes of degree >=3 are surrounded
            by at most two nodes of degree two or greater.
            ref: http://mathworld.wolfram.com/CaterpillarGraph.html
            r=   r@   FT)degree	neighborsr
   )gr-   
deg_over_3nbhnbh_deg_over_2s        r   is_caterpillarz>TestGeneratorsRandom.test_random_graph.<locals>.is_caterpillar   s}     &';!((1+*:!;J; !12Q!V#188C=TUCU#!V!V>*a/ !  <!Vs   A0A0A5A5c                     | D cg c]  }| j                  |      dkD  s| }} | j                  |            S c c}w )z
            A tree is a lobster if it has the property that the removal of leaf
            nodes leaves a caterpillar graph (Gallian 2007)
            ref: http://mathworld.wolfram.com/LobsterGraph.html
            r,   )rJ   subgraph)rL   r-   	non_leafsrP   s      r   
is_lobsterz:TestGeneratorsRandom.test_random_graph.<locals>.is_lobster   s?     %&9q!q9I9!!**Y"788 :s   ==r   c              3   @   K   | ]  }j                  |        y wN)rJ   )r   r-   r   s     r   r   z9TestGeneratorsRandom.test_random_graph.<locals>.<genexpr>   s     21188A;2s      )r3   tries)nxgnm_random_graphdense_gnm_random_graphbarabasi_albert_graphr   complete_graphextended_barabasi_albert_graphpowerlaw_cluster_graphrandom_regular_graphpytestraisesNetworkXErrorrandom_shell_graphrandom_lobstermaxnodesrandom_powerlaw_tree_sequencerandom_powerlaw_tree)selfr3   constructorrT   seqr   rP   s        @@r   test_random_graphz&TestGeneratorsRandom.test_random_graphc   s   R.R=%%c2t4$$S!T2$$S!T2  "v...$$S!T23D3DQ3GH  "{333--c1aDA  "b(((--c1aDA  "f,,,--c1adC  "b(((--c1c1dC  "W,,,  "W,,,--c1c3E  "W,,,  "W,,,%%c1c48%%c1c48  "v...##BD1b&&(?(?BGb&&(?(?RH$m4!!+t4		9 b#sD12	22Q666!}}b&&(9(92sAtLb&&(9(92q!TJb&&(9(92q#tL b#sD1a    ..r12QG##B!<r   c           	         g d}t        j                  d      }|D ]  }t        j                  d||      }t        j                  d||d|      }|j	                         |j	                         k(  sJ t        j                  d||      }	t        j                  d||d|      }
|	j	                         |
j	                         k(  sJ t        j                  d||      }t        j                  d||||      }|j                         |j                         k(  sJ t        j                  d|||||      }t        j                  d|||      }t        j                  d|||      }	t        |j                         |	j                               |j                         cxk  r.t        |j                         |	j                               k  rJ  J  t         j                  }t        j                  t         j                  ||||d       t        j                  t         j                  ||||d       t        j                  t         j                  |d||d       t        j                  t         j                  |d||d       t        j                  t        ||      dz
        }t        j                  t         j                  |d||||       y	)
z
        Tests that the dual BA random graph generated behaves consistently.

        Tests the exceptions are raised as expected.

        The graphs generation are repeated several times to prevent lucky shots

        r4   r5   i
  r   r   r,   r   g      g      ?)initial_graphN)rY   r]   r\   dual_barabasi_albert_graphr%   sizeminrf   ra   rb   rc   )rj   m1m2r'   seedsrp   r3   BA1DBA1BA2DBA2BA3DBA3DBAdbaginitials                   r   test_dual_barabasi_albertz.TestGeneratorsRandom.test_dual_barabasi_albert   sB     ))"- 	D**3D9C00b"aFD99;$**,... **3D9C00b"aFD99;$**,...**3D9C00b"aFD 88:,,,//RQmTC**3D-HC**3D-HCCHHJ
+sxxzXSSXXZ=XXXX+	2 ,,b&&b"b!<b&&b"b!<b&&c2r4@b&&c2r3?##CBK!O4b&&c2r1GTr   c                 T   g d}|D ]  }t        j                  d||      }|j                         }t        j                  d|dd|      }|j	                         |k(  sJ t        j                  d|dd|      }|j	                         |dz  kD  sJ t        j                  d|dd|      }|j	                         |k(  sJ t        j                  d|dd|      }|j	                         |j	                         kD  sJ |j	                         |j	                         k  rJ  t         j                  }	t        j                  t         j                  |	||dd       t        j                  t         j                  |	dddd       t        j                  t         j                  |	dddd       y	)
z
        Tests that the extended BA random graph generated behaves consistently.

        Tests the exceptions are raised as expected.

        The graphs generation are repeated several times to prevent lucky-shots

        ro   r   r   r)   r@   rA   r,   r?   N)rY   r\   r   r^   rr   ra   rb   rc   )
rj   mrv   r3   BA_modelBA_model_edgesG1G2G3ebags
             r   test_extended_barabasi_albertz2TestGeneratorsRandom.test_extended_barabasi_albert   sx      	)D//Q=H%557N 2231aFB779... 22334HB779~1111 2231c4HB779... 2233TJB779rwwy(((779rwwy((('	), 00b&&aAq9b&&aa;b&&c1c3?r   c                     d}t        j                  dd|      }t        |      dk(  sJ |j                         dk(  sJ y)zYTests that a 0-regular graph has the correct number of nodes and
        edges.

        r4   r   r   N)rY   r`   r
   r   )rj   r3   r   s      r   test_random_zero_regular_graphz3TestGeneratorsRandom.test_random_zero_regular_graph  sD    
 ##Ar401v||  "a'''r   c                 Z   t        j                  dd      }t        |      dk(  sJ |j                         dk(  sJ t        j                  ddd      }t        |      dk(  sJ |j                         dk(  sJ t        j                  dd      }t        |      dk(  sJ |j                         dk(  sJ t        j                  ddd      }t        |      dk(  sJ |j                         d	k(  sJ t        j                  dd
      }t        |      dk(  sJ |j                         dk(  sJ y )Nr   r=   r4   r3   r   r   Tr   r   r   r   )rY   rZ   r
   r   )rj   r   s     r   test_gnmzTestGeneratorsRandom.test_gnm  s#   A&1v||  "a'''AB/1v||  "a'''C(1v||  "b(((C$71v||  "b(((D)1v||  "a'''r   c                    t        j                  t        j                  t        j                  ddd       t        j                  t        j                  t        j
                  ddd       t        j                  dddd       t        j
                  dddd       t        j                  dddd       t        j
                  dddd       y )Nr      r7   	   r   r   r?   )ra   rb   rY   rc   watts_strogatz_graphnewman_watts_strogatz_graph)rj   s    r   test_watts_strogatz_big_kz.TestGeneratorsRandom.test_watts_strogatz_big_k!  s    b&&(?(?RNb&&(F(FBPTU 	At!4
&&r1c: 	B15
&&r2t!<r   c                     fd}fd}dt        j                  d||      }t        j                  d||d      }t        |      dk(  sJ y )Nc                     ||z
  z  S rV    )ur1   zcs      r   integralz?TestGeneratorsRandom.test_random_kernel_graph.<locals>.integral0  s    A;r   c                     |z  |z   S rV   r   )r   r1   rr   s      r   rootz;TestGeneratorsRandom.test_random_kernel_graph.<locals>.root3  s    q519r   r,   i  r4   r   )rY   random_kernel_graphr
   )rj   r   r   graphr   s       @r   test_random_kernel_graphz-TestGeneratorsRandom.test_random_kernel_graph/  sP    		 &&tXt<&&tXt"E5zT!!!r   N)r,      r?   )r@   )
__name__
__module____qualname__rm   r   r   r   r   r   r   r   r   r   r:   r:   b   s+    J=X+UZ$@L((*=
"r   r:   )kexpected_num_nodesr   )r@   r   r   )r   r   r<   c                     t        j                  d| dd      }t        |      |k(  sJ |j                         |k(  sJ y )Nr   r7   r4   r   )rY   r   r
   r   )r   r   r   r   s       r   test_watts_strogatzr   <  sE     	At"5Aq6''''"4444r   c                      t        j                  dddd      } t        |       dk(  sJ | j                         dk(  sJ y )Nr   r@   rC   r4   r   rY   r   r
   r   r   s    r   +test_newman_watts_strogatz_zero_probabilityr   I  s?    
&&r1c;Aq6R<<"$$$r   c                      t        j                  dddd      } t        |       dk(  sJ | j                         dk\  sJ y )Nr   r   r7   r4   r   r<   r   r   s    r   .test_newman_watts_strogatz_nonzero_probabilityr   O  s?    
&&r1d<Aq6R<<"$$$r   c                      t        j                  ddddd      } t        |       dk(  sJ | j                         dk(  sJ y )Nr   r@   r   r4   )rX   r3   )rY   connected_watts_strogatz_graphr
   r   r   s    r   test_connected_watts_strogatzr   U  sA    
))"aBRHAq6R<<"$$$r   c                      t        j                  t        j                  d      5  t        j                  dddd       d d d        y # 1 sw Y   y xY w)Nz Maximum number of tries exceededmatchr   r@   r   r   )rX   )ra   rb   rY   rc   r   r   r   r   (test_connected_watts_strogatz_zero_triesr   [  s@    	r''/Q	R ?
))"aA>? ? ?   A		Azgenerator, kwargsr<   r(   F)r-   r'   r   T   r   )r-   r   )r-   r   r   2   r+   r   )r-   r   r'   )dr-   rH   r=   r@   )r-   rt   ru   r'   )r-   r   r'   q)r-   r   r'   )r-   p1p2rk   rF   rG   r   rW   r,   )r-   r3   rX   c                     ||z
  S rV   r   )r   r1   r   s      r   <lambda>r   y  s
    1q5 r   c                     ||z   S rV   r   r   r1   r   s      r   r   r   z  s
    q1u r   )r-   kernel_integralkernel_rootcreate_using_instancec                      G d dt         j                        } G d dt         j                        }|j                  d      r|n|}|r |       n|} | di |d|i}t	        ||      sJ y )Nc                       e Zd Zy)%test_create_using.<locals>.DummyGraphNr   r   r   r   r   r   
DummyGraphr         r   r   c                       e Zd Zy)'test_create_using.<locals>.DummyDiGraphNr   r   r   r   DummyDiGraphr     r   r   r   r   create_usingr   )rY   GraphDiGraphget
isinstance)r   kwargsr   r   r   create_using_typer   r   s           r   test_create_usingr   `  si    BRXX rzz  )/

:(>J*?$&EVL::\:Ee.///r   fnc                     t        j                  t        j                  d      5   | ddt        j                         d d d        y # 1 sw Y   y xY w)Nzmust not be a multi-graphr   r<   r(   r   )ra   rb   rY   rc   
MultiGraph)r   r   s     r    test_gnp_fns_disallow_multigraphr     s>     
r''/J	K 0
2s/0 0 0r   	graphtypec                     t        j                  t        j                  d      5   | dd|       d d d        y # 1 sw Y   y xY w)Nmust not ber   r   r<   r   ra   rb   rY   rc   r   r   s     r   -test_gnm_fns_disallow_directed_and_multigraphr     s9     
r''}	= +
2r	*+ + +s	   ;Ac                     t        j                  t        j                  d      5   | ddd|       d d d        y # 1 sw Y   y xY w)Nr   r   r   r@   r(   r   r   r   s     r   4test_watts_strogatz_disallow_directed_and_multigraphr     s;     
r''}	= /
2q#I./ / /s	   <Ac                     t        j                  t        j                  d      5  t        j                  dd|        d d d        y # 1 sw Y   y xY w)Nr   r   r@   r   r   )ra   rb   rY   rc   r`   r   s    r   :test_random_regular_graph_disallow_directed_and_multigraphr     s=    	r''}	= ?
2I>? ? ?   AAc                     t        j                  t        j                  d      5  t        j                  dd|        d d d        y # 1 sw Y   y xY w)Nr   r   r   r=   r   )ra   rb   rY   rc   r\   r   s    r   5test_barabasi_albert_disallow_directed_and_multigraphr     sA    	r''}	= @
  QY?@ @ @r   c                     t        j                  t        j                  d      5  t        j                  dddd|        d d d        y # 1 sw Y   y xY w)Nr   r   r   r@   r,   g?r   )ra   rb   rY   rc   rq   r   s    r   :test_dual_barabasi_albert_disallow_directed_and_multigraphr     sE    	r''}	= M
%%b!Q)LM M M   A

Ac                     t        j                  t        j                  d      5  t        j                  dddd|        d d d        y # 1 sw Y   y xY w)Nr   r   r   r@   r(   rA   r   )ra   rb   rY   rc   r^   r   s    r   >test_extended_barabasi_albert_disallow_directed_and_multigraphr     sE    	r''}	= S
))"ac	RS S Sr   c                     t        j                  t        j                  d      5  t        j                  ddd|        d d d        y # 1 sw Y   y xY w)Nr   r   r   r+   r(   r   )ra   rb   rY   rc   r_   r   s    r   6test_powerlaw_cluster_disallow_directed_and_multigraphr     sC    	r''}	= F
!!"a9EF F Fr   c                     t        j                  t        j                  d      5  t        j                  ddd|        d d d        y # 1 sw Y   y xY w)Nr   r   r   r   r   )ra   rb   rY   rc   re   r   s    r   4test_random_lobster_disallow_directed_and_multigraphr     sC    	r''}	= @
"c3Y?@ @ @r   c                     t        j                  t        j                  d      5  t        j                  ddg|        d d d        y # 1 sw Y   y xY w)Nr   r   )r   r<   r@   )r   r<   r+   r   )ra   rb   rY   rc   rd   r   s    r   2test_random_shell_disallow_directed_and_multigraphr     sD    	r''}	= R
{K8yQR R Rr   c                     t        j                  t        j                  d      5  t        j                  d|        d d d        y # 1 sw Y   y xY w)Nr   r   r   r   )ra   rb   rY   rc   ri   r   s    r   :test_random_powerlaw_tree_disallow_directed_and_multigraphr     s;    	r''}	= <
;< < <s   AAc                     t        j                  t        j                  d      5  t        j                  dd d |        d d d        y # 1 sw Y   y xY w)Nr   r   r   c                     ||z   S rV   r   )yabs      r   r   zEtest_random_kernel_disallow_directed_and_multigraph.<locals>.<lambda>  s
    A r   c                     ||z   S rV   r   r   s      r   r   zEtest_random_kernel_disallow_directed_and_multigraph.<locals>.<lambda>  s
    q1u r   r   )ra   rb   rY   rc   r   r   s    r   3test_random_kernel_disallow_directed_and_multigraphr     sD    	r''}	= 

%'<9	

 
 
s   AA)5__doc__ra   networkxrY   gnp_random_graphfast_gnp_random_graphbinomial_grapherdos_renyi_graph_gnp_generatorsmarkparametrizer   r   r   r&   r2   r8   r:   r   r   r   r   r   r[   rZ   r   r   r   r`   r\   rq   r^   r_   re   rd   ri   r   r   r   r   r   MultiDiGraphr   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r     sL   I   	 o6]3' 4 7' o6&*'	 7
' o6]3' 4 7' o6= 7= o6j)]3H 4 * 7H* "%%r'8'8":N:NO .P'	'W" W"t 555%%%?
 		!	!#5#IJ		!	!#4#HI			BSeDE			BSdCD		"	""1$56			BQEBC			BQDAB		'	'r)DE		 	 "=>		*	*"13,GH		 	 "34		!	!!#45		&	&b(MN		*	*"13S,QR		"	""13$?@			"Cs;<			0N OP		 	 B"CD""#84	
'> 05$-@
0 A?@
0 dE]3 8 8":M:MNO0 P 40
  3 3R5N5NOPrzz2=="//&RS+ T Q+
 
&&

)) rzz2=="//&RS/ T/
 rzz2=="//&RS? T?
 rzz2=="//&RS@ T@
 rzz2=="//&RSM TM
 rzz2=="//&RSS TS
 rzz2=="//&RSF TF
 rzz2=="//&RS@ T@
 rzz2=="//&RSR TR
 rzz2=="//&RS< T<
 rzz2=="//&RS
 T
r   