o
    3ήc!                     @   s   d dl mZ d dlZd dlZd dlmZ d dlmZ ej	
dddd Zd	d
 ZG dd dZG dd dZG dd dZdS )    )RandomN)convert_node_labels_to_integers)_extrema_boundingcompute)diameterradius	peripherycentereccentricitiesc                 C   sF   t d}t  t j|| d W d    d S 1 sw   Y  d S )N   r   )nxcomplete_graphpytestdeprecated_callextrema_bounding)r   G r   W/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/tests/test_distance_measures.py test_extrema_bounding_deprecated
   s   

"r   c                  C   sJ   t d} tjtdd t| dd W d    d S 1 sw   Y  d S )Nr   zcompute must be one of)matchspamr   )r   
path_graphr   raises
ValueErrorr   )r   r   r   r   ,test__extrema_bounding_invalid_compute_kwarg   s   
"r   c                   @   s|   e Zd Z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d Zdd Zdd Zdd Zdd Zdd ZdS )TestDistancec                 C   s    t tddddd}|| _d S )N      sorted)first_labelordering)cnltir   grid_2d_graphr   selfr   r   r   r   setup_method   s   
zTestDistance.setup_methodc                 C   s:  t | jddksJ t | j}|d dksJ tt | j}t j| j|d}|d dks1J t j| jdd}|dks?J t j| jddgd}|d dksQJ t j| jddgd}|d dkscJ t d}t |}|d dksuJ t j|dd}|dksJ tt jt j|d t 	 }t |}|i ksJ d S )Nr      sp)v   r   )
r   eccentricityr   dictshortest_path_lengthr   r   r   NetworkXErrorempty_graph)r%   er)   r   r   r   r   test_eccentricity   s*   


