o
    3ήcS                     @   s   d Z ddlZddlZddlmZmZ dd ZG dd dZG dd	 d	eZ	G d
d deZ
G dd de
ZG dd de
ZG dd dZdd Zejjdd Zdd Zejjdd ZdS )z>Unit tests for the :mod:`networkx.algorithms.tree.mst` module.    N)edges_equalnodes_equalc                   C   sB   t t tjt dd W d    d S 1 sw   Y  d S )Nrandom	algorithm)pytestraises
ValueErrornxminimum_spanning_treeGraph r   r   N/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/tree/tests/test_mst.pytest_unknown_algorithm	   s   "r   c                   @   sx   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )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              	   C   s   | j | _g d}t | _| 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| _dS )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edgesr   r   r   setup_method   s$   
	
z(MinimumSpanningTreeTestBase.setup_methodc                 C   8   t j| j| jd}tdd |D }t|| jsJ d S )Nr   c                 s   ,    | ]\}}}t ||t|||fV  qd S Nminmax.0uvdr   r   r   	<genexpr>D      * zAMinimumSpanningTreeTestBase.test_minimum_edges.<locals>.<genexpr>)r
   minimum_spanning_edgesr   r   sortedr   r!   r#   r%   actualr   r   r   test_minimum_edges@      z.MinimumSpanningTreeTestBase.test_minimum_edgesc                 C   r'   )Nr   c                 s   r(   r)   r*   r-   r   r   r   r2   K   r3   zAMinimumSpanningTreeTestBase.test_maximum_edges.<locals>.<genexpr>)r
   maximum_spanning_edgesr   r   r5   r   r"   r6   r   r   r   test_maximum_edgesG   r9   z.MinimumSpanningTreeTestBase.test_maximum_edgesc                 C   sH   t j| j| jdd}tdd |D }dd | jD }t||s"J d S )NFr   datac                 s   (    | ]\}}t ||t||fV  qd S r)   r*   r.   r/   r0   r   r   r   r2   R      & z@MinimumSpanningTreeTestBase.test_without_data.<locals>.<genexpr>c                 S      g | ]	\}}}||fqS r   r   r-   r   r   r   
<listcomp>S       zAMinimumSpanningTreeTestBase.test_without_data.<locals>.<listcomp>)r
   r4   r   r   r5   r!   r   )r#   r%   r7   expectedr   r   r   test_without_dataN   s   z-MinimumSpanningTreeTestBase.test_without_datac                 C   s   | j }|jddtdd tj|| jddd}tdd	 |D }d
d | jD }t||s/J tj|| jddd}t	
t t| W d    n1 sMw   Y  tj|| jdd}t	
t t| W d    d S 1 spw   Y  d S )Nr      nanr   FTr   r=   
ignore_nanc                 s   r>   r)   r*   r?   r   r   r   r2   ]   r@   z?MinimumSpanningTreeTestBase.test_nan_weights.<locals>.<genexpr>c                 S   rA   r   r   r-   r   r   r   rB   ^   rC   z@MinimumSpanningTreeTestBase.test_nan_weights.<locals>.<listcomp>r<   )r   add_edgefloatr
   r4   r   r5   r!   r   r   r   r	   list)r#   r   r%   r7   rD   r   r   r   test_nan_weightsV   s$   



"z,MinimumSpanningTreeTestBase.test_nan_weightsc                 C   s   g d}t  }|dd |D  |jddtdd t j|| jdd	d
}tdd |D }dd | jD }t	||s>J d S )Nr   c                 S   $   g | ]\}}}|d  |d  |fqS r   r   r.   r/   r0   wtr   r   r   rB   {      $ zFMinimumSpanningTreeTestBase.test_nan_weights_order.<locals>.<listcomp>r   r   rG   rH   FTrI   c                 s   r>   r)   r*   r?   r   r   r   r2      r@   zEMinimumSpanningTreeTestBase.test_nan_weights_order.<locals>.<genexpr>c                 S   "   g | ]\}}}|d  |d  fqS rP   r   r-   r   r   r   rB         " )
r
   r   r    rK   rL   r4   r   r5   r!   r   r#   r%   r   r7   shiftr   r   r   test_nan_weights_orderk   s   
z2MinimumSpanningTreeTestBase.test_nan_weights_orderc                 C   sv   g d}t  }|dd |D  |d t j|| jddd}tdd	 |D }d
d | jD }t||s9J d S )Nr   c                 S   rO   rP   r   rQ   r   r   r   rB      rS   zBMinimumSpanningTreeTestBase.test_isolated_node.<locals>.<listcomp>r   FTrI   c                 s   r>   r)   r*   r?   r   r   r   r2      r@   zAMinimumSpanningTreeTestBase.test_isolated_node.<locals>.<genexpr>c                 S   rT   rP   r   r-   r   r   r   rB      rU   )	r
   r   r    add_noder4   r   r5   r!   r   rV   r   r   r   test_isolated_node   s   

