U
    ?hGl                     @   s   d dl mZ d dlmZ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G d	d
 d
ZG 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G d'd( d(Zd)d* Zd+d, Zd-d. ZdS )/    deque)combinationspermutationsN)edges_equalpairwisec                 C   s   t | dd dS )zConsume the iterator entirely.r   )maxlenNr   )iterator r
   T/var/www/html/venv/lib/python3.8/site-packages/networkx/algorithms/tests/test_dag.py_consume   s    r   c                   @   sX   e Zd Z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 )TestDagLongestPathzBUnit tests computing the longest path in a directed acyclic graph.c                 C   s   t  }t |g kstd S NnxDiGraphdag_longest_pathAssertionErrorselfGr
   r
   r   
test_empty   s    zTestDagLongestPath.test_emptyc                 C   s:   ddddddg}t |}t |ddd	d
dgks6td S )N      r      r      r      r       )r      r   r   r   r    r"   r   r   edgesr   r
   r
   r   test_unweighted1   s    
z#TestDagLongestPath.test_unweighted1c                 C   s<   dddddddg}t |}t |dd	d
ddgks8td S Nr   r   r   r   r   r    r   r   r   r    r   r   r   r   r   r    r   r$   r
   r
   r   test_unweighted2   s    
z#TestDagLongestPath.test_unweighted2c                 C   s>   t  }ddddddg}|| t |ddd	gks:t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   add_weighted_edges_fromr   r   r   r   r%   r
   r
   r   test_weighted"   s    
z TestDagLongestPath.test_weightedc                 C   s   t  }tt jt j| d S r   )r   GraphpytestraisesNetworkXNotImplementedr   r   r
   r
   r   test_undirected_not_implemented(   s    z2TestDagLongestPath.test_undirected_not_implementedc                 C   sx   dd t dD }t }||d |d  ||d |d  ||d |d  ||d |d  t| dS )	zTests that computing the longest path does not depend on
        nodes being orderable.

        For more information, see issue #1989.

        c                 S   s   g | ]
}t  qS r
   )object.0nr
   r
   r   
<listcomp>5   s     z=TestDagLongestPath.test_unorderable_nodes.<locals>.<listcomp>r   r   r   r   r   N)ranger   r   add_edger   )r   nodesr   r
   r
   r   test_unorderable_nodes,   s    	z)TestDagLongestPath.test_unorderable_nodesc                 C   s>   ddddddddg}t |}t |dd	d
ddgks:td S r'   )r   MultiDiGraphr   r   r$   r
   r
   r   test_multigraph_unweighted?   s    
z-TestDagLongestPath.test_multigraph_unweightedc                 C   s:   t  }dddddg}|| t |ddgks6td S )Nr   r   r   r   r   r   r   r   r   r   r   r    r   r   r   r   r   r   rE   r4   r   r   r5   r
   r
   r   test_multigraph_weightedD   s    
z+TestDagLongestPath.test_multigraph_weightedc                 C   sT   t ddg}|dddg t |ddgks4tt j|dddd	dgksPtd S )
Nr   r   rI   rJ   rK   r   r   )Zdefault_weightr   rL   r   r
   r
   r   'test_multigraph_weighted_default_weightP   s    z:TestDagLongestPath.test_multigraph_weighted_default_weightN)__name__
__module____qualname____doc__r   r&   r,   r6   r;   rD   rF   rM   rN   r
   r
   r
   r   r      s   r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )TestDagLongestPathLengthz\Unit tests for computing the length of a longest path in a
    directed acyclic graph.

    c                 C   s   ddddddg}t |}t |dks,tdddd	d
ddg}t |}t |dksZtt  }|d t |dks~td S )Nr   r   r   r   r!   r    r#   r   r(   r)   r*   r+   r   r   )r   r   dag_longest_path_lengthr   add_noder$   r
   r
   r   test_unweighted_   s    


