o
    3ήc                     @   s   d dl Z d dlZd dlmZ dddZdddZG dd	 d	ZG d
d deZG dd dZ	G dd dZ
G dd deZG dd deZdS )    N)pairwiseweightc                    s|   |d |ksJ |d |ksJ t rn  r"fddnfddt fddt|D }||ks<J d S )Nr   c                    s   t  fdd| D S )Nc                 3   s    | ]	}|  d V  qdS )   Nget).0er    ]/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/shortest_paths/tests/test_weighted.py	<genexpr>   s    z2validate_path.<locals>.weight_f.<locals>.<genexpr>)minvaluesuvdr
   r   r   weight_f   s   zvalidate_path.<locals>.weight_fc                    s   |  dS )Nr   r   r   r
   r   r   r         c                 3   s(    | ]\}}|| | | V  qd S Nr   r   r   r   )Gr   r   r   r      s   & z validate_path.<locals>.<genexpr>)callableis_multigraphsumr   )r   stsoln_lenpathr   computedr   )r   r   r   r   validate_path   s   r!   c                 C   s$   ||ksJ t | |||||d d S Nr
   )r!   )r   r   r   r   lengthr   r   r   r   r   validate_length_path   s   r$   c                   @      e Zd ZdZdd ZdS )WeightedTestBasezjBase class for test classes that test functions for computing
    shortest paths in weighted graphs.

    c                 C   sv  t j}|t ddddd| _t d| _t jdt  d| _t  | _| j	g d t 
| j| _| jjdd	d
d t  | _| j	g dg dg dg dg dg dg dg t  | _| j	g dg dg dg dg dg dg t  | _| j	g dg dg dg dg dg dg dg dg t | j| _| jjdddd t  | _| jg d dS ) z.Creates some graphs for use in the unit tests.   r   sorted)first_labelordering   create_using
)r   r   
   )r   x   )r   r   r   )r   r0      )r   yr   )r0   r      )r0   r   r1   )r0   r3   r2   )r3   r   r+   )r3   r      r   r      r
   )r   r'   r   )r'   r1   r   )r1   r5   r   )r5   r4   r   )r   r4   2   )r   r2   d   )r2   r4   r8   r   r   r2   )r   r2      r2   r4   r   )r4   r'   r1   )r1   r   r/   )r   r2   r2   r4   r'   r   )r5   r+   r   )r+   r   r   r   r4   )
)r   r   )r   r0   )r   r   )r   r0   )r   r3   )r0   r   )r0   r   )r0   r3   )r3   r   )r3   r   N)nxconvert_node_labels_to_integersgrid_2d_graphgridcycle_graphcycleDiGraphdirected_cycleXGadd_weighted_edges_fromMultiDiGraphMXGadd_edgeXG2GraphXG3XG4
MultiGraphMXG4r   add_edges_from)selfcnltir   r   r   setup_method'   sV   


&

zWeightedTestBase.setup_methodN)__name__
__module____qualname____doc__rS   r   r   r   r   r&   !       r&   c                	   @   s   e Zd Zdd Zdd Zdd Zdd Zej	d	e
je
je
je
je
je
jf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 )%TestWeightedPathc              
   C   s  t | jd\}}t| jddd|d  |d dksJ t| jdddt | jdd  tt | jdd dks;J t| jdddt | jdd d  t| jdddt | jdd  | j }d|d d d< t |d\}}t|ddd	|d  |d d	ksJ t|ddd	t 	|dd t 
|ddd	ksJ t| jdd
dt 	| jdd
 t| jdd
dt 	| jdd
 t 
| jdd
dksJ t| jdddt 	| jdd t 
| jdddksJ t| jdddt 	| jdd t| jdddt | jddd  t| jdddt | jdd d  t| jdddt 	| jdd t 
| jdddks/J tt jt j	| jdd tt jt j
| jdd t| jdd
d
t 	| jdd
 t| jddd
