U
    ?h                     @   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t| D ]@\}}| ||s<t|r$|| | | | | | | ks$tq$ttj| |d}ttj||d}|  D ]F}|  D ]8}||kr||| kr|| | ||| |  kstqqd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)setZnodesAssertionErroredgeshas_edgedictnxZshortest_path_length)GspannerZstretchr   uvZoriginal_lengthZspanner_length r   \/var/www/html/venv/lib/python3.8/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_weights1   s    r   c                  C   s>   t d} t j| dtd}| jD ]\}}|||s t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   r   test_spanner_trivialC   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_graphL   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_graphW   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_graphc   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_graphn   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_graphz   s
    r&   c               	   C   s.   t t t } t| d W 5 Q R X 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)N)__doc__r'   Znetworkxr   Znetworkx.utilsr   r   r   r   r   r   r!   r$   r%   r&   r)   r   r   r   r   <module>   s   
'	