z(TestDagLongestPathLength.test_unweightedc                 C   s   t  }tt jt j| d S r   )r   r7   r8   r9   r:   rU   r   r
   r
   r   r;   m   s    z8TestDagLongestPathLength.test_undirected_not_implementedc                 C   s8   ddddddg}t  }|| t |dks4td S )Nr-   r/   r0   r1   r2   r3   r    )r   r   r4   rU   r   r$   r
   r
   r   r6   q   s    
z&TestDagLongestPathLength.test_weightedc                 C   s4   ddddddddg}t |}t |dks0td S )	Nr   r   r(   r)   r*   r+   r   r   )r   rE   rU   r   r$   r
   r
   r   rF   w   s    
z3TestDagLongestPathLength.test_multigraph_unweightedc                 C   s6   t  }dddddg}|| t |dks2td S )NrG   rH   rI   rJ   rK   r    )r   rE   r4   rU   r   r5   r
   r
   r   rM   |   s    
z1TestDagLongestPathLength.test_multigraph_weightedN)	rO   rP   rQ   rR   rW   r;   r6   rF   rM   r
   r
   r
   r   rS   Y   s   rS   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%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1S )2TestDAGc                 C   s   d S r   r
   )clsr
   r
   r   setup_class   s    zTestDAG.setup_classc                 C   s   t dddg}t jt jfD ]}t||dkstq|dd t jt jfD ]}tt j	t
|| qN|dd t jt jfD ]}t||dkstq|dd tt |dksttt |dkstd S )	Nr   r*   r   r   r   r   r   r   rK   >   rK   r[   )r   r   topological_sort lexicographical_topological_sorttupler   rB   r8   r9   NetworkXUnfeasibler   remove_edge)r   DG	algorithmr
   r
   r   test_topological_sort1   s    zTestDAG.test_topological_sort1c                 C   s`   t jd}t |rtt | r,tt t ddgrDtt t ddgs\td S )Nr   r(   r)   )r   
generatorsZcomplete_graphis_directed_acyclic_graphr   Zto_directedr7   r   r   r
   r
   r   test_is_directed_acyclic_graph   s
    z&TestDAG.test_is_directed_acyclic_graphc                 C   s   t dgdgdgdgdgdgdgdgd	gd
	}tt jtt | t |rTt|	dd tt | t |s|td S )Nr   r   r   r    r               )	r   r   r   r   r       rg   rh   ri   )
r   r   r8   r9   r_   r   r\   re   r   r`   r   ra   r
   r
   r   test_topological_sort2   s"    zTestDAG.test_topological_sort2c                    s   t    dd tddD   dd tddD   dd tddD   d	d tdd
D   fdd}|tt    dd tt j	t
t   d S )Nc                 S   s   g | ]}d |fqS )r   r
   r>   ir
   r
   r   r@      s     z2TestDAG.test_topological_sort3.<locals>.<listcomp>r   r    c                 S   s   g | ]}d |fqS )r   r
   rn   r
   r
   r   r@      s     	   c                 S   s   g | ]}d |fqS )r"   r
   rn   r
   r
   r   r@      s     rg   c                 S   s   g | ]}d |fqS )r   r
   rn   r
   r
   r   r@      s     rj   c                    sL   t | tstt| t ks"tt| dD ]\}}t ||r,tq,d S )Nr   )