t 	| jdd t | jddddgfksuJ d S )Nr   r   	   r   r2   r   r0   r      r4   r'   r   r6   moon)r=   single_source_dijkstrarE   r!   single_source_dijkstra_pathdict"single_source_dijkstra_path_lengthrH   to_undirecteddijkstra_pathdijkstra_path_lengthrJ   rL   rM   rO   r   pytestraisesNetworkXNoPathrB   )rQ   DPGGr   r   r   test_dijkstraq   sN   
$zTestWeightedPath.test_dijkstrac                    sT  t  jdddgt jddR   t  jdddgt jddR   t  jdddgt jddR   t  jdddgt jddR   t  jdddgt jddR   t  jdddgt jddR   t jdd }t	 jddt
 fd	d
t|d d |dd  D t jdd td}ttjtj|dd d S )Nr   r   rZ   r2   r   r4   r'   r6   c                 3   s&    | ]\}} j | | d  V  qdS )r   N)rE   r   rQ   r   r   r      s   $ z?TestWeightedPath.test_bidirectional_dijkstra.<locals>.<genexpr>r   r   )r$   rE   r=   bidirectional_dijkstrar   rB   rL   rM   r^   r!   r   ziprb   
path_graphrd   re   NodeNotFound)rQ   rh   r   r   rk   r   test_bidirectional_dijkstra   sP   





*
	z,TestWeightedPath.test_bidirectional_dijkstrac           	         sd  dd  fdd d fdd	}dfdd		}d
d }| j }d}d}dgtt|d  }dd tfddt|D }|||||tj |||||tj |||||tj |||||| |||||| dd tfddt|D }|||||tj |||||tj |||||tj |||||| |||||| d S )Nc                  W   s   t dd | D S )Nc                 s   s    | ]}|d  V  qdS )r2   Nr   )r   valr   r   r   r      s    zLTestWeightedPath.test_weight_functions.<locals>.heuristic.<locals>.<genexpr>)r   )zr   r   r   	heuristic   s   z9TestWeightedPath.test_weight_functions.<locals>.heuristicc                    s$   ||kr|gS  | | | ||g S r   r   )predr   r   getpathr   r   rv      s   $z7TestWeightedPath.test_weight_functions.<locals>.getpathr   c                    s,   t j| ||d\}}|| }| |||fS r"   )r=   goldberg_radzik)gr   r   r   rt   distru   r   r   rw      s   z?TestWeightedPath.test_weight_functions.<locals>.goldberg_radzikc                    s0   t j| || |d}t j| || |d}||fS r"   )r=   
astar_pathastar_path_length)rx   r   r   r   r   ry   rs   r   r   astar   s   z5TestWeightedPath.test_weight_functions.<locals>.astarc                 S   s0   || |||d}t | |||g|R d|i d S )Nr
   r   )r$   )r   r   r   lFwresr   r   r   vlp   s    z3TestWeightedPath.test_weight_functions.<locals>.vlpr5   r'   r   c                 S   s   d|d  S )Nr   r2   r   r   r   _r   r   r   r      r   z6TestWeightedPath.test_weight_functions.<locals>.weightc                 3        | ]\}} ||d V  qd S r   r   r   r
   r   r   r          z9TestWeightedPath.test_weight_functions.<locals>.<genexpr>c                 S   s   d| |  S )Nr2   r   r   r   r   r   r      r   c                 3   r   r   r   r   r
   r   r   r      r   r
   )	rB   listranger   r   r=   rl   r]   single_source_bellman_ford)	rQ   rw   r}   r   r   r   r   r   r#   r   )rv   rs   r   r   test_weight_functions   s.   z&TestWeightedPath.test_weight_functionsc                 C   sh   t tj$ t }t|g d t|g d t|dd}W d    d S 1 s-w   Y  d S )N)r   r2   r4   )r'   r1   r5   r   r5   )rd   re   r=   rf   rK   add_pathrl   )rQ   r   r   r   r   r   #test_bidirectional_dijkstra_no_path   s   "z4TestWeightedPath.test_bidirectional_dijkstra_no_pathfnc                 C   s   t d}tt j ||dd W d    n1 sw   Y  tt j ||dd W d    d S 1 s9w   Y  d S Nr2   r4   r   r=   rn   rd   re   ro   rQ   r   r   r   r   r   test_absent_source   s   
