
    fi.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 Z G d d          Z G d d	          Z G d
 d          Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z G d d          Zd Zd Z d Z!d  Z"d! Z#ej$        %                    d"g d#d$hfg d%d&hfg d' e&            ff          d(             Z'd) Z(ej$        %                    d"g d#d$hfg d%d&d*hff          d+             Z)dS ),    deque)combinationspermutationsN)edges_equalpairwisec                 (    t          | d           dS )zConsume the iterator entirely.r   )maxlenNr   )iterators    z/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/networkx/algorithms/tests/test_dag.py_consumer      s     
(1    c                   H    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )TestDagLongestPathzBUnit tests computing the longest path in a directed acyclic graph.c                 `    t          j                    }t          j        |          g k    sJ d S NnxDiGraphdag_longest_pathselfGs     r   
test_emptyzTestDagLongestPath.test_empty   s/    JLL"1%%++++++r   c                 n    g d}t          j        |          }t          j        |          g dk    sJ d S )N)      r      r      r       r$      )r       )r   r   r    r$   r&   r   r   edgesr   s      r   test_unweighted1z#TestDagLongestPath.test_unweighted1   sB    @@@Ju"1%%888888r   c                 n    g d}t          j        |          }t          j        |          g dk    sJ d S )Nr   r   r    r"   r"   r$   r   r    r   r$   r#   r   r   r    r"   r$   r   r(   s      r   test_unweighted2z#TestDagLongestPath.test_unweighted2   sB    HHHJu"1%%888888r   c                     t          j                    }g d}|                    |           t          j        |          g dk    sJ 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)   s      r   test_weightedz TestDagLongestPath.test_weighted"   sR    JLLSSS	!!%((("1%%222222r   c                     t          j                    }t          j        t           j        t           j        |           d S r   )r   GraphpytestraisesNetworkXNotImplementedr   r   s     r   test_undirected_not_implementedz2TestDagLongestPath.test_undirected_not_implemented(   s-    HJJb/1DaHHHHHr   c                    d t          d          D             }t          j                    }|                    |d         |d                    |                    |d         |d                    |                    |d         |d                    |                    |d         |d                    t          j        |           dS )zTests that computing the longest path does not depend on
        nodes being orderable.

        For more information, see issue #1989.

        c                 *    g | ]}t                      S  )object.0ns     r   
<listcomp>z=TestDagLongestPath.test_unorderable_nodes.<locals>.<listcomp>5   s    ,,,a,,,r   r"   r   r   r   r    N)ranger   r   add_edger   )r   nodesr   s      r   test_unorderable_nodesz)TestDagLongestPath.test_unorderable_nodes,   s     -,588,,,JLL	

58U1X&&&	

58U1X&&&	

58U1X&&&	

58U1X&&& 	Ar   c                 n    g d}t          j        |          }t          j        |          g dk    sJ d S )Nr   r   r   r-   r.   r/   r0   r#   r1   )r   MultiDiGraphr   r(   s      r   test_multigraph_unweightedz-TestDagLongestPath.test_multigraph_unweighted?   sB    PPPOE"""1%%888888r   c                     t          j                    }g d}|                    |           t          j        |          ddgk    sJ d S )N)r   r   r   )r   r    r   r   r    r   r   r    r$   r   r    r   r   r    r   rM   r6   r   r7   s      r   test_multigraph_weightedz+TestDagLongestPath.test_multigraph_weightedD   s\    O
 
 
 	
!!%((("1%%!Q//////r   c                     t          j        ddg          }|                    g d           t          j        |          ddgk    sJ t          j        |d          g dk    sJ d S )Nr   r   )rQ   rR   rS   r   r    )default_weightr   r   r    rT   r   s     r   'test_multigraph_weighted_default_weightz:TestDagLongestPath.test_multigraph_weighted_default_weightP   s~    OVV,--	!!"C"C"CDDD "1%%!Q////"1Q777999DDDDDDr   N)__name__
__module____qualname____doc__r   r*   r2   r8   r>   rJ   rN   rU   rY   rA   r   r   r   r      s        LL, , ,9 9 9
9 9 9
3 3 3I I I  &9 9 9

0 
0 
0E E E E Er   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )TestDagLongestPathLengthz\Unit tests for computing the length of a longest path in a
    directed acyclic graph.

    c                 R   g d}t          j        |          }t          j        |          dk    sJ g d}t          j        |          }t          j        |          dk    sJ t          j                    }|                    d           t          j        |          dk    sJ d S )Nr   r   r!   r#   r%   )r$   r'   r"   r,   r   r   )r   r   dag_longest_path_lengthadd_noder(   s      r   test_unweightedz(TestDagLongestPathLength.test_unweighted_   s    @@@Ju)!,,1111HHHJu)!,,1111 JLL	

1)!,,111111r   c                     t          j                    }t          j        t           j        t           j        |           d S r   )r   r:   r;   r<   r=   rb   r   s     r   r>   z8TestDagLongestPathLength.test_undirected_not_implementedm   s-    HJJb/1KQOOOOOr   c                     g d}t          j                    }|                    |           t          j        |          dk    sJ d S )Nr4   r$   )r   r   r6   rb   r(   s      r   r8   z&TestDagLongestPathLength.test_weightedq   sN    SSSJLL	!!%((()!,,111111r   c                 j    g d}t          j        |          }t          j        |          dk    sJ d S )NrL   r"   )r   rM   rb   r(   s      r   rN   z3TestDagLongestPathLength.test_multigraph_unweightedw   s>    PPPOE"")!,,111111r   c                     t          j                    }g d}|                    |           t          j        |          dk    sJ d S )NrP   r$   )r   rM   r6   rb   r7   s      r   rU   z1TestDagLongestPathLength.test_multigraph_weighted|   sX    O
 
 
 	
!!%((()!,,111111r   N)	rZ   r[   r\   r]   rd   r>   r8   rN   rU   rA   r   r   r_   r_   Y   sl         
2 2 2P P P2 2 22 2 2

2 
2 
2 
2 
2r   r_   c                       e Zd Zed             Zd Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )TestDAGc                     d S r   rA   )clss    r   setup_classzTestDAG.setup_class   s    r   c                    t          j        g d          }t           j        t           j        fD ] }t	           ||                    dk    sJ !|                    dd           t           j        t           j        fD ]0}t          j        t           j        t           ||                     1|
                    dd           t           j        t           j        fD ] }t	           ||                    dk    sJ !|
                    dd           t	          t          j        |                    dv sJ t	          t          j        |                    dk    sJ d S )N)r   r/   r   rX   r    r   rS   >   rX   rS   )r   r   topological_sort lexicographical_topological_sorttuplerH   r;   r<   NetworkXUnfeasibler   remove_edge)r   DG	algorithms      r   test_topological_sort1zTestDAG.test_topological_sort1   s]   Z00011-r/RS 	5 	5I2''944444
Aq-r/RS 	J 	JIM"/99R==IIII
q!-r/RS 	5 	5I2''944444
q!R(,,--1GGGGGR8<<==JJJJJJr   c                 h   t           j                            d          }t          j        |          rJ t          j        |                                          rJ t          j        t          j        ddg                    rJ t          j        t          j        ddg                    sJ d S )Nr   r-   r.   )r   
generatorscomplete_graphis_directed_acyclic_graphto_directedr:   r   r   s     r   test_is_directed_acyclic_graphz&TestDAG.test_is_directed_acyclic_graph   s    M((++/22222/@@@@@/&&9I0J0JKKKKK+BJ7G,H,HIIIIIIIr   c                    t          j        dgdgdgdgdgdgdgdgd	gd
	          }t          j        t           j        t
          t          j        |                     t          j        |          rJ |                    dd           t          t          j        |                     t          j        |          sJ d S )Nr   r    r"   r$   r               )	r   r   r    r"   r$      r~   r   r   )	r   r   r;   r<   rr   r   ro   rz   rs   r   rt   s     r   test_topological_sort2zTestDAG.test_topological_sort2   s    Z33333DDDD
 

 
 	b+Xr7J27N7NOOO/33333
q!$R(()))+B///////r   c                    t          j                                        d t          dd          D                                            d t          dd          D                                            d t          dd          D                                            d t          dd	          D                        fd
} |t	          t          j                                                           dd           t          j        t           j	        t          t          j                             d S )Nc                     g | ]}d |fS )r   rA   rD   is     r   rF   z2TestDAG.test_topological_sort3.<locals>.<listcomp>       777aAq6777r   r   r$   c                     g | ]}d |fS )r   rA   r   s     r   rF   z2TestDAG.test_topological_sort3.<locals>.<listcomp>   r   r   	   c                     g | ]}d |fS )r&   rA   r   s     r   rF   z2TestDAG.test_topological_sort3.<locals>.<listcomp>   s    888aAq6888r   r~   c                     g | ]}d |fS )r"   rA   r   s     r   rF   z2TestDAG.test_topological_sort3.<locals>.<listcomp>   s    999aAq6999r   r   c                     t          | t                    sJ t          |           t                    k    sJ t          | d          D ]\  }}t	          j        ||          rJ d S )Nr   )
isinstancelistsetr   r   has_path)orderuvrt   s      r   validatez0TestDAG.test_topological_sort3.<locals>.validate   sz    eT*****u::R(((($UA.. 1 11;r1a0000001 1r   r   r   )r   r   add_edges_fromrG   r   ro   rH   r;   r<   rr   r   )r   r   rt   s     @r   test_topological_sort3zTestDAG.test_topological_sort3   s4   Z\\
775A;;777888
775A;;777888
885B<<888999
995R==999:::	1 	1 	1 	1 	1 	b)"--..///
Bb+Xr7J27N7NOOOOOr   c                     t          j                    }|                    dd           t          j        t           j        t          t          j        |                     d S )Nr   r   )r   r:   rH   r;   r<   NetworkXErrorr   ro   r   s     r   test_topological_sort4zTestDAG.test_topological_sort4   sI    HJJ	

1ab&"2Ea2H2HIIIIIr   c                     t          j                    }|                    dd           t          t          j        |                    ddgk    sJ d S )Nr   r   )r   r   rH   r   ro   r   s     r   test_topological_sort5zTestDAG.test_topological_sort5   sO    JLL	

1aB'**++1v555555r   c                    t           j        t           j        fD ]dfd}fd}fd}t          j        t
          |           t          j        t
          |           t          j        t           j        |           ed S )Nc                      t          j        g d          } d} |           D ]}|rd}|                     d|z
  d            d S )Nr   r   r-   TFr$   )r   r   rH   rt   firstxru   s      r   runtime_errorz5TestDAG.test_topological_sort6.<locals>.runtime_error   se    Z 8 8 899"2 . .A . %AE1---. .r   c                      t          j        g d          } d} |           D ]}|rd}|                     d           d S )Nr   TFr"   r   r   remove_noder   s      r   unfeasible_errorz8TestDAG.test_topological_sort6.<locals>.unfeasible_error   _    Z 8 8 899"2 * *A * %q)))* *r   c                      t          j        g d          } d} |           D ]}|rd}|                     d           d S )Nr   TFr   r   r   s      r   runtime_error2z6TestDAG.test_topological_sort6.<locals>.runtime_error2   r   r   )r   ro   rp   r;   r<   RuntimeErrorrr   )r   r   r   r   ru   s       @r   test_topological_sort6zTestDAG.test_topological_sort6   s    -r/RS 	C 	CI. . . . .* * * * ** * * * * M,666M,777M"/1ABBBB9	C 	Cr   c                     t          j        g d          }t          t          j        |                    g dgk    sJ d S )N)r   r   r-   r.   r1   r   r   r   all_topological_sortsr   s     r   test_all_topological_sorts_1z$TestDAG.test_all_topological_sorts_1   sI    Z88899B,R0011ooo5FFFFFFFr   c                     t          j        g d          }t          t          j        |                    g dg dg dg dg dgk    sJ 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$   r   r    )r   r   sortedr   r   s     r   test_all_topological_sorts_2z$TestDAG.test_all_topological_sorts_2   st    Z@@@AAb.r2233OOOOOOOOOO8
 
 
 
 
 
 
r   c                     d }d }d }t          j        t          j        |           t          j        t          j        |           t          j        t          j        |           d S )Nc                  t    t          j        g d          } t          t          j        |                      d S )N)r   r   r-   r"   r   r.   r   )rt   s    r   
unfeasiblez8TestDAG.test_all_topological_sorts_3.<locals>.unfeasible  s7    DDDEEB)"--.....r   c                  t    t          j        ddg          } t          t          j        |                      d S Nr   r   )r   r:   r   r   r   s    r   not_implementedz=TestDAG.test_all_topological_sorts_3.<locals>.not_implemented  s5    &&)**A)!,,-----r   c                  t    t          j        g d          } t          t          j        |                      d S )N)r   r   r   )r   
MultiGraphr   r   r   s    r   not_implemented_2z?TestDAG.test_all_topological_sorts_3.<locals>.not_implemented_2  s7    66677A)!,,-----r   )r;   r<   r   rr   r=   )r   r   r   r   s       r   test_all_topological_sorts_3z$TestDAG.test_all_topological_sorts_3
  sw    	/ 	/ 	/
	. 	. 	.
	. 	. 	. 	b+Z888b/AAAb/1BCCCCCr   c                 ,   t          j                    }t          d          D ]}|                    |           t	          t          t          t          |j                                      t	          t          j	        |                    k    sJ d S )Nr'   )
r   r   rG   rc   r   mapr   r   rI   r   )r   rt   r   s      r   test_all_topological_sorts_4z$TestDAG.test_all_topological_sorts_4  s    Z\\q 	 	AKKNNNNc$RX 6 67788F$R((=
 =
 
 
 
 
 
 
r   c                     t          j        g d          }t          t          j        |                    t          g dg dg          k    sJ d S )N)r   r   r   r-   r#   r#   r#   r1   )r   r   r    r$   r"   )r   rM   r   r   r   s     r   'test_all_topological_sorts_multigraph_1z/TestDAG.test_all_topological_sorts_multigraph_1%  sh    _UUUVVb.r2233v__ooo.8
 8
 
 
 
 
 
 
r   c                 $   d}g }t          d|          D ] }|                    ||dz   fg|z             !t          j        |          }t	          t          j        |                    t	          t          d|dz                       gk    sJ d S )Nr   r   )rG   extendr   rM   r   r   )r   Nr)   r   rt   s        r   'test_all_topological_sorts_multigraph_2z/TestDAG.test_all_topological_sorts_multigraph_2+  s    q! 	+ 	+ALL1a!e*)****_U##B,R0011d5AE??6K6K5LLLLLLLr   c                 T   t          j                    }t           j        j        j        }|                    g d            ||d          h dk    sJ  ||d          ddhk    sJ  ||d          t                      k    sJ t          j        t           j	        ||d           d S )Nr   r/   r   r   r.   r   r&   r%   r&   >   r   r   r"   r$   r    r   r"      )
r   r   
algorithmsdag	ancestorsr   r   r;   r<   r   )r   r   r   s      r   test_ancestorszTestDAG.test_ancestors3  s    JLLM%/		QQQRRRyA,,,....yA1a&((((yA#%%''''b&	1a88888r   c                 T   t          j                    }t           j        j        j        }|                    g d            ||d          h dk    sJ  ||d          h dk    sJ  ||d          t                      k    sJ t          j        t           j	        ||d           d S )Nr   r   >   r   r    r&   r"   >   r   r    r$   r&   r    r   )
r   r   r   r   descendantsr   r   r;   r<   r   )r   r   r   s      r   test_descendantszTestDAG.test_descendants<  s    JLLm'3	QQQRRR{1a  III----{1a  LLL0000{1a  CEE))))b&Q:::::r   c                 :   t          j        g d          }g d}t          t          j        |                                          |          sJ t          j        g d          }g d}t          t          j        |                                          |          sJ t          j        g d          }g d}t          |d |D             z             }t          t          t          j        |                                                    |          sJ t          j        g d          }g d}t          t          t          j        |                                                    |          sJ t          j        g d          }g d}t          t          t          j        |                                                    |          sJ t          j        g d          }g d}t          t          t          j        |                                                    |          sJ t          j        dd	d
difd	dddifdg          }t          j        |          }|                                D ]5\  }}|	                    ||          |	                    ||          k    sJ 6d}t          j        d t          |          D                       }t          j        |          }|                                D ]5\  }}|	                    ||          |	                    ||          k    sJ 6t          j                    }t          j        t           j                  5  t          j        |d           d d d            d S # 1 swxY w Y   d S )Nr   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                     g | ]}||fS rA   rA   rC   s     r   rF   z3TestDAG.test_transitive_closure.<locals>.<listcomp>N      !4!4!4Q1a&!4!4!4r   r   r   ar    br   r-   
   c              3   ,   K   | ]}||d z   d|dfV  dS )r   r   )fweightNrA   r   s     r   	<genexpr>z2TestDAG.test_transitive_closure.<locals>.<genexpr>d  s5      MMq1q5q"9"9:MMMMMMr   zwrong input)	reflexive)r   r   r   transitive_closurer)   r   r:   r   rM   get_edge_datarG   r;   r<   r   )r   r   solutionsolnHr   r   ks           r   test_transitive_closurezTestDAG.test_transitive_closureE  s   J///00CCC203399;;XFFFFFJ///00;;;203399;;XFFFFFJ///00CCCh!4!4!!4!4!44556""7":":"@"@"B"BCCTJJJJJH---..CCC6""7":":"@"@"B"BCCXNNNNNM22233CCC6""7":":"@"@"B"BCCXNNNNNO44455CCC6""7":":"@"@"B"BCCXNNNNN JAQx(1a#q*:FCDD!!$$GGII 	B 	BDAq??1a((AOOAq,A,AAAAAAJMME!HHMMMMM!!$$GGII 	B 	BDAq??1a((AOOAq,A,AAAAAAHJJ]2+,, 	> 	>!!}====	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s   ,NNNc                 T   t          j        g d          }g d}t          |d |D             z             }t          t          j        |                                          |          sJ t          t          j        |d                                          |          sJ t          t          j        |d                                          |          sJ t          t          j        |d                                           |          sJ t          j        g d          }g d}t          |d |D             z             }t          t          j        |                                          |          sJ t          t          j        |d                                          |          sJ t          t          j        |d                                          |          sJ t          t          j        |d                                           |          sJ t          j        g d	          }t          g d
          }t          |d |D             z             }t          t          t          j        |                                                    |          sJ t          t          t          j        |d                                                    |          sJ t          t          t          j        |d                                                     |          sJ t          t          t          j        |d                                                    |          sJ t          j        g d          }g d}t          |d |D             z             }t          t          j        |                                          |          sJ t          t          j        |d                                          |          sJ t          t          j        |d                                          |          sJ t          t          j        |d                                           |          sJ t          j        g d          }g d}t          |d |D             z             }t          t          j        |                                          |          sJ t          t          j        |d                                          |          sJ t          t          j        |d                                          |          sJ t          t          j        |d                                           |          sJ t          j        g d          }g d}t          |d |D             z             }t          t          j        |                                          |          sJ t          t          j        |d                                          |          sJ t          t          j        |d                                          |          sJ t          t          j        |d                                           |          sJ d S )Nr   r   c                     g | ]}||fS rA   rA   rC   s     r   rF   z=TestDAG.test_reflexive_transitive_closure.<locals>.<listcomp>p  r   r   FTr   r   c                     g | ]}||fS rA   rA   rC   s     r   rF   z=TestDAG.test_reflexive_transitive_closure.<locals>.<listcomp>x  r   r   r   r   c                     g | ]}||fS rA   rA   rC   s     r   rF   z=TestDAG.test_reflexive_transitive_closure.<locals>.<listcomp>  r   r   c                     g | ]}||fS rA   rA   rC   s     r   rF   z=TestDAG.test_reflexive_transitive_closure.<locals>.<listcomp>  r   r   c                     g | ]}||fS rA   rA   rC   s     r   rF   z=TestDAG.test_reflexive_transitive_closure.<locals>.<listcomp>  r   r   c                     g | ]}||fS rA   rA   rC   s     r   rF   z=TestDAG.test_reflexive_transitive_closure.<locals>.<listcomp>  r   r   )	r   r   r   r   r   r)   r:   r   rM   )r   r   r   r   s       r   !test_reflexive_transitive_closurez)TestDAG.test_reflexive_transitive_closurem  s   J///00CCCh!4!4!!4!4!4455203399;;XFFFFF20E::@@BBHMMMMM20D99??AA4HHHHH20D99??AA8LLLLLJ///00;;;h!4!4!!4!4!4455203399;;XFFFFF20E::@@BBHMMMMM20D99??AA4HHHHH20D99??AA8LLLLLJ///00JJJKKh!4!4!!4!4!44556""7":":"@"@"B"BCCTJJJJJ6""75"A"A"G"G"I"IJJDQQQQQ6""74"@"@"F"F"H"HII8TTTTT6""74"@"@"F"F"H"HII4PPPPPH---..CCCh!4!4!!4!4!4455203399;;XFFFFF20E::@@BBHMMMMM20D99??AA4HHHHH20D99??AA8LLLLLM22233CCCh!4!4!!4!4!4455203399;;XFFFFF20E::@@BBHMMMMM20D99??AA4HHHHH20D99??AA8LLLLLO44455CCCh!4!4!!4!4!4455203399;;XFFFFF20E::@@BBHMMMMM20D99??AA4HHHHH20D99??AA8LLLLLLLr   c                    t          j        g d          }t           j        j        j        }g d}t           ||                                          |          sJ t          j        g d          }g d}t           ||                                          |          sJ t          j        g d          }t          j	        t           j
        ||           t          j        ddddifddd	d
ifdg          } ||          }|                                D ]5\  }}|                    ||          |                    ||          k    sJ 6d}t          j        d t          |          D                       } ||          }|                                D ]5\  }}|                    ||          |                    ||          k    sJ 6d S )Nr   r   r   r   r   r   r   r    r   r   r-   r   c              3   ,   K   | ]}||d z   d|dfV  dS )r   bar)foor   NrA   r   s     r   r   z6TestDAG.test_transitive_closure_dag.<locals>.<genexpr>  s5      QQ11q5%1"="=>QQQQQQr   )r   r   r   r   transitive_closure_dagr   r)   r:   r;   r<   r=   r   rG   )r   r   r   r   r   r   r   r   s           r   test_transitive_closure_dagz#TestDAG.test_transitive_closure_dag  s   J///00].ECCC--a006688(CCCCCJ///00;;;--a006688(CCCCCH---..b/1CQGGG JAQx(1a#q*:FCDDq!!GGII 	B 	BDAq??1a((AOOAq,A,AAAAAAJQQaQQQQQq!!GGII 	B 	BDAq??1a((AOOAq,A,AAAAAA	B 	Br   c                    t          j        g d          }t           j        j        j        }g d}t           ||                                          |          sJ t          j        g d          }t           j        j        j        }g d}t           ||                                          |          sJ t          j        g d          }t          j	        t           j
        ||           d S )Nr   r   r   r   )r   r   r   r   transitive_reductionr   r)   r:   r;   r<   r=   )r   r   r   r   s       r   test_transitive_reductionz!TestDAG.test_transitive_reduction  s    JGGGHH!}0E+++//2288::HEEEEEJ???@@!}0E+++//2288::HEEEEEH---..b/1EqIIIIIr   c                 z    d |D             }d |D             }t          |          t          |          k    sJ d S )Nc                 ,    g | ]}t          |          S rA   	frozensetrD   r   s     r   rF   z-TestDAG._check_antichains.<locals>.<listcomp>  s    ...y||...r   c                 ,    g | ]}t          |          S rA   r  r  s     r   rF   z-TestDAG._check_antichains.<locals>.<listcomp>  s    ,,,y||,,,r   )r   )r   r   resultsolress        r   _check_antichainszTestDAG._check_antichains  sK    ..X...,,V,,,3xx3s88######r   c                 \   t           j        j        j        t          j        g d          }g dgdgdgdgg}|                     t           |                    |           t          j        g d          }g dgdgddgdgddgddgg d	d
gd
dgdgddgdgdgg}|                     t           |                    |           t          j        g d          }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g dg dddgdgg}|                     t           |                    |           t          j        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          j                    }|                     t           |                    g g           t          j                    }|                    g d           g dgdgddgdgddgddgg dg}|                     t           |                    |           fd}t          j        g d          }t          j
        t           j        ||           t          j        g d          }t          j
        t           j        ||           d S )Nr   r"   r    r   r   ra   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                 4    t           |                     S r   )r   )r   
antichainss    r   r   z"TestDAG.test_antichains.<locals>.f  s    

1&&&r   r   )r   r   r   r  r   r  r   add_nodes_fromr:   r;   r<   r=   rr   )r   r   r   r   r  s       @r   test_antichainszTestDAG.test_antichains  s-   ]&1
J///00aS1#s+tJJqMM22H===JGGGHHCCFCFFIICFCFCC
  	tJJqMM22H===J???@@CCCFFCCFFFIIIIFC
" 	tJJqMM22H===JAq6qcqcqc::;;aS1#sQFQFQC@tJJqMM22H===JLLtJJqMM22RD999JLL	###aS1a&1#1v1vyyyItJJqMM22H===	' 	' 	' 	' 	' H---..b/A666J///00b+Q22222r   c                 4   t          j        g d          }t          t          j        |                    g dk    sJ t          t          j        |d                     g dk    sJ t          t          j        |d                     g dk    sJ d S )N)r   r   r   r0   r   )r   r   r    r"   r$   r&   c                     | S r   rA   r   s    r   <lambda>z?TestDAG.test_lexicographical_topological_sort.<locals>.<lambda>  s     r   keyc                     |  S r   rA   r  s    r   r  z?TestDAG.test_lexicographical_topological_sort.<locals>.<lambda>  s    ! r   )r   r$   r"   r   r&   r    )r   r   r   rp   r   s     r   %test_lexicographical_topological_sortz-TestDAG.test_lexicographical_topological_sort  s    J???@@B7::;;?Q?Q?QQQQQB7{{KKKLL Q
 Q
 Q
 
 
 
 
 B7||LLLMM R
 R
 R
 
 
 
 
 
 
r   c                 &    G d d          d }fdt          d          D             t          j                    }g d}|                    fd|D                        t	          t          j        ||                    }|k    sJ 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                       e Zd Zd Zd ZdS )ATestDAG.test_lexicographical_topological_sort2.<locals>.Test_Nodec                 "    || _         d| _        d S )Nr   )labelpriority)r   rE   s     r   __init__zJTestDAG.test_lexicographical_topological_sort2.<locals>.Test_Node.__init__  s    
 !r   c                     d| j          dS )NzNode())r  r   s    r   __repr__zJTestDAG.test_lexicographical_topological_sort2.<locals>.Test_Node.__repr__"  s    ,tz,,,,r   N)rZ   r[   r\   r   r$  rA   r   r   	Test_Noder    s2        " " "- - - - -r   r%  c                     | j         S r   )r  )nodes    r   sorting_keyzCTestDAG.test_lexicographical_topological_sort2.<locals>.sorting_key%  s
    = r   c                 &    g | ]} |          S rA   rA   )rD   rE   r%  s     r   rF   zBTestDAG.test_lexicographical_topological_sort2.<locals>.<listcomp>(  s!    555qiill555r   r"   )r   r   r   r   )r   r    r   c              3   >   K   | ]\  }}|         |         fV  d S r   rA   )rD   r   r   
test_nodess      r   r   zATestDAG.test_lexicographical_topological_sort2.<locals>.<genexpr>+  s4      JJDAq*Q-A7JJJJJJr   r  N)rG   r   r   r   r   rp   )r   r(  r   r)   sortingr%  r-  s        @@r   &test_lexicographical_topological_sort2z.TestDAG.test_lexicographical_topological_sort2  s    	- 	- 	- 	- 	- 	- 	- 	-	! 	! 	! 6555E!HH555
JLL000	JJJJEJJJJJJr:1+NNNOO*$$$$$$r   N)rZ   r[   r\   classmethodrm   rv   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r/  rA   r   r   rj   rj      s         [K K K*J J J0 0 0,P P P$J J J6 6 6
C C C>G G G
 
 
D D D&
 
 

 
 
M M M9 9 9; ; ;&> &> &>P/M /M /MbB B B.
J 
J 
J$ $ $
:3 :3 :3x
 
 
(% % % % %r   rj   c            
      ~   t          j        ddgddgdgg ddgg g d                                          } d t          j        |           D             }g d	ddgdgd
gg}||k    sJ t          j        | j                  }|                    dd
           d t          j        |          D             }||k    sJ d S )Nr   r    r"   r$   r'   r&   )r   r   r    r"   r$   r&   r'   c                 ,    g | ]}t          |          S rA   r   rD   gens     r   rF   z0test_topological_generations.<locals>.<listcomp>6  s    HHH36#;;HHHr   )r"   r&   r'   r   c                 ,    g | ]}t          |          S rA   r3  r4  s     r   rF   z0test_topological_generations.<locals>.<listcomp><  s    III36#;;IIIr   )r   r   reversetopological_generationsrM   r)   rH   )r   generationsexpectedMGs       r   test_topological_generationsr<  1  s    

F1v1#"!QB2FF	 	gii  IH"*DQ*G*GHHHK		Aq6A3,H(""""		!	!BKK1II"*DR*H*HIIIK(""""""r   c                  z    t          j                    } t          t          j        |                     g k    sJ d S r   )r   r   r   r8  r   s    r   "test_topological_generations_emptyr>  @  s7    

A*1--.."444444r   c                      t          j        ddgddgddgg          } t          j        t           j                  5  t          t          j        |                      d d d            d S # 1 swxY w Y   d S )Nr   r   r    )r   r   r;   r<   rr   r   r8  r   s    r   "test_topological_generations_cycler@  E  s    

QFQFQF+,,A	r,	-	- , ,R'**+++, , , , , , , , , , , , , , , , , ,s   "A++A/2A/c                      t          j                    } t          j        | g d           t          j        |           rJ d S )Nr   r   r    r"   r   r   	add_cycleis_aperiodicr   s    r   test_is_aperiodic_cyclerF  K  s?    

ALLLL!!!q!!!!!!!r   c                      t          j                    } t          j        | g d           t          j        | g d           t          j        |           sJ d S )NrB  )r    r"   r$   r&   r'   rC  r   s    r   test_is_aperiodic_cycle2rH  Q  sU    

ALLLL!!!LOOO$$$?1r   c                      t          j                    } t          j        | g d           t          j        | g d           t          j        |           rJ d S )NrB  )r    r"   r$   r&   rC  r   s    r   test_is_aperiodic_cycle3rJ  X  sU    

ALLLL!!!LLLL!!!q!!!!!!!r   c                      t          j                    } t          j        | g d           |                     dd           t          j        |           sJ d S )NrB  r   r    r   r   rD  rH   rE  r   s    r   test_is_aperiodic_cycle4rM  _  S    

ALLLL!!!JJq!?1r   c                      t          j                    } t          j        | g d           |                     dd           t          j        |           sJ d S )NrB  r   rL  r   s    r   test_is_aperiodic_selflooprP  f  rN  r   c                      t          j                    } t          j        t           j        t           j        |            d S r   )r   r   r;   r<   NetworkXPointlessConceptrE  r   s    r   #test_is_aperiodic_null_graph_raisesrS  m  s,    

A
M"-rBBBBBr   c                      t          j        g d          } t          j        t           j        t           j        |            d S )Nr   )r   r:   r;   r<   r   rE  r   s    r   #test_is_aperiodic_undirected_raisesrU  r  s7    
)))**A
M""BOQ77777r   c                      t          j                    } t          j        | g d           |                     dd           t	          j        t           j        t           j        |            d S )Nr  r    )r   r   rD  rH   r;   r<   r   rE  r   s    r   %test_is_aperiodic_disconnected_raisesrW  w  sV    

ALIIIJJq!
M""BOQ77777r   c                      t          j        ddg          } t          j        t           j        t           j        |            d S r   )r   r   r;   r<   r   rE  r   s    r   )test_is_aperiodic_weakly_connected_raisesrY  ~  s5    

FF#$$A
M""BOQ77777r   c                      t          j        t           j                  } t          j        t           j        d          5  t          j        |            d d d            d S # 1 swxY w Y   d S )Ncreate_usingzGraph has no nodes.match)r   empty_graphr   r;   r<   rR  rE  r   s    r   test_is_aperiodic_empty_graphr`    s    
BJ///A	r2:O	P	P	P  
                 s    A""A&)A&c                  |    t          j        t          j                              } t          j        |           rJ d S r   )r   r   davis_southern_women_graphrE  r   s    r   test_is_aperiodic_bipartiterc    s6    