isinstancelistr   setr   r   Zhas_path)orderuvra   r
   r   validate   s    z0TestDAG.test_topological_sort3.<locals>.validateri   r   )r   r   add_edges_fromrA   rr   r\   rB   r8   r9   r_   r   )r   rx   r
   rw   r   test_topological_sort3   s    zTestDAG.test_topological_sort3c                 C   s.   t  }|dd tt jtt | d S )Nr   r   )r   r7   rB   r8   r9   NetworkXErrorr   r\   r   r
   r
   r   test_topological_sort4   s    zTestDAG.test_topological_sort4c                 C   s2   t  }|dd tt |ddgks.td S )Nr   r   )r   r   rB   rr   r\   r   r   r
   r
   r   test_topological_sort5   s    zTestDAG.test_topological_sort5c                    s`   t jt jfD ]N  fdd} fdd} fdd}tt| tt| tt j| qd S )Nc                     s>   t dddg} d} | D ]}|rd}| d| d qd S )Nr   r   r(   TFr    )r   r   rB   ra   firstxrb   r
   r   runtime_error   s    z5TestDAG.test_topological_sort6.<locals>.runtime_errorc                     s8   t dddg} d} | D ]}|rd}| d qd S )Nr   r   r(   TFr   r   r   remove_noder~   r   r
   r   unfeasible_error   s    z8TestDAG.test_topological_sort6.<locals>.unfeasible_errorc                     s8   t dddg} d} | D ]}|rd}| d qd S )Nr   r   r(   TFr   r   r~   r   r
   r   runtime_error2   s    z6TestDAG.test_topological_sort6.<locals>.runtime_error2)r   r\   r]   r8   r9   RuntimeErrorr_   )r   r   r   r   r
   r   r   test_topological_sort6   s    zTestDAG.test_topological_sort6c                 C   s8   t ddddg}tt |ddddd	ggks4td S )
Nr   r   r(   r)   r   r   r   r   r    )r   r   rr   all_topological_sortsr   rl   r
   r
   r   test_all_topological_sorts_1   s    z$TestDAG.test_all_topological_sorts_1c              
   C   sj   t dddddg}tt |dddd	d
gdddd
d	gdddd	d
gdddd
d	gddd
dd	ggksftd S )Nr*   r   r   r   r   r   r)   r   r   r   r   r    )r   r   sortedr   r   rl   r
   r
   r   test_all_topological_sorts_2   s    z$TestDAG.test_all_topological_sorts_2c                 C   sF   dd }dd }dd }t tj| t tj| t tj| d S )Nc                  S   s&   t dddddg} tt |  d S )Nr   r   r(   r   r   r)   )r   r   rr   r   rw   r
   r
   r   
unfeasible  s    z8TestDAG.test_all_topological_sorts_3.<locals>.unfeasiblec                  S   s    t ddg} tt |  d S Nr   r   )r   r7   rr   r   r   r
   r
   r   not_implemented  s    z=TestDAG.test_all_topological_sorts_3.<locals>.not_implementedc                  S   s"   t dddg} tt |  d S r   )r   
MultiGraphrr   r   r   r
   r
   r   not_implemted_2  s    z=TestDAG.test_all_topological_sorts_3.<locals>.not_implemted_2)r8   r9   r   r_   r:   )r   r   r   r   r
   r
   r   test_all_topological_sorts_3
  s    z$TestDAG.test_all_topological_sorts_3c                 C   sJ   t  }tdD ]}|| qtttt|jtt 	|ksFt
d S )Nr#   )r   r   rA   rV   r   maprr   r   rC   r   r   )r   ra   ro   r
   r
   r   test_all_topological_sorts_4  s    z$TestDAG.test_all_topological_sorts_4c              	   C   sN   t dddddddg}tt |tddddd	gdddd	dggksJtd S )
Nr   r   r(   r   r   r   r   r   r    )r   rE   r   r   r   rl   r
   r
   r   'test_all_topological_sorts_multigraph_1%  s    z/TestDAG.test_all_topological_sorts_multigraph_1c                 C   sd   d}g }t d|D ]}|||d fg|  qt|}tt|tt d|d gks`td S )Nrp   r   )rA   extendr   rE   rr   r   r   )r   Nr%   ro   ra   r
   r
   r   'test_all_topological_sorts_multigraph_2+  s    
z/TestDAG.test_all_topological_sorts_multigraph_2c              	   C   s   t  }t jjj}|dddddddg ||dd	d
ddhksDt||dd	dhksZt||d	t ksntt	t j
||d d S )Nr   r*   r   r   r)   r   r"   r!   r"   r   r   r   r    r      )r   r   
algorithmsdag	ancestorsry   r   rs   r8   r9   r{   )r   r   r   r
   r
   r   test_ancestors3  s    
