
    h                     |    S r SSKrSSKrSSKJr  SrSS jr\" S5      SS j5       rS r	S	 r
S
 rS rS rS rS rg)z4Unit tests for the sparsifier computation functions.    N)py_random_state   c                 0   [        U R                  5       5      [        UR                  5       5      :X  d   eUR                  5        H>  u  pEU R                  XE5      (       d   eU(       d  M&  X   U   U   X   U   U   :X  a  M>   e   [	        [
        R                  " XS95      n[	        [
        R                  " XS95      nU R                  5        H@  nU R                  5        H)  nXF;   d  M
  XVU   ;   d  M  Xt   U   X&U   U   -  ::  a  M)   e   MB     g)a  Test whether a spanner is valid.

This function tests whether the given spanner is a subgraph of the
given graph G with the same node set. It also tests for all shortest
paths whether they adhere to the given stretch.

Parameters
----------
G : NetworkX graph
    The original graph for which the spanner was constructed.

spanner : NetworkX graph
    The spanner to be tested.

stretch : float
    The proclaimed stretch of the spanner.

weight : object
    The edge attribute to use as distance.
weightN)setnodesedgeshas_edgedictnxshortest_path_length)Gspannerstretchr   uvoriginal_lengthspanner_lengths           \/var/www/html/env/lib/python3.13/site-packages/networkx/algorithms/tests/test_sparsifiers.py_test_spannerr      s    , qwwy>S1111 zz!6:a=(ADGFO;;;   2221DEO"11'IJNWWYA#Q-?(?%(+w9KA9N/NNNN         c                 f    U R                  5        H  u  p#UR                  5       X   U   S'   M     g)a"  Assigns random weights to the edges of a graph.

Parameters
----------

G : NetworkX graph
    The original graph for which the spanner was constructed.

seed : integer, random_state, or None (default)
    Indicator of random number generation state.
    See :ref:`Randomness<randomness>`.
r   N)r
   random)r   seedr   r   s       r   _assign_random_weightsr   2   s,     	 KKMQ r   c                      [         R                  " S5      n [         R                  " U S[        S9nU R                   H  u  p#UR                  X#5      (       a  M   e   g)z&Test a trivial spanner with stretch 1.   r   r   N)r   complete_graphr   _seedr
   r   )r   r   r   r   s       r   test_spanner_trivialr#   D   sK    
"AjjAE*G%%%% r   c                      [         R                  " S5      n [         R                  " U S[        S9n[	        XS5        [         R                  " U S[        S9n[	        XS5        g)z9Test spanner construction on a complete unweighted graph.r      r    
   N)r   r!   r   r"   r   r   r   s     r   &test_spanner_unweighted_complete_graphr(   M   sJ    
"AjjAE*G!a jjBU+G!b!r   c                      [         R                  " S5      n [        U [        S9  [         R                  " U SS[        S9n[        XSSS9  [         R                  " U SS[        S9n[        XSSS9  g)	z7Test spanner construction on a complete weighted graph.r   r    r%   r   r   r   r   r&   N)r   r!   r   r"   r   r   r'   s     r   $test_spanner_weighted_complete_graphr+   X   s\    
"A15)jjAhU;G!a1jjBxe<G!b2r   c                      [         R                  " SS[        S9n [         R                  " U S[        S9n[	        XS5        [         R                  " U S[        S9n[	        XS5        g)z5Test spanner construction on an unweighted gnp graph.r   皙?r    r%   r&   N)r   gnp_random_graphr"   r   r   r'   s     r   !test_spanner_unweighted_gnp_graphr/   d   sN    
B%0AjjAE*G!a jjBU+G!b!r   c                      [         R                  " SS[        S9n [        U [        S9  [         R                  " U SS[        S9n[        XSSS9  [         R                  " U SS[        S9n[        XSSS9  g	)
z3Test spanner construction on an weighted gnp graph.r   r-   r    r%   r   r*   r   r&   N)r   r.   r"   r   r   r   r'   s     r   test_spanner_weighted_gnp_graphr1   o   s`    
B%0A15)jjAhU;G!a1jjBxe<G!b2r   c                     [         R                  " [         R                  " S5      [         R                  " S5      5      n [         R                  " U S[        S9n[        XS5        [         R                  " U S[        S9n[        XS5        g)z2Test spanner construction on a disconnected graph.r&   r%   r    N)r   disjoint_unionr!   r   r"   r   r'   s     r   *test_spanner_unweighted_disconnected_graphr4   {   sb    
"++B/1B1B21FGAjjAE*G!a jjBU+G!b!r   c                      [         R                  " [        5         [        R                  " 5       n [        R
                  " U S5        SSS5        g! , (       d  f       g= f)z+Check whether an invalid stretch is caught.r   N)pytestraises
ValueErrorr   empty_graphr   )r   s    r   test_spanner_invalid_stretchr:      s4    	z	"NN


1a 
#	"	"s   -A
A)N)__doc__r6   networkxr   networkx.utilsr   r"   r   r   r#   r(   r+   r/   r1   r4   r:    r   r   <module>r?      sY    :   *	$ON * *"&"	3"	3"r   