U
    ?hnx                     @   s   d dl mZmZmZ d dlmZ 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dd	 Zd
d Zdd Zdd Zdd ZG dd dZG dd dZdd ZG dd dZdS )    )chainislicetee)shuffleN)
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S )
TestCyclesc                 C   s\   t  }t|ddddg t|ddddg t|ddddd	g |d	d
 || _d S )Nr                           	   )networkxGraphnx	add_cycleadd_edgeG)clsr    r   W/var/www/html/venv/lib/python3.8/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 }|ddddgddddd	gddd
dggksPtt|d}tdd |D }|ddddgddddd	gddd
dggkstt|d}tdd |D }|ddddgddddd	gddd
dggkstt|d t|d}tdd |d d D t|d g }|ddddgddddd	gddd
dgdddggksZtd S )Nr   c                 s   s   | ]}t |V  qd S r   sortedr    cr   r   r   r&       s     z.TestCycles.test_cycle_basis.<locals>.<genexpr>r   r   r   r   r   r   r   r   c                 s   s   | ]}t |V  qd S r   r-   r/   r   r   r   r&   #   s     r   c                 s   s   | ]}t |V  qd S r   r-   r/   r   r   r   r&   &   s     ABCc                 s   s   | ]}t |V  qd S r   r-   r/   r   r   r   r&   +   s     ABC)r   r   cycle_basisr.   AssertionErrorr   r   r*   r   cyZsort_cyr   r   r   test_cycle_basis   s    ,,,(zTestCycles.test_cycle_basisc              	   C   s0   t tj t }t|d}W 5 Q R X d S Nr   )pytestraisesr   NetworkXNotImplementedDiGraphr   r6   r*   r   r9   r   r   r   test_cycle_basis2.   s    zTestCycles.test_cycle_basis2c              	   C   s0   t tj t }t|d}W 5 Q R X d S r;   )r<   r=   r   r>   
MultiGraphr   r6   r@   r   r   r   test_cycle_basis33   s    zTestCycles.test_cycle_basis3c                 C   sx   t  }t |ddddg t |ddddg t |}tdd |D }|dgdddgdddgdddggksttdS )	z-Tests the function for graphs with self loopsr   r   r   r   r   c                 s   s   | ]}t |V  qd S r   r-   r/   r   r   r   r&   >   s     z8TestCycles.test_cycle_basis_self_loop.<locals>.<genexpr>N)r   r   r   r6   r.   r7   r8   r   r   r   test_cycle_basis_self_loop8   s    
z%TestCycles.test_cycle_basis_self_loopc                    s   dddddddg}t |}tt |}dgdd	d
gdd
gd	d
gd
gg}t|t|ks^t|D ]  t fdd|D sbtqbd S )N)r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   c                 3   s   | ]}  |V  qd S r   r,   r    rcr0   r*   r   r   r&   H   s     z0TestCycles.test_simple_cycles.<locals>.<genexpr>)r   r?   r.   simple_cyclesr'   r7   r(   )r*   edgesr   cccar   rM   r   test_simple_cyclesA   s    
 zTestCycles.test_simple_cyclesc                 C   s:   t  }t |ddg tt |}t|dks6td S )Nr+   r   )r   r?   r   listrN   r'   r7   r*   r   r0   r   r   r   test_unsortableJ   s    zTestCycles.test_unsortablec                    s   t  }t |dddg tt | t dks8t d dddgsRtt |dddg tt |}t|dkstdddgdddgg}|D ]  t fdd	|D stqd S )
Nr   r   r   r   
         c                 3   s   | ]}  |V  qd S r   rJ   rK   rM   r   r   r&   ]   s     z6TestCycles.test_simple_cycles_small.<locals>.<genexpr>)	r   r?   r   r.   rN   r'   r7   r,   r(   )r*   r   rP   rQ   r   rM   r   test_simple_cycles_smallR   s    z#TestCycles.test_simple_cycles_smallc                 C   s"   t  }tt |g kstd S r   )r   r?   rS   rN   r7   r*   r   r   r   r   test_simple_cycles_empty_   s    z#TestCycles.test_simple_cycles_emptyc                 C   s  t  }td|d D ] }|d| |||d  q|d| d d t|d d| d D ](}||d| d  |||d  qb|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_graphc   s    zTestCycles.worst_case_graphc                 C   s@   t ddD ]0}| |}ttt|}|d| ks