zTestDAG.test_ancestorsc              	   C   s   t  }t jjj}|dddddddg ||dd	d
dhksBt||dd	d
ddhks\t||d
t ksptt	t j
||d d S )Nr   r*   r   r   r)   r   r!   r   r   r   r"   r   r    r   )r   r   r   r   descendantsry   r   rs   r8   r9   r{   )r   r   r   r
   r
   r   test_descendants<  s    
zTestDAG.test_descendantsc              	   C   sb  t dddg}ddddddg}tt | |s8tt dddg}dddddg}tt | |sntt dddg}dddd	ddg}t|d
d |D  }ttt | |stt dddg}ddddddg}ttt | |stt dddg}ddddddg}ttt | |s:tt 	dddg}ddddddg}ttt | |sxtt ddddifddddifdg}t |}| D ](\}}|
|||
||kstqd}t dd t|D }t |}| D ](\}}|
|||
||kstqt  }tt j t j|dd W 5 Q R X d S )Nr   r   r(   r*   r   r   r   r   r   r   r   r   c                 S   s   g | ]}||fqS r
   r
   r=   r
   r
   r   r@   N  s     z3TestDAG.test_transitive_closure.<locals>.<listcomp>r   r   ar   br   
   c                 s   s"   | ]}||d  d|dfV  qdS )r   r   )fweightNr
   rn   r
   r
   r   	<genexpr>d  s     z2TestDAG.test_transitive_closure.<locals>.<genexpr>zwrong input)Z	reflexive)r   r   r   transitive_closurer%   r   r   r7   r   rE   get_edge_datarA   r8   r9   r{   )r   r   solutionsolnHru   rv   kr
   r
   r   test_transitive_closureE  s>    $
