
    Vh{                     d   d 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e      Z	 G d	 d
e      Z
 G d de
      Z G d de
      Z G d d      Z G d d      Zd Zej                   j"                  d        Zd Zej                   j"                  d        Zd Zd Zd Z G d d      Zy)z>Unit tests for the :mod:`networkx.algorithms.tree.mst` module.    N)edges_equalnodes_equalc                  d   t        j                  t              5  t        j                  t        j
                         d       d d d        t        j                  t        d      5  t        j                  t        j
                         d       d d d        y # 1 sw Y   WxY w# 1 sw Y   y xY w)Nrandom	algorithmz.random is not a valid choice for an algorithm.)match)pytestraises
ValueErrornxminimum_spanning_treeGraphmaximum_spanning_edges     W/home/dcms/DCMS/lib/python3.12/site-packages/networkx/algorithms/tree/tests/test_mst.pytest_unknown_algorithmr   	   s    	z	" A
  x@A	J
 B 	!!"((*AB BA AB Bs   *B'*B&B#&B/c                   d    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zy)MinimumSpanningTreeTestBasea  Base class for test classes for minimum spanning tree algorithms.
    This class contains some common tests that will be inherited by
    subclasses. Each subclass must have a class attribute
    :data:`algorithm` that is a string representing the algorithm to
    run, as described under the ``algorithm`` keyword argument for the
    :func:`networkx.minimum_spanning_edges` function.  Subclasses can
    then implement any algorithm-specific tests.
    c           	      B   | j                   | _        g d}t        j                         | _        | j                  j                  |       ddddifddddifddddifd	dddifdddd
ifdd
ddifg| _        ddddifdd	ddifddddifddddifdd
ddifdd
ddifg| _        y)zjCreates an example graph and stores the expected minimum and
        maximum spanning tree edges.
        )r         )r         r         )r   r   	   )r      r   )r   r!   r   )r   r!      )r   r      )r!   r   r   )r!   r#   r    )r   r#      r   r   weightr   r   r   r!   r   r#   r    r   r"   r$   N)r   algor   r   Gadd_weighted_edges_fromminimum_spanning_edgelistmaximum_spanning_edgelist)selfmethodedgess      r   setup_methodz(MinimumSpanningTreeTestBase.setup_method   s    
 NN	
 &&u-Ha=!Ha=!Ha=!Ha=!Ha=!Ha=!*
& Ha=!Ha=!Ha=!Hb>"Ha=!Hb>"*
&r   c                     t        j                  | j                  | j                        }t	        d |D              }t        || j                        sJ y )Nr   c              3   V   K   | ]!  \  }}}t        ||      t        ||      |f # y wNminmax.0uvds       r   	<genexpr>zAMinimumSpanningTreeTestBase.test_minimum_edges.<locals>.<genexpr>H   )     GgaAQC1Iq1G   '))r   minimum_spanning_edgesr'   r&   sortedr   r)   r+   r-   actuals      r   test_minimum_edgesz.MinimumSpanningTreeTestBase.test_minimum_edgesD   D    ))$&&DIIF GGG64#A#ABBBr   c                     t        j                  | j                  | j                        }t	        d |D              }t        || j                        sJ y )Nr   c              3   V   K   | ]!  \  }}}t        ||      t        ||      |f # y wr1   r2   r5   s       r   r:   zAMinimumSpanningTreeTestBase.test_maximum_edges.<locals>.<genexpr>O   r;   r<   )r   r   r'   r&   r>   r   r*   r?   s      r   test_maximum_edgesz.MinimumSpanningTreeTestBase.test_maximum_edgesK   rB   r   c                     t        j                  | j                  | j                  d      }t	        d |D              }| j
                  D cg c]
  \  }}}||f }}}}t        ||      sJ y c c}}}w )NFr   datac              3   R   K   | ]  \  }}t        ||      t        ||      f ! y wr1   r2   r6   r7   r8   s      r   r:   z@MinimumSpanningTreeTestBase.test_without_data.<locals>.<genexpr>V   %     A41aQC1I.A   %')r   r=   r'   r&   r>   r)   r   )r+   r-   r@   r7   r8   r9   expecteds          r   test_without_dataz-MinimumSpanningTreeTestBase.test_without_dataR   sl    ))$&&DIIER A5AA*.*H*HIIwq!QQFII68,,, Js   A1c                    | j                   }|j                  ddt        d             t        j                  || j
                  dd      }t        d |D              }| j                  D cg c]
  \  }}}||f }}}}t        ||      sJ t        j                  || j
                  dd      }t        j                  t              5  t        |       d d d        t        j                  || j
                  d	      }t        j                  t              5  t        |       d d d        y c c}}}w # 1 sw Y   `xY w# 1 sw Y   y xY w)
