o
    &?eÅ                     @   s   d dl mZmZmZ d dlmZ d dlmZ d dlZd dl	Z
d dlmZmZ dd 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G dd dZdS )    )chainislicetee)inf)shuffleN)FORWARDREVERSEc                 C   s   t | dkrd S zdd l}W n
 ty   Y d S w t }| D ]}t|| qtj|dd}|jj|	 d dd}|j
d | t | ksGJ d S )Nr   T)ZorientedF)ZtolZ	hermitian   )lennumpyImportErrornxGraph	add_cycleZincidence_matrixZlinalgZmatrix_rankZtoarrayshape)ZbasisnpHbincZrank r   f/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/networkx/algorithms/tests/test_cycles.pycheck_independent   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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	            r"   	   )r   r   r   add_edgeG)clsr%   r   r   r   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r   lnr   r   	<genexpr>*   s   " z3TestCycles.is_cyclic_permutation.<locals>.<genexpr>)r
   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   r5   r(   r6   r8   r   r   r   r/   2   r:   r#   c                 s   r5   r(   r6   r8   r   r   r   r/   5   r:   ABCc                 s   r5   r(   r6   r8   r   r   r   r/   :   r:   )ABC)r%   r   cycle_basisr7   r   r2   r%   cyZ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@   r2   r%   rB   r   r   r   test_cycle_basis2=      "zTestCycles.test_cycle_basis2c                 C   rD   rE   )rF   rG   r   rH   
MultiGraphr@   rJ   r   r   r   test_cycle_basis3B   rL   zTestCycles.test_cycle_basis3c                    sh   t d}|t tdd t |}ddd t | } fddt |D }||ks2J d S )	Nr   r   r"   r   r	   r	   r   c                    s   g | ]} fd d|D qS )c                    s   g | ]}  ||qS r   )getr*   r.   permr   r   
<listcomp>O   s    zBTestCycles.test_cycle_basis_ordered.<locals>.<listcomp>.<listcomp>r   )r*   ZcycrR   r   r   rT   O   s    z7TestCycles.test_cycle_basis_ordered.<locals>.<listcomp>)r   cycle_graphupdater1   r@   relabel_nodes)r2   r%   ZcbGr   ZcbHr   rR   r   test_cycle_basis_orderedG   s   