202233Aq!!!!!!!r   c                      t          j                    } |                     d           t          j        |           rJ |                     dd           t          j        |           sJ d S )Nr   )r   r   rc   rE  rH   r   s    r   test_is_aperiodic_single_nodere    sb    

AJJqMMMq!!!!!JJq!?1r   c                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )TestDagToBranchingz>Unit tests for the :func:`networkx.dag_to_branching` function.c                     t          j        g d          }t          j        |          }t          j        g d          }t          j        |          sJ t          j        ||          sJ dS )znTests that a directed acyclic graph with a single degree
        zero node produces an arborescence.

        )r*  r+  r/   r   )r*  r/   r+  r!   N)r   r   dag_to_branchingis_arborescenceis_isomorphicr   r   Br:  s       r   test_single_rootz#TestDagToBranching.test_single_root  sv    
 J77788"":>>>??!!$$$$$8,,,,,,,r   c                    t          j        g d          }t          j        |          }t          j        g d          }t          j        |          sJ t          j        |          rJ t          j        ||          sJ 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!   r%   )r&   r'   N)r   r   ri  is_branchingrj  rk  rl  s       r   test_multiple_rootsz&TestDagToBranching.test_multiple_roots  s     J???@@"":NNNOOq!!!!!%a(((((8,,,,,,,r   c                     t          j        ddt          j                              }t          j        |          }t          j        ||          sJ 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   ri  rk  )r   Arm  s      r   test_already_arborescencez,TestDagToBranching.test_already_arborescence  sP    
 Q
