o
    ]Zhx                     @   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 td}td}t }| D ]}t|| qtj|dd}|jj|	 d dd}|j
d | t | ks@J d S )	Nr   numpyZscipyT)ZorientedF)ZtolZ	hermitian   )lenpytestZimportorskipnxGraph	add_cycleZincidence_matrixZlinalgZmatrix_rankZtoarrayshape)ZbasisnpspHbincZrank r   T/var/www/auris/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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   r0   .       z.TestCycles.test_cycle_basis.<locals>.<genexpr>r   r    r   r
   c                 s   r6   r)   r7   r9   r   r   r   r0   1   r;   r$   c                 s   r6   r)   r7   r9   r   r   r   r0   4   r;   ABCc                 s   r6   r)   r7   r9   r   r   r   r0   9   r;   )ABC)r&   r   cycle_basisr8   r   r3   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   )r   raisesr   NetworkXNotImplementedDiGraphrA   r3   r&   rC   r   r   r   test_cycle_basis2<      "zTestCycles.test_cycle_basis2c                 C   rE   rF   )r   rG   r   rH   
MultiGraphrA   rJ   r   r   r   test_cycle_basis3A   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>N   s    zBTestCycles.test_cycle_basis_ordered.<locals>.<listcomp>.<listcomp>r   )r+   ZcycrR   r   r   rT   N   s    z7TestCycles.test_cycle_basis_ordered.<locals>.<listcomp>)r   cycle_graphupdater2   rA   relabel_nodes)r3   r&   ZcbGr   ZcbHr   rR   r   test_cycle_basis_orderedF   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   r6   r)   r7   r9   r   r   r   r0   W   r;   z8TestCycles.test_cycle_basis_self_loop.<locals>.<genexpr>r   r   r
   r   )r   r   r   )r   r   r!   N)r   r   r   rA   r8   rB   r   r   r   test_cycle_basis_self_loopQ   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)   r5   r+   rcr:   r3   r   r   r0   a       z0TestCycles.test_simple_cycles.<locals>.<genexpr>)r   rI   r8   simple_cyclesr   r1   )r3   edgesr&   cccar   re   r   test_simple_cyclesZ   s   
zTestCycles.test_simple_cyclesc                 C   s*   t dg}tt |dggksJ d S )Nr[   r   )r   r   listrg   r3   r&   r   r   r   test_simple_cycles_singletonc   s   z'TestCycles.test_simple_cycles_singletonc                 C   s:   t  }t |ddg tt |}t|dksJ d S )Nr4   r
   )r   rI   r   rl   rg   r   r3   r&   r:   r   r   r   test_unsortableg   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   ra   r)   rb   rc   re   r   r   r0   z   rf   z6TestCycles.test_simple_cycles_small.<locals>.<genexpr>)r   rI   r   r8   rg   r   r5   r1   )r3   r&   ri   rj   r   re   r   test_simple_cycles_smallo   s   z#TestCycles.test_simple_cycles_smallc                 C   s"   t  }tt |g ksJ d S r)   )r   rI   rl   rg   rm   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  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   r2   r%   )r3   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   rq   )r2   rw   r   rl   r   rg   )r3   rv   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   rq   c                 3   ra   r)   rb   )r+   rre   r   r   r0      rf   z;TestCycles.test_recursive_simple_and_not.<locals>.<genexpr>c                 3   ra   r)   rb   r9   rd   r3   r   r   r0      rf   )r2   rw   r8   r   rg   recursive_simple_cyclesr   r1   )r3   rv   r&   ri   rccr   r:   rd   r3   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   ra   r)   rb   rc   re   r   r   r0      rf   zATestCycles.test_simple_graph_with_reported_bug.<locals>.<genexpr>c                 3   ra   r)   rb   r9   rz   r   r   r0      rf   )r   rI   add_edges_fromr8   rg   r   r{   r1   )r3   r&   rh   ri   r|   r   r}   r   #test_simple_graph_with_reported_bug   s   
z.TestCycles.test_simple_graph_with_reported_bugN)__name__
__module____qualname__classmethodr(   r5   rD   rK   rN   rX   rZ   rk   rn   rp   rt   ru   rw   rx   r~   r   r   r   r   r   r      s$    
		r   c                 C   s    t | \}}t|d  t||S r)   )r   nextzip)iterabler4   r   r   r   r   pairwise   s   