z#TestCycles.test_cycle_basis_orderedc                 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   r5   r(   r6   r8   r   r   r   r/   X   r:   z8TestCycles.test_cycle_basis_self_loop.<locals>.<genexpr>r   r   r	   r   )r   r   r   )r   r   r    N)r   r   r   r@   r7   rA   r   r   r   test_cycle_basis_self_loopR   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   rY   r   r	   c                 3       | ]	}  |V  qd S r(   r4   r*   rcr9   r2   r   r   r/   b       z0TestCycles.test_simple_cycles.<locals>.<genexpr>)r   rI   r7   simple_cyclesr
   r0   )r2   edgesr%   cccar   rd   r   test_simple_cycles[   s   
zTestCycles.test_simple_cyclesc                 C   s:   t  }t |ddg tt |}t|dksJ d S )Nr3   r	   )r   rI   r   listrf   r
   r2   r%   r9   r   r   r   test_unsortabled   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   r`   r(   ra   rb   rd   r   r   r/   w   re   z6TestCycles.test_simple_cycles_small.<locals>.<genexpr>)r   rI   r   r7   rf   r
   r4   r0   )r2   r%   rh   ri   r   rd   r   test_simple_cycles_smalll   s   z#TestCycles.test_simple_cycles_smallc                 C   s"   t  }tt |g ksJ d S r(   )r   rI   rk   rf   r2   r%   r   r   r   test_simple_cycles_emptyy   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  q1|d| d |d  td| d d| d D ]}|d| d | ||d| d  q_|d| d d| d  |S )Nr   r	   r   )r   rI   r1   r$   )r2   kr%   r.   r   r   r   worst_case_graph}   s   zTestCycles.worst_case_graphc                 C   s@   t ddD ]}| |}ttt|}|d| ksJ qd S )Nr   rn   )r1   ru   r
   rk   r   rf   )r2   rt   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   rn   c                 3   r`   r(   ra   )r*   rrd   r   r   r/      re   z;TestCycles.test_recursive_simple_and_not.<locals>.<genexpr>c                 3   r`   r(   ra   r8   rc   r2   r   r   r/      re   )r1   ru   r7   r   rf   recursive_simple_cyclesr
   r0   )r2   rt   r%   rh   rccr   r9   rc   r2   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)r\   )r   r   rO   )r	   r   r_   )r   r   r   r   r   r   )r   r   )r   r	   r   r   r   r   r   r	   )r   r   )r   r      c                 3   r`   r(   ra   rb   rd   r   r   r/      re   zATestCycles.test_simple_graph_with_reported_bug.<locals>.<genexpr>c                 3   r`   r(   ra   r8   rx   r   r   r/      re   )r   rI   add_edges_fromr7   rf   r
   ry   r0   )r2   r%   rg   rh   rz   r   r{   r   #test_simple_graph_with_reported_bug   s   
z.TestCycles.test_simple_graph_with_reported_bugN)__name__
__module____qualname__classmethodr'   r4   rC   rK   rN   rX   rZ   rj   rm   rq   rs   ru   rv   r|   r   r   r   r   r   r      s"    
		r   c                 C   s    t | \}}t|d  t||S r(   )r   nextzip)iterabler3   r   r   r   r   pairwise   s   

r   c                 C   s   t t| t| dS Nr	   )r   r   r   r9   r   r   r   cycle_edges   s   r   c                 C   s   t t| S r(   )	frozensetr   r   r   r   r   directed_cycle_edgeset   s   r   c                 C   s*   t | dkrtt| S tttt| S r   r
   r   r   mapr   r   r   r   undirected_cycle_edgeset   s   r   c                 C   s*   t | dkrtt| S tttt| S )Nr   r   r   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 r(   )Zis_directedr   Zis_multigraphr   r   gr   r   r   edgeset_function   s
   z%TestCycleEnumeration.edgeset_functionc	           	         s   |d urt ||krtd| d| |dkr+||v r$td| dt|||< n||v r5|| ntd| dt fdd|D sRt| d	| d
|rjt  |jt |krlt| d| dd S 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subgraphrg   )	r2   r   r9   escachesource
original_clength_bound	chordlessr   r   r   check_cycle   s(   
z TestCycleEnumeration.check_cycleNFc                    s`  |d u r|r	t jnt j}ttt|}t| tt|| tt||t j	| dd}| 
|}i }	|d ur=||	d< i }
||fi |	D ]}fdd|D }||}| ||||
d||| qGt|tr|t|
|krztd| dt|
 d S |D ]} fd	d|D }||}| ||||
d
||| q~t|
r|
 D ]}td| dd S d S )NT)copyr   c                       g | ]} | qS r   r   r*   x)unlabelr   r   rT   "      z>TestCycleEnumeration.check_cycle_algorithm.<locals>.<listcomp>r   z	expected z cycles, got c                    r   r   r   r   )labelr   r   rT   /  r   expectedr   z, is valid but not in the expected cycle set!)r   chordless_cyclesrf   rk   r1   r
   r   dictr   rW   r   r   
isinstanceintr   values)r2   r   expected_cyclesr   r   	algorithmZrelabelhZedgesetparamsZcycle_cacher9   r   r   r   )r   r   r   check_cycle_algorithm  sJ   


