o
    ˷e-                     @   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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   \/var/www/ideatree/venv/lib/python3.10/site-packages/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   r7   r   r   r   test_cycle_basis2+      "zTestCycles.test_cycle_basis2c                 C   r:   r;   )r<   r=   r   r>   
MultiGraphr   r6   r@   r   r   r   test_cycle_basis30   rB   zTestCycles.test_cycle_basis3c                    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   r   r   r	   r	   r   c                 3       | ]	}  |V  qd S r   r*   r   rcr/   r(   r   r   r$   <       z0TestCycles.test_simple_cycles.<locals>.<genexpr>)r   r?   r-   simple_cyclesr%   r&   )r(   edgesr   cccar   rO   r   test_simple_cycles5   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-   rQ   r(   r   r/   r   r   r   test_simple_cycles_graph>   s   "z#TestCycles.test_simple_cycles_graphc                 C   s*   t  }t |ddg tt |}d S )Nr)   r   )r   r?   r   listrQ   rV   r   r   r   test_unsortableC   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   rK   r   rL   rM   rO   r   r   r$   T   rP   z6TestCycles.test_simple_cycles_small.<locals>.<genexpr>)r   r?   r   r-   rQ   r%   r*   r&   )r(   r   rS   rT   r   rO   r   test_simple_cycles_smallI   s   z#TestCycles.test_simple_cycles_smallc                 C   s"   t  }tt |g ksJ d S r   )r   r?   rX   rQ   r(   r   r   r   r   test_simple_cycles_emptyV   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%   rX   rQ   )r(   	ncircuitsr#   r/   r   r   r   r   test_complete_directed_graphZ   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_grapha   s   zTestCycles.worst_case_graphc                 C   s@   t ddD ]}| |}ttt|}|d| ksJ qd S )Nr
   rZ   )r'   rf   r%   rX   r   rQ   )r(   re   r   r"   r   r   r   test_worst_case_graphs   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	   rZ   c                 3   rK   r   rL   )r   rrO   r   r   r$      rP   z;TestCycles.test_recursive_simple_and_not.<locals>.<genexpr>c                 3   rK   r   rL   r.   rN   r(   r   r   r$      rP   )r'   rf   r-   r   rQ   recursive_simple_cyclesr%   r&   )r(   re   r   rS   rccr   r/   rN   r(   r   test_recursive_simple_and_notz   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)rF   )r   r
   r   r   )r   r
   rI   )r	   r   r
   r	   )r
   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r	   )r   r
      c                 3   rK   r   rL   rM   rO   r   r   r$      rP   zATestCycles.test_simple_graph_with_reported_bug.<locals>.<genexpr>c                 3   rK   r   rL   r.   ri   r   r   r$      rP   )r   r?   add_edges_fromr-   rQ   r%   rj   r&   )r(   r   rR   rS   rk   r   rl   r   #test_simple_graph_with_reported_bug   s   
z.TestCycles.test_simple_graph_with_reported_bugN)__name__
__module____qualname__classmethodr   r*   r9   rA   rD   rU   rW   rY   r]   r_   rd   rf   rg   rm   rr   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   rE   rn   rn   rI   r
   r   )nodesrR   )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   rR   r<   r=   	exceptionNetworkXNoCycler   ry   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   rE   rG   rH   r   r   rR   r   rX   r   ry   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   rR   r   rX   r   ry   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 )NrE   rn   r   r?   rR   rX   r   ry   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   rE   rn   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?   rR   rX   r   ry   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   rC   rR   rX   r   ry   r   r   r   r   test_multigraph   s
   (zTestFindCycle.test_multigraphc                 C   r   )Nr   )r   r   r   r   r   r	   )r   MultiDiGraphrR   rX   r   ry   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?   rR   rX   r   ry   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   rR   rX   r   ry   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)rE   rG   rG   rJ   r   r   r   r	   r   )r   r   rX   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)rE   rG   )r	   r
   )r   r	   )r   r   r	   r
   r   r   r   )r   r   r<   r=   rz   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)rE   rF   rG   r   r   r   r   r   r	   )
r   r?   r<   r=   rz   r{   r   rX   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)rn   rH   rG   rI   r   sourcer   rG   rI   r	   )r   r?   rq   r<   r=   r{   r   rX   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)rG   rH   rx   ro   r   r   )r   r?   rq   r<   r=   r{   r   r^   r   r   r   test_no_cycle+  s   zTestFindCycle.test_no_cycleN)rs   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   rw      s(    
rw   c                 C   s   t | t |ks
J d S r   r,   )r)   r!   r   r   r   assert_basis_equal4  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   9  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>B      z=TestMinimumCycles.test_unweighted_diamond.<locals>.<listcomp>r   r	   r   )r	   r
   r   r   r   r   r(   mcbr   r   r   test_unweighted_diamond@  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   F  r   z;TestMinimumCycles.test_weighted_diamond.<locals>.<listcomp>r   r   r   r   r   r   r   test_weighted_diamondD  s   $z'TestMinimumCycles.test_weighted_diamondc                 C   s\   d}t |D ]%}tdd}| }| }t|}tt|}||| | ks+J qd S )NrZ   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_dimensionalityH  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   W  s    z9TestMinimumCycles.test_complete_graph.<locals>.<listcomp>)r   rb   r   all)r(   cgr   r   r   r   test_complete_graphT  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_graphY  s   z!TestMinimumCycles.test_tree_graphN)
rs   rt   ru   rv   r   r   r   r   r   r   r   r   r   r   r   8  s    
r   )r<   r   r   networkx.algorithmsr   r   %networkx.algorithms.traversal.edgedfsr   r   r   rw   r   r   r   r   r   r   <module>   s       