Nr      nanr%   FTr   rH   
ignore_nanc              3   R   K   | ]  \  }}t        ||      t        ||      f ! y wr1   r2   rJ   s      r   r:   z?MinimumSpanningTreeTestBase.test_nan_weights.<locals>.<genexpr>a   rK   rL   rG   )r'   add_edgefloatr   r=   r&   r>   r)   r   r
   r   r   list)r+   r'   r-   r@   r7   r8   r9   rM   s           r   test_nan_weightsz,MinimumSpanningTreeTestBase.test_nan_weightsZ   s   FF	

1bu
.))4
 A5AA*.*H*HIIwq!QQFII68,,,))5
 ]]:& 	K	 ))!tyyuM]]:& 	K	 	 J	 		 	s   /D0D7E7E Ec                    t        j                         }|j                  ddt        d             t        j                  |ddd      }t        j                  t              5  t        |       d d d        t        j                  |dd      }t        j                  t              5  t        |       d d d        y # 1 sw Y   OxY w# 1 sw Y   y xY w)	Nr   rP   rQ   rR   primFrS   rG   )	r   
MultiGraphrV   rW   r=   r
   r   r   rX   )r+   r'   r-   s      r   test_nan_weights_MultiGraphz7MinimumSpanningTreeTestBase.test_nan_weights_MultiGrapho   s    MMO	

1bu
.))e
 ]]:& 	K	 ))!vEJ]]:& 	K	 			 		 	s   $B>)C
>C
Cc           
         g d}t        j                         }|j                  |D cg c]  \  }}}|dz   |dz   |f c}}}       |j                  ddt	        d             t        j
                  || j                  dd	      }t        d
 |D              }| j                  D cg c]  \  }}}|dz   |dz   f }}}}t        ||      sJ y c c}}}w c c}}}w )Nr   r   r   r   rQ   rR   FTrS   c              3   R   K   | ]  \  }}t        ||      t        ||      f ! y wr1   r2   rJ   s      r   r:   zEMinimumSpanningTreeTestBase.test_nan_weights_order.<locals>.<genexpr>   rK   rL   )