z*TestCycleEnumeration.check_cycle_algorithmc                 C   s,   t ||D ]\}}| j|||||d qd S )N)r   r   r   )r   r   )r2   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 g d}| j||dd | j||ddd d	d
 |D }| j||ddd d S )Nr   r<   r   ))r   r]   r   r   r~   Tr   r   r   r   c                 S   s   g | ]
}t |d k r|qS r   r
   r8   r   r   r   rT   V      zMTestCycleEnumeration.test_directed_chordless_cycle_digons.<locals>.<listcomp>r	   )r   rI   r   r1   r$   r   r2   r   r   r   r   r   $test_directed_chordless_cycle_digonsL  s   z9TestCycleEnumeration.test_directed_chordless_cycle_digonsc                 C   s  t g d}ddg}| j||dd t  }t |td t |tdd |d	d
 g d}| j||dd |d
d	 g d}| 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 )N)r]   r   r~   r   r   r   r\   )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!   r   r   r   r   r   c                 s   &    | ]}t |D ]}||fV  qqd S r(   r1   )r*   r+   jr   r   r   r/   p     $ zPTestCycleEnumeration.test_directed_chordless_cycle_undirected.<locals>.<genexpr>rn   )r   rI   r   r   r1   r$   remove_edger   r   r   r   (test_directed_chordless_cycle_undirectedY  s(   z=TestCycleEnumeration.test_directed_chordless_cycle_undirectedc                 C   sD  t  }t |td t |tdd g tdg tddg}| j||dd | j|dd |D ddd |d	d
 |g 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      g | ]
}t |d kr|qS r   r   r8   r   r   r   rT   {  r   zGTestCycleEnumeration.test_chordless_cycles_directed.<locals>.<listcomp>r   r   r!   r   r"   c                 S   r   r   r   r8   r   r   r   rT     r   r<   c                 S   r   r   r   r8   r   r   r   rT     r   c                 S   r   r   r   r8   r   r   r   rT     r   )	r   rI   r   r1   r   r$   appendr   r   r2   r%   r   r   r   r   test_chordless_cycles_directedt  s4   
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                       g | ]}  |qS r   r   rQ   r2   r   r   rT         zOTestCycleEnumeration.test_directed_chordless_cycle_diclique.<locals>.<listcomp>rn   c                 S      g | ]
}|| | d  qS r   r   rQ   r   r   r   rT     r   Tr   c                 S   r   r   r   rQ   r   r   r   rT     r   r   r   r1   r   )r2   r   r   r   r   r   &test_directed_chordless_cycle_diclique  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       | ]}||fV  qd S r(   r   r)   r   r   r   r/     r:   zMTestCycleEnumeration.test_directed_chordless_loop_blockade.<locals>.<genexpr>rn   c                 S      g | ]}|fqS r   r   r)   r   r   r   rT         zNTestCycleEnumeration.test_directed_chordless_loop_blockade.<locals>.<listcomp>Tr   r	   r   c                 s   r   r(   r   r)   r   r   r   r/     r:   r   r   c                 S   r   r   r   r)   r   r   r   rT     r   )r   rI   r1   r   r   MultiDiGraphr   r   r   r   r   %test_directed_chordless_loop_blockade  s   
z:TestCycleEnumeration.test_directed_chordless_loop_blockadec                    s<   fddt ddD }g d} j||dd dd	 } fd
dt ddD }dd |D } j||d|d dd }g d} fddt ddD } j||d|d dd |D } fddt ddD } j||d|d g d} fddt ddD } || g d} fddt dD } || d S )Nc                    r   r   r   rQ   r   r   r   rT     r   zTTestCycleEnumeration.test_simple_cycles_notable_clique_sequences.<locals>.<listcomp>r   r   )r   r	   r   rn   ro   #   8   T   x         r   r   c                 {   (    dd t j| fi |D E d H  d S )Nc                 s        | ]}t |d kr|V  qdS r   Nr   r8   r   r   r   r/         zfTestCycleEnumeration.test_simple_cycles_notable_clique_sequences.<locals>.triangles.<locals>.<genexpr>r   rf   r   kwargsr   r   r   	triangles     &zSTestCycleEnumeration.test_simple_cycles_notable_clique_sequences.<locals>.trianglesc                    r   r   r   rQ   r   r   r   rT     r   c                 S      g | ]}d | qS r   r   r   r   r   r   rT     r   )r   r   c                 {   r   )Nc                 s   r   )r   Nr   r8   r   r   r   r/     r   zhTestCycleEnumeration.test_simple_cycles_notable_clique_sequences.<locals>.four_cycles.<locals>.<genexpr>r   r   r   r   r   four_cycles  r   zUTestCycleEnumeration.test_simple_cycles_notable_clique_sequences.<locals>.four_cycles)r   r   r   r      -   i      iz  iv  i  c                    r   r   r   rQ   r   r   r   rT     r   r	   r   c                 S   r   r   r   r   r   r   r   rT     r   c                    r   r   r   rQ   r   r   r   rT     r   r   )r   r	   r   ro   r   i  i=	  c                    r   r   r   rQ   r   r   r   rT     r   r"   )r   r   r   r	   r!   %      i  c                    r   r   r   rQ   r   r   r   rT     r   r   )r2   r   r   r   r   r   r   r   +test_simple_cycles_notable_clique_sequences  s8   z@TestCycleEnumeration.test_simple_cycles_notable_clique_sequencesc                 C   sv  t  }t |td g tdg}| j||dd t |td g ttd}| j||dd t |td g }| j||dd t  }t |td g 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  g ttd}| j||dd t |td | j|g dd d S )Nr   Tr   r<   )r   rM   r   r1   r   r   r   )r2   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 g tdg tddg}| j||dd | j|dd |D ddd |d	d
 |g td