===""1%%%%%%%r   c                 &   t          j        ddt          j                              }t          j        ddt          j                              }t          j        ||          }t          j        |          }t          j        ||          sJ dS )z}Tests that a directed acyclic graph that is already a
        branching produces an isomorphic branching as output.

        r   r[  N)r   rs  r   disjoint_unionri  rk  )r   T1T2r   rm  s        r   test_already_branchingz)TestDagToBranching.test_already_branching  s    
 a>>>a>>>b"%%""1%%%%%%%r   c                     t          j        t          j                  5  t          j        t          dd                    }t          j        |           ddd           dS # 1 swxY w Y   dS )z3Tests that a non-acyclic graph causes an exception.abcT)cyclicN)r;   r<   r   	HasACycler   r   ri  r   s     r   test_not_acyclicz#TestDagToBranching.test_not_acyclic  s    ]2<(( 	# 	#
8E$77788A"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   8A$$A(+A(c                     t          j        t          j                  5  t          j        t          j                               d d d            d S # 1 swxY w Y   d S r   )r;   r<   r   r=   ri  r:   r#  s    r   test_undirectedz"TestDagToBranching.test_undirected  s    ]2455 	, 	,

+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,   &AAAc                     t          j        t          j                  5  t          j        t          j                               d d d            d S # 1 swxY w Y   d S r   )r;   r<   r   r=   ri  r   r#  s    r   test_multigraphz"TestDagToBranching.test_multigraph  s    ]2455 	1 	1000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1r  c                     t          j        t          j                  5  t          j        t          j                               d d d            d S # 1 swxY w Y   d S r   )r;   r<   r   r=   ri  rM   r#  s    r   test_multidigraphz$TestDagToBranching.test_multidigraph  s    ]2455 	3 	3 1 1222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3r  N)rZ   r[   r\   r]   rn  rq  ru  rz  r  r  r  r  rA   r   r   rg  rg    s        HH	- 	- 	-- - -P& & &	& 	& 	&# # #, , ,1 1 13 3 3 3 3r   rg  c                      t          j        d          } t          j        | d          t          j        | d          cxk    o	h dk     dS c  dS )z^Regression test to ensure ancestors and descendants work as expected on
    undirected graphs.r$   r   >   r   r   r    r"   N)r   