z.MinimumSpanningTreeTestBase.test_isolated_nodec                 C   6   t j| j| jd}t|jdd}t|| jsJ d S Nr   Tr=   )r
   r   r   r   r5   r%   r   r!   r#   Tr7   r   r   r   test_minimum_tree      z-MinimumSpanningTreeTestBase.test_minimum_treec                 C   r[   r\   )r
   maximum_spanning_treer   r   r5   r%   r   r"   r^   r   r   r   test_maximum_tree   ra   z-MinimumSpanningTreeTestBase.test_maximum_treec                 C   sn   t ddtddfddtddfg}t j|| jd}tt|ttds(J tt|	 dd	gs5J d S )
Nr   r   rH   r   r   r   r   r   r   r   r   )
r
   r   dictr   r   r   rM   ranger   r%   r#   r   r_   r   r   r   test_disconnected   s   &z-MinimumSpanningTreeTestBase.test_disconnectedc                 C   sH   t d}t j|| jd}tt|ttdsJ | dks"J d S )Nr   r   r   )	r
   empty_graphr   r   r   r5   rM   rg   number_of_edgesrh   r   r   r   test_empty_graph   s   
z,MinimumSpanningTreeTestBase.test_empty_graphc                 C   s   t  }|jdddddd |jdddddd |jdddd	dd d
|jd< t j|| jd}|j|jks7J t||s>J | D ]\}}|j| | |j| | ksVJ qBd S )Nr   r   redr   )r   colordistancer   green
   bluebarfoor   )	r
   r   rK   graphr   r   r   r%   adj)r#   r   r_   r/   r0   r   r   r   test_attributes   s   
"z+MinimumSpanningTreeTestBase.test_attributesc                 C   s   t  }|jddddd |jddddd |jddddd |d t j|| jdd	}tt|tt	d
s:J t
t| ddgsGJ t j|| jdd	}tt|tt	d
s]J t
t| ddgsjJ d S )Nr   r   r   )r   ro   r      r   ro   )r   r   r   r   r   r   r   rd   )r
   r   rK   rY   r   r   r   r5   rM   rg   r   r%   rb   rh   r   r   r   test_weight_attribute   s   