d |g d | j||dd | j|dd |D ddd d S )Nr   r   r   Tr   c                 S   r   r   r   r8   r   r   r   rT     r   zDTestCycleEnumeration.test_chordless_cycles_graph.<locals>.<listcomp>r   r!   r   r"   )r   r   r!   r"   r#   rn      c                 S   r   r   r   r8   r   r   r   rT     r   )r   r   r   r1   r   r$   r   r   r   r   r   test_chordless_cycles_graph  s   
z0TestCycleEnumeration.test_chordless_cycles_graphc                    sl  d  d dks
J t  }t D ]}|d s"|||d    |||d    qg 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scJ t  }t D ]}|||d    |d s||d   | qkg t 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                    (   g | ]} fd dt ||d D qS )c                       g | ]}|  qS r   r   r   r   r   r   rT      r   [TestCycleEnumeration.test_chordless_cycles_giant_hamiltonian.<locals>.<listcomp>.<listcomp>r   r   r)   r   r   r   rT         zPTestCycleEnumeration.test_chordless_cycles_giant_hamiltonian.<locals>.<listcomp>Tr   c                 S   r   r   r   r8   r   r   r   rT   $  r   r   r   d   c                    r  )c                    r  r   r   r   r   r   r   rT   9  r   r  r   r   r)   r   r   r   rT   8  r  c                 S   r   r  r   r8   r   r   r   rT   =  r   )r   r   r1   r$   r   rI   )r2   r%   vr   r   r   r   'test_chordless_cycles_giant_hamiltonian  s:   


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 q"d S )	Nrn   c                 s   r   r(   r   )r*   r   yr   r   r   r/   B  r   zMTestCycleEnumeration.test_simple_cycles_acyclic_tournament.<locals>.<genexpr>Tr   r	   r   r   )r   rI   r1   r   )r2   r.   r%   rt   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 |g d | ||g |t tdd ttdd}| |||g |t tdd ttdd}h d}| || t|dkseJ t d}|t g d	j	 d
}| || d S )Nr"   r   r<   )r   r	     r   >   )
r   r   r    r!   r"   r         r   r  )r"   r#   rn   r  r   r  r  r   )r   r	   r   r   r   r  r   r  r  r   r"   r!   )
r   r	   r   r   r   r  rn   r#   r"   r!   )r   r	   r   r   r   r   r    r!   )r   r   r    r!   r"   r#   rn   r  r    )r   rn   r  r   r  r   r   r"   ro   )
r   rU   r   r1   r   r$   Zadd_pathrV   r
   rg   )r2   ZtestGZcyc1Zcyc2Zcyc3r   r   r   r   test_simple_cycles_graphJ  s$   

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 ]4}||dk rA|n|d  |dkrKq7t |t|||  ||7 }t|D ]\}}| j|||d q^q7d S )Nrn   r   r   r   r	   )r   rI   r1   r   r   	enumerater   r   )r2   dr   r.   rt   r   r   topr   r   r   test_simple_cycles_bounded}  s*   
z/TestCycleEnumeration.test_simple_cycles_boundedc                 C   s   t d}t jdt jd}tt j|ddg ksJ tt j|ddg ks'J tt j|ddg ks4J tt j|ddg ksAJ d S )Nr   )Zcreate_usingr   r   )r   rU   rI   rk   rf   r   )r2   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 ]}J W d    n1 sw   Y  t t t }t|dD ]}J W d    n1 sAw   Y  t t t }t|dD ]}J W d    n1 sdw   Y  t t t }t|dD ]}J W d    d S 1 sw   Y  d S )Nr<   )rF   rG   
ValueErrorr   rI   rf   r   r   rl   r   r   r   test_simple_cycles_bound_error  s0   "z3TestCycleEnumeration.test_simple_cycles_bound_errorc                    sl    fddt ddD }g d} j||dd dd t dD } fd	dt dD } j||dd d S )
Nc                    r   r   r   rQ   r   r   r   rT     r   zETestCycleEnumeration.test_chordless_cycles_clique.<locals>.<listcomp>r   r   )r   r	   r   rn   ro   r   r   r   r   r   r   i  il  Tr   c                 S   r   r   r   rQ   r   r   r   rT     r   c                    r   r   r   rQ   r   r   r   rT     r   r   )r2   r   r   r   r   r   test_chordless_cycles_clique  s   
z1TestCycleEnumeration.test_chordless_cycles_clique)NFN)r   r   r   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   g d| _ g d| _d S )Nr   ))r<   r   r[   rO   rO   r_   r   r	   )nodesrg   )r&   r   r   r   r'     s   
zTestFindCycle.setup_classc                 C   s(   t | j}tt jjt j|| j d S r(   )	r   r   rg   rF   rG   	exceptionNetworkXNoCycle
find_cycler  rr   r   r   r   test_graph_nocycle  s   z TestFindCycle.test_graph_nocyclec                 C   sB   t | j}|dd tt || j}g d}||ksJ d S )Nr   r   r[   r]   r^   r   r   rg   r$   rk   r"  r  r2   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|| jd d}g d}||ks!J d S )Nr   r   Zorientationr$  r%  r&  r   r   r   test_graph_orientation_none  s
   z)TestFindCycle.test_graph_orientation_nonec                 C   sZ   t | j}|dd tt j|| 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   rg   r$   rk   r"  r  r   r&  r   r   r   test_graph_orientation_original  s
   z-TestFindCycle.test_graph_orientation_originalc                 C   s6   t | j}tt || j}ddg}||ksJ d S )Nr[   rO   r   rI   rg   rk   r"  r  r&  r   r   r   test_digraph  s   zTestFindCycle.test_digraphc                 C   s:   t | j}tt j|| jd d}ddg}||ksJ d S )Nr(  r[   rO   r,  r&  r   r   r   test_digraph_orientation_none  s   z+TestFindCycle.test_digraph_orientation_nonec                 C   F   t | j}tt j|| jdd}ddtfddtfg}||ks!J d S )Nr*  r(  r   r	   r   rI   rg   rk   r"  r  r   r&  r   r   r   !test_digraph_orientation_original     z/TestFindCycle.test_digraph_orientation_originalc                 C   b   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   rM   rg   rk   r"  r  r&  r   r   r   test_multigraph  s
   (zTestFindCycle.test_multigraphc                 C   r3  )Nr4  )r	   r   r   r   r	   r   )r   r   rg   rk   r"  r  r&  r   r   r   test_multidigraph  s
   (zTestFindCycle.test_multidigraphc                 C   r/  )Nignorer(  r   r	   r0  r&  r   r   r   test_digraph_ignore  r2  z!TestFindCycle.test_digraph_ignorec                 C   r/  )Nreverser(  r	   r   )r   rI   rg   rk   r"  r  r   r&  r   r   r   test_digraph_reverse  r2  z"TestFindCycle.test_digraph_reversec                 C   s   t | j}tt j|| 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s9J |d d |d d ksGJ d S )Nr7  r(  r   r	   r   r   )r   r   rg   rk   r"  r  r   r&  r   r   r   test_multidigraph_ignore  s   $ z&TestFindCycle.test_multidigraph_ignorec                 C   sN   t g d}tt j|g ddd}dddtfdddtfg}||ks%J d S )N)r[   r]   r]   rY   r7  r(  r	   r   r   )r   r   rk   r"  r   r   r&  r   r   r   test_multidigraph_ignore2  s   z'TestFindCycle.test_multidigraph_ignore2c                 C   s0   t g d}tjt jjt j|g ddd d S )N)r[   r]   r   )r   r   r   r*  r(  )r   r   rF   rG   r   r!  r"  rr   r   r   r   test_multidigraph_original#  s   