"z#TestWeightedPath.test_absent_sourcec                 C   s@   t d}t |dg dgdgdgddddddfksJ d S )Nr'   r   r   r2   r   r   r2   r4   r4   )r=   rn   !dijkstra_predecessor_and_distancerQ   r   r   r   r   test_dijkstra_predecessor1  s
   

z+TestWeightedPath.test_dijkstra_predecessor1c                 C   s   t g d}t |d\}}|d g ksJ |d dgks J |d ddgddgfv s.J |d dgks7J |dddddksBJ d S )N)r   r   )r   r2   )r2   r4   )r4   r   r   r   r2   r4   r   )r=   rK   r   )rQ   r   rt   ry   r   r   r   test_dijkstra_predecessor2  s   z+TestWeightedPath.test_dijkstra_predecessor2c                 C   sl   t  }|g d t |d\}}|d dgksJ |d dks$J t j|ddd\}}d|vs4J d S )Nr.   r   r   r   rZ   r[   cutoff)r=   rC   rF   r   )rQ   rE   rh   rg   r   r   r   test_dijkstra_predecessor3   s   z+TestWeightedPath.test_dijkstra_predecessor3c                 C   sB   t j}t|| jdd dksJ || jddd}d|vsJ d S )Nr   r2   r'   r   )r=   r`   r_   rO   )rQ   plsplr   r   r   'test_single_source_dijkstra_path_length6  s   z8TestWeightedPath.test_single_source_dijkstra_path_lengthc                 C   sN   t  }|jdddd |jdddd t |dd}|dddgfks%J d S )Nabr/   r
   r8   )r=   rN   rI   rl   )rQ   r   dpr   r   r   &test_bidirectional_dijkstra_multigraph<  s
   z7TestWeightedPath.test_bidirectional_dijkstra_multigraphc                 C   sj   t  }|jdddddd |jddddd	d
 t |d\}}|g dgdks*J |dddks3J d S )Nr   r   shortr1   r8   )keyfoor   longr   n   )r   barr   )r   r   r   )r=   rN   rI   r   )rQ   r   pr   r   r   r   &test_dijkstra_pred_distance_multigraphC  s   z7TestWeightedPath.test_dijkstra_pred_distance_multigraphc                 C   s   t jdt  d}t |rJ |jdddd |jdddd t|}t |s+J |t|ks3J ttt j	|d ttt j
|d ttt j|d |dd ttt j|dd d S )	Nr1   r,   r[   rZ   r
   r4   r/   )r=   rA   rC   negative_edge_cyclerI   lenrd   re   