z1MinimumSpanningTreeTestBase.test_weight_attributeN)__name__
__module____qualname____doc__r&   r8   r;   rE   rN   rX   rZ   r`   rc   ri   rl   rw   r{   r   r   r   r   r      s    	(r   c                   @   s   e Zd ZdZdZdd ZdS )TestBoruvkaub   Unit tests for computing a minimum (or maximum) spanning tree
    using Borůvka's algorithm.
    boruvkac                 C   s6   t j| jdd}tdd |D }t|| jsJ dS )u_   Tests that using a Unicode string can correctly indicate
        Borůvka's algorithm.
        u   borůvkar   c                 s   r(   r)   r*   r-   r   r   r   r2      r3   z0TestBoruvka.test_unicode_name.<locals>.<genexpr>N)r
   r4   r   r5   r   r!   r6   r   r   r   test_unicode_name   s   zTestBoruvka.test_unicode_nameN)r|   r}   r~   r   r   r   r   r   r   r   r      s    r   c                   @   s   e Zd Zdd Zdd ZdS )MultigraphMSTTestBasec                 C   Z   t  }|jddddd |jddddd t j}||| jdd}td	gt|s+J d
S )z[Tests that the minimum spanning edges of a multigraph
        preserves edge keys.
        r   r   ar   keyr   bFr<   )r   r   r   N)r
   
MultiGraphrK   r4   r   r   rM   )r#   r   	min_edges	mst_edgesr   r   r   test_multigraph_keys_min      z.MultigraphMSTTestBase.test_multigraph_keys_minc                 C   r   )z[Tests that the maximum spanning edges of a multigraph
        preserves edge keys.
        r   r   r   r   r   r   Fr<   )r   r   r   N)r
   r   rK   r:   r   r   rM   )r#   r   	max_edgesr   r   r   r   test_multigraph_keys_max   r   z.MultigraphMSTTestBase.test_multigraph_keys_maxN)r|   r}   r~   r   r   r   r   r   r   r      s    r   c                   @   s   e Zd ZdZdZdS )TestKruskalzaUnit tests for computing a minimum (or maximum) spanning tree
    using Kruskal's algorithm.
    kruskalN)r|   r}   r~   r   r   r   r   r   r   r      s    r   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )TestPrimz^Unit tests for computing a minimum (or maximum) spanning tree
    using Prim's algorithm.
    primc                 C   \   t  }|jddddd |jddddd t j|| jd}tdgt|jd	d
s,J d S )Nr   r   r   r   r   r   r   )r   r   r   r   r]   )r
   r   rK   r   r   r   rM   r%   rh   r   r   r   test_multigraph_keys_tree  
    z"TestPrim.test_multigraph_keys_treec                 C   r   )Nr   r   r   r   r   r   r   )r   r   r   r   r]   )r
   r   rK   rb   r   r   rM   r%   rh   r   r   r   test_multigraph_keys_tree_max  r   z&TestPrim.test_multigraph_keys_tree_maxN)r|   r}   r~   r   r   r   r   r   r   r   r   r     s
    r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	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                 C   s  g d}t  | _| 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| _d S )N))r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   )r
   r   r   r    spanning_trees)r#   r%   r   r   r   r&     sX   

z%TestSpanningTreeIterator.setup_methodc                 C   sF   d}t | jD ]}t|jdd}t|| j| sJ |d7 }qdS )zZ
        Tests that the spanning trees are correctly returned in increasing order
        r   Tr]   r   Nr
   SpanningTreeIteratorr   r5   r%   r   r   r#   
tree_indextreer7   r   r   r   #test_minimum_spanning_tree_iterator_  s   
z<TestSpanningTreeIterator.test_minimum_spanning_tree_iteratorc                 C   sJ   d}t j| jddD ]}t|jdd}t|| j| sJ |d8 }q
dS )zZ
        Tests that the spanning trees are correctly returned in decreasing order
        r   F)minimumTr]   r   Nr   r   r   r   r   #test_maximum_spanning_tree_iteratori  s   
z<TestSpanningTreeIterator.test_maximum_spanning_tree_iteratorN)r|   r}   r~   r   r&   r   r   r   r   r   r   r     s
    A
r   c               
   C   s   ddl m}  td ddddddddd	d
	}t }|D ]\}}|j||| |||f d qg d}t }|| tj|ddd}tj	
|j|jsPJ dS )z@
    Using a fixed seed, sample one tree for repeatability.
    r   expscipyw-!lU??5^IҿDJտ燧W2￩	rd   ry   r   r   rz   )r   r   re   )r   r   r   r   )r   r   
lambda_key)re   r   r   r   r   )r   r   r   *   seedN)mathr   r   importorskipr
   r   rK   add_edges_fromrandom_spanning_treeutilsr   r%   )r   gammar   r/   r0   solution_edgessolutionsampled_treer   r   r   .test_random_spanning_tree_multiplicative_smallt  s(   

r   c               
   C   s  ddl m}  ddlm} td td}ddddddd	d
dd	}t }|D ]\}}|j||| |||f d q(d}i }t	|D ]}	d}
|	j
ddD ]	\}}}|
|9 }
qN|
||	< ||
7 }qDt|dksiJ d}i }|D ]}	||	 | | ||	< d||	< qo|d}t|D ])}tj|d|d}t|sJ |D ]}	tj|	j
|j
r||	  d7  <  nqq|t| t| \}}|dk rJ dS )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   r]   K   i  %   r   皙?N)r   r   r   r   r   r   r
   r   rK   r   r%   lenrg   r   is_treer   r   	chisquarerM   values)r   r   statsr   r   r/   r0   total_weighttree_expectedtr   r1   sample_sizetree_actualrng_r   pr   r   r   .test_random_spanning_tree_multiplicative_large  sV   




 r   c               
   C   s   t d dddddddddd	} t }| D ]\}}|j||| ||f d qg d	}t }|| tj|d
ddd}tj|j	|j	sIJ dS )zA
    Sample a single spanning tree from the additive method.
    r   r   r   r   r   r   r   rH   )ry   rz   re   r   )r   r   r   Fr   )r   multiplicativer   N)
r   r   r
   r   rK   r   r   r   r   r%   )r%   r   r/   r0   r   r   r   r   r   r   (test_random_spanning_tree_additive_small  s*   

r   c               
   C   s  ddl m}  td td}dddddddd	dd
	}t }|D ]\}}|j|||||f d q"d}i }t|D ]}d}	|jddD ]	\}}}
|	|
7 }	qF|	||< ||	7 }q<t	|dksaJ d}i }|D ]}|| | | ||< d||< qg| d}t
|D ]*}tj|dd|d}t|sJ |D ]}tj|j|jr||  d7  <  nqq|t| t| \}}|dk rJ dS )z>
    Sample many spanning trees from the additive method.
    r   r   r   r   r   r   r   r   r   r   rH   r   r]   r   i  r   F)r   r   r   N)r   r   r   r   r
   r   rK   r   r%   r   rg   r   r   r   r   r   rM   r   )r   r   r%   r   r/   r0   r   r   r   r   r1   r   r   r   r   r   r   r   r   r   (test_random_spanning_tree_additive_large  sX   




 r   )r   r   networkxr
   networkx.utilsr   r   r   r   r   r   r   r   r   r   markslowr   r   r   r   r   r   r   <module>   s$     @]"
["