o
    3ήcH/                     @   sn   d dl Z d dlZd dlZd dlmZmZ d dlmZmZ G dd dZ	G dd dZ
dd	 ZG d
d dZdS )    N)
find_cycleminimum_cycle_basis)FORWARDREVERSEc                   @   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d Zdd  Zd!S )"
TestCyclesc                 C   sN   t  }t|g d t|g d t|g d |dd || _d S )Nr            r   r
         r   r            r   	   )networkxGraphnx	add_cycleadd_edgeG)clsr    r   L/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/tests/test_cycles.pysetup_class
   s   
zTestCycles.setup_classc                    s>   t |t  krdS || t fddtD S )NFc                 3   s$    | ]}||   kV  qd S Nr   ).0iblnr   r   	<genexpr>   s   " z3TestCycles.is_cyclic_permutation.<locals>.<genexpr>)lenanyrange)selfar!   r   r    r   is_cyclic_permutation   s
   z TestCycles.is_cyclic_permutationc                 C   s"  | j }t|d}tdd |D }|g dg dg dgks!J t|d}tdd |D }|g dg dg dgks?J t|d	}td
d |D }|g dg dg dgks]J t|d t|d	}tdd |d d D t|d g }|g dg dg dg dgksJ d S )Nr   c                 s       | ]}t |V  qd S r   sortedr   cr   r   r   r$          z.TestCycles.test_cycle_basis.<locals>.<genexpr>r   r   r   r   c                 s   r+   r   r,   r.   r   r   r   r$       r0   r   c                 s   r+   r   r,   r.   r   r   r   r$   #   r0   ABCc                 s   r+   r   r,   r.   r   r   r   r$   (   r0   )ABC)r   r   cycle_basisr-   r   r   r(   r   cysort_cyr   r   r   test_cycle_basis   s   ((zTestCycles.test_cycle_basisc                 C   F   t tj t }t|d}W d    d S 1 sw   Y  d S Nr   )pytestraisesr   NetworkXNotImplementedDiGraphr   r6   r(   r   r8   r   r   r   test_cycle_basis2+      "zTestCycles.test_cycle_basis2c                 C   r;   r<   )r=   r>   r   r?   
MultiGraphr   r6   rA   r   r   r   test_cycle_basis30   rC   zTestCycles.test_cycle_basis3c                 C   sj   t  }t |g d t |g d t |}tdd |D }|dgg dg dg dgks3J d	S )
z-Tests the function for graphs with self loopsr   )r   r   r   r	   c                 s   r+   r   r,   r.   r   r   r   r$   ;   r0   z8TestCycles.test_cycle_basis_self_loop.<locals>.<genexpr>r   r   r   r	   )r   r	   r
   )r   r	   r   N)r   r   r   r6   r-   r7   r   r   r   test_cycle_basis_self_loop5   s   
&z%TestCycles.test_cycle_basis_self_loopc                    s|   g d}t |}tt |}dgg dddgddgdgg}t|t|ks)J |D ] t fdd|D s;J q+d S )N))r   r   r   r   r   r	   r   r	   r	   r   r	   r   )r	   r	   r   rF   r	   r   c                 3       | ]	}  |V  qd S r   r*   r   rcr/   r(   r   r   r$   E       z0TestCycles.test_simple_cycles.<locals>.<genexpr>)r   r@   r-   simple_cyclesr%   r&   )r(   edgesr   cccar   rQ   r   test_simple_cycles>   s   
zTestCycles.test_simple_cyclesc                 C   sH   t tj t }tt|}W d    d S 1 sw   Y  d S r   )r=   r>   r   r?   r   r-   rS   r(   r   r/   r   r   r   test_simple_cycles_graphG   s   "z#TestCycles.test_simple_cycles_graphc                 C   s*   t  }t |ddg tt |}d S )Nr)   r   )r   r@   r   listrS   rX   r   r   r   test_unsortableL   s   zTestCycles.test_unsortablec                    s   t  }t |g d tt | t dksJ  d g ds'J t |g d tt |}t|dks>J g dg dg}|D ] t fdd|D sXJ qHd S )N)r   r	   r
   r   r   )
         r	   c                 3   rM   r   rN   rO   rQ   r   r   r$   ]   rR   z6TestCycles.test_simple_cycles_small.<locals>.<genexpr>)r   r@   r   r-   rS   r%   r*   r&   )r(   r   rU   rV   r   rQ   r   test_simple_cycles_smallR   s   z#TestCycles.test_simple_cycles_smallc                 C   s"   t  }tt |g ksJ d S r   )r   r@   rZ   rS   r(   r   r   r   r   test_simple_cycles_empty_   s   z#TestCycles.test_simple_cycles_emptyc                 C   sP   g d}t tdd|D ]\}}tt|}ttt||ks%J qd S )N)r   r   r]   T   i  i=	  i>  r	   r   )zipr'   r   r@   complete_graphr%   rZ   rS   )r(   	ncircuitsr#   r/   r   r   r   r   test_complete_directed_graphc   s
   z'TestCycles.test_complete_directed_graphc                 C   s  t  }td|d D ]}|d| |||d  q|d| d d t|d d| d D ]}||d| d  |||d  q1|d| d |d  td| d d| d D ]}|d| d | ||d| d  q_|d| d d| d  |S )Nr	   r   r
   )r   r@   r'   r   )r(   kr   r#   r   r   r   worst_case_graphj   s   zTestCycles.worst_case_graphc                 C   s@   t ddD ]}| |}ttt|}|d| ksJ qd S )Nr
   r\   )r'   rh   r%   rZ   r   rS   )r(   rg   r   r"   r   r   r   test_worst_case_graph|   s
   