ValueErrorr`   r]   r   rl   )rQ   r   
graph_sizer   r   r   test_negative_edge_cycleK  s   z)TestWeightedPath.test_negative_edge_cyclec                 C   s>   t  }|jdddd |jdddd t j|ddsJ d S )Nr   r   )r   r   r   r
   )r=   rC   rI   r   )rQ   r   r   r   r   *test_negative_edge_cycle_custom_weight_keyY  s   z;TestWeightedPath.test_negative_edge_cycle_custom_weight_keyc                 C   s   t d}d|jd d d< d|jd d d< d|jd d d< dd }t |dd\}}|dks3J |g d	ks;J t j|dd|d
\}}|dksLJ |ddgksTJ dS )zpTests that a callable weight is interpreted as a weight
        function instead of an edge attribute.

        r4   r/   r   r2   r   r   c                 S      d|d  S Nr   r   r   r   r   r   r   r   o  r   z5TestWeightedPath.test_weight_function.<locals>.weightr9   r
   皙?N)r=   complete_graphadjr]   )rQ   r   r   distancer   r   r   r   test_weight_function_  s   
z%TestWeightedPath.test_weight_functionc                 C   sj   t d}tt |}|d d g dksJ d|d d d< tt |}|d d g d	ks3J d S )
Nr+   r   r4   r   r/   r   r2   r   r   r5   r1   r'   r4   )r=   rA   r_   all_pairs_dijkstra_path)rQ   rB   r   r   r   r   test_all_pairs_dijkstra_path}  s   
z-TestWeightedPath.test_all_pairs_dijkstra_pathc              	   C   sz   t d}tt |}|d ddddddddksJ d|d d d< tt |}|d ddd	d
ddddks;J d S )Nr+   r   r   r2   r4   r   r   r2   r4   r'   r1   r5   r/   r   r1   r'   )r=   rA   r_   all_pairs_dijkstra_path_length)rQ   rB   r   r   r   r   #test_all_pairs_dijkstra_path_length  s   
 $z4TestWeightedPath.test_all_pairs_dijkstra_path_lengthc              	   C   s   t d}tt |}|d d ddddddddksJ |d d d g dks,J d|d d d	< tt |}|d d ddd
dddddksMJ |d d d g dks[J d S )Nr+   r   r   r2   r4   r   r   r/   r   r1   r'   r   )r=   rA   r_   all_pairs_dijkstra)rQ   rB   outr   r   r   test_all_pairs_dijkstra  s   
$$ z(TestWeightedPath.test_all_pairs_dijkstraN)rT   rU   rV   rj   rp   r   r   rd   markparametrizer=   rb   rc   r^   r`   r]   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rY   p   s8    4".

		rY   c                   @   r%   )TestDijkstraPathLengthzLUnit tests for the :func:`networkx.dijkstra_path_length`
    function.

    c                 C   sj   t d}d|jd d d< d|jd d d< d|jd d d< dd }t j|dd|d	}|d
ks3J dS )zTests for computing the length of the shortest path using
        Dijkstra's algorithm with a user-defined weight function.

        r4   r/   r   r2   r   r   c                 S   r   r   r   r   r   r   r   r     r   z;TestDijkstraPathLength.test_weight_function.<locals>.weightr
   r   N)r=   r   r   rc   )rQ   r   r   r#   r   r   r   r     s   
z+TestDijkstraPathLength.test_weight_functionN)rT   rU   rV   rW   r   r   r   r   r   r     rX   r   c                   @   sZ   e Zd ZdZdd Zdd Zdd Zej	de
je
je
jfd	d
 Zdd Zdd ZdS )TestMultiSourceDijkstrazYUnit tests for the multi-source dialect of Dijkstra's shortest
    path algorithms.

    c                 C   @   t t tt i  W d    d S 1 sw   Y  d S r   )rd   re   r   r=   multi_source_dijkstrarK   rk   r   r   r   test_no_sources     "z'TestMultiSourceDijkstra.test_no_sourcesc                 C   r   r   )rd   re   r   r=   multi_source_dijkstra_pathrK   rk   r   r   r   test_path_no_sources  r   z,TestMultiSourceDijkstra.test_path_no_sourcesc                 C   r   r   )rd   re   r   r=   !multi_source_dijkstra_path_lengthrK   rk   r   r   r   test_path_length_no_sources  r   z3TestMultiSourceDijkstra.test_path_length_no_sourcesr   c                 C   s   t d}tt j ||dgd W d    n1 sw   Y  tt j ||dgd W d    d S 1 s;w   Y  d S r   r   r   r   r   r   r     s   
	"z*TestMultiSourceDijkstra.test_absent_sourcec                 C   s~   g d}t  }|| ddh}t ||\}}dddddd}dgddgg dddgdgd}||ks7J ||ks=J d S )	N)r   r   r   r   r2   r   )r2   r4   r/   r<   r   r'   r   r2   r   r   r2   r4   r'   r9   r4   )r=   rK   rF   r   )rQ   edgesr   sources	distancespathsexpected_distancesexpected_pathsr   r   r   test_two_sources  s   
 z(TestMultiSourceDijkstra.test_two_sourcesc                 C   sV   t d}t |dg}|dd |D ksJ t |dg}|dd |D ks)J d S )Nr'   r   c                 S   s   i | ]}||qS r   r   r   nr   r   r   