"
"zTestDAG.test_transitive_closurec                 C   s  t dddg}ddddddg}t|dd |D  }tt | |sNttt |d	 |shttt |d
 |sttt |d  |stt dddg}dddddg}t|dd |D  }tt | |sttt |d	 |sttt |d
 |s ttt |d  |s<tt dddg}tddddddg}t|dd |D  }ttt | |stttt |d	 |stttt |d  |stttt |d
 |stt dddg}ddddddg}t|dd |D  }tt | |sDttt |d	 |s`ttt |d
 |s|ttt |d  |stt dddg}ddddddg}t|dd |D  }tt | |sttt |d	 |sttt |d
 |s ttt |d  |s<tt 	dddg}ddddddg}t|dd |D  }tt | |sttt |d	 |sttt |d
 |sttt |d  |std S )Nr   r   r(   r*   r   r   c                 S   s   g | ]}||fqS r
   r
   r=   r
   r
   r   r@   p  s     z=TestDAG.test_reflexive_transitive_closure.<locals>.<listcomp>FTc                 S   s   g | ]}||fqS r
   r
   r=   r
   r
   r   r@   x  s     r   r   r   c                 S   s   g | ]}||fqS r
   r
   r=   r
   r
   r   r@     s     c                 S   s   g | ]}||fqS r
   r
   r=   r
   r
   r   r@     s     c                 S   s   g | ]}||fqS r
   r
   r=   r
   r
   r   r@     s     c                 S   s   g | ]}||fqS r
   r
   r=   r
   r
   r   r@     s     )
r   r   r   r   r   r%   r   r7   r   rE   )r   r   r   r   r
   r
   r   !test_reflexive_transitive_closurem  sT       z)TestDAG.test_reflexive_transitive_closurec                 C   sH  t dddg}t jjj}ddddddg}t|| |s@tt dddg}dddddg}t|| |sttt dddg}t	
t j|| t ddd	d
ifdd
ddifdg}||}| D ]$\}}||||||kstqd}t dd t|D }||}| D ](\}}||||||kstqd S )Nr   r   r(   r*   r   r   r   r   r   r   r   r   r   c                 s   s"   | ]}||d  d|dfV  qdS )r   bar)Zfoor   Nr
   rn   r
   r
   r   r     s     z6TestDAG.test_transitive_closure_dag.<locals>.<genexpr>)r   r   r   r   Ztransitive_closure_dagr   r%   r   r7   r8   r9   r:   r   rA   )r   r   r   r   r   ru   rv   r   r
   r
   r   test_transitive_closure_dag  s$    
$z#TestDAG.test_transitive_closure_dagc                 C   s   t ddddddg}t jjj}dddg}t|| |s@tt dddddg}t jjj}dddg}t|| |s~tt dddg}t	
t j|| d S )Nr   r*   r   r   r   r(   )r   r   r   r   transitive_reductionr   r%   r   r7   r8   r9   r:   )r   r   r   r   r
   r
   r   test_transitive_reduction  s    



z!TestDAG.test_transitive_reductionc                 C   s4   dd |D }dd |D }t |t |ks0td S )Nc                 S   s   g | ]}t |qS r
   	frozensetr>   r   r
   r
   r   r@     s     z-TestDAG._check_antichains.<locals>.<listcomp>c                 S   s   g | ]}t |qS r
   r   r   r
   r
   r   r@     s     )rs   r   )r   r   resultZsolresr
   r
   r   _check_antichains  s    zTestDAG._check_antichainsc                    sN  t jjj t dddg}g dgdgdgdgg}| t || t dddd	d
dg}g dgdgddgdgddgddgdddgdgddgdgddgdgdgg}| t || t dddd	d
g}g dgdgdgddgddgdgdgddgddgddgdddgdddgddgdgg}| t || t ddgdgdgdgd}g dgdgdgdgddgddgdgg}| t || t  }| t |g g t  }|dddg g dgdgddgdgddgddgdddgg}| t ||  fdd}t dddg}t	
t j|| t dddg}t	
t j|| d S )Nr   r   r(   r   r   r   r   r   r   r!   rT   r#   r"   r    r*   )r   r   r   r   r   c                    s   t  | S r   )rr   r   
antichainsr
   r   r     s    z"TestDAG.test_antichains.<locals>.fr   )r   r   r   r   r   r   rr   Zadd_nodes_fromr7   r8   r9   r:   r_   )r   r   r   r   r
   r   r   test_antichains  sj    
&,zTestDAG.test_antichainsc                 C   s   t dddddg}tt |dddd	d
dgks6ttt j|dd ddddd	d
dgks`ttt j|dd ddd
d	dddgkstd S )Nr   r   r   r+   r   r   r   r   r   r    r"   c                 S   s   | S r   r
   r   r
   r
   r   <lambda>      z?TestDAG.test_lexicographical_topological_sort.<locals>.<lambda>keyc                 S   s   |  S r   r
   r   r
   r
   r   r     r   )r   r   rr   r]   r   r   r
   r
   r   %test_lexicographical_topological_sort  s$    "
z-TestDAG.test_lexicographical_topological_sortc                    sz   G dd d dd } fddt dD t }dd	d
dg}|fdd|D  ttj||d}|ksvtdS )z
        Check the case of two or more nodes with same key value.
        Want to avoid exception raised due to comparing nodes directly.
        See Issue #3493
        c                   @   s   e Zd Zdd Zdd ZdS )zATestDAG.test_lexicographical_topological_sort2.<locals>.Test_Nodec                 S   s   || _ d| _d S )Nr   )labelpriority)r   r?   r
   r
   r   __init__  s    zJTestDAG.test_lexicographical_topological_sort2.<locals>.Test_Node.__init__c                 S   s   d| j  dS )NzNode())r   r   r
   r
   r   __repr__"  s    zJTestDAG.test_lexicographical_topological_sort2.<locals>.Test_Node.__repr__N)rO   rP   rQ   r   r   r
   r
   r
   r   	Test_Node  s   r   c                 S   s   | j S r   )r   )noder
   r
   r   sorting_key%  s    zCTestDAG.test_lexicographical_topological_sort2.<locals>.sorting_keyc                    s   g | ]} |qS r
   r
   r=   )r   r
   r   r@   (  s     zBTestDAG.test_lexicographical_topological_sort2.<locals>.<listcomp>r   r   r   r   r   )r   r   r   c                 3   s"   | ]\}} |  | fV  qd S r   r
   )r>   r   r   )