z TestCycles.test_worst_case_graphc                    s   t ddD ]E}|}tt|}tt|}t|t|ks$J |D ] t fdd|D s6J q&|D ]tfdd|D sIJ q9qd S )Nr	   r\   c                 3   rM   r   rN   )r   rrQ   r   r   r$      rR   z;TestCycles.test_recursive_simple_and_not.<locals>.<genexpr>c                 3   rM   r   rN   r.   rP   r(   r   r   r$      rR   )r'   rh   r-   r   rS   recursive_simple_cyclesr%   r&   )r(   rg   r   rU   rccr   r/   rP   r(   r   test_recursive_simple_and_not   s   
z(TestCycles.test_recursive_simple_and_notc                    s   t  }g d}|| tt |}t|dksJ tt |}t|t|ks-J |D ] t fdd|D s?J q/|D ]tfdd|D sRJ qBd S )N)rI   )r   r
   r   r   )r   r
   rL   )r	   r   r
   r	   )r
   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r	   )r   r
      c                 3   rM   r   rN   rO   rQ   r   r   r$      rR   zATestCycles.test_simple_graph_with_reported_bug.<locals>.<genexpr>c                 3   rM   r   rN   r.   rk   r   r   r$      rR   )r   r@   add_edges_fromr-   rS   r%   rl   r&   )r(   r   rT   rU   rm   r   rn   r   #test_simple_graph_with_reported_bug   s   
z.TestCycles.test_simple_graph_with_reported_bugN)__name__
__module____qualname__classmethodr   r*   r:   rB   rE   rG   rW   rY   r[   r_   ra   rf   rh   ri   ro   rt   r   r   r   r   r   	   s$    
		r   c                   @   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d Zdd  Zd!d" Zd#d$ Zd%S )&TestFindCyclec                 C   s   g d| _ g d| _d S )Nr   ))r2   r   rH   rp   rp   rL   r
   r   )nodesrT   )r   r   r   r   r      s   