<dictcomp>  s    z=TestMultiSourceDijkstra.test_simple_paths.<locals>.<dictcomp>c                 S   s   i | ]}|t t|d  qS )r   )r   r   r   r   r   r   r     s    )r=   rn   r   r   )rQ   r   lengthsr   r   r   r   test_simple_paths  s
   
z)TestMultiSourceDijkstra.test_simple_pathsN)rT   rU   rV   rW   r   r   r   rd   r   r   r=   r   r   r   r   r   r   r   r   r   r   r     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d Zdd  Zd!d" Zd#S )$ TestBellmanFordAndGoldbergRadzikc                 C   s   t  }|d t |dddgiksJ t |dddiks"J t |dddiddgifks3J t |ddg iddifksCJ t |ddd iddifksSJ d S Nr   )r=   rC   add_nodesingle_source_bellman_ford_path&single_source_bellman_ford_path_lengthr   %bellman_ford_predecessor_and_distancerw   r   r   r   r   test_single_node_graph  s   
" $z7TestBellmanFordAndGoldbergRadzik.test_single_node_graphc                 C   sX   t d}t jt jt jt jt jt jfD ]}t	t j
||dd t	t j
||dd qd S r   )r=   rn   r   bellman_ford_pathbellman_ford_path_lengthr   r   r   rd   re   ro   )rQ   r   r   r   r   r   test_absent_source_bellman_ford  s   
z@TestBellmanFordAndGoldbergRadzik.test_absent_source_bellman_fordc                 C   sJ   t tj td}t|dd W d    d S 1 sw   Y  d S r   )rd   re   r=   ro   rn   rw   r   r   r   r   "test_absent_source_goldberg_radzik	  s   
"zCTestBellmanFordAndGoldbergRadzik.test_absent_source_goldberg_radzikc                 C   s   t  }|jdddd |jdddd |jdddd |jdddd t j|ddr-J |jddd	d t j|dds>J d|jd
 d< t j|ddrNJ d S )Nr   r   r   r
   r2   r4   Tr|   gCl?)r2   r   r   )r=   rC   rI   r   r   r   r   r   r   test_negative_cycle_heuristic  s   z>TestBellmanFordAndGoldbergRadzik.test_negative_cycle_heuristicc           	   
      s   dd l }|jtdD ]C}|| dD ]9}dD ]4}dD ]/ tj||ddd} fd	d
|jD }|| tj|dd}tj|dd}||ksKJ qqqqd S )Nr   r2   )r   g?)r   r/      )r   Z   r'   T)seeddirectedc                 3   s$    | ]\}}||d  fV  qdS )r   Nr   r   max_costunifr   r   r   $  s   " zSTestBellmanFordAndGoldbergRadzik.test_negative_cycle_consistency.<locals>.<genexpr>Fr|   )	randomuniformr   r   r=   binomial_graphr   rF   r   )	rQ   r   random_seeddensityNr   r   no_heuristicwith_heuristicr   r   r   test_negative_cycle_consistency  s"   

z@TestBellmanFordAndGoldbergRadzik.test_negative_cycle_consistencyc                 C   s  t jdt  d}|jdddd tdD ]4}tt jt j|| tt jt j	|| tt jt j
|| tt jt j|| tt jt j|| qt d}|jdddd tdD ]4}tt jt j|| tt jt j	|| tt jt j
|| tt jt j|| tt jt j|| q[t dddd	ifg}tt jt j|d tt jt j	|d tt jt j
|d tt jt j|d tt jt j|d d S )
Nr1   r,   r   r2   r   r
   r   r   )r=   rA   rC   rI   r   rd   re   NetworkXUnboundedr   r   r   r   rw   )rQ   r   ir   r   r   test_negative_cycle+  sL   
