
    wgr                        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 G d d      Zd Zd Zd Z d Z!d  Z"ejF                  jI                  d!g d"d#hfg d$d%hfg d& e%       ff      d'        Z&d( Z'ejF                  jI                  d!g d"d#hfg d$d%d)hff      d*        Z(y)+    deque)combinationspermutationsN)edges_equalpairwisec                     t        | d       y)zConsume the iterator entirely.r   )maxlenNr   )iterators    g/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/networkx/algorithms/tests/test_dag.py_consumer      s     
(1    c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)TestDagLongestPathzBUnit tests computing the longest path in a directed acyclic graph.c                 `    t        j                         }t        j                  |      g k(  sJ y NnxDiGraphdag_longest_pathselfGs     r   
test_emptyzTestDagLongestPath.test_empty   s&    JJL""1%+++r   c                 n    g d}t        j                  |      }t        j                  |      g dk(  sJ y )N)      r      r      r       r$      )r       )r   r   r    r$   r&   r   r   edgesr   s      r   test_unweighted1z#TestDagLongestPath.test_unweighted1   s.    @JJu""1%888r   c                 n    g d}t        j                  |      }t        j                  |      g dk(  sJ y )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   s.    HJJu""1%888r   c                     t        j                         }g d}|j                  |       t        j                  |      g dk(  sJ y )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"   s9    JJLS	!!%(""1%222r   c                     t        j                         }t        j                  t         j                  t         j
                  |       y r   )r   GraphpytestraisesNetworkXNotImplementedr   r   s     r   test_undirected_not_implementedz2TestDagLongestPath.test_undirected_not_implemented(   s)    HHJb//1D1DaHr   c                 `   t        d      D cg c]  }t                }}t        j                         }|j	                  |d   |d          |j	                  |d   |d          |j	                  |d   |d          |j	                  |d   |d          t        j
                  |       yc c}w )zTests 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_nodesz)TestDagLongestPath.test_unorderable_nodes,   s     $)8,a,,JJL	

58U1X&	

58U1X&	

58U1X&	

58U1X& 	A -s   B+c                 n    g d}t        j                  |      }t        j                  |      g dk(  sJ y )Nr   r   r   r-   r.   r/   r0   r#   r1   )r   MultiDiGraphr   r(   s      r   test_multigraph_unweightedz-TestDagLongestPath.test_multigraph_unweighted?   s.    POOE"""1%888r   c                     t        j                         }g d}|j                  |       t        j                  |      ddgk(  sJ y )N)r   r   r   )r   r    r   r   r    r   r   r    r$   r   r    r   r   r    r   rH   r6   r   r7   s      r   test_multigraph_weightedz+TestDagLongestPath.test_multigraph_weightedD   sB    OO
 	
!!%(""1%!Q///r   c                     t        j                  ddg      }|j                  g d       t        j                  |      ddgk(  sJ t        j                  |d      g dk(  sJ y )Nr   r   )rL   rM   rN   r   r    )default_weightr   r   r    rO   r   s     r   'test_multigraph_weighted_default_weightz:TestDagLongestPath.test_multigraph_weighted_default_weightP   s^    OOVV,-	!!"CD ""1%!Q///""1Q79DDDr   N)__name__
__module____qualname____doc__r   r*   r2   r8   r>   rE   rI   rP   rT    r   r   r   r      s4    L,9
9
3I&9

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

    c                 N   g d}t        j                  |      }t        j                  |      dk(  sJ g d}t        j                  |      }t        j                  |      dk(  sJ t        j                         }|j                  d       t        j                  |      dk(  sJ y )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    @JJu))!,111HJJu))!,111 JJL	

