
    hr                        S SK Jr  S SKJrJr  S SKrS SKrS SKJ	r	J
r
  S r " S S5      r " S S	5      r " S
 S5      rS rS rS rS rS rS rS rS rS rS rS rS rS rS r " S S5      rS rS rS r S r!S  r"\RF                  RI                  S!/ S"QS#14/ S$QS%14/ S&Q\%" 5       445      S' 5       r&S( r'\RF                  RI                  S!/ S"QS#14/ S$QS%S)1445      S* 5       r(g)+    deque)combinationspermutationsN)edges_equalpairwisec                     [        U SS9  g)zConsume the iterator entirely.r   )maxlenNr   )iterators    T/var/www/html/env/lib/python3.13/site-packages/networkx/algorithms/tests/test_dag.py_consumer      s     
(1    c                   N    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rSrg)TestDagLongestPath   zBUnit tests computing the longest path in a directed acyclic graph.c                 f    [         R                  " 5       n[         R                  " U5      / :X  d   eg NnxDiGraphdag_longest_pathselfGs     r   
test_emptyTestDagLongestPath.test_empty   s&    JJL""1%+++r   c                 t    / SQn[         R                  " U5      n[         R                  " U5      / SQ:X  d   eg )N)      r       r       r"      r&      )r"      )r   r    r"   r&   r(   r   r   edgesr   s      r   test_unweighted1#TestDagLongestPath.test_unweighted1   s.    @JJu""1%888r   c                 t    / SQn[         R                  " U5      n[         R                  " U5      / SQ:X  d   eg )Nr   r!   r"   r$   r$   r&   r   r"   r   r&   r%   r   r    r"   r$   r&   r   r*   s      r   test_unweighted2#TestDagLongestPath.test_unweighted2   s.    HJJu""1%888r   c                     [         R                  " 5       n/ SQnUR                  U5        [         R                  " U5      / SQ:X  d   eg )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_weighted TestDagLongestPath.test_weighted"   s9    JJLS	!!%(""1%222r   c                     [         R                  " 5       n[        R                  " [         R                  [         R
                  U5        g r   )r   GraphpytestraisesNetworkXNotImplementedr   r   s     r   test_undirected_not_implemented2TestDagLongestPath.test_undirected_not_implemented(   s)    HHJb//1D1DaHr   c                 j   [        S5       Vs/ s H  n[        5       PM     nn[        R                  " 5       nUR	                  US   US   5        UR	                  US   US   5        UR	                  US   US   5        UR	                  US   US   5        [        R
                  " U5        gs  snf )zyTests that computing the longest path does not depend on
nodes being orderable.

For more information, see issue #1989.

r$   r   r   r    r"   N)rangeobjectr   r   add_edger   )r   nnodesr   s       r   test_unorderable_nodes)TestDagLongestPath.test_unorderable_nodes,   s     $)8,8a8,JJL	

58U1X&	

58U1X&	

58U1X&	

