o
    3ήc                     @   s.   d dl Z d dlZd dlmZ G dd dZdS )    N)pairwisec                   @   s   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d Zdd ZdS )	TestAStarc                 C   s"   g d}t  | _| j| d S )N)
)su
   )r   x   )r   v   )r   r      )r	   yr
   )r   r      )r   r	   r   )r   r   r   )r   r      )r   r	      )nxDiGraphXGadd_weighted_edges_from)clsedges r   Z/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/shortest_paths/tests/test_astar.pysetup_class   s   
zTestAStar.setup_classc                    sv   ddddd  fdd}t  }g d}g d}|| || g d	}g d}t |d
d|||fv s9J dS )z;Tests that A* algorithm finds any of multiple optimal pathsg?gzG?q=
ףp?r   )abcdc                        |  S Nr   r   r	   heuristic_valuesr   r   h      z0TestAStar.test_multiple_optimal_paths.<locals>.h))r   r   g
ףp=
?)r   r   g(\?)r   r   g      ?)r   r   r   )r   r   r   r   r   N)r   Graphadd_nodes_fromr   
astar_path)selfr#   graphpointsr   path1path2r   r!   r   test_multiple_optimal_paths   s   

 z%TestAStar.test_multiple_optimal_pathsc                 C   s8   t | jddg dksJ t | jdddksJ d S )Nr   r	   r   r   r   r	   	   )r   r'   r   astar_path_lengthr(   r   r   r   test_astar_directed+   s   zTestAStar.test_astar_directedc                 C   s\   t | j}|dd t| D  t |ddg dks!J t |dddks,J d S )Nc                 s   s    | ]
\}}||d fV  qdS )i  Nr   ).0r   r	   r   r   r   	<genexpr>1   s    z2TestAStar.test_astar_multigraph.<locals>.<genexpr>r   r	   r.   r/   )r   MultiDiGraphr   r   listr   r'   r0   r(   Gr   r   r   test_astar_multigraph/   s   zTestAStar.test_astar_multigraphc                 C   s^   | j  }d|d d d< d|d d d< t|ddg dks"J t|ddd	ks-J d S )
Nr   r   r   weightr   r	   r   r.      )r   to_undirectedr   r'   r0   )r(   GGr   r   r   test_astar_undirected5   s
   
zTestAStar.test_astar_undirectedc                 C   s8   t  }g d}|| t |ddg dksJ d S )N))r
      r
   r?   r   r
   r   r   r
   )r   r   r
   )r
   r   2   )r
   r   d   )r   r   rC   r
   r   )r
   r?   r   r   r   r   r   r   r'   )r(   XG2r   r   r   r   test_astar_directed2>   s   
	zTestAStar.test_astar_directed2c                 C   N   t  }g d}|| t |ddg dksJ t |dddks%J 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'   r0   )r(   XG3r   r   r   r   test_astar_undirected2L   s
   
z TestAStar.test_astar_undirected2c                 C   rG   )N)rH   )r
   r   r   rJ   )r   r?   r
   r@   rA   )r   r   r
   )r   r   r
   r   r   rH   r?   rM   )r(   XG4r   r   r   r   test_astar_undirected3S   s
   

z TestAStar.test_astar_undirected3c                    sX   ddddd  fdd}g d}t  }|| g d}t |dd	||ks*J d S )
N$   r?   r   )n5n2n1n0c                    r   r   r   r    r!   r   r   r#   j   r$   z)TestAStar.test_astar_directed3.<locals>.h))rS   rU      )rS   rT   r/   )rT   rU   r
   )rU   rV       rS   rV   rD   )r(   r#   r   r)   answerr   r!   r   test_astar_directed3g   s   
zTestAStar.test_astar_directed3c                 C   s8   g d}t  }|| t |ddg dksJ d S )N))r   r   r
   )r   r   r
   )r   r   r   )r   r   r
   )r   er
   r   r[   )r   r   r   r[   rD   )r(   r   r)   r   r   r   test_astar_directed4w   s   
zTestAStar.test_astar_directed4c                 C   sJ   t  }|g d t |ddg dksJ t |dddks#J d S )N))r   r   )r   r   r    )r   r   )r	   r   )r   r   )r   w)r]   r	   )r   r   )r   r   )r   r	   r   r	   )r   r   r	   r   )r   r   add_edges_fromr'   r0   r7   r   r   r   test_astar_w1   s   zTestAStar.test_astar_w1c                 C   sB   t tj t| jdd W d    d S 1 sw   Y  d S )Nr   moon)pytestraisesr   NodeNotFoundr'   r   r1   r   r   r   test_astar_nopath   s   "zTestAStar.test_astar_nopathc                 C   sB   t d}t |ddg dksJ t |ddg dksJ d S )Nr   r   r   rK   r?   )r   r   r   r?   )r   cycle_graphr'   dijkstra_path)r(   Cr   r   r   
test_cycle   s   
zTestAStar.test_cyclec                 C   sV   dd t dD }t }|t|dd t||d |d }t|dks)J d	S )
zqTests that A* accommodates nodes that are not orderable.

        For more information, see issue #554.

        c                 S   s   g | ]}t  qS r   )object)r3   nr   r   r   
<listcomp>   s    z4TestAStar.test_unorderable_nodes.<locals>.<listcomp>r?   T)cyclicr   r   r   N)ranger   r%   r^   r   r'   len)r(   nodesr8   pathr   r   r   test_unorderable_nodes   s
   z TestAStar.test_unorderable_nodesN)__name__
__module____qualname__classmethodr   r-   r2   r9   r>   rF   rO   rQ   rZ   r\   r_   rd   rh   rq   r   r   r   r   r      s$    
	r   )ra   networkxr   networkx.utilsr   r   r   r   r   r   <module>   s    