r   r   r(   rV   rW   r=   r&   r>   r)   r   	r+   r-   r'   r7   r8   wtr@   r9   shifts	            r   test_nan_weights_orderz2MinimumSpanningTreeTestBase.test_nan_weights_order|   s    
 HHJ	!!e"L"L(!QAE1q5"#5"LM	

1ae
-))4
 A5AA/3/M/MNNGAq!!a%QNN65))) #M Os   C+Cc           
         g d}t        j                         }|j                  |D cg c]  \  }}}|dz   |dz   |f c}}}       |j                  d       t        j                  || j
                  dd      }t        d |D              }| j                  D cg c]  \  }}}|dz   |dz   f }}}}t        ||      sJ y c c}}}w c c}}}w )Nr   r   r   FTrS   c              3   R   K   | ]  \  }}t        ||      t        ||      f ! y wr1   r2   rJ   s      r   r:   zAMinimumSpanningTreeTestBase.test_isolated_node.<locals>.<genexpr>   rK   rL   )	r   r   r(   add_noder=   r&   r>   r)   r   r`   s	            r   test_isolated_nodez.MinimumSpanningTreeTestBase.test_isolated_node   s    
 HHJ	!!e"L"L(!QAE1q5"#5"LM	

1))4
 A5AA/3/M/MNNGAq!!a%QNN65))) #M Os   CCc                     t        j                  | j                  | j                        }t	        |j                  d            }t        || j                        sJ y Nr   TrH   )r   r   r'   r&   r>   r-   r   r)   r+   Tr@   s      r   test_minimum_treez-MinimumSpanningTreeTestBase.test_minimum_tree   G    $$TVVtyyAT*+64#A#ABBBr   c                     t        j                  | j                  | j                        }t	        |j                  d            }t        || j                        sJ y ri   )r   maximum_spanning_treer'   r&   r>   r-   r   r*   rk   s      r   test_maximum_treez-MinimumSpanningTreeTestBase.test_maximum_tree   rn   r   c                 (   t        j                  ddddifddddifg      }t        j                  || j                        }t	        t        |      t        t        d                  sJ t        t        |j                               dd	g      sJ y )
Nr   r   r%   r   r   r   r!   r   r   r   r   )	r   r   r   r&   r   rX   ranger   r-   r+   r'   rl   s      r   test_disconnectedz-MinimumSpanningTreeTestBase.test_disconnected   s|    HHq!h]+aXqM-BCD$$Q$))<47DqN3334	?VV,<===r   c                     t        j                  d      }t        j                  || j                        }t	        t        |      t        t        d                  sJ |j                         dk(  sJ y )Nr   r   r   )	r   empty_graphr   r&   r   r>   rX   ru   number_of_edgesrv   s      r   test_empty_graphz,MinimumSpanningTreeTestBase.test_empty_graph   sY    NN1$$Q$))<6!9d58n555  "a'''r   c                    t        j                         }|j                  ddddd       |j                  ddddd       |j                  dddd	d       d
|j                  d<   t        j                  || j
                        }|j                  |j                  k(  sJ t        ||      sJ |j                         D ],  \  }}|j                  |   |   |j                  |   |   k(  r,J  y )Nr   r   redr   )r%   colordistancer   green
   bluebarfoor   )	r   r   rV   graphr   r&   r   r-   adj)r+   r'   rl   r7   r8   s        r   test_attributesz+MinimumSpanningTreeTestBase.test_attributes   s    HHJ	

1a
;	

1a1
=	

1a&1
=$$Q$))<ww!''!!!1a   GGI 	.DAq558A;!%%(1+---	.r   c                    t        j                         }|j                  dddd       |j                  dddd       |j                  dddd       |j                  d       t        j                  || j
                  d	      }t        t        |      t        t        d
                  sJ t        t        |j                               ddg      sJ t        j                  || j
                  d	      }t        t        |      t        t        d
                  sJ t        t        |j                               ddg      sJ y )Nr   r   r   )r%   r   r      r   r   )r   r%   r!   r   r   r   r   rs   )r   r   rV   rf   r   r&   r   r>   rX   ru   r   r-   rp   rv   s      r   test_weight_attributez1MinimumSpanningTreeTestBase.test_weight_attribute   s    HHJ	

1aA
.	

1aQ
/	

1aA
.	

1$$Q$))JO6!9d58n5556!''),vv.>???$$Q$))JO6!9d58n5556!''),vv.>???r   N)__name__
__module____qualname____doc__r.   rA   rE   rN   rY   r]   rc   rg   rm   rq   rw   r{   r   r   r   r   r   r   r      sS    &
PCC-**2*2C
C
>(
.@r   r   c                       e Zd ZdZdZd Zy)TestBoruvkaub   Unit tests for computing a minimum (or maximum) spanning tree
    using Borůvka's algorithm.
    boruvkac                     t        j                  | j                  d      }t        d |D              }t	        || j
                        sJ y)u_   Tests that using a Unicode string can correctly indicate
        Borůvka's algorithm.
        u   borůvkar   c              3   V   K   | ]!  \  }}}t        ||      t        ||      |f # y wr1   r2   r5   s       r   r:   z0TestBoruvka.test_unicode_name.<locals>.<genexpr>   r;   r<   N)r   r=   r'   r>   r   r)   r?   s      r   test_unicode_namezTestBoruvka.test_unicode_name   sB     ))$&&JG GGG64#A#ABBBr   N)r   r   r   r   r   r   r   r   r   r   r      s     ICr   r   c                       e Zd Zd Zd Zy)MultigraphMSTTestBasec                     t        j                         }|j                  dddd       |j                  dddd       t         j                  } ||| j                  d      }t        d	gt        |            sJ y
)z[Tests that the minimum spanning edges of a multigraph
        preserves edge keys.
        r   r   ar   keyr%   bFrG   )r   r   r   Nr   r\   rV   r=   r&   r   rX   )r+   r'   	min_edges	mst_edgess       r   test_multigraph_keys_minz.MultigraphMSTTestBase.test_multigraph_keys_min   j     MMO	

1aS
+	

1aS
+--	a4995A	K=$y/:::r   c                     t        j                         }|j                  dddd       |j                  dddd       t         j                  } ||| j                  d      }t        d	gt        |            sJ y
)z[Tests that the maximum spanning edges of a multigraph
        preserves edge keys.
        r   r   r   r   r   r   FrG   )r   r   r   N)r   r\   rV   r   r&   r   rX   )r+   r'   	max_edgesr   s       r   test_multigraph_keys_maxz.MultigraphMSTTestBase.test_multigraph_keys_max   r   r   N)r   r   r   r   r   r   r   r   r   r      s    	;	;r   r   c                       e Zd ZdZdZd Zy)TestKruskalzaUnit tests for computing a minimum (or maximum) spanning tree
    using Kruskal's algorithm.
    kruskalc                    t        j                         }|j                  dddd       |j                  dddd       |j                  dddd       |j                  dddd       t        j                  || j                  dd      }t        d	d
gt        |            sJ t        j                  || j                  dd      }t        ddddifddddifgt        |            sJ t        j                  || j                  dd      }t        ddgt        |            sJ t        j                  || j                  dd      }t        dddddifdddddifgt        |            sJ y)zTests that the keys and data values are included in
        MST edges based on whether keys and data parameters are
        true or falser   r   r   r   r!   TF)r   keysrH   )r   r   r   )r   r   r   r%   r   rt   Nr   )r+   r'   r   s      r   test_key_data_boolzTestKruskal.test_key_data_bool  s    MMO	

1aQq
)	

1aQq
)	

1aQq
)	

1aQq
) --E
	 Iy14	?CCC --T
	 XqM"QHa=$9:DO
 	
 

 --U
	 FF+T)_=== --D
	 A!}%1a(A'?@$y/
 	
 
r   N)r   r   r   r   r   r   r   r   r   r   r   
  s     I$
r   r   c                   ,    e Zd ZdZdZd Zd Zd Zd Zy)TestPrimz^Unit tests for computing a minimum (or maximum) spanning tree
    using Prim's algorithm.
    r[   c                 8   t        j                         }|j                  dddd       |j                  dddd       |j                  dddd       t        j                  || j                  d      }t        dddddfdddddfgt        |            sJ y )Nr   r   r   r   r!   Tr   rT   )r   r   rV   r=   r&   r   rX   r+   Hr   s      r    test_prim_mst_edges_simple_graphz)TestPrim.test_prim_mst_edges_simple_graph?  s    HHJ	

1aQq
)	

1aQq
)	

1aQq
)--a499QUV	A+,q!Q!5L.MNO
 	
 
r   c                 &   t        j                         }|j                  dddt        d             |j                  dddd       |j                  dddd       |j                  dddd       t        j                  || j
                  d      }t        dddd	difdddd	difgt        |            sJ t        j                  t              5  t        t        j                  || j
                  d
             ddd       y# 1 sw Y   yxY w)zpTests that the edges with NaN weights are ignored or
        raise an Error based on ignore_nan is true or falser   r   rQ   r   r   r!   Tr   r%   FN)r   r\   rV   rW   r=   r&   r   rX   r
   r   r   r   s      r   test_ignore_nanzTestPrim.test_ignore_nanK  s     MMO	

1aQuU|
4	

1aQq
)	

1aQq
)	

1aQq
) --a499QUV	A!}%1a(A'?@$y/
 	
 

 ]]:& 	V**1		eTU	V 	V 	Vs   ,DDc                    t        j                         }|j                  dddd       |j                  dddd       t        j                  || j                        }t        dgt        |j                  d	
                  sJ y )Nr   r   r   r   r   r   r   )r   r   r   r%   rj   )r   r\   rV   r   r&   r   rX   r-   rv   s      r   test_multigraph_keys_treez"TestPrim.test_multigraph_keys_tree^  m    MMO	

1aS
+	

1aS
+$$Q$))<I;QWW(W-C(DEEEr   c                    t        j                         }|j                  dddd       |j                  dddd       t        j                  || j                        }t        dgt        |j                  d	
                  sJ y )Nr   r   r   r   r   r   r   )r   r   r   r%   rj   )r   r\   rV   rp   r&   r   rX   r-   rv   s      r   test_multigraph_keys_tree_maxz&TestPrim.test_multigraph_keys_tree_maxe  r   r   N)	r   r   r   r   r   r   r   r   r   r   r   r   r   r   8  s%     I

V&FFr   r   c                   "    e Zd ZdZd Zd Zd Zy)TestSpanningTreeIteratoru   
    Tests the spanning tree iterator on the example graph in the 2005 Sörensen
    and Janssens paper An Algorithm to Generate all Spanning Trees of a Graph in
    Order of Increasing Cost
    c                    g d}t        j                         | _        | j                  j                  |       ddddifddddifddddifddddifgddddifddddifdddd	ifddddifgddddifdddd	ifddddifddddifgddddifddddifdddd
ifddddifgddddifddddifdddd	ifddddifgddddifdddd	ifdddd
ifddddifgddddifddddifddddifdddd
ifgddddifdddd	ifddddifdddd
ifgg| _        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(   spanning_trees)r+   r-   s     r   r.   z%TestSpanningTreeIterator.setup_methodt  s)   R&&u-
 A!}%A!}%A!}%A!}%	 A!}%A!}%A!}%A!}%	 A!}%A!}%A!}%A!}%	 A!}%A!}%A!}%A!}%	 A!}%A!}%A!}%A!}%	 A!}%A!}%A!}%A!}%	 A!}%A!}%A!}%A!}%	 A!}%A!}%A!}%A!}%	g9
r   c                     d}t        j                  | j                        D ]=  }t        |j	                  d            }t        || j                  |         sJ |dz  }? y)Z
        Tests that the spanning trees are correctly returned in increasing order
        r   Trj   r   Nr   SpanningTreeIteratorr'   r>   r-   r   r   r+   
tree_indextreer@   s       r   #test_minimum_spanning_tree_iteratorz<TestSpanningTreeIterator.test_minimum_spanning_tree_iterator  s`     
++DFF3 	DDJJDJ12Fvt':'::'FGGG!OJ	r   c                     d}t        j                  | j                  d      D ]=  }t        |j	                  d            }t        || j                  |         sJ |dz  }? y)Z
        Tests that the spanning trees are correctly returned in decreasing order
        r   FminimumTrj   r   Nr   r   s       r   #test_maximum_spanning_tree_iteratorz<TestSpanningTreeIterator.test_maximum_spanning_tree_iterator  sb     