1))!,111r   c                     t        j                         }t        j                  t         j                  t         j
                  |       y r   )r   r:   r;   r<   r=   r^   r   s     r   r>   z8TestDagLongestPathLength.test_undirected_not_implementedm   s)    HHJb//1K1KQOr   c                     g d}t        j                         }|j                  |       t        j                  |      dk(  sJ y )Nr4   r$   )r   r   r6   r^   r(   s      r   r8   z&TestDagLongestPathLength.test_weightedq   s9    SJJL	!!%())!,111r   c                 j    g d}t        j                  |      }t        j                  |      dk(  sJ y )NrG   r"   )r   rH   r^   r(   s      r   rI   z3TestDagLongestPathLength.test_multigraph_unweightedw   s.    POOE"))!,111r   c                     t        j                         }g d}|j                  |       t        j                  |      dk(  sJ y )NrK   r$   )r   rH   r6   r^   r7   s      r   rP   z1TestDagLongestPathLength.test_multigraph_weighted|   s>    OO
 	
!!%())!,111r   N)	rU   rV   rW   rX   r`   r>   r8   rI   rP   rY   r   r   r[   r[   Y   s!    
2P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y)TestDAGc                      y r   rY   )clss    r   setup_classzTestDAG.setup_class   s    r   c                    t        j                  g d      }t         j                  t         j                  fD ]  }t	         ||            dk(  rJ  |j                  dd       t         j                  t         j                  fD ]1  }t        j                  t         j                  t         ||             3 |j                  dd       t         j                  t         j                  fD ]  }t	         ||            dk(  rJ  |j                  dd       t	        t        j                  |            dv sJ t	        t        j                  |            dk(  sJ y )N)r   r/   r   rS   r    r   rN   >   rS   rN   )r   r   topological_sort lexicographical_topological_sorttuplerB   r;   r<   NetworkXUnfeasibler   remove_edge)r   DG	algorithms      r   test_topological_sort1zTestDAG.test_topological_sort1   s(   ZZ01--r/R/RS 	5I2'9444	5 	Aq--r/R/RS 	JIMM"//9R=I	J 	q!--r/R/RS 	5I2'9444	5 	q!R((,-1GGGGR88<=JJJr   c                 j   t         j                  j                  d      }t        j                  |      rJ t        j                  |j	                               rJ t        j                  t        j
                  ddg            rJ t        j                  t        j                  ddg            sJ y )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    MM((+//222//@@@//&&9I0JKKK++BJJ7G,H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 |j                  dd       t        t        j                  |             t        j                  |      sJ y )Nr   r    r"   r$   r               )	r   r   r    r"   r$      rz   r{   r|   )	r   r   r;   r<   rn   r   rk   rv   ro   r   rp   s     r   test_topological_sort2zTestDAG.test_topological_sort2   s    ZZ33333DDDD

 	b++Xr7J7J27NO//333
q!$$R()++B///r   c                    t        j                         j                  t        dd      D cg c]  }d|f c}       j                  t        dd      D cg c]  }d|f c}       j                  t        dd      D cg c]  }d|f c}       j                  t        dd      D cg c]  }d|f c}       fd	} |t	        t        j
                                     j                  d
d       t        j                  t         j                  t        t        j
                               y c c}w c c}w c c}w c c}w )Nr   r$   r   	   rz   r&   r}   r"   c                     t        | t              sJ t        |       t              k(  sJ t        | d      D ]  \  }}t	        j
                  ||      sJ  y )Nr   )
isinstancelistsetr   r   has_path)orderuvrp   s      r   validatez0TestDAG.test_topological_sort3.<locals>.validate   sY    eT***u:R((($UA. 11;;r1a0001r   r|   )r   r   add_edges_fromr@   r   rk   rB   r;   r<   rn   r   )r   ir   rp   s      @r   test_topological_sort3zTestDAG.test_topological_sort3   s    ZZ\
5A;7aAq678
5A;7aAq678
5B<8aAq689
5R=9aAq69:	1 	b))"-./
Bb++Xr7J7J27NO 8789s   D:D?E0E	c                     t        j                         }|j                  dd       t        j                  t         j
                  t        t        j                  |             y )Nr   r   )r   r:   rB   r;   r<   NetworkXErrorr   rk   r   s     r   test_topological_sort4zTestDAG.test_topological_sort4   s<    HHJ	

1ab&&"2E2Ea2HIr   c                     t        j                         }|j                  dd       t        t        j                  |            ddgk(  sJ y )Nr   r   )r   r   rB   r   rk   r   s     r   test_topological_sort5zTestDAG.test_topological_sort5   s=    JJL	

1aB''*+1v555r   c                    t         j                  t         j                  fD ]i  fd}fd}fd}t        j                  t
        |       t        j                  t
        |       t        j                  t         j                  |       k y )Nc                      t        j                  g d      } d} |       D ]  }|sd}| j                  d|z
  d        y )Nr   r   r-   TFr$   )r   r   rB   rp   firstxrq   s      r   runtime_errorz5TestDAG.test_topological_sort6.<locals>.runtime_error   sD    ZZ 89"2 .A %AE1-.r   c                  ~    t        j                  g d      } d} |       D ]  }|sd}| j                  d        y )Nr   TFr"   r   r   remove_noder   s      r   unfeasible_errorz8TestDAG.test_topological_sort6.<locals>.unfeasible_error   >    ZZ 89"2 *A %q)*r   c                  ~    t        j                  g d      } d} |       D ]  }|sd}| j                  d        y )Nr   TFr   r   r   s      r   runtime_error2z6TestDAG.test_topological_sort6.<locals>.runtime_error2   r   r   )r   rk   rl   r;   r<   RuntimeErrorrn   )r   r   r   r   rq   s       @r   test_topological_sort6zTestDAG.test_topological_sort6   sg    --r/R/RS 	CI.** MM,6MM,7MM"//1AB9	Cr   c                 ~    t        j                  g d      }t        t        j                  |            g dgk(  sJ y )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   s2    ZZ89B,,R01o5F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 y )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   sG    ZZ@Ab..r238
 
 	
 
r   c                     d }d }d }t        j                  t        j                  |       t        j                  t        j                  |       t        j                  t        j                  |       y )Nc                  n    t        j                  g d      } t        t        j                  |              y )N)r   r   r-   r"   r   r.   r   )rp   s    r   
unfeasiblez8TestDAG.test_all_topological_sorts_3.<locals>.unfeasible  s$    DEB))"-.r   c                  n    t        j                  ddg      } t        t        j                  |              y )Nr   r   )r   r:   r   r   r   s    r   not_implementedz=TestDAG.test_all_topological_sorts_3.<locals>.not_implemented  s(    &&)*A))!,-r   c                  n    t        j                  g d      } t        t        j                  |              y )N)r   r   r   )r   
MultiGraphr   r   r   s    r   not_implemented_2z?TestDAG.test_all_topological_sorts_3.<locals>.not_implemented_2  s$    67A))!,-r   )r;   r<   r   rn   r=   )r   r   r   r   s       r   test_all_topological_sorts_3z$TestDAG.test_all_topological_sorts_3
  sP    	/
	.
	. 	b++Z8b//Ab//1BCr   c                    t        j                         }t        d      D ]  }|j                  |        t	        t        t        t        |j                                    t	        t        j                  |            k(  sJ y )Nr'   )
r   r   r@   r_   r   mapr   r   rD   r   )r   rp   r   s      r   test_all_topological_sorts_4z$TestDAG.test_all_topological_sorts_4  sg    ZZ\q 	AKKN	c$RXX 678F$$R(=
 
 	
 
r   c                     t        j                  g d      }t        t        j                  |            t        g dg dg      k(  sJ y )N)r   r   r   r-   r#   r#   r#   r1   )r   r   r    r$   r"   )r   rH   r   r   r   s     r   'test_all_topological_sorts_multigraph_1z/TestDAG.test_all_topological_sorts_multigraph_1%  sB    __UVb..r23vo.8
 
 	
 
r   c                     d}g }t        d|      D ]  }|j                  ||dz   fg|z          t        j                  |      }t	        t        j
                  |            t	        t        d|dz               gk(  sJ y )Nr   r   )r@   extendr   rH   r   r   )r   Nr)   r   rp   s        r   'test_all_topological_sorts_multigraph_2z/TestDAG.test_all_topological_sorts_multigraph_2+  sz    q! 	+ALL1a!e*)*	+__U#B,,R01d5AE?6K5LLLLr   c                 R   t        j                         }t         j                  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       y )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    JJLMM%%//		QRA,...A1a&(((A#%'''b&&	1a8r   c                 R   t        j                         }t         j                  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       y )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    JJLmm''33	QR1a I---1a L0001a CE)))b&&Q:r   c                    t        j                  g d      }g d}t        t        j                  |      j	                         |      sJ t        j                  g d      }g d}t        t        j                  |      j	                         |      sJ t        j                  g d      }g d}t        ||D cg c]  }||f c}z         }t        t        t        j                  |      j	                               |      sJ t        j                  g d      }g d}t        t        t        j                  |      j	                               |      sJ t        j                  g d      }g d}t        t        t        j                  |      j	                               |      sJ t        j                  g d      }g d}t        t        t        j                  |      j	                               |      sJ t        j                  ddd	d
ifdd
ddifdg      }t        j                  |      }|j	                         D ],  \  }}|j                  ||      |j                  ||      k(  r,J  d}t        j                  d t        |      D              }t        j                  |      }|j	                         D ],  \  }}|j                  ||      |j                  ||      k(  r,J  t        j                         }t        j                  t         j                        5  t        j                  |d       d d d        y c c}w # 1 sw Y   y xY w)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   r   r   ar    br   r-   
   c              3   2   K   | ]  }||d z   d|df  yw)r   r   )fweightNrY   .0r   s     r   	<genexpr>z2TestDAG.test_transitive_closure.<locals>.<genexpr>d  s      Mq1q5q"9:M   zwrong input)	reflexive)r   r   r   transitive_closurer)   r   r:   r   rH   get_edge_datar@   r;   r<   r   )	r   r   solutionrC   solnHr   r   ks	            r   test_transitive_closurezTestDAG.test_transitive_closureE  s   JJ/0C200399;XFFFJJ/0;200399;XFFFJJ/0Ch!!4Q1a&!4456""7"7":"@"@"BCTJJJHH-.C6""7"7":"@"@"BCXNNNMM23C6""7"7":"@"@"BCXNNNOO45C6""7"7":"@"@"BCXNNN JJAQx(1a#q*:FCD!!!$GGI 	BDAq??1a(AOOAq,AAAA	B JJME!HMM!!!$GGI 	BDAq??1a(AOOAq,AAAA	B HHJ]]2++, 	>!!!}=	> 	>9 "58	> 	>s   :M
'MMc                 :   t        j                  g d      }g d}t        ||D cg c]  }||f c}z         }t        t        j                  |      j                         |      sJ t        t        j                  |d      j                         |      sJ t        t        j                  |d      j                         |      sJ t        t        j                  |d       j                         |      sJ t        j                  g d      }g d}t        ||D cg c]  }||f c}z         }t        t        j                  |      j                         |      sJ t        t        j                  |d      j                         |      sJ t        t        j                  |d      j                         |      sJ t        t        j                  |d       j                         |      sJ t        j                  g d      }t        g d      }t        ||D cg c]  }||f c}z         }t        t        t        j                  |      j                               |      sJ t        t        t        j                  |d      j                               |      sJ t        t        t        j                  |d       j                               |      sJ t        t        t        j                  |d      j                               |      sJ t        j                  g d      }g d}t        ||D cg c]  }||f c}z         }t        t        j                  |      j                         |      sJ t        t        j                  |d      j                         |      sJ t        t        j                  |d      j                         |      sJ t        t        j                  |d       j                         |      sJ t        j                  g d      }g d}t        ||D cg c]  }||f c}z         }t        t        j                  |      j                         |      sJ t        t        j                  |d      j                         |      sJ t        t        j                  |d      j                         |      sJ t        t        j                  |d       j                         |      sJ t        j                  g d      }g d}t        ||D cg c]  }||f c}z         }t        t        j                  |      j                         |      sJ t        t        j                  |d      j                         |      sJ t        t        j                  |d      j                         |      sJ t        t        j                  |d       j                         |      sJ y c c}w c c}w c c}w c c}w c c}w c c}w )	Nr   r   FTr   r   r   r   )	r   r   r   r   r   r)   r:   r   rH   )r   r   r   rC   r   s        r   !test_reflexive_transitive_closurez)TestDAG.test_reflexive_transitive_closurem  s   JJ/0Ch!!4Q1a&!445200399;XFFF200E:@@BHMMM200D9??A4HHH200D9??A8LLLJJ/0;h!!4Q1a&!445200399;XFFF200E:@@BHMMM200D9??A4HHH200D9??A8LLLJJ/0JKh!!4Q1a&!4456""7"7":"@"@"BCTJJJ6""7"75"A"G"G"IJDQQQ6""7"74"@"F"F"HI8TTT6""7"74"@"F"F"HI4PPPHH-.Ch!!4Q1a&!445200399;XFFF200E:@@BHMMM200D9??A4HHH200D9??A8LLLMM23Ch!!4Q1a&!445200399;XFFF200E:@@BHMMM200D9??A4HHH200D9??A8LLLOO45Ch!!4Q1a&!445200399;XFFF200E:@@BHMMM200D9??A4HHH200D9??A8LLLY "5 "5 "5 "5 "5 "5s#   W?
X
X	
;X
3X
+X
c                 f   t        j                  g d      }t         j                  j                  j                  }g d}t         ||      j                         |      sJ t        j                  g d      }g d}t         ||      j                         |      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      } ||      }|j                         D ],  \  }}|j                  ||      |j                  ||      k(  r,J  d}t        j                  d t        |      D              } ||      }|j                         D ],  \  }}|j                  ||      |j                  ||      k(  r,J  y )Nr   r   r   r   r   r   r   r    r   r   r-   r   c              3   2   K   | ]  }||d z   d|df  yw)r   bar)foor   NrY   r   s     r   r   z6TestDAG.test_transitive_closure_dag.<locals>.<genexpr>  s      Q11q5%1"=>Qr   )r   r   r   r   transitive_closure_dagr   r)   r:   r;   r<   r=   r   r@   )r   r   r   r   r   r   r   r   s           r   test_transitive_closure_dagz#TestDAG.test_transitive_closure_dag  s   JJ/0]]..EEC-a0668(CCCJJ/0;-a0668(CCCHH-.b//1CQG JJAQx(1a#q*:FCDq!GGI 	BDAq??1a(AOOAq,AAAA	B JJQaQQq!GGI 	BDAq??1a(AOOAq,AAAA	Br   c                     t        j                  g d      }t         j                  j                  j                  }g d}t         ||      j                         |      sJ t        j                  g d      }t         j                  j                  j                  }g d}t         ||      j                         |      sJ t        j                  g d      }t        j                  t         j                  ||       y )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    JJGH!}}00EE+/288:HEEEJJ?@!}}00EE+/288:HEEEHH-.b//1EqIr   c                     |D cg c]  }t        |       }}|D cg c]  }t        |       }}t        |      t        |      k(  sJ y c c}w c c}w r   )	frozensetr   )r   r   resultr   solress         r   _check_antichainszTestDAG._check_antichains  sN    %-.y|..%+,y|,,3x3s8### /,s
   AAc                    t         j                  j                  j                  t        j                  g d      }g dgdgdgdgg}| j                  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}| j                  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}| j                  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}| j                  t         |            |       t        j                         }| j                  t         |            g g       t        j                         }|j                  g d       g dgdgddgdgddgddgg dg}| j                  t         |            |       fd}t        j                  g d      }t        j                  t         j                  ||       t        j                  g d      }t        j                  t         j                  ||       y )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    r   r   r   r   )r   r   r   c                 &    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=   rn   )r   r   r   r   r   s       @r   test_antichainsz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//A6JJ/0b++Q2r   c                    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 y )N)r   r   r   r0   r   )r   r   r    r"   r$   r&   c                     | S r   rY   r   s    r   <lambda>z?TestDAG.test_lexicographical_topological_sort.<locals>.<lambda>  s     r   keyc                     |  S r   rY   r   s    r   r  z?TestDAG.test_lexicographical_topological_sort.<locals>.<lambda>  s    ! r   )r   r$   r"   r   r&   r    )r   r   r   rl   r   s     r   %test_lexicographical_topological_sortz-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                     G d d      }d }t        d      D cg c]
  } ||       c}t        j                         }g d}|j                  fd|D               t	        t        j
                  ||            }|k(  sJ yc c}w )	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y)ATestDAG.test_lexicographical_topological_sort2.<locals>.Test_Nodec                      || _         d| _        y )Nr   )labelpriority)r   rC   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    tzzl!,,r   N)rU   rV   rW   r  r  rY   r   r   	Test_Noder    s    "-r   r  c                     | j                   S r   )r  )nodes    r   sorting_keyzCTestDAG.test_lexicographical_topological_sort2.<locals>.sorting_key%  s    == r   r"   )r   r   r   r   )r   r    r   c              3   8   K   | ]  \  }}|   |   f  y wr   rY   )r   r   r   
test_nodess      r   r   zATestDAG.test_lexicographical_topological_sort2.<locals>.<genexpr>+  s"     JDAq*Q-A7Js   r  N)r@   r   r   r   r   rl   )r   r  r  rC   r   r)   sortingr  s          @r   &test_lexicographical_topological_sort2z.TestDAG.test_lexicographical_topological_sort2  sz    	- 	-	! -2!H5qil5
JJL0	JEJJr::1+NO*$$$ 6s   BN)rU   rV   rW   classmethodri   rr   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  rY   r   r   rf   rf      s     K*J0,P$J6
C>G
D&

M9;&>P/MbB.
J$
:3x
(%r   rf   c            
         t        j                  ddgddgdgg ddgg g d      j                         } t        j                  |       D cg c]  }t	        |       }}g dddgdgd	gg}||k(  sJ t        j
                  | j                        }|j                  dd	       t        j                  |      D cg c]  }t	        |       }}||k(  sJ y c c}w c c}w )
Nr   r    r"   r$   r'   r&   )r   r   r    r"   r$   r&   r'   )r"   r&   r'   r   )r   r   reversetopological_generationsr   rH   r)   rB   )r   gengenerationsexpectedMGs        r   test_topological_generationsr#  1  s    


F1v1#"!QB2F	gi  +-*D*DQ*GH36#;HKHAq6A3,H("""		!BKK1*,*D*DR*HI36#;IKI(""" I Js   
C9Cc                  r    t        j                         } t        t        j                  |             g k(  sJ y r   )r   r   r   r  r   s    r   "test_topological_generations_emptyr%  @  s+    


A**1-."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        y # 1 sw Y   y xY w)Nr   r   r    )r   r   r;   r<   rn   r   r  r   s    r   "test_topological_generations_cycler'  E  s]    


QFQFQF+,A	r,,	- ,R''*+, , ,s   A**A3c                      t        j                         } t        j                  | g d       t        j                  |       rJ y )Nr   r   r    r"   r   r   	add_cycleis_aperiodicr   s    r   test_is_aperiodic_cycler-  K  s0    


ALLL!q!!!!r   c                      t        j                         } t        j                  | g d       t        j                  | g d       t        j                  |       sJ y )Nr)  )r    r"   r$   r&   r'   r*  r   s    r   test_is_aperiodic_cycle2r/  Q  s;    


ALLL!LLO$??1r   c                      t        j                         } t        j                  | g d       t        j                  | g d       t        j                  |       rJ y )Nr)  )r    r"   r$   r&   r*  r   s    r   test_is_aperiodic_cycle3r1  X  s>    


ALLL!LLL!q!!!!r   c                      t        j                         } t        j                  | g d       | j                  dd       t        j                  |       sJ y )Nr)  r   r    r   r   r+  rB   r,  r   s    r   test_is_aperiodic_cycle4r4  _  ;    


ALLL!JJq!??1r   c                      t        j                         } t        j                  | g d       | j                  dd       t        j                  |       sJ y )Nr)  r   r3  r   s    r   test_is_aperiodic_selfloopr7  f  r5  r   c                      t        j                         } t        j                  t         j                  t         j
                  |        y r   )r   r:   r;   r<   r   r,  r   s    r   #test_is_aperiodic_undirected_raisesr9  m  s'    

A
MM"""BOOQ7r   c                      t        j                  t         j                        } t        j                  t         j
                  d      5  t        j                  |        d d d        y # 1 sw Y   y xY w)Ncreate_usingzGraph has no nodes.match)r   empty_graphr   r;   r<   NetworkXPointlessConceptr,  r   s    r   test_is_aperiodic_empty_graphrA  r  sJ    
BJJ/A	r22:O	P 
  s   
A))A2c                      t        j                  t        j                               } t        j                  |       rJ y r   )r   r   davis_southern_women_graphr,  r   s    r   test_is_aperiodic_bipartiterD  x  s.    


20023Aq!!!!r   c                      t        j                  ddt        j                               } t        j                  |       rJ y )Nr       r;  )r   full_rary_treer   r,  r   s    r   test_is_aperiodic_rary_treerH  ~  s1    
!Rbjjl;Aq!!!!r   c                  0   t        j                         } t        j                  | g d       t        j                  | g d       t        j                  |       rJ | j	                  dd       | j	                  dd       t        j                  |       sJ y )Nr)  )r$   r&   r'   r   r   r    r$   r'   )r   r   r+  r,  rB   r   s    r   test_is_aperiodic_disconnectedrJ    si    


ALLL!LLL!q!!!JJq!JJq!??1r   c                      t        j                         } t        j                  | g d       | j                  dd       t        j                  |       rJ y )Nr   r    r3  r   s    r   test_is_aperiodic_disconnected2rL    s>    


ALLIJJq!q!!!!r   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)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 y)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  s\    
 JJ7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 y)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   rP  is_branchingrQ  rR  rS  s       r   test_multiple_rootsz&TestDagToBranching.test_multiple_roots  sn     JJ?@"::NOq!!!%%a(((8,,,r   c                     t        j                  ddt        j                               }t        j                  |      }t        j                  ||      sJ y)zTests that a directed acyclic graph that is already an
        arborescence produces an isomorphic arborescence as output.

        r   r;  N)r   balanced_treer   rP  rR  )r   ArT  s      r   test_already_arborescencez,TestDagToBranching.test_already_arborescence  sD    
 Q

="1%%%r   c                 2   t        j                  ddt        j                               }t        j                  ddt        j                               }t        j                  ||      }t        j                  |      }t        j
                  ||      sJ y)z}Tests that a directed acyclic graph that is already a
        branching produces an isomorphic branching as output.

        r   r;  N)r   rZ  r   disjoint_unionrP  rR  )r   T1T2r   rT  s        r   test_already_branchingz)TestDagToBranching.test_already_branching  sp    
 a>a>b"%"1%%%r   c                     t        j                  t        j                        5  t        j                  t        dd            }t        j                  |       ddd       y# 1 sw Y   yxY w)z3Tests that a non-acyclic graph causes an exception.abcT)cyclicN)r;   r<   r   	HasACycler   r   rP  r   s     r   test_not_acyclicz#TestDagToBranching.test_not_acyclic  sJ    ]]2<<( 	#

8E$78A"	# 	# 	#s   6A##A,c                     t        j                  t        j                        5  t        j                  t        j
                                d d d        y # 1 sw Y   y xY wr   )r;   r<   r   r=   rP  r:   r  s    r   test_undirectedz"TestDagToBranching.test_undirected  s=    ]]2445 	,
+	, 	, 	,   (AAc                     t        j                  t        j                        5  t        j                  t        j
                                d d d        y # 1 sw Y   y xY wr   )r;   r<   r   r=   rP  r   r  s    r   test_multigraphz"TestDagToBranching.test_multigraph  s=    ]]2445 	10	1 	1 	1ri  c                     t        j                  t        j                        5  t        j                  t        j
                                d d d        y # 1 sw Y   y xY wr   )r;   r<   r   r=   rP  rH   r  s    r   test_multidigraphz$TestDagToBranching.test_multidigraph  s>    ]]2445 	3 12	3 	3 	3ri  N)rU   rV   rW   rX   rU  rX  r\  ra  rf  rh  rk  rm  rY   r   r   rN  rN    s.    H	--P&	&#,13r   rN  c                      t        j                  d      } t        j                  | d      t        j                  | d      cxk(  xr h dk(   yc  y)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_undirectedrp    s5     	aALLA"..A.>,>r   c                      t        j                         } t        j                  t         j                  d      5  t        j
                  |        d d d        y # 1 sw Y   y xY wNzfor undirected typer=  )r   r:   r;   r<   r=   compute_v_structuresr   s    r   test_compute_v_structures_raisert    sE    

A	r008M	N #
"# # #s   AA"c                  ,   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 y )Nr  r  r   r   r   r   r    )r[  rT  CrT  )rT  Dr{  Er   r}  r   )r   r   r   rs  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                      t        j                         } t        j                         5  t        j                  |        d d d        y # 1 sw Y   y xY wr   )r   r   r;   deprecated_callrs  r   s    r   $test_compute_v_structures_deprecatedr    s<    


A				! #
"# # #s   AAc                      t        j                         } t        j                  t         j                  d      5  t         j
                  j                  |        d d d        y # 1 sw Y   y xY wrr  )r   r:   r;   r<   r=   r   v_structuresr   s    r   test_v_structures_raiser    sI    

A	r008M	N 
A      A##A,)edgelistr!  rv  rw  )rx  ry  )r{  r   r|  r~  )r[  rT  rz  )r  r   r  c                     t        j                  |       }t        t         j                  j	                  |            }||k(  sJ y r   )r   r   r   r   r  )r  r!  r   r  s       r   test_v_structuresr    s9     	

8ABFF''*+I   r   c                      t        j                         } t        j                  t         j                  d      5  t         j
                  j                  |        d d d        y # 1 sw Y   y xY wrr  )r   r:   r;   r<   r=   r   	collidersr   s    r   test_colliders_raiser  -  sI    

A	r008M	N 
  r  )r{  r}  r   c                     t        j                  |       }t        t         j                  j	                  |            }||k(  sJ y r   )r   r   r   r   r  )r  r!  r   r  s       r   test_collidersr  3  s9     	

8ABFF$$Q'(I   r   ))collectionsr   	itertoolsr   r   r;   networkxr   networkx.utilsr   r   r   r   r[   rf   r#  r%  r'  r-  r/  r1  r4  r7  r9  rA  rD  rH  rJ  rL  rN  rp  rt  r  r  r  markparametrizer   r  r  r  rY   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   