zTestDistance.test_eccentricityc                 C      t | jdks
J d S )Nr'   r   r   r   r%   r   r   r   test_diameter=      zTestDistance.test_diameterc                 C   r3   )Nr   r   r   r   r5   r   r   r   test_radius@   r7   zTestDistance.test_radiusc                 C       t t| jh dksJ d S )N   r   r         setr   r   r   r5   r   r   r   test_peripheryC       zTestDistance.test_peripheryc                 C   r:   )N   r'      
      r?   r   r	   r   r5   r   r   r   test_centerF   rA   zTestDistance.test_centerc                 C      t j| jdddksJ d S )NT	useboundsr'   r4   r5   r   r   r   test_bound_diameterI      z TestDistance.test_bound_diameterc                 C   rH   )NTrI   r   r8   r5   r   r   r   test_bound_radiusL   rL   zTestDistance.test_bound_radiusc                 C   (   h d}t tj| jdd|ksJ d S )Nr;   TrI   r>   r%   resultr   r   r   test_bound_peripheryO       z!TestDistance.test_bound_peripheryc                 C   rN   )NrB   TrI   rF   rO   r   r   r   test_bound_centerS   rR   zTestDistance.test_bound_centerc                 C   s6   t  }|dd |dd tt jt j| d S )Nr   r+   r   r   )r   Graphadd_edger   r   r/   r   r$   r   r   r   test_radius_exceptionW   s   z"TestDistance.test_radius_exceptionc                 C   sJ   t tj tddg}t|}W d    d S 1 sw   Y  d S )Nr   r+   r   r   r   r   r   r/   rT   r,   r%   r   r1   r   r   r   test_eccentricity_infinite]      "z'TestDistance.test_eccentricity_infinitec                 C   sN   t tj tddg}tj|dd}W d    d S 1 s w   Y  d S )NrW   rX   r   r(   rY   rZ   r   r   r   *test_eccentricity_undirected_not_connectedb   s   "z7TestDistance.test_eccentricity_undirected_not_connectedc                 C   sJ   t tj tddg}t| W d    d S 1 sw   Y  d S )NrW   )r   r   )r   r   r   r/   DiGraphr,   )r%   DGr   r   r   +test_eccentricity_directed_weakly_connectedg   r\   z8TestDistance.test_eccentricity_directed_weakly_connectedN)__name__
__module____qualname__r&   r2   r6   r9   r@   rG   rK   rM   rQ   rS   rV   r[   r]   r`   r   r   r   r   r      s    r   c                   @   sp   e Zd Ze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d Zdd Zdd Zdd ZdS )TestResistanceDistancec                 C   s   t dat dad S )Nnumpyscipy)r   importorskipnpr)   )clsr   r   r   setup_classn   s   
z"TestResistanceDistance.setup_classc                 C   sR   t  }|jdddd |jdddd |jdddd |jdddd || _d S )Nr   r+   weightr   r   )r   rT   rU   r   r$   r   r   r   r&   u   s   
z#TestResistanceDistance.setup_methodc                 C   4   t | jdddd}d}t|dt|dksJ d S )Nr   r   rl   T433333@   r   resistance_distancer   roundr%   rd	test_datar   r   r   test_resistance_distance}      z/TestResistanceDistance.test_resistance_distancec                 C   rm   )Nr   r   rl   FgQ?ro   rp   rs   r   r   r   test_resistance_distance_noinv   rw   z5TestResistanceDistance.test_resistance_distance_noinvc                 C   s&   t | jdd}t|ddksJ d S )Nr   r   ro   rp   )r%   rt   r   r   r   "test_resistance_distance_no_weight   s   z9TestResistanceDistance.test_resistance_distance_no_weightc                 C   sF   d| j d d d< t| j dddd}d}t|dt|dks!J d S )	Nr+   r   rl   r   Tg      ro   )r   r   rq   rr   rs   r   r   r   #test_resistance_distance_neg_weight   s   z:TestResistanceDistance.test_resistance_distance_neg_weightc                 C   sn   t  }|jdddd |jdddd |jdddd |jdddd t |dddd}t|ds5J d S )	Nr   r+   rk   r   r   rl   Trn   )r   
MultiGraphrU   rq   rh   isclose)r%   r   rt   r   r   r   test_multigraph   s   z&TestResistanceDistance.test_multigraphc                 C   sT   t t d| jd d d< t| jddd W d    d S 1 s#w   Y  d S )Nr   r   r+   rl   r   )r   r   ZeroDivisionErrorr   r   rq   r5   r   r   r   test_resistance_distance_div0   s   "z4TestResistanceDistance.test_resistance_distance_div0c                 C   sN   t tj | jd t| jdd W d    d S 1 s w   Y  d S )Nro   r   )r   r   r   r/   r   add_noderq   r5   r   r   r   &test_resistance_distance_not_connected   s   "z=TestResistanceDistance.test_resistance_distance_not_connectedc                 C   sB   t tj t| jdd W d    d S 1 sw   Y  d S )Nr   r   r   r   r/   rq   r   r5   r   r   r   "test_resistance_distance_same_node      "z9TestResistanceDistance.test_resistance_distance_same_nodec                 C   B   t tj t| jdd W d    d S 1 sw   Y  d S )N	   r   r   r5   r   r   r   +test_resistance_distance_nodeA_not_in_graph   r   zBTestResistanceDistance.test_resistance_distance_nodeA_not_in_graphc                 C   r   )Nr   r   r   r5   r   r   r   +test_resistance_distance_nodeB_not_in_graph   r   zBTestResistanceDistance.test_resistance_distance_nodeB_not_in_graphN)ra   rb   rc   classmethodrj   r&   rv   rx   ry   r{   r~   r   r   r   r   r   r   r   r   r   rd   m   s    
	rd   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )TestBarycenterz>Test :func:`networkx.algorithms.distance_measures.barycenter`.c                 K   s>   t j|fi |}t|tsJ t|t|ksJ ||S )z2Return the subgraph induced on the barycenter of g)r   
barycenter
isinstancelistr?   subgraph)r%   gkwargsbr   r   r   barycenter_as_subgraph   s   
z%TestBarycenter.barycenter_as_subgraphc                 C   s   t tjtjtd d S )Nro   )r   r   r   NetworkXNoPathr   r0   r5   r   r   r   test_must_be_connected   rL   z%TestBarycenter.test_must_be_connectedc                 C   s   t d}tt |}t j||dt|ksJ |j D ]	\}}}d|d< qtj	t
t j||dd |d d= tj	t jt j||d d S )Nro   r(   r   rl   )r)   rl   r   )r   r   r-   r.   r   r   edgesdatar   r   r   r   )r%   K_5r)   ur*   r   r   r   r   test_sp_kwarg   s   


zTestBarycenter.test_sp_kwargc                 C   sv   t d}tdD ]0}t|dd|}| |}t|dkr(| dks'J qt|dks0J | dks8J qdS )z_The barycenter of a tree is a single vertex or an edge.

        See [West01]_, p. 78.
        l   >[= 2   r   K   r+   r   N)r   ranger   random_treerandintr   lensize)r%   prngiRTr   r   r   r   
test_trees   s   
zTestBarycenter.test_treesc                 C   s  t dgddgddgddgg ddgdgdgdgdgd
}| j|dd	}t|dgks.J |jr3J d
d
d
d
d
dddddd
}| D ]\}}|j| d |ksSJ qD|jD ]	}d|j| d< qW| j|ddd}t|dgksrJ |jrwJ | D ]\}}|j| d |d ksJ q{dS )z9Test the tree pictured at the bottom of [West01]_, p. 78.r   axyz)r   r   r   r+   r   r   )
r   r   r   r   r   r   r   r+   r   r   barycentricity)attr   #               )
r   r   r+   r   r   r   r   r   r   r   r+   rl   barycentricity2)rl   r   N)r   rT   r   r   r   itemsnodes)r%   r   r   expected_barycentricitynoder   edger   r   r   test_this_one_specific_tree   sJ   


z*TestBarycenter.test_this_one_specific_treeN)	ra   rb   rc   __doc__r   r   r   r   r   r   r   r   r   r      s    r   )randomr   r   networkxr   r   r"   %networkx.algorithms.distance_measuresr   markparametrizer   r   r   rd   r   r   r   r   r   <module>   s    
TD