++DFFEB 	DDJJDJ12Fvt':'::'FGGG!OJ	r   N)r   r   r   r   r.   r   r   r   r   r   r   r   m  s    ?
Br   r   c                   "    e Zd ZdZd Zd Zd Zy)"TestSpanningTreeMultiGraphIteratorz\
    Uses the same graph as the above class but with an added edge of twice the weight.
    c           	         g d}t        j                         | _        | j                  j                  |       ddlm} g | _         || j                  j                  d      D ]h  }| j                  j                  |      }t        j                  |      s4| j                  j                  t        |j                  dd                   j y )N)r   )r   r   r   r   r   r   )r   r!   rP   r   )r   r   r   r   )r   r!      r   )r   r!   r#   r   )combinationsr!   Tr   rH   )r   r\   r'   r(   	itertoolsr   r   r-   edge_subgraphis_treeappendr>   )r+   r-   r   er   s        r   r.   z/TestSpanningTreeMultiGraphIterator.setup_method  s    
 &&u- 	+ dffllA. 	UA66''*Dzz$##**6$**$T*2R+ST	Ur   c                    d}d}t        j                  | j                        D ]Y  }t        |j	                  dd            }t        |D cg c]
  }|d   d    c}      }|| j                  v sJ ||k\  sJ |dz  }[ yc c}w )r   r   Tr   r   r%   r   Nr   r   r'   r>   r-   sumr   r+   r   last_weightr   r@   r   r%   s          r   .test_minimum_spanning_tree_iterator_multigraphzQTestSpanningTreeMultiGraphIterator.test_minimum_spanning_tree_iterator_multigraph  s     