z4TestBellmanFordAndGoldbergRadzik.test_negative_cyclec                 C   sf   t jdt  d}t |g d |jdddd t |dg dks%J t |d	g d
ks1J d S )Nr1   r,   )r4   r1   r5   r+   r[   rZ   r   r2   ir
   )r   r   r2   r4   r'   r   r+   )r2   r4   r'   r   r   r2   )r=   rA   rC   	add_cyclerI   find_negative_cycler   r   r   r   %test_find_negative_cycle_longer_cycleS  s
   zFTestBellmanFordAndGoldbergRadzik.test_find_negative_cycle_longer_cyclec                 C   s*   t jdt  d}tt jt j|d d S )Nr1   r,   r4   )r=   rn   rC   rd   re   NetworkXErrorr   r   r   r   r   !test_find_negative_cycle_no_cycleZ  s   zBTestBellmanFordAndGoldbergRadzik.test_find_negative_cycle_no_cyclec                 C   s4   t  }|jdddd t |dg dksJ d S )Nr   r   r   r
   )r   r   r   )r=   rK   rI   r   r   r   r   r   $test_find_negative_cycle_single_edge^  s   zETestBellmanFordAndGoldbergRadzik.test_find_negative_cycle_single_edgec                 C   s"  t jdt  d}|jdddd t |ddgddgg dg d	g d
d
ks*J t |ddddddd
ks:J t |ddddddd
dgddgg dg d	g d
d
fks[J t |dg dgdgdgdgd
dddddd
fkswJ t |dd ddddd
dddddd
fksJ d S )Nr1   r,   r   r2   r   r
   r   r9   r   r   r   r   r4   )	r=   rA   rC   rI   r   r   r   r   rw   r   r   r   r   test_negative_weightc  s8   


 



z5TestBellmanFordAndGoldbergRadzik.test_negative_weightc              	   C   s  t d}|dd |dd t |ddgddgddgddgdd	gdd
gdks-J t |ddddddddks>J t |dddddddddgddgddgddgdd	gdd
gdfkscJ t |dg dgdgdgdgdgddddddddfksJ t |dd dddddddddddddfksJ t d}|ddddifddddifddddifg t j|ddddgddgddgddgdd	gdd
gdksJ t j|ddddddddddksJ t j|dddddddddddgddgddgddgdd	gdd
gdfksJ t j|dddg dgdgdgdgdgddddddddfks3J t j|dddd dddddddddddddfksPJ d S )Nr5   r/      r:   r   r   r2   r4   r'   r1   )r   r   r2   r4   r'   r1   ABloadCir
   )	r=   r   rI   r   r   r   r   rw   rP   r   r   r   r   test_not_connected  s   



&