tq
d S )Nr   rV   )r)   r]   r'   rS   r   rN   r7   )r*   r\   r   r$   r   r   r   test_worst_case_graphu   s    
z TestCycles.test_worst_case_graphc                    s   t ddD ]}|}tt|}tt|}t|t|ksHt|D ]  t fdd|D sLtqL|D ] tfdd|D srtqrq
d S )Nr   rV   c                 3   s   | ]}  |V  qd S r   rJ   )r    rrM   r   r   r&      s     z;TestCycles.test_recursive_simple_and_not.<locals>.<genexpr>c                 3   s   | ]}  |V  qd S r   rJ   r/   rL   r*   r   r   r&      s     )	r)   r]   r.   r   rN   recursive_simple_cyclesr'   r7   r(   )r*   r\   r   rP   rccr   r0   rL   r*   r   test_recursive_simple_and_not|   s    
z(TestCycles.test_recursive_simple_and_notc                    s   t  }ddddddddd	d
dddddg}|| tt |}t|dksRttt |}t|t|kstt|D ]  t fdd|D sxtqx|D ] tfdd|D stqd S )NrF   )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   s   | ]}  |V  qd S r   rJ   rK   rM   r   r   r&      s     zATestCycles.test_simple_graph_with_reported_bug.<locals>.<genexpr>c                 3   s   | ]}  |V  qd S r   rJ   r/   r`   r   r   r&      s     )	r   r?   add_edges_fromr.   rN   r'   r7   ra   r(   )r*   r   rO   rP   rb   r   rc   r   #test_simple_graph_with_reported_bug   s4    
z.TestCycles.test_simple_graph_with_reported_bugN)__name__
__module____qualname__classmethodr   r,   r:   rA   rC   rD   rR   rU   rY   r[   r]   r^   rd   rm   r   r   r   r   r
      s   
		r
   c                 C   s    t | \}}t|d  t||S r   )r   nextzip)iterabler+   r#   r   r   r   pairwise   s    
ru   c                 C   s   t t| t| dS Nr   )ru   r   r   r0   r   r   r   cycle_edges   s    rx   c                 C   s   t t| S r   )	frozensetrx   rw   r   r   r   directed_cycle_edgeset   s    rz   c                 C   s*   t | dkrtt| S tttt| S rv   r'   ry   rx   maprw   r   r   r   undirected_cycle_edgeset   s    r}   c                 C   s.   t | dkrtt| S tttt| S d S )Nr   r{   rw   r   r   r   multigraph_cycle_edgeset   s    r~   c                   @   s   e Zd Zedd Zedd Zedd Zdd Zd-ddZd.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 )/TestCycleEnumerationc                 C   s
   t | S r   )r   complete_graphr%   r   r   r   K   s    zTestCycleEnumeration.Kc                 C   s   t |  S r   )r   r   Zto_directedr   r   r   r   D   s    zTestCycleEnumeration.Dc                 C   s    |   rtS |  rtS tS d S r   )Zis_directedrz   Zis_multigraphr~   r}   gr   r   r   edgeset_function   s
    z%TestCycleEnumeration.edgeset_functionc	           	         s   |d k	r(t ||kr(td| d| |dkrX||krJtd| dq|t|||< n$||krl|| ntd| dt fdd|D st| d	| d
|rt  |jt |krt| d| dd S )Ncomputed cycle z exceeds length bound computedz has already been found!zexpected cycle z was not computedc                 3   s   | ]} j | V  qd S r   )Zhas_edger    er   r   r   r&      s     z3TestCycleEnumeration.check_cycle.<locals>.<genexpr>z claimed cycle z is not a cycle of gz cycle z is not chordless)r'   RuntimeErrortuplepopallZsubgraphrO   )	r*   r   r0   escachesource
original_clength_bound	chordlessr   r   r   check_cycle   s&    
z TestCycleEnumeration.check_cycleNFc                    s^  |d kr|rt jnt j}ttt|}t| tt|| tt||t j	| dd}| 
|}i }	|d k	rz||	d< i }
||f|	D ]6}fdd|D }||}| ||||
d||| qt|trt|
|krtd| dt|
 d S |D ]6} fd	d|D }||}| ||||
d
||| qt|
rZ|
 D ]}td| dqBd S )NT)copyr   c                    s   g | ]} | qS r   r   r    x)unlabelr   r   
<listcomp>  s     z>TestCycleEnumeration.check_cycle_algorithm.<locals>.<listcomp>r   z	expected z cycles, got c                    s   g | ]} | qS r   r   r   )labelr   r   r     s     expectedr   z, is valid but not in the expected cycle set!)r   chordless_cyclesrN   rS   r)   r'   r   dictrs   Zrelabel_nodesr   r   
isinstanceintr   values)r*   r   expected_cyclesr   r   	algorithmZrelabelhZedgesetparamsZcycle_cacher0   r   r   r   )r   r   r   check_cycle_algorithm   sb    
       
       

z*TestCycleEnumeration.check_cycle_algorithmc                 C   s,   t ||D ]\}}| j|||||d q
d S )N)r   r   r   )rs   r   )r*   g_familyZcycle_countsr   r   r   r   Z
num_cyclesr   r   r   (check_cycle_enumeration_integer_sequence!  s    z=TestCycleEnumeration.check_cycle_enumeration_integer_sequencec                 C   s   t  }t |td t |tdd d d  |dd ddddg}| j||dd	 | j||dd
d dd |D }| j||ddd d S )Nr   r2   r   )r   rG   r   r   rg   Tr   r   r   r   c                 S   s   g | ]}t |d k r|qS r   r'   r/   r   r   r   r   <  s      zMTestCycleEnumeration.test_directed_chordless_cycle_digons.<locals>.<listcomp>r   )r   r?   r   r)   r   r   r*   r   r   r   r   r   $test_directed_chordless_cycle_digons2  s    z9TestCycleEnumeration.test_directed_chordless_cycle_digonsc              	   C   s  t dddddddg}dd	g}| j||d
d t  }t |td t |tdd |dd dddg}| j||d
d |dd dddg}| j||d
d dg}| j||d
dd |dd ddg}| j||d
d t dd tdD }g }| j||d
d d S )NrG   r   rg   rh   ri   rj   rF   )r   r   r   r   r   )r   r   r   r   r   Tr   r   r   r   r   r   )r   r   r   r   r   )r   r   r   r   r   )r   r   r   r   r   )r   r   r   c                 s   s$   | ]}t |D ]}||fV  qqd S r   r)   )r    r!   jr   r   r   r&   V  s     
  zPTestCycleEnumeration.test_directed_chordless_cycle_undirected.<locals>.<genexpr>rV   )r   r?   r   r   r)   r   remove_edger   r   r   r   (test_directed_chordless_cycle_undirected?  s(    

z=TestCycleEnumeration.test_directed_chordless_cycle_undirectedc                 C   s>  t  }t |td t |tdd tdtddg}| j||dd | j|dd |D ddd |d	d
 |td
d | j||dd | j|dd |D ddd |d
d	 d	d
g|d< | j||dd | j|dd |D ddd |  |d	d
 | j||dd | j|dd |D ddd d S )Nr   r      Tr   c                 S   s   g | ]}t |d kr|qS r   r   r/   r   r   r   r   a  s      zGTestCycleEnumeration.test_chordless_cycles_directed.<locals>.<listcomp>r   r   r   r   r   c                 S   s   g | ]}t |d kr|qS r   r   r/   r   r   r   r   h  s      r2   c                 S   s   g | ]}t |d kr|qS r   r   r/   r   r   r   r   o  s      c                 S   s   g | ]}t |d kr|qS r   r   r/   r   r   r   r   v  s      )	r   r?   r   r)   r   r   appendr   r   r*   r   r   r   r   r   test_chordless_cycles_directedZ  sL                z3TestCycleEnumeration.test_chordless_cycles_directedc                    s^    fddt dD }dd t dD } j||dd dd t dD } j||dd	 d S )
Nc                    s   g | ]}  |qS r   r   r    r%   r*   r   r   r   z  s     zOTestCycleEnumeration.test_directed_chordless_cycle_diclique.<locals>.<listcomp>rV   c                 S   s   g | ]}|| | d  qS r   r   r   r   r   r   r   {  s     Tr   c                 S   s   g | ]}|| | d  qS r   r   r   r   r   r   r     s     r   r   r)   r   )r*   r   r   r   r   r   &test_directed_chordless_cycle_dicliquey  s        z;TestCycleEnumeration.test_directed_chordless_cycle_dicliquec                 C   s   t dd tdD }t |td dd tdD }| j||dd | j||dd	 t |}|d
d tdddD  dd tdddD }| j||dd d S )Nc                 s   s   | ]}||fV  qd S r   r   r   r   r   r   r&     s     zMTestCycleEnumeration.test_directed_chordless_loop_blockade.<locals>.<genexpr>rV   c                 S   s   g | ]
}|fqS r   r   r   r   r   r   r     s     zNTestCycleEnumeration.test_directed_chordless_loop_blockade.<locals>.<listcomp>Tr   r   r   c                 s   s   | ]}||fV  qd S r   r   r   r   r   r   r&     s     r   r   c                 S   s   g | ]
}|fqS r   r   r   r   r   r   r     s     )r   r?   r)   r   r   MultiDiGraphrl   r   r   r   r   %test_directed_chordless_loop_blockade  s    
z:TestCycleEnumeration.test_directed_chordless_loop_blockadec                    sv   fddt ddD }ddddd	d
dddddg} j||dd dd } fddt ddD }dd |D } j||d|d dd }dddddddddddg} fd dt ddD } j||d|d d!d |D } fd"dt ddD } j||d|d ddd#d	dd$d%g} fd&dt dd'D } || ddddd(d)d*d+g} fd,dt d'D } || d S )-Nc                    s   g | ]}  |qS r   r   r   r   r   r   r     s     zTTestCycleEnumeration.test_simple_cycles_notable_clique_sequences.<locals>.<listcomp>r   r   r   r   r   rV   rW   #   8   T   x         r   r   c                 {   s"   dd t j| f|D E d H  d S )Nc                 s   s   | ]}t |d kr|V  qdS r   Nr   r/   r   r   r   r&     s      zfTestCycleEnumeration.test_simple_cycles_notable_clique_sequences.<locals>.triangles.<locals>.<genexpr>r   rN   r   kwargsr   r   r   	triangles  s    zSTestCycleEnumeration.test_simple_cycles_notable_clique_sequences.<locals>.trianglesc                    s   g | ]}  |qS r   r   r   r   r   r   r     s     c                 S   s   g | ]}d | qS r   r   r   r   r   r   r     s     )r   r   c                 {   s"   dd t j| f|D E d H  d S )Nc                 s   s   | ]}t |d kr|V  qdS )r   Nr   r/   r   r   r   r&     s      zhTestCycleEnumeration.test_simple_cycles_notable_clique_sequences.<locals>.four_cycles.<locals>.<genexpr>r   r   r   r   r   four_cycles  s    zUTestCycleEnumeration.test_simple_cycles_notable_clique_sequences.<locals>.four_cycles   -   i      iz  iv  i  c                    s   g | ]}  |qS r   r   r   r   r   r   r     s     c                 S   s   g | ]}d | qS r   r   r   r   r   r   r     s     c                    s   g | ]}  |qS r   r   r   r   r   r   r     s     r   i  i=	  c                    s   g | ]}  |qS r   r   r   r   r   r   r     s     r   r   %      i  c                    s   g | ]}  |qS r   r   r   r   r   r   r     s     r   )r*   r   r   r   r   r   r   r   +test_simple_cycles_notable_clique_sequences  sN               z@TestCycleEnumeration.test_simple_cycles_notable_clique_sequencesc                 C   sn  t  }t |td tdg}| j||dd t |td ttd}| j||dd t |td g }| j||dd t  }t |td tdg}| j||dd t |td | j|g dd t |td | j|g dd t  }t |td t |tdd d d  ttd}| j||dd t |td | j|g dd d S )Nr   Tr   r2   )r   rB   r   r)   r   rx   r   )r*   r   r   r   r   r   1test_directed_chordless_cycle_parallel_multiedges  s2    zFTestCycleEnumeration.test_directed_chordless_cycle_parallel_multiedgesc              	   C   s   t  }t |td t |tdd tdtddg}| j||dd | j|dd |D ddd |d	d
 |td
d |dd
d	ddddg | j||dd | j|dd |D ddd d S )Nr   r   r   Tr   c                 S   s   g | ]}t |d kr|qS r   r   r/   r   r   r   r     s      zDTestCycleEnumeration.test_chordless_cycles_graph.<locals>.<listcomp>r   r   r   r   r   rV      c                 S   s   g | ]}t |d kr|qS r   r   r/   r   r   r   r     s      )r   r   r   r)   r   r   r   r   r   r   r   test_chordless_cycles_graph  s*          z0TestCycleEnumeration.test_chordless_cycles_graphc                    sh  d  d dkst t }t D ]4}|d sD|||d    |||d    q$td dg fddtd dD  }| j||dd | j|d	d |D d
dd d  d dkst t }t D ]4}|||d    |d s||d   | qt d ddg fddtd dD  }| j||dd | j|dd |D d
dd d S )Ni  r   r   r   c                    s(   g | ] } fd dt ||d D qS )c                    s   g | ]}|  qS r   r   r   r   r   r   r     s     [TestCycleEnumeration.test_chordless_cycles_giant_hamiltonian.<locals>.<listcomp>.<listcomp>r   r   r   r   r   r   r     s    zPTestCycleEnumeration.test_chordless_cycles_giant_hamiltonian.<locals>.<listcomp>Tr   c                 S   s   g | ]}t |d kr|qS r   r   r/   r   r   r   r   
  s      r   r   d   c                    s(   g | ] } fd dt ||d D qS )c                    s   g | ]}|  qS r   r   r   r   r   r   r     s     r   r   r   r   r   r   r   r     s    c                 S   s   g | ]}t |d kr|qS r   r   r/   r   r   r   r   #  s      )r7   r   r   r)   r   r   r?   )r*   r   vr   r   r   r   'test_chordless_cycles_giant_hamiltonian  sD    
   
   z<TestCycleEnumeration.test_chordless_cycles_giant_hamiltonianc                 C   sp   d}t dd t|D }| |g  | j|g dd t|d D ]&}| j|g |d | j|g |dd qDd S )	NrV   c                 s   s$   | ]}t |D ]}||fV  qqd S r   r   )r    r   yr   r   r   r&   (  s     
  zMTestCycleEnumeration.test_simple_cycles_acyclic_tournament.<locals>.<genexpr>Tr   r   r   r   )r   r?   r)   r   )r*   r%   r   r\   r   r   r   %test_simple_cycles_acyclic_tournament&  s    z:TestCycleEnumeration.test_simple_cycles_acyclic_tournamentc                 C   s  t d}ttd}| ||g |dd t |ddddg | ||g |t tdd ttdd}| |||g |t tdd	 ttdd	}d
dddddh}| || t|dkst	t d	}|t d	dddddddgj
 d}| || d S )Nr   r   r2   r   r      r   )r   r   r   r   r   r   r   r   )r   r   rV   r   r         r   )r   r   r   r   r   r   rV   r   )
r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   rV   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   rV   r   r   r   r   rW   )r   cycle_graphr   r)   r   r   Zadd_pathupdater'   r7   rO   )r*   ZtestGZcyc1Zcyc2Zcyc3r   r   r   r   test_simple_cycles_graph0  s0    

"z-TestCycleEnumeration.test_simple_cycles_graphc                 C   s   t  }g }tdD ]@}t |t| || t|D ]\}}| j|||d q:qt  }d}g }tdD ]h}||dk r|n|d  |dkrqnt |t|||  ||7 }t|D ]\}}| j|||d qqnd S )NrV   r   r   r   r   )r   r?   r)   r   r   	enumerater   r   )r*   dr   r%   r\   r   r   topr   r   r   test_simple_cycles_boundedc  s$    
z/TestCycleEnumeration.test_simple_cycles_boundedc                 C   s   t d}t jdt jd}tt j|ddg ks4ttt j|ddg ksNttt j|ddg kshttt j|ddg kstd S )Nr   )Zcreate_usingr   r   )r   r   r?   rS   rN   r7   r   )r*   r   ZDGr   r   r   %test_simple_cycles_bound_corner_cases}  s    
z:TestCycleEnumeration.test_simple_cycles_bound_corner_casesc              	   C   s   t t( t }t|dD ]}ds tq W 5 Q R X t t( t }t|dD ]}dsXtqXW 5 Q R X t t( t }t|dD ]}dstqW 5 Q R X t t( t }t|dD ]}dstqW 5 Q R X d S )Nr2   F)	r<   r=   
ValueErrorr   r?   rN   r7   r   r   rT   r   r   r   test_simple_cycles_bound_error  s     z3TestCycleEnumeration.test_simple_cycles_bound_errorc                    s    fddt ddD }ddddd	d
dddddddg} j||dd dd t dD } fddt dD } j||dd d S )Nc                    s   g | ]}  |qS r   r   r   r   r   r   r     s     zETestCycleEnumeration.test_chordless_cycles_clique.<locals>.<listcomp>r   r   r   r   r   rV   rW   r   r   r   r   r   r   i  il  Tr   c                 S   s   g | ]}|| | d  qS r   r   r   r   r   r   r     s     c                    s   g | ]}  |qS r   r   r   r   r   r   r     s     r   )r*   r   r   r   r   r   test_chordless_cycles_clique  s        z1TestCycleEnumeration.test_chordless_cycles_clique)NFN)NFN)rn   ro   rp   staticmethodr   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      s<   


   
:   
-%0
3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$   ddddg| _ dddddd	g| _d S )
Nr   r   r   r   )r2   r   rE   re   rI   r   r   )nodesrO   )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   rO   r<   r=   	exceptionNetworkXNoCycler   r   rZ   r   r   r   test_graph_nocycle  s    z TestFindCycle.test_graph_nocyclec                 C   sB   t | j}|dd tt|| j}dddg}||ks>td S )Nr   r   rE   rG   rH   r   r   rO   r   rS   r   r   r7   r*   r   r   Zx_r   r   r   test_graph_cycle  s
    
zTestFindCycle.test_graph_cyclec                 C   sF   t | j}|dd tt|| jd d}dddg}||ksBtd S )Nr   r   ZorientationrE   rG   rH   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sTtd S )Nr   r   originalr   r   )	r   r   rO   r   rS   r   r   r   r7   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s0td S )NrE   re   r   r?   rO   rS   r   r   r7   r   r   r   r   test_digraph  s    zTestFindCycle.test_digraphc                 C   s8   t | j}tt|| jd d}ddg}||ks4td S )Nr   rE   re   r   r   r   r   r   test_digraph_orientation_none  s    z+TestFindCycle.test_digraph_orientation_nonec                 C   sD   t | j}tt|| jdd}ddtfddtfg}||ks@td S )Nr   r   r   r   r   r?   rO   rS   r   r   r   r7   r   r   r   r   !test_digraph_orientation_original  s    z/TestFindCycle.test_digraph_orientation_originalc                 C   s`   t | j}tt|| j}ddg}|d |d ks8t|d d d |d d d ks\td S )Nr   r   r   )r   r   r   r   r   r   )r   rB   rO   rS   r   r   r7   r   r   r   r   test_multigraph  s
    zTestFindCycle.test_multigraphc                 C   s`   t | j}tt|| j}ddg}|d |d ks8t|d d d |d d d ks\td S )Nr  )r   r   r   r   r   r   )r   r   rO   rS   r   r   r7   r   r   r   r   test_multidigraph  s
    zTestFindCycle.test_multidigraphc                 C   sD   t | j}tt|| jdd}ddtfddtfg}||ks@td S )Nignorer   r   r   r  r   r   r   r   test_digraph_ignore  s    z!TestFindCycle.test_digraph_ignorec                 C   sD   t | j}tt|| jdd}ddtfddtfg}||ks@td S )Nreverser   r   r   )r   r?   rO   rS   r   r   r	   r7   r   r   r   r   test_digraph_reverse  s    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sLt|d d d |d d d kspt|d d |d d kstd S )Nr  r   r   r   r   r   )r   r   rO   rS   r   r   r   r7   r   r   r   r   test_multidigraph_ignore  s    $z&TestFindCycle.test_multidigraph_ignorec                 C   sP   t dddg}tt|dddgdd}dddtfdddtfg}||ksLtd S )NrE   rG   r   r   r   r  r   )r   r   rS   r   r   r	   r7   r   r   r   r   test_multidigraph_ignore2  s    z'TestFindCycle.test_multidigraph_ignore2c              	   C   s8   t ddddg}tjt jjt|ddddd	gd
d d S )NrE   rG   r   )r   r   r   r   r   r   r   r   r   )r   r   r<   r=   r   r   r   rZ   r   r   r   test_multidigraph_original	  s    z(TestFindCycle.test_multidigraph_originalc                 C   s^   t dddg}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sZt
d S )
NrE   rF   rG   r   r   r  r   r   r   )r   r?   r<   r=   r   r   r   rS   r   r	   r7   )r*   r   r   r   r   r   test_dag  s       zTestFindCycle.test_dagc                 C   s   t  }|ddddg tjt jt|dd tt |d}ddg}||ksRttt |d}ddg}||ksvttt |}ddg}||kstd S )	Nre   rH   rG   rI   r   r   r   r   )	r   r?   rl   r<   r=   r   r   rS   r7   r   r   r   r   test_prev_explored  s    z TestFindCycle.test_prev_exploredc                 C   sB   t  }|ddddg tjt jt|dd tt jt| d S )NrG   rH   r   rf   r   r  )r   r?   rl   r<   r=   r   r   rZ   r   r   r   test_no_cycle1  s    zTestFindCycle.test_no_cycleN)rn   ro   rp   rq   r   r   r   r   r   r   r  r  r  r  r  r
  r  r  r  r  r  r  r   r   r   r   r     s&   
r   c                 C   s   t | t |kstd S r   )r.   r7   )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   s:   t  }t j|ddddgdd |jdddd || _d S )Nr   r   r   r   weightr   )r   r   r   r   diamond_graph)r   Tr   r   r   r   ?  s    zTestMinimumCycles.setup_classc                 C   s2   t | j}tdd |D dddgdddgg d S )Nc                 S   s   g | ]}t |qS r   r-   r/   r   r   r   r   H  s     z=TestMinimumCycles.test_unweighted_diamond.<locals>.<listcomp>r   r   r   r   r   r  r  r*   mcbr   r   r   test_unweighted_diamondF  s    
z)TestMinimumCycles.test_unweighted_diamondc                 C   s8   t | jdd}tdd |D dddgddddgg d S )	Nr  r  c                 S   s   g | ]}t |qS r   r-   r/   r   r   r   r   L  s     z;TestMinimumCycles.test_weighted_diamond.<locals>.<listcomp>r   r   r   r   r  r  r   r   r   test_weighted_diamondJ  s    z'TestMinimumCycles.test_weighted_diamondc                 C   s\   d}t |D ]J}tdd}| }| }t|}tt|}||| | kstqd S )NrV   g333333?)	r)   r   Zerdos_renyi_graphZnumber_of_nodesZnumber_of_edgesZnumber_connected_componentsr'   r   r7   )r*   Zntrial_ZrgZnnodesZnedgesZncompZdim_mcbr   r   r   test_dimensionalityN  s    
z%TestMinimumCycles.test_dimensionalityc                 C   s,   t d}t|}tdd |D s(td S )Nr   c                 s   s   | ]}t |d kV  qdS r   r   )r    cycler   r   r   r&   ]  s     z8TestMinimumCycles.test_complete_graph.<locals>.<genexpr>)r   r   r   r   r7   )r*   Zcgr  r   r   r   test_complete_graphZ  s    
z%TestMinimumCycles.test_complete_graphc                 C   s   t dd}t|rtd S )Nr   )r   Zbalanced_treer   r7   )r*   tgr   r   r   test_tree_graph_  s    z!TestMinimumCycles.test_tree_graphN)
rn   ro   rp   rq   r   r  r  r  r   r"  r   r   r   r   r  >  s   
r  )	itertoolsr   r   r   randomr   r<   r   r   Znetworkx.algorithmsr   r   Z%networkx.algorithms.traversal.edgedfsr   r	   r
   ru   rx   rz   r}   r~   r   r   r  r  r   r   r   r   <module>   s*       q 