++DFF3 	DDJJDtJ<=F&9Q!A$x.9:FT00000[(((!OJ	9s   B
c                    d}d}t        j                  | j                  d      D ]Y  }t        |j	                  dd            }t        |D cg c]
  }|d   d    c}      }|| j                  v sJ ||k  sJ |d	z  }[ y
c c}w )r      2   Fr   Tr   r   r%   r   Nr   r   s          r   .test_maximum_spanning_tree_iterator_multigraphzQTestSpanningTreeMultiGraphIterator.test_maximum_spanning_tree_iterator_multigraph  s     
++DFFEB 	DDJJDtJ<=F&9Q!A$x.9:FT00000[(((!OJ	9s   B
N)r   r   r   r   r.   r   r   r   r   r   r   r     s    U:r   r   c            
         ddl m}  t        j                  d       ddddddddd	d
	}t	        j
                         }|D ]$  \  }}|j                  || | |||f                & g d}t	        j
                         }|j                  |       t	        j                  |dd      }t        j                  j                  |j                  |j                        sJ y)z@
    Using a fixed seed, sample one tree for repeatability.
    r   expscipyw-!lU??5^IҿDJտ燧W2￩	rs   r   r   r   r   )r   r!   rt   )r   r   r   r!   )r!   r   
lambda_key)rt   r   r!   r   r   )r!   r   r   *   seedN)mathr   r
   importorskipr   r   rV   add_edges_fromrandom_spanning_treeutilsr   r-   )r   gammar'   r7   r8   solution_edgessolutionsampled_trees           r   .test_random_spanning_tree_multiplicative_smallr    s     
  