r   c                 C   s   t t| t| dS Nr
   )r   r   r   r:   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   r0     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subgraphrh   )	r3   r   r:   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   2  r   expectedr   z, is valid but not in the expected cycle set!)r   chordless_cyclesrg   rl   r2   r   r   dictr   rW   r   r   
isinstanceintr   values)r3   r   expected_cyclesr   r   	algorithmZrelabelhZedgesetparamsZcycle_cacher:   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   )r3   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   r9   r   r   r   rT   Y      zMTestCycleEnumeration.test_directed_chordless_cycle_digons.<locals>.<listcomp>r
   )r   rI   r   r2   r%   r   r3   r   r   r   r   r   $test_directed_chordless_cycle_digonsO  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)   r2   )r+   r,   jr   r   r   r0   s     $ zPTestCycleEnumeration.test_directed_chordless_cycle_undirected.<locals>.<genexpr>rq   )r   rI   r   r   r2   r%   remove_edger   r   r   r   (test_directed_chordless_cycle_undirected\  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   r9   r   r   r   rT   ~  r   zGTestCycleEnumeration.test_chordless_cycles_directed.<locals>.<listcomp>r   r   r"   r   r#   c                 S   r   r   r   r9   r   r   r   rT     r   r=   c                 S   r   r   r   r9   r   r   r   rT     r   c                 S   r   r   r   r9   r   r   r   rT     r   )	r   rI   r   r2   r   r%   appendr   r   r3   r&   r   r   r   r   test_chordless_cycles_directedw  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   r3   r   r   rT         zOTestCycleEnumeration.test_directed_chordless_cycle_diclique.<locals>.<listcomp>rq   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   r2   r   )r3   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   r0     r;   zMTestCycleEnumeration.test_directed_chordless_loop_blockade.<locals>.<genexpr>rq   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   r0     r;   r   r   c                 S   r   r   r   r*   r   r   r   rT     r   )r   rI   r2   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   rq   rr   #   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   r9   r   r   r   r0         zfTestCycleEnumeration.test_simple_cycles_notable_clique_sequences.<locals>.triangles.<locals>.<genexpr>r   rg   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   r9   r   r   r   r0     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   rr   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   )r3   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   r2   r   r   r   )r3   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   r9   r   r   r   rT     r   zDTestCycleEnumeration.test_chordless_cycles_graph.<locals>.<listcomp>r   r"   r   r#   )r   r   r"   r#   r$   rq      c                 S   r   r   r   r9   r   r   r   rT     r   )r   r   r   r2   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   r9   r   r   r   rT   '  r   r   r   d   c                    r  )c                    r  r   r   r   r   r   r   rT   <  r   r  r   r   r*   r   r   r   rT   ;  r  c                 S   r   r	  r   r9   r   r   r   rT   @  r   )r   r   r2   r%   r   rI   )r3   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 )	Nrq   c                 s   r   r)   r   )r+   r   yr   r   r   r0   E  r   zMTestCycleEnumeration.test_simple_cycles_acyclic_tournament.<locals>.<genexpr>Tr   r
   r   r   )r   rI   r2   r   )r3   r/   r&   rv   r   r   r   %test_simple_cycles_acyclic_tournamentC  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$   rq   r  r   r  r  r   )r   r
   r   r   r   r  r   r  r  r   r#   r"   )
r   r
   r   r   r   r  rq   r$   r#   r"   )r   r
   r   r   r   r   r!   r"   )r   r   r!   r"   r#   r$   rq   r  r!   )r   rq   r  r   r  r   r   r#   rr   )
r   rU   r   r2   r   r%   Zadd_pathrV   r   rh   )r3   ZtestGZcyc1Zcyc2Zcyc3r   r   r   r   test_simple_cycles_graphM  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 )Nrq   r   r   r   r
   )r   rI   r2   r   r   	enumerater   r   )r3   dr   r/   rv   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   rl   rg   r   )r3   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=   )r   rG   
ValueErrorr   rI   rg   r   r   ro   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   rq   rr   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   )r3   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
   )nodesrh   )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   rh   r   rG   	exceptionNetworkXNoCycle