test_nodesr
   r   r   +  s     zATestDAG.test_lexicographical_topological_sort2.<locals>.<genexpr>r   N)rA   r   r   ry   rr   r]   r   )r   r   r   r%   Zsortingr
   )r   r   r   &test_lexicographical_topological_sort2  s    z.TestDAG.test_lexicographical_topological_sort2N)rO   rP   rQ   classmethodrZ   rc   rf   rm   rz   r|   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   rX      s2   

		(1<rX   c               
   C   s   t ddgddgdgg ddgg g d } dd	 t | D }dddgddgdgd
gg}||ksftt | j}|dd
 dd	 t |D }||kstd S )Nr   r   r   r    r#   r"   )r   r   r   r   r    r"   r#   c                 S   s   g | ]}t |qS r
   r   r>   genr
   r
   r   r@   6  s     z0test_topological_generations.<locals>.<listcomp>r   c                 S   s   g | ]}t |qS r
   r   r   r
   r
   r   r@   <  s     )r   r   reversetopological_generationsr   rE   r%   rB   )r   ZgenerationsexpectedZMGr
   r
   r   test_topological_generations1  s     r   c                  C   s"   t  } tt | g kstd S r   )r   r   rr   r   r   r   r
   r
   r   "test_topological_generations_empty@  s    r   c               	   C   sF   t ddgddgddgg} tt j tt |  W 5 Q R X d S )Nr   r   r   )r   r   r8   r9   r_   rr   r   r   r
   r
   r   "test_topological_generations_cycleE  s    r   c                  C   s.   t  } t | ddddg t | r*td S Nr   r   r   r   r   r   	add_cycleis_aperiodicr   r   r
   r
   r   test_is_aperiodic_cycleK  s    r   c                  C   sD   t  } t | ddddg t | dddddg t | s@td S )Nr   r   r   r   r    r"   r#   r   r   r
   r
   r   test_is_aperiodic_cycle2Q  s    r   c                  C   sB   t  } t | ddddg t | ddddg t | r>td S )Nr   r   r   r   r    r"   r   r   r
   r
   r   test_is_aperiodic_cycle3X  s    r   c                  C   s:   t  } t | ddddg | dd t | s6td S r   r   r   r   rB   r   r   r   r
   r
   r   test_is_aperiodic_cycle4_  s    r   c                  C   s:   t  } t | ddddg | dd t | s6td S r   r   r   r
   r
   r   test_is_aperiodic_selfloopf  s    r   c                  C   s   t  } tt jt j|  d S r   )r   r7   r8   r9   r{   r   r   r
   r
   r   test_is_aperiodic_raisem  s    r   c                  C   s    t t  } t | rtd S r   )r   r   Zdavis_southern_women_graphr   r   r   r
   r
   r   test_is_aperiodic_bipartiter  s    r   c                  C   s&   t jddt  d} t | r"td S )Nr      Zcreate_using)r   Zfull_rary_treer   r   r   r   r
   r
   r   test_is_aperiodic_rary_treex  s    r   c                  C   sh   t  } t | ddddg t | ddddg t | r>t| dd | dd t | sdtd S )	Nr   r   r   r   r    r"   r#   r   )r   r   r   r   r   rB   r   r
   r
   r   test_is_aperiodic_disconnected}  s    r   c                  C   s8   t  } t | dddg | dd t | r4td S )Nr   r   r   r   r   r   r
   r
   r   test_is_aperiodic_disconnected2  s    r   c                   @   sP   e Zd Z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 )TestDagToBranchingz>Unit tests for the :func:`networkx.dag_to_branching` function.c                 C   sP   t ddddg}t |}t ddddg}t |s<tt ||sLtdS )znTests that a directed acyclic graph with a single degree
        zero node produces an arborescence.

        r   r   r*   r   r   N)r   r   dag_to_branchingis_arborescencer   is_isomorphicr   r   Br   r
   r
   r   test_single_root  s
    