58U1X& 	A -s   B0c                 t    / SQn[         R                  " U5      n[         R                  " U5      / SQ:X  d   eg )Nr   r!   r!   r0   r1   r2   r3   r%   r4   )r   MultiDiGraphr   r*   s      r   test_multigraph_unweighted-TestDagLongestPath.test_multigraph_unweighted?   s.    POOE"""1%888r   c                     [         R                  " 5       n/ SQnUR                  U5        [         R                  " U5      SS/:X  d   eg )N)r   r    r    )r    r"   r    r   r"   r   r   r"   r&   r   r"   r    r   r"   r   rO   r:   r   r;   s      r   test_multigraph_weighted+TestDagLongestPath.test_multigraph_weightedD   sB    OO
 	
!!%(""1%!Q///r   c                     [         R                  " SS/5      nUR                  / SQ5        [         R                  " U5      SS/:X  d   e[         R                  " USS9/ SQ:X  d   eg )Nr   r!   )rT   rU   rV   r   r"   )default_weightr   r    r"   rW   r   s     r   'test_multigraph_weighted_default_weight:TestDagLongestPath.test_multigraph_weighted_default_weightP   s^    OOVV,-	!!"CD ""1%!Q///""1Q79DDDr    N)__name__
__module____qualname____firstlineno____doc__r   r,   r5   r<   rC   rK   rP   rX   r]   __static_attributes__r_   r   r   r   r      s4    L,9
9
3I&9

0Er   r   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
TestDagLongestPathLengthY   zTUnit tests for computing the length of a longest path in a
directed acyclic graph.

c                 `   / SQn[         R                  " U5      n[         R                  " U5      S:X  d   e/ SQn[         R                  " U5      n[         R                  " U5      S:X  d   e[         R                  " 5       nUR                  S5        [         R                  " U5      S:X  d   eg )Nr   r!   r#   r%   r'   )r&   r)   r$   r/   r   r   )r   r   dag_longest_path_lengthadd_noder*   s      r   test_unweighted(TestDagLongestPathLength.test_unweighted_   s    @JJu))!,111HJJu))!,111 JJL	

1))!,111r   c                     [         R                  " 5       n[        R                  " [         R                  [         R
                  U5        g r   )r   r?   r@   rA   rB   rk   r   s     r   rC   8TestDagLongestPathLength.test_undirected_not_implementedm   s)    HHJb//1K1KQOr   c                     / SQn[         R                  " 5       nUR                  U5        [         R                  " U5      S:X  d   eg )Nr8   r&   )r   r   r:   rk   r*   s      r   r<   &TestDagLongestPathLength.test_weightedq   s9    SJJL	!!%())!,111r   c                 p    / SQn[         R                  " U5      n[         R                  " U5      S:X  d   eg )NrN   r$   )r   rO   rk   r*   s      r   rP   3TestDagLongestPathLength.test_multigraph_unweightedw   s.    POOE"))!,111r   c                     [         R                  " 5       n/ SQnUR                  U5        [         R                  " U5      S:X  d   eg )NrS   r&   )r   rO   r:   rk   r;   s      r   rX   1TestDagLongestPathLength.test_multigraph_weighted|   s>    OO
 	
!!%())!,111r   r_   N)r`   ra   rb   rc   rd   rm   rC   r<   rP   rX   re   r_   r   r   rg   rg   Y   s!    
2P22

2r   rg   c                       \ rS rSr\S 5       rS rS rS rS r	S r
S rS	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)TestDAG   c                     g r   r_   )clss    r   setup_classTestDAG.setup_class   s    r   c                    [         R                  " / SQ5      n[         R                  [         R                  4 H  n[	        U" U5      5      S:X  a  M   e   UR                  SS5        [         R                  [         R                  4 H3  n[        R                  " [         R                  [        U" U5      5        M5     UR                  SS5        [         R                  [         R                  4 H  n[	        U" U5      5      S:X  a  M   e   UR                  SS5        [	        [         R                  " U5      5      S;   d   e[	        [         R                  " U5      5      S:X  d   eg )N)r   r2   r!   r\   r"   r    rV   >   r\   rV   )r   r   topological_sort lexicographical_topological_sorttuplerH   r@   rA   NetworkXUnfeasibler   remove_edge)r   DG	algorithms      r   test_topological_sort1TestDAG.test_topological_sort1   s   ZZ01--r/R/RSI2'9444 T 	Aq--r/R/RSIMM"//9R=I T 	q!--r/R/RSI2'9444 T 	q!R((,-1GGGGR88<=JJJr   c                    [         R                  R                  S5      n[         R                  " U5      (       a   e[         R                  " UR	                  5       5      (       a   e[         R                  " [         R
                  " SS/5      5      (       a   e[         R                  " [         R                  " SS/5      5      (       d   eg )Nr    r0   r1   )r   
generatorscomplete_graphis_directed_acyclic_graphto_directedr?   r   r   s     r   test_is_directed_acyclic_graph&TestDAG.test_is_directed_acyclic_graph   s    MM((+//2222//@@@@//&&9I0JKKKK++BJJ7G,HIIIIr   c                    [         R                  " S/S/S/S/S/S/S/S/S	/S
.	5      n[        R                  " [         R                  [
        [         R                  " U5      5        [         R                  " U5      (       a   eUR                  SS5        [        [         R                  " U5      5        [         R                  " U5      (       d   eg )Nr    r"   r$   r&   r               )	r   r    r"   r$   r&      r   r   r   )	r   r   r@   rA   r   r   r   r   r   r   r   s     r   test_topological_sort2TestDAG.test_topological_sort2   s    ZZ33333DDDD

 	b++Xr7J7J27NO//3333
q!$$R()++B////r   c                   ^ [         R                  " 5       mTR                  [        SS5       Vs/ s H  nSU4PM	     sn5        TR                  [        SS5       Vs/ s H  nSU4PM	     sn5        TR                  [        SS5       Vs/ s H  nSU4PM	     sn5        TR                  [        SS5       Vs/ s H  nSU4PM	     sn5        U4S	 jnU" [	        [         R
                  " T5      5      5        TR                  S
S5        [        R                  " [         R                  [        [         R
                  " T5      5        g s  snf s  snf s  snf s  snf )Nr    r&   r   	   r   r(   r   r$   c                    > [        U [        5      (       d   e[        U 5      [        T5      :X  d   e[        U S5       H#  u  p[        R
                  " TX!5      (       d  M#   e   g )Nr    )
isinstancelistsetr   r   has_path)orderuvr   s      r   validate0TestDAG.test_topological_sort3.<locals>.validate   sV    eT****u:R((($UA.;;r10000 /r   r   )r   r   add_edges_fromrF   r   r   rH   r@   rA   r   r   )r   ir   r   s      @r   test_topological_sort3TestDAG.test_topological_sort3   s   ZZ\
5A;7;aAq6;78
5A;7;aAq6;78
5B<8<aAq6<89
5R=9=aAq6=9:	1 	b))"-./
Bb++Xr7J7J27NO 8789s   EEE:Ec                     [         R                  " 5       nUR                  SS5        [        R                  " [         R
                  [        [         R                  " U5      5        g )Nr   r    )r   r?   rH   r@   rA   NetworkXErrorr   r   r   s     r   test_topological_sort4TestDAG.test_topological_sort4   s<    HHJ	

1ab&&"2E2Ea2HIr   c                     [         R                  " 5       nUR                  SS5        [        [         R                  " U5      5      SS/:X  d   eg )Nr   r   )r   r   rH   r   r   r   s     r   test_topological_sort5TestDAG.test_topological_sort5   s=    JJL	

1aB''*+1v555r   c                 .  ^ [         R                  [         R                  4 Hp  mU4S jnU4S jnU4S jn[        R                  " [
        U5        [        R                  " [
        U5        [        R                  " [         R                  U5        Mr     g )Nc                     > [         R                  " / SQ5      n SnT" U 5       H#  nU(       d  M  SnU R                  SU-
  S5        M%     g )Nr   r!   r0   TFr&   )r   r   rH   r   firstxr   s      r   runtime_error5TestDAG.test_topological_sort6.<locals>.runtime_error   sA    ZZ 89"2Au %AE1- 'r   c                     > [         R                  " / SQ5      n SnT" U 5       H  nU(       d  M  SnU R                  S5        M!     g )Nr   TFr$   r   r   remove_noder   s      r   unfeasible_error8TestDAG.test_topological_sort6.<locals>.unfeasible_error   ;    ZZ 89"2Au %q) 'r   c                     > [         R                  " / SQ5      n SnT" U 5       H  nU(       d  M  SnU R                  S5        M!     g )Nr   TFr    r   r   s      r   runtime_error26TestDAG.test_topological_sort6.<locals>.runtime_error2   r   r   )r   r   r   r@   rA   RuntimeErrorr   )r   r   r   r   r   s       @r   test_topological_sort6TestDAG.test_topological_sort6   sa    --r/R/RSI.** MM,6MM,7MM"//1AB9 Tr   c                     [         R                  " / SQ5      n[        [         R                  " U5      5      / SQ/:X  d   eg )N)r   r!   r0   r1   r4   r   r   r   all_topological_sortsr   s     r   test_all_topological_sorts_1$TestDAG.test_all_topological_sorts_1   s2    ZZ89B,,R01o5FFFFr   c                     [         R                  " / SQ5      n[        [         R                  " U5      5      / SQ/ SQ/ SQ/ SQ/ SQ/:X  d   eg )N)r2   r    r   r#   r$   r"   r1   )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_2$TestDAG.test_all_topological_sorts_2   sG    ZZ@Ab..r238
 
 	
 
r   c                     S nS nS n[         R                  " [        R                  U5        [         R                  " [        R                  U5        [         R                  " [        R                  U5        g )Nc                  r    [         R                  " / SQ5      n [        [         R                  " U 5      5        g )N)r   r!   r0   r$   r    r1   r   )r   s    r   
unfeasible8TestDAG.test_all_topological_sorts_3.<locals>.unfeasible  s$    DEB))"-.r   c                  r    [         R                  " SS/5      n [        [         R                  " U 5      5        g )Nr   r!   )r   r?   r   r   r   s    r   not_implemented=TestDAG.test_all_topological_sorts_3.<locals>.not_implemented  s(    &&)*A))!,-r   c                  r    [         R                  " / SQ5      n [        [         R                  " U 5      5        g )N)r   r   r!   )r   
MultiGraphr   r   r   s    r   not_implemented_2?TestDAG.test_all_topological_sorts_3.<locals>.not_implemented_2  s$    67A))!,-r   )r@   rA   r   r   rB   )r   r   r   r   s       r   test_all_topological_sorts_3$TestDAG.test_all_topological_sorts_3
  sP    	/
	.
	. 	b++Z8b//Ab//1BCr   c                    [         R                  " 5       n[        S5       H  nUR                  U5        M     [	        [        [        [        UR                  5      5      5      [	        [         R                  " U5      5      :X  d   eg )Nr)   )
r   r   rF   rl   r   mapr   r   rJ   r   )r   r   r   s      r   test_all_topological_sorts_4$TestDAG.test_all_topological_sorts_4  sb    ZZ\qAKKN c$RXX 678F$$R(=
 
 	
 
r   c                     [         R                  " / SQ5      n[        [         R                  " U5      5      [        / SQ/ SQ/5      :X  d   eg )N)r   r   r!   r0   r%   r%   r%   r4   )r   r    r"   r&   r$   )r   rO   r   r   r   s     r   'test_all_topological_sorts_multigraph_1/TestDAG.test_all_topological_sorts_multigraph_1%  sB    __UVb..r23vo.8
 
 	
 
r   c                    Sn/ n[        SU5       H  nUR                  X3S-   4/U-  5        M     [        R                  " U5      n[	        [        R
                  " U5      5      [	        [        SUS-   5      5      /:X  d   eg )Nr   r   )rF   extendr   rO   r   r   )r   Nr+   r   r   s        r   'test_all_topological_sorts_multigraph_2/TestDAG.test_all_topological_sorts_multigraph_2+  ss    q!ALL1!e*)* __U#B,,R01d5AE?6K5LLLLr   c                 Z   [         R                  " 5       n[         R                  R                  R                  nUR                  / SQ5        U" US5      1 Sk:X  d   eU" US5      SS1:X  d   eU" US5      [        5       :X  d   e[        R                  " [         R                  X!S5        g )Nr   r2   r   r   r1   r    r(   r'   r(   >   r   r    r$   r&   r"   r   r$      )
r   r   
algorithmsdag	ancestorsr   r   r@   rA   r   )r   r   r   s      r   test_ancestorsTestDAG.test_ancestors3  s    JJLMM%%//		QRA,...A1a&(((A#%'''b&&	a8r   c                 Z   [         R                  " 5       n[         R                  R                  R                  nUR                  / SQ5        U" US5      1 Sk:X  d   eU" US5      1 Sk:X  d   eU" US5      [        5       :X  d   e[        R                  " [         R                  X!S5        g )Nr   r   >   r    r"   r(   r$   >   r    r"   r&   r(   r"   r   )
r   r   r   r   descendantsr   r   r@   rA   r   )r   r   r   s      r   test_descendantsTestDAG.test_descendants<  s    JJLmm''33	QR1a I---1a L0001a CE)))b&&:r   c                    [         R                  " / SQ5      n/ SQn[        [         R                  " U5      R	                  5       U5      (       d   e[         R                  " / SQ5      n/ SQn[        [         R                  " U5      R	                  5       U5      (       d   e[         R                  " / SQ5      n/ SQn[        X! Vs/ s H  o3U4PM     sn-   5      n[        [        [         R                  " U5      R	                  5       5      U5      (       d   e[         R                  " / SQ5      n/ SQn[        [        [         R                  " U5      R	                  5       5      U5      (       d   e[         R                  " / SQ5      n/ SQn[        [        [         R                  " U5      R	                  5       5      U5      (       d   e[         R                  " / SQ5      n/ SQn[        [        [         R                  " U5      R	                  5       5      U5      (       d   e[         R                  " SSS	S
04SS
SS04S/5      n[         R                  " U5      nUR	                  5        H+  u  pgUR                  Xg5      UR                  Xg5      :X  a  M+   e   Sn[         R                  " S [        U5       5       5      n[         R                  " U5      nUR	                  5        H+  u  pgUR                  Xg5      UR                  Xg5      :X  a  M+   e   [         R                  " 5       n[        R                  " [         R                  5         [         R                  " USS9  S S S 5        g s  snf ! , (       d  f       g = f)Nr   r   r2   r   r$   r!   r#   r0   r   r!   r#   r   r2   r   r!   r#   r   r!   r"   r   r   r   r!   r"   r    r2   r   r   r    ar"   br   r0   
   c              3   6   #    U  H  oUS -   SUS.4v   M     g7f)r   r   )fweightNr_   .0r   s     r   	<genexpr>2TestDAG.test_transitive_closure.<locals>.<genexpr>d  s     MHq1q5q"9:H   zwrong input)	reflexive)r   r   r   transitive_closurer+   r   r?   r   rO   get_edge_datarF   r@   rA   r   )	r   r   solutionrI   solnHr   r   ks	            r   test_transitive_closureTestDAG.test_transitive_closureE  s   JJ/0C200399;XFFFFJJ/0;200399;XFFFFJJ/0Ch!!4!Qa&!!4456""7"7":"@"@"BCTJJJJHH-.C6""7"7":"@"@"BCXNNNNMM23C6""7"7":"@"@"BCXNNNNOO45C6""7"7":"@"@"BCXNNNN JJAQx(1a#q*:FCD!!!$GGIDA??1(AOOA,AAAA  JJME!HMM!!!$GGIDA??1(AOOA,AAAA  HHJ]]2++,!!!}= -,9 "58 -,s   M7
M<<
N
c                 r   [         R                  " / SQ5      n/ SQn[        X! Vs/ s H  o3U4PM     sn-   5      n[        [         R                  " U5      R                  5       U5      (       d   e[        [         R                  " US5      R                  5       U5      (       d   e[        [         R                  " US5      R                  5       U5      (       d   e[        [         R                  " US 5      R                  5       U5      (       d   e[         R                  " / SQ5      n/ SQn[        X! Vs/ s H  o3U4PM     sn-   5      n[        [         R                  " U5      R                  5       U5      (       d   e[        [         R                  " US5      R                  5       U5      (       d   e[        [         R                  " US5      R                  5       U5      (       d   e[        [         R                  " US 5      R                  5       U5      (       d   e[         R                  " / SQ5      n[        / SQ5      n[        X! Vs/ s H  o3U4PM     sn-   5      n[        [        [         R                  " U5      R                  5       5      U5      (       d   e[        [        [         R                  " US5      R                  5       5      U5      (       d   e[        [        [         R                  " US 5      R                  5       5      U5      (       d   e[        [        [         R                  " US5      R                  5       5      U5      (       d   e[         R                  " / SQ5      n/ SQn[        X! Vs/ s H  o3U4PM     sn-   5      n[        [         R                  " U5      R                  5       U5      (       d   e[        [         R                  " US5      R                  5       U5      (       d   e[        [         R                  " US5      R                  5       U5      (       d   e[        [         R                  " US 5      R                  5       U5      (       d   e[         R                  " / SQ5      n/ SQn[        X! Vs/ s H  o3U4PM     sn-   5      n[        [         R                  " U5      R                  5       U5      (       d   e[        [         R                  " US5      R                  5       U5      (       d   e[        [         R                  " US5      R                  5       U5      (       d   e[        [         R                  " US 5      R                  5       U5      (       d   e[         R                  " / SQ5      n/ SQn[        X! Vs/ s H  o3U4PM     sn-   5      n[        [         R                  " U5      R                  5       U5      (       d   e[        [         R                  " US5      R                  5       U5      (       d   e[        [         R                  " US5      R                  5       U5      (       d   e[        [         R                  " US 5      R                  5       U5      (       d   eg s  snf s  snf s  snf s  snf s  snf s  snf )	Nr   r   FTr   r   r   r   )	r   r   r   r   r  r+   r?   r   rO   )r   r   r  rI   r  s        r   !test_reflexive_transitive_closure)TestDAG.test_reflexive_transitive_closurem  s?   JJ/0Ch!!4!Qa&!!445200399;XFFFF200E:@@BHMMMM200D9??A4HHHH200D9??A8LLLLJJ/0;h!!4!Qa&!!445200399;XFFFF200E:@@BHMMMM200D9??A4HHHH200D9??A8LLLLJJ/0JKh!!4!Qa&!!4456""7"7":"@"@"BCTJJJJ6""7"75"A"G"G"IJDQQQQ6""7"74"@"F"F"HI8TTTT6""7"74"@"F"F"HI4PPPPHH-.Ch!!4!Qa&!!445200399;XFFFF200E:@@BHMMMM200D9??A4HHHH200D9??A8LLLLMM23Ch!!4!Qa&!!445200399;XFFFF200E:@@BHMMMM200D9??A4HHHH200D9??A8LLLLOO45Ch!!4!Qa&!!445200399;XFFFF200E:@@BHMMMM200D9??A4HHHH200D9??A8LLLLY "5 "5 "5 "5 "5 "5s#   Z
8Z 
Z%
	Z*
Z/
-Z4
c                    [         R                  " / SQ5      n[         R                  R                  R                  n/ SQn[        U" U5      R                  5       U5      (       d   e[         R                  " / SQ5      n/ SQn[        U" U5      R                  5       U5      (       d   e[         R                  " / SQ5      n[        R                  " [         R                  X!5        [         R                  " SSSS04SSS	S
04S/5      nU" U5      nUR                  5        H+  u  pVUR                  XV5      UR                  XV5      :X  a  M+   e   Sn[         R                  " S [        U5       5       5      nU" U5      nUR                  5        H+  u  pVUR                  XV5      UR                  XV5      :X  a  M+   e   g )Nr   r   r   r   r   r    r   r"   r   r   r0   r  c              3   6   #    U  H  oUS -   SUS.4v   M     g7f)r   bar)foor  Nr_   r  s     r   r  6TestDAG.test_transitive_closure_dag.<locals>.<genexpr>  s     Q11q5%1"=>r	  )r   r   r   r   transitive_closure_dagr   r+   r?   r@   rA   rB   r  rF   )r   r   r  r  r  r   r   r  s           r   test_transitive_closure_dag#TestDAG.test_transitive_closure_dag  sl   JJ/0]]..EEC-a0668(CCCCJJ/0;-a0668(CCCCHH-.b//1CG JJAQx(1a#q*:FCDq!GGIDA??1(AOOA,AAAA  JJQaQQq!GGIDA??1(AOOA,AAAA r   c                    [         R                  " / SQ5      n[         R                  R                  R                  n/ SQn[        U" U5      R                  5       U5      (       d   e[         R                  " / SQ5      n[         R                  R                  R                  n/ SQn[        U" U5      R                  5       U5      (       d   e[         R                  " / SQ5      n[        R                  " [         R                  X!5        g )Nr   r   r   r   )r   r   r   r   transitive_reductionr   r+   r?   r@   rA   rB   )r   r   r  r  s       r   test_transitive_reduction!TestDAG.test_transitive_reduction  s    JJGH!}}00EE+/288:HEEEEJJ?@!}}00EE+/288:HEEEEHH-.b//1EIr   c                     U Vs/ s H  n[        U5      PM     nnU Vs/ s H  n[        U5      PM     nn[        U5      [        U5      :X  d   eg s  snf s  snf r   )	frozensetr   )r   r  resultr   solress         r   _check_antichainsTestDAG._check_antichains  sP    %-.Xy|X.%+,Vy|V,3x3s8### /,s
   AAc                    ^ [         R                  R                  R                  m[         R                  " / SQ5      n/ S/S/S/S//nU R                  [        T" U5      5      U5        [         R                  " / SQ5      n/ S/S/SS/S/SS/SS// S	QS
/S
S/S/SS/S/S//nU R                  [        T" U5      5      U5        [         R                  " / SQ5      n/ S/S
/S/SS/SS
/S/S/SS/SS
/SS// SQ/ SQSS/S//nU R                  [        T" U5      5      U5        [         R                  " SS/S/S/S/S.5      n/ S/S/S/S/SS/SS/S//nU R                  [        T" U5      5      U5        [         R                  " 5       nU R                  [        T" U5      5      / /5        [         R                  " 5       nUR                  / SQ5        / S/S/SS/S/SS/SS// SQ/nU R                  [        T" U5      5      U5        U4S jn[         R                  " / SQ5      n[        R                  " [         R                  X15        [         R                  " / SQ5      n[        R                  " [         R                  X15        g )Nr   r$   r"   r    r   rj   r)   r(   )r(   r)   r$   r&   )r   r2   r0   r%   r'   )r    r$   r(   )r    r$   r&   )r   r   r    r"   r   r   r   r    )r    r   r   c                 &   > [        T" U 5      5      $ r   )r   )r   
antichainss    r   r  "TestDAG.test_antichains.<locals>.f  s    
1&&r   r   )r   r   r   r,  r   r'  r   add_nodes_fromr?   r@   rA   rB   r   )r   r   r  r  r,  s       @r   test_antichainsTestDAG.test_antichains  s   ]]&&11
JJ/0aS1#s+tJqM2H=JJGHCCFCFFCFCFCC
  	tJqM2H=JJ?@CCCFFCCFFFFC
" 	tJqM2H=JJAq6qcqcqc:;aS1#sQFQFQC@tJqM2H=JJLtJqM2RD9JJL	#aS1a&1#1v1vyItJqM2H=	' HH-.b//6JJ/0b++Q2r   c                    [         R                  " / SQ5      n[        [         R                  " U5      5      / SQ:X  d   e[        [         R                  " US S95      / SQ:X  d   e[        [         R                  " US S95      / SQ:X  d   eg )N)r   r!   r   r3   r   )r   r    r"   r$   r&   r(   c                     U $ r   r_   r   s    r   <lambda>?TestDAG.test_lexicographical_topological_sort.<locals>.<lambda>  s    r   keyc                     U * $ r   r_   r3  s    r   r4  r5    s    !r   )r   r&   r$   r    r(   r"   )r   r   r   r   r   s     r   %test_lexicographical_topological_sort-TestDAG.test_lexicographical_topological_sort  s    JJ?@B77:;?QQQQB77{KL Q
 
 	
 
 B77|LM R
 
 	
 
r   c                   ^  " S S5      nS n[        S5       Vs/ s H
  o1" U5      PM     snm[        R                  " 5       n/ SQnUR                  U4S jU 5       5        [	        [        R
                  " XBS95      nUT:X  d   egs  snf )	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                        \ rS rSrS rS rSrg)ATestDAG.test_lexicographical_topological_sort2.<locals>.Test_Nodei  c                     Xl         SU l        g )Nr   labelpriority)r   rI   s     r   __init__JTestDAG.test_lexicographical_topological_sort2.<locals>.Test_Node.__init__  s    
 !r   c                 "    SU R                    S3$ )NzNode())r@  r   s    r   __repr__JTestDAG.test_lexicographical_topological_sort2.<locals>.Test_Node.__repr__"  s    tzzl!,,r   r?  N)r`   ra   rb   rc   rB  rG  re   r_   r   r   	Test_Noder=    s    "-r   rI  c                     U R                   $ r   )rA  )nodes    r   sorting_keyCTestDAG.test_lexicographical_topological_sort2.<locals>.sorting_key%  s    == r   r$   )r   r   r   r    )r   r"   r!   c              3   <   >#    U  H  u  pTU   TU   4v   M     g 7fr   r_   )r  r   r   
test_nodess      r   r  ATestDAG.test_lexicographical_topological_sort2.<locals>.<genexpr>+  s      JEDA*Q-A7Es   r6  N)rF   r   r   r   r   r   )r   rI  rL  rI   r   r+   sortingrQ  s          @r   &test_lexicographical_topological_sort2.TestDAG.test_lexicographical_topological_sort2  s|    	- 	-	! -2!H5HqilH5
JJL0	JEJJr::1NO*$$$ 6s   B
r_   N)r`   ra   rb   rc   classmethodr|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r'  r/  r9  rT  re   r_   r   r   rx   rx      s     K*J0,P$J6
C>G
D&

M9;&>P/MbB.
J$
:3x
(%r   rx   c            
         [         R                  " SS/SS/S// SS// / S.5      R                  5       n [         R                  " U 5       Vs/ s H  n[	        U5      PM     nn/ SQSS/S/S	//nX#:X  d   e[         R
                  " U R                  5      nUR                  SS	5        [         R                  " U5       Vs/ s H  n[	        U5      PM     nnX#:X  d   eg s  snf s  snf )
Nr    r"   r$   r&   r)   r(   )r   r    r"   r$   r&   r(   r)   )r$   r(   r)   r   )r   r   reversetopological_generationsr   rO   r+   rH   )r   gengenerationsexpectedMGs        r   test_topological_generationsr^  1  s    


F1v1#"!QB2F	gi  +-*D*DQ*GH*G36#;*GKHAq6A3,H"""		!BKK1*,*D*DR*HI*H36#;*HKI""" I Js   C C$c                  x    [         R                  " 5       n [        [         R                  " U 5      5      / :X  d   eg r   )r   r   r   rY  r   s    r   "test_topological_generations_emptyr`  @  s+    