E 	
A 81	

1aCq!f$6
78 >NxxzHN+**1lDL880B0BCCCr   c            
         ddl m}  ddlm} t	        j
                  d       t	        j
                  d      }ddddddd	d
dd	}t        j                         }|D ]$  \  }}|j                  || | |||f                & d}i }t        j                  |      D ].  }	d}
|	j                  d      D ]  \  }}}|
|z  }
 |
||	<   ||
z  }0 t        |      dk(  sJ d}i }|D ]  }	||	   |z  |z  ||	<   d||	<     |d      }t        |      D ]{  }t        j                  |d|      }t        j                  |      sJ |D ]E  }	t        j                  j!                  |	j                  |j                        s8||	xx   dz  cc<    { } |j#                  t%        |j'                               t%        |j'                                     \  }}|dk  rJ y)zJ
    Sample many trees from the distribution created in the last test
    r   r   Randomnumpyscipy.statsr   r   r   r   r   r   r   r   r   r   rj   K   i  %   r   皙?N)r   r   r   r  r
   r   r   r   rV   r   r-   lenru   r   r   r   r   	chisquarerX   values)r   r  statsr   r'   r7   r8   total_weighttree_expectedtr%   r9   sample_sizetree_actualrng_r  ps                     r   .test_random_spanning_tree_multiplicative_larger  *  s
   
 
 .E 
E 	
A 81	

1aCq!f$6
78 LM$$Q' wwLw1 	GAq!aKF	!a }### KK )!,|;{JaA *C; ..q,SIzz,''' 	Axx##AGG\-?-?@A!#		" ??4 2 2 45tM<P<P<R7STDAq 4x<xr   c            
         t        j                  d       dddddddddd	} t        j                         }| D ]  \  }}|j	                  ||| ||f            g d	}t        j                         }|j                  |       t        j                  |d
dd      }t        j                  j                  |j                  |j                        sJ y)zA
    Sample a single spanning tree from the additive method.
    r   r   r   r   r!   r   r   rR   )r   r   rt   r   )r   r   r%   Fr	  )r%   multiplicativer   N)
r
   r   r   r   rV   r   r   r   r   r-   )r-   r'   r7   r8   r   r   r  s          r   (test_random_spanning_tree_additive_smallr    s       
E 	
A /1	

1aq!f
./ >NxxzHN+**	(5rL 880B0BCCCr   c            
         ddl m}  t        j                  d       t        j                  d      }dddddddd	dd
	}t	        j
                         }|D ]  \  }}|j                  |||||f            d}i }t	        j                  |      D ].  }d}	|j                  d      D ]  \  }}}
|	|
z  }	 |	||<   ||	z  }0 t        |      dk(  sJ d}i }|D ]  }||   |z  |z  ||<   d||<     | d      }t        |      D ]|  }t	        j                  |dd|      }t	        j                  |      sJ |D ]E  }t        j                  j                  |j                  |j                        s8||xx   dz  cc<    | ~ |j                  t!        |j#                               t!        |j#                                     \  }}|dk  rJ y)z>
    Sample many spanning trees from the additive method.
    r   r  r  r  r   r   r   r!   r   r   rR   r%   rj   r  i  r	  F)r  r   r
  N)r   r  r
   r   r   r   rV   r   r-   r  ru   r   r   r   r   r  rX   r  )r  r  r-   r'   r7   r8   r  r  r  r%   r9   r  r  r  r  r  r  s                    r   (test_random_spanning_tree_additive_larger    s	   
 
 .E 
E 	
A /1	