z#TestDagToBranching.test_single_rootc                 C   sd   t dddddg}t |}t ddddddg}t |sBtt |rPtt ||s`td	S )
zTests that a directed acyclic graph with multiple degree zero
        nodes creates an arborescence with multiple (weakly) connected
        components.

        r   r   r*   r   )r    r   r   r!   )r"   r#   N)r   r   r   Zis_branchingr   r   r   r   r
   r
   r   test_multiple_roots  s    
z&TestDagToBranching.test_multiple_rootsc                 C   s2   t jddt  d}t |}t ||s.tdS )zTests that a directed acyclic graph that is already an
        arborescence produces an isomorphic arborescence as output.

        r   r   N)r   balanced_treer   r   r   r   )r   Ar   r
   r
   r   test_already_arborescence  s    
z,TestDagToBranching.test_already_arborescencec                 C   sR   t jddt  d}t jddt  d}t ||}t |}t ||sNtdS )z}Tests that a directed acyclic graph that is already a
        branching produces an isomorphic branching as output.

        r   r   N)r   r   r   Zdisjoint_unionr   r   r   )r   ZT1ZT2r   r   r
   r
   r   test_already_branching  s
    
z)TestDagToBranching.test_already_branchingc              	   C   s8   t tj" ttddd}t| W 5 Q R X dS )z3Tests that a non-acyclic graph causes an exception.abcT)ZcyclicN)r8   r9   r   Z	HasACycler   r   r   r   r
   r
   r   test_not_acyclic  s    z#TestDagToBranching.test_not_acyclicc              	   C   s*   t tj tt  W 5 Q R X d S r   )r8   r9   r   r:   r   r7   r   r
   r
   r   test_undirected  s    z"TestDagToBranching.test_undirectedc              	   C   s*   t tj tt  W 5 Q R X d S r   )r8   r9   r   r:   r   r   r   r
   r
   r   test_multigraph  s    z"TestDagToBranching.test_multigraphc              	   C   s*   t tj tt  W 5 Q R X d S r   )r8   r9   r   r:   r   rE   r   r
   r
   r   test_multidigraph  s    z$TestDagToBranching.test_multidigraphN)rO   rP   rQ   rR   r   r   r   r   r   r   r   r  r
   r
   r
   r   r     s   (	r   c                  C   s>   t d} t | dt | d  ko4ddddhkn   dS )z_Regression test to ensure anscestors and descendants work as expected on
    undirected graphs.r    r   r   r   r   r   N)r   Z
path_graphr   r   r   r
   r
   r   %test_ancestors_descendants_undirected  s    
r  c                  C   s   t  } tt jt j|  d S r   )r   r7   r8   r9   r:   compute_v_structuresr   r
   r
   r   test_compute_v_structures_raise  s    r  c                  C   sx   dddg} t | }tt |}t|dks2td|ks>tdddd	d
g} t | }tt |}t|dksttd S )Nr   r   r   r   )r   r   r   )r   r   )Cr   )r   D)r  E)r   r  r   )r   r   rs   r  lenr   )r%   r   Z	v_structsr
   r
   r   test_compute_v_structures  s    


r	  ) collectionsr   	itertoolsr   r   r8   Znetworkxr   Znetworkx.utilsr   r   r   r   rS   rX   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r	  r
   r
   r
   r   <module>   s8   H0   +]