z(TestFindCycle.test_multidigraph_originalc                 C   s`   t g d}tjt jj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 )N)r[   r\   r]   r*  r(  r7  r   r	   r   )
r   rI   rF   rG   r   r!  r"  rk   r   r   )r2   r%   r   r   r   r   test_dag1  s   (zTestFindCycle.test_dagc                 C   s   t  }|g d tjt jt j|dd tt |d}ddg}||ks(J tt |d}ddg}||ks:J tt |}ddg}||ksKJ d S )N)rO   r^   r]   r_   r   r   r	   r]   r_   r   )r   rI   r   rF   rG   r!  r"  rk   r&  r   r   r   test_prev_explored9  s   z TestFindCycle.test_prev_exploredc                 C   sB   t  }|g d tjt jt j|dd tt jt j| d S )N)r]   r^   r  r}   r   r?  )r   rI   r   rF   rG   r!  r"  rr   r   r   r   test_no_cycleK  s   zTestFindCycle.test_no_cycleN)r   r   r   r   r'   r#  r'  r)  r+  r-  r.  r1  r5  r6  r8  r:  r;  r<  r=  r>  r@  rA  r   r   r   r   r    s(    
r  c                 C   s   t | t |ks
J d S r(   r6   )r3   r   r   r   r   assert_basis_equalT  s   rB  c                   @   sX   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S )TestMinimumCycleBasisc                 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'   Y  s   
z!TestMinimumCycleBasis.setup_classc                 C   s&   t | j}t|g dg dg d S )Nr   r   r	   )r   r   r   r   minimum_cycle_basisrF  rB  r2   mcbr   r   r   test_unweighted_diamond`  s   z-TestMinimumCycleBasis.test_unweighted_diamondc                 C   s*   t j| jdd}t|g dg dg d S )NrE  rD  rH  )r   r   r   r	   rI  rK  r   r   r   test_weighted_diamondd  s   z+TestMinimumCycleBasis.test_weighted_diamondc                 C   sp   d}t dd| D ],}tjdd|d}| }| }t|}t|}t||| | ks1J t| q	d S )Nrn   i  g333333?seed)	r1   r   Zerdos_renyi_graphZnumber_of_nodesZnumber_of_edgesZnumber_connected_componentsrJ  r
   r   )r2   ZntrialrP  ZrgZnnodesZnedgesZncomprL  r   r   r   test_dimensionalityh  s   