1aq!f
./ LM$$Q' wwHw- 	GAq!aKF	!a }### KK )!,|;{JaA *C; 	..xC
 zz,''' 	Axx##AGG\-?-?@A!#		& ??4 2 2 45tM<P<P<R7STDAq 4x<xr   c                      t        j                         } t         j                  j                  |       }t	        |j
                        dk(  sJ t	        |j                        dk(  sJ y )Nr   )r   r   r   r   r  nodesr-   r'   rsts     r   %test_random_spanning_tree_empty_graphr!    sM    

A
''
&
&q
)Csyy>Qsyy>Qr   c                      t        j                         } | j                  d       t         j                  j	                  |       }t        |j                        dk(  sJ t        |j                        dk(  sJ y Nr   r   )r   r   rf   r   r   r  r  r-   r  s     r   +test_random_spanning_tree_single_node_graphr$    sX    

AJJqM
''
&
&q
)Csyy>Qsyy>Qr   c                     t        j                         } | j                  d       | j                  dd       t         j                  j                  |       }t        |j                        dk(  sJ t        |j                        dk(  sJ y r#  )	r   r   rf   rV   r   r   r  r  r-   r  s     r   *test_random_spanning_tree_single_node_loopr&    sf    

AJJqMJJq!
''
&
&q
)Csyy>Qsyy>Q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y)TestNumberSpanningTreesc                 X    t        j                  d      at        j                  d      }y )Nr  r   )r
   r   np)clssps     r   setup_classz#TestNumberSpanningTrees.setup_class  s$       )  )r   c                     t        j                  d      }t        j                  t        j                  |      d      sJ y )Nr   r   )r   ry   r*  isclosenumber_of_spanning_treesr+   r'   s     r   test_nst_disconnectedz-TestNumberSpanningTrees.test_nst_disconnected$  /    NN1zz"55a8!<<<r   c                     t        j                         }t        j                  t         j                        5  t        j
                  |       d d d        y # 1 sw Y   y xY wr1   )r   r   r
   r   NetworkXPointlessConceptr0  r1  s     r   test_nst_no_nodesz)TestNumberSpanningTrees.test_nst_no_nodes(  sB    HHJ]]2667 	+''*	+ 	+ 	+s   AA c                 T   t        j                         }|j                  ddd       |j                  ddd       |j                  ddd       t        j	                  t        j
                  |      d      sJ t        j	                  t        j
                  |d      d      sJ y )Nr   r   rR   r   r%   r   r   r   rV   r*  r/  r0  r1  s     r   test_nst_weightz'TestNumberSpanningTrees.test_nst_weight-  s    HHJ	

1a
"	

1a
"	

1a
"zz"55a8!<<<zz"55aI1MMMr   c                 T   t        j                         }|j                  ddd       |j                  ddd       |j                  ddd       t        j	                  t        j
                  |      d      sJ t        j	                  t        j
                  |d      d      sJ y )Nr   r   rR   r   r%   r8  r1  s     r   test_nst_negative_weightz0TestNumberSpanningTrees.test_nst_negative_weight7  s    HHJ	

1a
"	

1a
#	

1a
#zz"55a8!<<<zz"55aI2NNNr   c                     t        j                  d      }|j                  dd       t        j	                  t        j
                  |      d      sJ y )Nr   r   )r   complete_graphrV   r*  r/  r0  r1  s     r   test_nst_selfloopz)TestNumberSpanningTrees.test_nst_selfloopA  s?    a 	

1azz"55a8!<<<r   c                    t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       t        j	                  t        j
                  |      d      sJ y )Nr   r   r   r   )r   r\   rV   r*  r/  r0  r1  s     r   test_nst_multigraphz+TestNumberSpanningTrees.test_nst_multigraphG  sd    MMO	

1a	

1a	

1a	

1azz"55a8!<<<r   c                     d}t        j                  |      }t        j                  t        j                  |      ||dz
  z        sJ y )Nr   r   )r   r?  r*  r/  r0  )r+   Nr'   s      r   test_nst_complete_graphz/TestNumberSpanningTrees.test_nst_complete_graphO  s>    a zz"55a8!A,GGGr   c                     t        j                  d      }t        j                  t        j                  |      d      sJ y )Nr   r   )r   
path_graphr*  r/  r0  r1  s     r   test_nst_path_graphz+TestNumberSpanningTrees.test_nst_path_graphU  s/    MM!zz"55a8!<<<r   c                     t        j                  d      }t        j                  t        j                  |      d      sJ y )Nr   )r   cycle_graphr*  r/  r0  r1  s     r   test_nst_cycle_graphz,TestNumberSpanningTrees.test_nst_cycle_graphY  r3  r   c                     t        j                  dt         j                        }t        j                  t         j
                        5  t        j                  |       d d d        y # 1 sw Y   y xY w)Nr   create_usingr   ry   MultiDiGraphr
   r   NetworkXErrorr0  r1  s     r   test_nst_directed_norootz0TestNumberSpanningTrees.test_nst_directed_noroot]  sK    NN12??;]]2++, 	+''*	+ 	+ 	+s   	A((A1c                     t        j                  dt         j                        }t        j                  t         j
                        5  t        j                  |d       d d d        y # 1 sw Y   y xY w)Nr   rM  r   rootrO  r1  s     r    test_nst_directed_root_not_existz8TestNumberSpanningTrees.test_nst_directed_root_not_existb  sM    NN12??;]]2++, 	4''3	4 	4 	4s   	A**A3c                     t        j                         }|j                  dd       |j                  dd       t        j	                  t        j
                  |d      d      sJ y )Nr   r   r   r!   rT  r   )r   DiGraphrV   r*  r/  r0  r1  s     r   $test_nst_directed_not_weak_connectedz<TestNumberSpanningTrees.test_nst_directed_not_weak_connectedg  sJ    JJL	

1a	

1azz"55aa@!DDDr   c                     t        j                         }t        j                  d|      }t        j	                  t        j
                  |d      d      sJ y )Nr   r   rT  r   )r   rX  rJ  r*  r/  r0  r1  s     r   test_nst_directed_cycle_graphz5TestNumberSpanningTrees.test_nst_directed_cycle_graphm  s>    JJLNN1a zz"55aa@!DDDr   c                     t        j                         }t        j                  d|      }t        j	                  t        j
                  |d      d      sJ y )Nr   r   rT  iA  )r   rX  r?  r*  r/  r0  r1  s     r    test_nst_directed_complete_graphz8TestNumberSpanningTrees.test_nst_directed_complete_graphr  s@    JJLa#zz"55aa@$GGGr   c                     t        j                         }t        j                  d|      }|j                  dd       t        j                  t        j                  |d      d      sJ y Nr   r   r   r   rT  r   rP  rJ  rV   r*  r/  r0  r1  s     r   test_nst_directed_multiz/TestNumberSpanningTrees.test_nst_directed_multiw  M    OONN1a 	

1azz"55aa@!DDDr   c                     t        j                         }t        j                  d|      }|j                  dd       t        j                  t        j                  |d      d      sJ y )Nr   r   r   rT  r`  r1  s     r   test_nst_directed_selfloopz2TestNumberSpanningTrees.test_nst_directed_selfloop}  rb  r   c                     t        j                         }t        j                  d|      }|j                  dd       t        j                  t        j                  |d      d      sJ y r_  )r   rP  rJ  remove_edger*  r/  r0  r1  s     r    test_nst_directed_weak_connectedz8TestNumberSpanningTrees.test_nst_directed_weak_connected  sM    OONN1a 	azz"55aa@!DDDr   c                    t        j                         }|j                  ddd       |j                  ddd       |j                  ddd       t        j                  |dd      }t        j                  |d      sJ t        j                  |dd      }t        j                  |d      sJ t        j                  |dd      }t        j                  |d      sJ y )	Nr   r   rR   r   r%   )rU  r%   r   r   )r   rX  rV   r0  r*  r/  )r+   r'   Nsts      r   test_nst_directed_weightedz2TestNumberSpanningTrees.test_nst_directed_weighted  s     JJL	

1a
"	

1a
"	

1a
"))!!HEzz#q!!!))!!HEzz#q!!!))!!HEzz#q!!!r   N)r   r   r   classmethodr-  r2  r6  r9  r=  r@  rB  rE  rH  rK  rR  rV  rY  r[  r]  ra  rd  rg  rj  r   r   r   r(  r(    sw    * *
=+
NO==H==+
4
EE
H
EEE"r   r(  )r   r
   networkxr   networkx.utilsr   r   r   r   r   r   r   r   r   r   r  markslowr  r  r  r!  r$  r&  r(  r   r   r   <module>rp     s    D   3BI@ I@XC- C$;7 ;4+
' +
\2F$ 2FjZ Zz; ;|DD X XvDD Y Yxy" y"r   