o
    ]Zh                     @   s|   d Z ddlZddlZddlmZ dZdddZedddd	Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )z4Unit tests for the sparsifier computation functions.    N)py_random_state   c                 C   s   t |  t | ksJ | D ] \}}| ||sJ |r2|| | | | | | | ks2J qttj| |d}ttj||d}|  D ]#}|  D ]}||v rk||| v rk|| | ||| |  kskJ qOqIdS )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nxZshortest_path_length)GspannerZstretchr   uvZoriginal_lengthZspanner_length r   Y/var/www/auris/lib/python3.10/site-packages/networkx/algorithms/tests/test_sparsifiers.py_test_spanner   s   $ r      c                 C   s*   |   D ]\}}| | | | d< qdS )aB  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   r   r   r   _assign_random_weights2   s   r   c                  C   s>   t d} t j| dtd}| jD ]\}}|||sJ qdS )z&Test a trivial spanner with stretch 1.   r   r   N)r   complete_graphr   _seedr   r	   )r   r   r   r   r   r   r   test_spanner_trivialD   s
   
r   c                  C   sF   t d} t j| dtd}t| |d t j| dtd}t| |d dS )z9Test spanner construction on a complete unweighted graph.r      r   
   N)r   r   r   r   r   r   r   r   r   r   &test_spanner_unweighted_complete_graphM   s
   
r   c                  C   s^   t d} t| td t j| ddtd}t| |ddd t j| ddtd}t| |ddd dS )	z7Test spanner construction on a complete weighted graph.r   r   r   r   r   r   r   r   N)r   r   r   r   r   r   r   r   r   r   $test_spanner_weighted_complete_graphX   s   
r!   c                  C   sL   t jddtd} t j| dtd}t| |d t j| dtd}t| |d dS )z5Test spanner construction on an unweighted gnp graph.r   皙?r   r   r   N)r   gnp_random_graphr   r   r   r   r   r   r   !test_spanner_unweighted_gnp_graphd   s
   r$   c                  C   sd   t jddtd} t| td t j| ddtd}t| |ddd t j| ddtd}t| |ddd d	S )
z3Test spanner construction on an weighted gnp graph.r   r"   r   r   r   r    r   r   N)r   r#   r   r   r   r   r   r   r   r   test_spanner_weighted_gnp_grapho   s   r%   c                  C   sT   t t dt d} t j| dtd}t| |d t j| dtd}t| |d dS )z2Test spanner construction on a disconnected graph.r   r   r   N)r   Zdisjoint_unionr   r   r   r   r   r   r   r   *test_spanner_unweighted_disconnected_graph{   s
   r&   c                  C   sD   t t t } t| d W d   dS 1 sw   Y  dS )z+Check whether an invalid stretch is caught.r   N)pytestZraises
ValueErrorr   Zempty_graphr   )r   r   r   r   test_spanner_invalid_stretch   s   "r)   )N)__doc__r'   Znetworkxr   Znetworkx.utilsr   r   r   r   r   r   r!   r$   r%   r&   r)   r   r   r   r   <module>   s    
'	