path_graphr   r   r   s    r   %test_ancestors_descendants_undirectedr    s]     	aALA".A..>>>>,,,>>>>>>>>>r   c                      t          j                    } t          j        t           j        d          5  t          j        |            d d d            d S # 1 swxY w Y   d S Nzfor undirected typer]  )r   r:   r;   r<   r=   compute_v_structuresr   s    r   test_compute_v_structures_raiser    s    


A	r08M	N	N	N # #
"""# # # # # # # # # # # # # # # # # #s   AAAc                  J   g d} t          j        |           }t          t          j        |                    }t	          |          dk    sJ d|v sJ g d} t          j        |           }t          t          j        |                    }t	          |          dk    sJ d S )Nr*  r+  r   r   r   r   r    )rt  rm  Crm  )rm  Dr  Er   r  r   )r   r   r   r  len)r)   r   	v_structss      r   test_compute_v_structuresr    s    $$$E

5AB+A..//Iy>>Q	!!!!HHHE

5AB+A..//Iy>>Qr   c                      t          j                    } t          j                    5  t          j        |            d d d            d S # 1 swxY w Y   d S r   )r   r   r;   deprecated_callr  r   s    r   $test_compute_v_structures_deprecatedr    s    

A			!	! # #
"""# # # # # # # # # # # # # # # # # #s   A		AAc                      t          j                    } t          j        t           j        d          5  t           j                            |            d d d            d S # 1 swxY w Y   d S r  )r   r:   r;   r<   r=   r   v_structuresr   s    r   test_v_structures_raiser    s    