z)TestMinimumCycleBasis.test_dimensionalityc                 C   s6   t d}t |}tdd |D sJ t| d S )Nr   c                 s   s    | ]	}t |d kV  qdS r   r   )r*   cycler   r   r   r/   x  re   z<TestMinimumCycleBasis.test_complete_graph.<locals>.<genexpr>)r   r   rJ  r   r   )r2   cgrL  r   r   r   test_complete_graphu  s   

z)TestMinimumCycleBasis.test_complete_graphc                 C   s   t dd}t |rJ d S )Nr   )r   Zbalanced_treerJ  )r2   tgr   r   r   test_tree_graph{  s   z%TestMinimumCycleBasis.test_tree_graphc                    s   t   tt  }g dg dg dg dg dg dgt|tks)J tfdd|D s6J |D ]}t fd	dt jj|d
dD sMJ q8t| 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   r   c                 3       | ]}| v V  qd S r(   r   r8   r   r   r   r/     r:   z<TestMinimumCycleBasis.test_petersen_graph.<locals>.<genexpr>c                 3   s     | ]\}}  ||V  qd S r(   r   r*   ur
  )r%   r   r   r/     r   T)Zcyclic)	r   petersen_graphrk   rJ  r
   r   utilsr   r   )r2   rL  r9   r   r%   r   r   test_petersen_graph  s   (z)TestMinimumCycleBasis.test_petersen_graphc                 C   sZ   d}t |}|dd |jD  |dd t |jD  t j|dd}t| d S )Nr"   c                 S      g | ]	\}}||d fqS )r#   r   rY  r   r   r   rT         zVTestMinimumCycleBasis.test_gh6787_variable_weighted_complete_graph.<locals>.<listcomp>c                 S   r_  )r	   r   rY  r   r   r   rT     r`  rE  rD  )r   r   add_weighted_edges_fromrg   rU   rJ  r   )r2   NrS  rL  r   r   r   ,test_gh6787_variable_weighted_complete_graph  s   