A**1-."444r   c                      [         R                  " SS/SS/SS//5      n [        R                  " [         R                  5         [        [         R                  " U 5      5        S S S 5        g ! , (       d  f       g = f)Nr    r   r"   )r   r   r@   rA   r   r   rY  r   s    r   "test_topological_generations_cyclerb  E  sT    


QFQFQF+,A	r,,	-R''*+ 
.	-	-s    A--
A;c                      [         R                  " 5       n [         R                  " U / SQ5        [         R                  " U 5      (       a   eg )Nr   r    r"   r$   r   r   	add_cycleis_aperiodicr   s    r   test_is_aperiodic_cyclerh  K  s3    


ALLL!q!!!!!r   c                      [         R                  " 5       n [         R                  " U / SQ5        [         R                  " U / SQ5        [         R                  " U 5      (       d   eg )Nrd  )r"   r$   r&   r(   r)   re  r   s    r   test_is_aperiodic_cycle2rj  Q  s>    


ALLL!LLO$??1r   c                      [         R                  " 5       n [         R                  " U / SQ5        [         R                  " U / SQ5        [         R                  " U 5      (       a   eg )Nrd  )r"   r$   r&   r(   re  r   s    r   test_is_aperiodic_cycle3rl  X  sA    


ALLL!LLL!q!!!!!r   c                      [         R                  " 5       n [         R                  " U / SQ5        U R                  SS5        [         R                  " U 5      (       d   eg )Nrd  r   r"   r   r   rf  rH   rg  r   s    r   test_is_aperiodic_cycle4ro  _  >    


ALLL!JJq!??1r   c                      [         R                  " 5       n [         R                  " U / SQ5        U R                  SS5        [         R                  " U 5      (       d   eg )Nrd  r   rn  r   s    r   test_is_aperiodic_selflooprr  f  rp  r   c                      [         R                  " 5       n [        R                  " [         R                  [         R
                  U 5        g r   )r   r?   r@   rA   r   rg  r   s    r   #test_is_aperiodic_undirected_raisesrt  m  s'    

A
MM"""BOOQ7r   c                      [         R                  " [         R                  S9n [        R                  " [         R
                  SS9   [         R                  " U 5        S S S 5        g ! , (       d  f       g = f)Ncreate_usingzGraph has no nodes.match)r   empty_graphr   r@   rA   NetworkXPointlessConceptrg  r   s    r   test_is_aperiodic_empty_graphr|  r  sB    
BJJ/A	r22:O	P
 
Q	P	Ps   A&&
A4c                      [         R                  " [         R                  " 5       5      n [         R                  " U 5      (       a   eg r   )r   r   davis_southern_women_graphrg  r   s    r   test_is_aperiodic_bipartiter  x  s1    


20023Aq!!!!!r   c                      [         R                  " SS[         R                  " 5       S9n [         R                  " U 5      (       a   eg )Nr"      rv  )r   full_rary_treer   rg  r   s    r   test_is_aperiodic_rary_treer  ~  s4    
!Rbjjl;Aq!!!!!r   c                  N   [         R                  " 5       n [         R                  " U / SQ5        [         R                  " U / SQ5        [         R                  " U 5      (       a   eU R	                  SS5        U R	                  SS5        [         R                  " U 5      (       d   eg )Nrd  )r&   r(   r)   r   r   r"   r&   r)   )r   r   rf  rg  rH   r   s    r   test_is_aperiodic_disconnectedr    so    


ALLL!LLL!q!!!!JJq!JJq!??1r   c                      [         R                  " 5       n [         R                  " U / SQ5        U R                  SS5        [         R                  " U 5      (       a   eg )Nr*  r"   rn  r   s    r   test_is_aperiodic_disconnected2r    sA    


ALLIJJq!q!!!!!r   c                   H    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rSrg)TestDagToBranchingi  z>Unit tests for the :func:`networkx.dag_to_branching` function.c                    [         R                  " / SQ5      n[         R                  " U5      n[         R                  " / SQ5      n[         R                  " U5      (       d   e[         R                  " X#5      (       d   eg)z^Tests that a directed acyclic graph with a single degree
zero node produces an arborescence.

)rN  rO  r2   r!   )rN  r2   rO  r#   N)r   r   dag_to_branchingis_arborescenceis_isomorphicr   r   Br\  s       r   test_single_root#TestDagToBranching.test_single_root  s`    
 JJ78"::>?!!!$$$$,,,,r   c                 >   [         R                  " / SQ5      n[         R                  " U5      n[         R                  " / SQ5      n[         R                  " U5      (       d   e[         R                  " U5      (       a   e[         R
                  " X#5      (       d   eg)zTests that a directed acyclic graph with multiple degree zero
nodes creates an arborescence with multiple (weakly) connected
components.

)rN  rO  r2   r!   )r&   r    )rN  r2   rO  r#   r'   )r(   r)   N)r   r   r  is_branchingr  r  r  s       r   test_multiple_roots&TestDagToBranching.test_multiple_roots  su     JJ?@"::NOq!!!!%%a((((,,,,r   c                     [         R                  " SS[         R                  " 5       S9n[         R                  " U5      n[         R                  " X5      (       d   eg)ztTests that a directed acyclic graph that is already an
arborescence produces an isomorphic arborescence as output.

r    rv  N)r   balanced_treer   r  r  )r   Ar  s      r   test_already_arborescence,TestDagToBranching.test_already_arborescence  sE    
 Q

="%%%%r   c                 :   [         R                  " SS[         R                  " 5       S9n[         R                  " SS[         R                  " 5       S9n[         R                  " X5      n[         R                  " U5      n[         R
                  " X45      (       d   eg)zmTests that a directed acyclic graph that is already a
branching produces an isomorphic branching as output.

r    rv  N)r   r  r   disjoint_unionr  r  )r   T1T2r   r  s        r   test_already_branching)TestDagToBranching.test_already_branching  so    
 a>a>b%"%%%%r   c                     [         R                  " [        R                  5         [        R                  " [        SSS95      n[        R                  " U5        SSS5        g! , (       d  f       g= f)z3Tests that a non-acyclic graph causes an exception.abcT)cyclicN)r@   rA   r   	HasACycler   r   r  r   s     r   test_not_acyclic#TestDagToBranching.test_not_acyclic  sA    ]]2<<(

8E$78A" )((s   5A##
A1c                     [         R                  " [        R                  5         [        R                  " [        R
                  " 5       5        S S S 5        g ! , (       d  f       g = fr   )r@   rA   r   rB   r  r?   rF  s    r   test_undirected"TestDagToBranching.test_undirected  s4    ]]2445
+ 655   *A
A&c                     [         R                  " [        R                  5         [        R                  " [        R
                  " 5       5        S S S 5        g ! , (       d  f       g = fr   )r@   rA   r   rB   r  r   rF  s    r   test_multigraph"TestDagToBranching.test_multigraph  s4    ]]24450 655r  c                     [         R                  " [        R                  5         [        R                  " [        R
                  " 5       5        S S S 5        g ! , (       d  f       g = fr   )r@   rA   r   rB   r  rO   rF  s    r   test_multidigraph$TestDagToBranching.test_multidigraph  s5    ]]2445 12 655r  r_   N)r`   ra   rb   rc   rd   r  r  r  r  r  r  r  r  re   r_   r   r   r  r    s.    H	--P&	&#,13r   r  c                      [         R                  " S5      n [         R                  " U S5      [         R                  " U S5      s=:H  =(       a    1 Sk:H    gs    g)zZRegression 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    s8     	aALLA"..A.>>,>r   c                      [         R                  " 5       n [        R                  " [         R                  SS9   [         R
                  " U 5        S S S 5        g ! , (       d  f       g = fNzfor undirected typerx  )r   r?   r@   rA   rB   compute_v_structuresr   s    r   test_compute_v_structures_raiser    s=    

A	r008M	N
" 
O	N	Ns   A
A'c                  <   / SQn [         R                  " U 5      n[        [         R                  " U5      5      n[	        U5      S:X  d   eSU;   d   e/ SQn [         R                  " U 5      n[        [         R                  " U5      5      n[	        U5      S:X  d   eg )NrN  rO  r   r   r   r    r"   )r  r  Cr  )r  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	!!!HE


5AB++A./Iy>Qr   c                      [         R                  " 5       n [        R                  " 5          [         R                  " U 5        S S S 5        g ! , (       d  f       g = fr   )r   r   r@   deprecated_callr  r   s    r   $test_compute_v_structures_deprecatedr    s3    


A				!
" 
"	!	!s   A
Ac                      [         R                  " 5       n [        R                  " [         R                  SS9   [         R
                  R                  U 5        S S S 5        g ! , (       d  f       g = fr  )r   r?   r@   rA   rB   r   v_structuresr   s    r   test_v_structures_raiser    sA    

A	r008M	N
A 
O	N	N    A""
A0)edgelistr\  r  r  )r  r  )r  r   r  r  )r  r  r  )rN  r   rO  c                     [         R                  " U 5      n[        [         R                  R	                  U5      5      nX1:X  d   eg r   )r   r   r   r   r  )r  r\  r   r  s       r   test_v_structuresr    s7     	

8ABFF''*+I   r   c                      [         R                  " 5       n [        R                  " [         R                  SS9   [         R
                  R                  U 5        S S S 5        g ! , (       d  f       g = fr  )r   r?   r@   rA   rB   r   	collidersr   s    r   test_colliders_raiser  -  sA    

A	r008M	N
 
O	N	Nr  )r  r  r   c                     [         R                  " U 5      n[        [         R                  R	                  U5      5      nX1:X  d   eg r   )r   r   r   r   r  )r  r\  r   r  s       r   test_collidersr  3  s7     	

8ABFF$$Q'(I   r   ))collectionsr   	itertoolsr   r   r@   networkxr   networkx.utilsr   r   r   r   rg   rx   r^  r`  rb  rh  rj  rl  ro  rr  rt  r|  r  r  r  r  r  r  r  r  r  r  markparametrizer   r  r  r  r_   r   r   <module>r     sU    0   0EE EEP-2 -2`e% e%P#5
,""8
""
"Z3 Z3z?##  %K	

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

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