A	r08M	N	N	N  
A                     A!!A%(A%)edgelistr:  r  r  )r  r  )r  r   r  r  )rt  rm  r  )r*  r   r+  c                     t          j        |           }t          t           j                            |                    }||k    sJ d S r   )r   r   r   r   r  )r  r:  r   r  s       r   test_v_structuresr    sG     	
8ABF''**++I      r   c                      t          j                    } t          j        t           j        d          5  t           j                            |            d d d            d S # 1 swxY w Y   d S r  )r   r:   r;   r<   r=   r   	collidersr   s    r   test_colliders_raiser  /  s    


A	r08M	N	N	N  
                 r  )r  r  r   c                     t          j        |           }t          t           j                            |                    }||k    sJ d S r   )r   r   r   r   r  )r  r:  r   r  s       r   test_collidersr  5  sG     	
8ABF$$Q''((I      r   )*collectionsr   	itertoolsr   r   r;   networkxr   networkx.utilsr   r   r   r   r_   rj   r<  r>  r@  rF  rH  rJ  rM  rP  rS  rU  rW  rY  r`  rc  re  rg  r  r  r  r  r  markparametrizer   r  r  r  rA   r   r   <module>r     sW         0 0 0 0 0 0 0 0      0 0 0 0 0 0 0 0  EE EE EE EE EE EE EE EEP-2 -2 -2 -2 -2 -2 -2 -2`e% e% e% e% e% e% e% e%P# # #5 5 5
, , ," " "  " " "    C C C
8 8 8
8 8 88 8 8
  " " "  Z3 Z3 Z3 Z3 Z3 Z3 Z3 Z3z? ? ?# # #  # # #    %$$K	

 IHH	
 
"	!	!3355)
 ! ! !    %$$K	

 IHHo.	
	 ! ! ! ! !r   