&z3TestBellmanFordAndGoldbergRadzik.test_not_connectedc                 C   s  t | jddg dksJ t | jdddksJ t | jdd g dks)J t | jdd dks6J t j| jddd\}}|dksGJ |g dksOJ t | jd\}}|d dgksaJ |d dksiJ t | jd\}}|d dkszJ |d dksJ t | j	ddg d	ksJ t | j	ddd
ksJ t | j	dd g d	ksJ t | j	dd d
ksJ t j| j	ddd\}}|d
ksJ |g d	ksJ t | j	d\}}|d dgksJ |d d
ksJ t | j	d\}}|d dksJ |d d
ksJ d S )Nr   r   r   r0   r   r   rZ   targetr   r   r2   r9   r'   r   )
r=   r   rH   r   r   r   r   r   rw   rO   rQ   rg   rh   r   r   r   test_multigraph  s4   z0TestBellmanFordAndGoldbergRadzik.test_multigraphc                 C   s  t | jddg dksJ t | jdddksJ t | jdd g dks)J t | jdd dks6J t j| jddd\}}|dksGJ |g dksOJ t | jd\}}|d dgksaJ |d dksiJ t | jd\}}|d dkszJ |d dksJ d S )Nr   r   r
  rZ   r  r   )	r=   r   rE   r   r   r   r   r   rw   r  r   r   r   test_others  s   z,TestBellmanFordAndGoldbergRadzik.test_othersc                 C   s  t d}t |ddgddgg dg ddksJ t |ddddddks*J t |dddddddgddgg dg ddfksGJ t |dg dgdgdgddddddfks`J t |dd dddddddddfksvJ t |dg dg d	ddgdgdksJ t |ddddddksJ t |ddddddg dg d	ddgdgdfksJ t |ddgdgdgg ddddddfksJ t |ddddd ddddddfksJ d S )
Nr'   r   r   r9   r   r2   r4   )r4   r2   r   r   )r4   r2   r   )r=   rn   r   r   r   r   rw   r   r   r   r   test_path_graph  sb   















z0TestBellmanFordAndGoldbergRadzik.test_path_graphc                 C   sj  t g d}t |d\}}|dddddksJ |d dgks#J |d ddgks-J |d g dg dfv s;J |d ddgksEJ t |d\}}|d g ksUJ |d dgks^J |d ddgddgfv slJ |d dgksuJ |dddddksJ t |d\}}|d d u sJ |d dksJ |d d	v sJ |d dksJ |dddddksJ d S )
Nr   r   r   r2   r   r9   )r   r4   r2   r4   )r   r4   )r=   rK   r   r   rw   )rQ   r   ry   r   rt   r   r   r   test_4_cycle1  s&   z-TestBellmanFordAndGoldbergRadzik.test_4_cyclec                 C   s   t  }|d |jdddd |jdddd |jddd	d |jdddd t |ddg d
ks6J t |dddksAJ d S )Nabcdr   r   r   r
   r   r   cr   )r   r   r  r   r   )r=   rC   add_nodes_fromrI   r   r   r   r   r   r   test_negative_weight_bf_pathI  s   
z=TestBellmanFordAndGoldbergRadzik.test_negative_weight_bf_pathc                 C   sD   t  }|g d t |dd t |dd t |dd d S )N)r   r   r;   )r4   r   r   r   r4   )r=   rC   rF   r   rb   rl   )rQ   rg   r   r   r   test_zero_cycle_smokeT  s
   z6TestBellmanFordAndGoldbergRadzik.test_zero_cycle_smokeN)rT   rU   rV   r   r   r   r   r   r   r   r  r  r  r	  r  r  r  r  r  r  r   r   r   r   r     s$    	(H!3r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestJohnsonAlgorithmc                 C   sN   t tj t }|d t| W d    d S 1 s w   Y  d S r   )rd   re   r=   r   rC   r   johnsonr   r   r   r   r   _  s
   
"z+TestJohnsonAlgorithm.test_single_node_graphc                 C   sT   t  }|g d tt jt j| t  }|g d tt jt j| d S )N)03r4   r  1)r  r  r  r  2r2   r  r   r'   r   r  r   )r=   rC   rF   rd   re   r   r  rK   r   r   r   r   r   e  s   

z(TestJohnsonAlgorithm.test_negative_cyclec                 C   sv   t  }|g d t |}|dgg dddgdddgdgg dg dd	d
d
gidd
gdgdd	ks9J d S )N)r  r  r  r!  r"  r  )r  r   r  r   )r  r  r   r  )r  r  r   r  )r  r  r   )r  r  r  r   r  )r  r   )r=   rC   rF   r  )rQ   r   r   r   r   r   test_negative_weights  s   
z*TestJohnsonAlgorithm.test_negative_weightsc                 C   sF   t tj td}t| W d    d S 1 sw   Y  d S )Nr1   )rd   re   r=   r   rn   r  r   r   r   r   test_unweighted_graph  s   
"z*TestJohnsonAlgorithm.test_unweighted_graphc                 C   s   t | jdddt| jd d  t | jdddt| jd d  t | jdddt| jd d  t | jdddt| jd d  t | jdd	dt| jd d	  t | jdd	dt| jd d	  d S )
Nr   r   rZ   r   r4   r'   r   r6   r2   )	r!   rE   r=   r  rH   rJ   rL   rM   rO   rk   r   r   r   test_graphs  s   """""&z TestJohnsonAlgorithm.test_graphsN)rT   rU   rV   r   r   r#  r$  r%  r   r   r   r   r  ^  s    r  r
   )rd   networkxr=   networkx.utilsr   r!   r$   r&   rY   r   r   r   r  r   r   r   r   <module>   s    

O  -!4  p