zTestFindCycle.setup_classc                 C   s&   t | j}tt jjt|| j d S r   )	r   r   rT   r=   r>   	exceptionNetworkXNoCycler   r{   r`   r   r   r   test_graph_nocycle   s   z TestFindCycle.test_graph_nocyclec                 C   s@   t | j}|dd tt|| j}g d}||ksJ d S )Nr	   r   rH   rJ   rK   r   r   rT   r   rZ   r   r{   r(   r   xx_r   r   r   test_graph_cycle   s
   zTestFindCycle.test_graph_cyclec                 C   sD   t | j}|dd tt|| jd d}g d}||ks J d S )Nr	   r   orientationr   r   r   r   r   r   test_graph_orientation_none   s
   z)TestFindCycle.test_graph_orientation_nonec                 C   sX   t | j}|dd tt|| jdd}ddtfddtfddtfg}||ks*J d S )Nr	   r   originalr   r   )r   r   rT   r   rZ   r   r{   r   r   r   r   r   test_graph_orientation_original   s
   z-TestFindCycle.test_graph_orientation_originalc                 C   s4   t | j}tt|| j}ddg}||ksJ d S )NrH   rp   r   r@   rT   rZ   r   r{   r   r   r   r   test_digraph   s   zTestFindCycle.test_digraphc                 C   s8   t | j}tt|| jd d}ddg}||ksJ d S )Nr   rH   rp   r   r   r   r   r   test_digraph_orientation_none   s   z+TestFindCycle.test_digraph_orientation_nonec                 C   D   t | j}tt|| jdd}ddtfddtfg}||ks J d S )Nr   r   r   r   r   r@   rT   rZ   r   r{   r   r   r   r   r   !test_digraph_orientation_original      z/TestFindCycle.test_digraph_orientation_originalc                 C   `   t | j}tt|| j}ddg}|d |d ksJ |d d d |d d d ks.J d S )Nr   r   r   )r   r   r   r   r   r	   )r   rD   rT   rZ   r   r{   r   r   r   r   test_multigraph   s
   (zTestFindCycle.test_multigraphc                 C   r   )Nr   )r   r   r   r   r   r	   )r   MultiDiGraphrT   rZ   r   r{   r   r   r   r   test_multidigraph   s
   (zTestFindCycle.test_multidigraphc                 C   r   )Nignorer   r   r   r   r   r   r   r   test_digraph_ignore   r   z!TestFindCycle.test_digraph_ignorec                 C   r   )Nreverser   r   r   )r   r@   rT   rZ   r   r{   r   r   r   r   r   test_digraph_reverse   r   z"TestFindCycle.test_digraph_reversec                 C   s   t | j}tt|| jdd}dddtfdddtfg}|d |d ks&J |d d d |d d d ks8J |d d |d d ksFJ d S )Nr   r   r   r   r	   r
   )r   r   rT   rZ   r   r{   r   r   r   r   r   test_multidigraph_ignore   s   $ z&TestFindCycle.test_multidigraph_ignorec                 C   sL   t g d}tt|g ddd}dddtfdddtfg}||ks$J d S )N)rH   rJ   rJ   rF   r   r   r   r	   r   )r   r   rZ   r   r   r   r   r   r   r   test_multidigraph_ignore2  s   z'TestFindCycle.test_multidigraph_ignore2c                 C   s.   t g d}tjt jjt|g ddd d S )N)rH   rJ   )r	   r
   )r   r	   )r   r   r	   r
   r   r   r   )r   r   r=   r>   r|   r}   r   r`   r   r   r   test_multidigraph_original  s   
z(TestFindCycle.test_multidigraph_originalc                 C   s\   t g d}tjt jjt|dd tt|dd}|ddtfddtfddt	fgks,J d S )N)rH   rI   rJ   r   r   r   r   r   r	   )
r   r@   r=   r>   r|   r}   r   rZ   r   r   )r(   r   r   r   r   r   test_dag  s   (zTestFindCycle.test_dagc                 C   s   t  }|g d tjt jt|dd tt |d}ddg}||ks'J tt |d}ddg}||ks9J tt |}ddg}||ksJJ d S )N)rp   rK   rJ   rL   r   sourcer   rJ   rL   r	   )r   r@   rs   r=   r>   r}   r   rZ   r   r   r   r   test_prev_explored"  s   z TestFindCycle.test_prev_exploredc                 C   s>   t  }|g d tjt jt|dd tt jt| d S )N)rJ   rK   rz   rq   r   r   )r   r@   rs   r=   r>   r}   r   r`   r   r   r   test_no_cycle4  s   zTestFindCycle.test_no_cycleN)ru   rv   rw   rx   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ry      s(    
ry   c                 C   s   t | t |ks
J d S r   r,   )r)   r!   r   r   r   assert_basis_equal=  s   r   c                   @   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S )TestMinimumCyclesc                 C   s6   t  }t j|g ddd |jdddd || _d S )Nr   r	   r
   r   r   weightr	   r   r   )r   r   r   r   diamond_graph)r   Tr   r   r   r   B  s   
zTestMinimumCycles.setup_classc                 C   s.   t | j}tdd |D g dg dg d S )Nc                 S      g | ]}t |qS r   r,   r.   r   r   r   
<listcomp>K      z=TestMinimumCycles.test_unweighted_diamond.<locals>.<listcomp>r   r	   r   )r	   r
   r   r   r   r   r(   mcbr   r   r   test_unweighted_diamondI  s   
$z)TestMinimumCycles.test_unweighted_diamondc                 C   s2   t | jdd}tdd |D g dg dg d S )Nr   r   c                 S   r   r   r,   r.   r   r   r   r   O  r   z;TestMinimumCycles.test_weighted_diamond.<locals>.<listcomp>r   r   r   r   r   r   r   test_weighted_diamondM  s   $z'TestMinimumCycles.test_weighted_diamondc                 C   s\   d}t |D ]%}tdd}| }| }t|}tt|}||| | ks+J qd S )Nr\   g333333?)r'   r   erdos_renyi_graphnumber_of_nodesnumber_of_edgesnumber_connected_componentsr%   r   )r(   ntrial_rgnnodesnedgesncompdim_mcbr   r   r   test_dimensionalityQ  s   
z%TestMinimumCycles.test_dimensionalityc                 C   s,   t d}t|}tdd |D sJ d S )Nr   c                 S   s   g | ]}t |d kqS )r
   )r%   )r   cycler   r   r   r   `  s    z9TestMinimumCycles.test_complete_graph.<locals>.<listcomp>)r   rd   r   all)r(   cgr   r   r   r   test_complete_graph]  s   
z%TestMinimumCycles.test_complete_graphc                 C   s   t dd}t|rJ d S )Nr
   )r   balanced_treer   )r(   tgr   r   r   test_tree_graphb  s   z!TestMinimumCycles.test_tree_graphN)
ru   rv   rw   rx   r   r   r   r   r   r   r   r   r   r   r   A  s    
r   )r=   r   r   networkx.algorithmsr   r   %networkx.algorithms.traversal.edgedfsr   r   r   ry   r   r   r   r   r   r   <module>   s     ) 