zBTestMinimumCycleBasis.test_gh6787_variable_weighted_complete_graphc                    s   t d}|jddgdd g dg dg dg tt j|dd}t|t ks,J t fd	d
|D s9J g dg dg dg tt |}t|t ksUJ t fdd
|D sbJ d S )Nr   )r   r   rn   )r	   r   rn   distrD  )r	   r   r   )r   r   r	   r   )r	   r   r   c                 3   rW  r(   r   r8   rX  r   r   r/     r:   zMTestMinimumCycleBasis.test_gh6787_and_edge_attribute_names.<locals>.<genexpr>)r   r   r   c                 3   rW  r(   r   r8   rX  r   r   r/     r:   )r   rU   ra  rk   rJ  r
   r   )r2   r%   rL  r   rX  r   $test_gh6787_and_edge_attribute_names  s   
z:TestMinimumCycleBasis.test_gh6787_and_edge_attribute_namesN)r   r   r   r   r'   rM  rN  rQ  rT  rV  r^  rc  re  r   r   r   r   rC  X  s    
rC  c                   @   s   e Zd Zejde dfe dfe	 dfe
 dfe dfejdddefedefeeeedeedddfeg dd	ff	d
d ZdS )	TestGirthr]  r   r   r    rn   *   rO  ))r   r    )r   r"   )r   r#   )r	   r"   )r   r"   )r   r#   )r   r#   )r   r#   )r    r"   )r    r#   )r!   r"   r   c                 C   s   t ||ks	J d S r(   )r   Zgirthr   r   r   r   
test_girth  s    zTestGirth.test_girthN)r   r   r   rF   markZparametrizer   Zchvatal_graphZtutte_graphr[  Zheawood_graphZpappus_graphZrandom_treer   Zempty_graphr   r   r   r1   rh  r   r   r   r   rf    s&    




$rf  )	itertoolsr   r   r   mathr   randomr   rF   Znetworkxr   Z%networkx.algorithms.traversal.edgedfsr   r   r   r   r   r   r   r   r   r   r  rB  rC  rf  r   r   r   r   <module>   s.     %   q R