find_cycler!  rm   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   rh   r%   rl   r$  r!  r3   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   rh   r%   rl   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   rh   rl   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   rh   rl   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   rh   rl   r$  r!  r(  r   r   r   test_multigraph  s
   (zTestFindCycle.test_multigraphc                 C   r5  )Nr6  )r
   r   r   r   r
   r   )r   r   rh   rl   r$  r!  r(  r   r   r   test_multidigraph  s
   (zTestFindCycle.test_multidigraphc                 C   r1  )Nignorer*  r   r
   r2  r(  r   r   r   test_digraph_ignore  r4  z!TestFindCycle.test_digraph_ignorec                 C   r1  )Nreverser*  r
   r   )r   rI   rh   rl   r$  r!  r   r(  r   r   r   test_digraph_reverse  r4  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 )Nr9  r*  r   r
   r   r   )r   r   rh   rl   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   r9  r*  r
   r   r   )r   r   rl   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   r   rG   r"  r#  r$  rm   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*  r9  r   r
   r   )
r   rI   r   rG   r"  r#  r$  rl   r   r   )r3   r&   r   r   r   r   test_dag4  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   r   rG   r#  r$  rl   r(  r   r   r   test_prev_explored<  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   rA  )r   rI   r   r   rG   r#  r$  rm   r   r   r   test_no_cycleN  s   zTestFindCycle.test_no_cycleN)r   r   r   r   r(   r%  r)  r+  r-  r/  r0  r3  r7  r8  r:  r<  r=  r>  r?  r@  rB  rC  r   r   r   r   r    s(    
r  c                 C   s   t | t |ks
J d S r)   r7   )r4   r   r   r   r   assert_basis_equalW  s   rD  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(   \  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_basisrH  rD  r3   mcbr   r   r   test_unweighted_diamondc  s   z-TestMinimumCycleBasis.test_unweighted_diamondc                 C   s*   t j| jdd}t|g dg dg d S )NrG  rF  rJ  )r   r   r   r
   rK  rM  r   r   r   test_weighted_diamondg  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 )Nrq   i  g333333?seed)	r2   r   Zerdos_renyi_graphZnumber_of_nodesZnumber_of_edgesZnumber_connected_componentsrL  r   r   )r3   ZntrialrR  ZrgZnnodesZnedgesZncomprN  r   r   r   test_dimensionalityk  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   r0   {  rf   z<TestMinimumCycleBasis.test_complete_graph.<locals>.<genexpr>)r   r   rL  r   r   )r3   cgrN  r   r   r   test_complete_graphx  s   

z)TestMinimumCycleBasis.test_complete_graphc                 C   s   t dd}t |rJ d S )Nr   )r   Zbalanced_treerL  )r3   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   r9   r   r   r   r0     r;   z<TestMinimumCycleBasis.test_petersen_graph.<locals>.<genexpr>c                 3   s     | ]\}}  ||V  qd S r)   r   r+   ur  )r&   r   r   r0     r   T)Zcyclic)	r   petersen_graphrl   rL  r   r   utilsr   r   )r3   rN  r:   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   r[  r   r   r   rT         zVTestMinimumCycleBasis.test_gh6787_variable_weighted_complete_graph.<locals>.<listcomp>c                 S   ra  )r
   r   r[  r   r   r   rT     rb  rG  rF  )r   r   add_weighted_edges_fromrh   rU   rL  r   )r3   NrU  rN  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   rq   )r
   r   rq   distrF  )r
   r   r   )r   r   r
   r   )r
   r   r   c                 3   rY  r)   r   r9   rZ  r   r   r0     r;   zMTestMinimumCycleBasis.test_gh6787_and_edge_attribute_names.<locals>.<genexpr>)r   r   r   c                 3   rY  r)   r   r9   rZ  r   r   r0     r;   )r   rU   rc  rl   rL  r   r   )r3   r&   rN  r   rZ  r   $test_gh6787_and_edge_attribute_names  s   
z:TestMinimumCycleBasis.test_gh6787_and_edge_attribute_namesN)r   r   r   r   r(   rO  rP  rS  rV  rX  r`  re  rg  r   r   r   r   rE  [  s    
rE  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!   rq   *   rQ  ))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   r   markZparametrizer   Zchvatal_graphZtutte_graphr]  Zheawood_graphZpappus_graphZrandom_labeled_treer   Zempty_graphr   r   r   r2   rj  r   r   r   r   rh    s&    




$rh  )	itertoolsr   r   r   mathr   randomr   r   Znetworkxr   Z%networkx.algorithms.traversal.edgedfsr   r   r   r   r   r   r   r   r   r   r  rD  rE  rh  r   r   r   r   <module>   s.     )   q R