U
    ¹mœdo6  ã                   @   sP  d dl Z e  d¡Ze  d¡Zd dlZd dlmZmZm	Z	 d dl
mZ G dd„ dƒZe jdd	„ ƒZe j d
edfedfedff¡dd„ ƒZdd„ Ze j de ¡ ejd dgdd gged�fe ¡ ejd dgd d gged�fg¡dd„ ƒZdd„ Ze j dedfedfedfejdfejdff¡dd „ ƒZe j de ¡ d!d"gd"d!ggfe ¡ d!d"gd!d!ggfg¡d#d$„ ƒZd%d&„ Z e j d'd(d)g¡d*d+„ ƒZ!e j d,ejejf¡e j d-d.d d/d0difd d/d1d2d3œfd d/d4dd5d6œfg¡d7d8„ ƒƒZ"e j d9e ¡ e ¡ f¡d:d;„ ƒZ#e j d9e ¡ e ¡ f¡d<d=„ ƒZ$d>d?„ Z%e j d,ej&ej'f¡d@dA„ ƒZ(dS )Bé    NÚnumpyznumpy.testing)Úbarbell_graphÚcycle_graphÚ
path_graph)Úgraphs_equalc                   @   s”   e 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d„ Zdd„ Zdd „ Zd!d"„ Zd#S )$ÚTestConvertNumpyArrayc                 C   s@   t ddƒ| _tdtjd�| _|  t ¡ ¡| _|  t ¡ ¡| _	d S )Né
   é   ©Úcreate_using)
r   ÚG1r   ÚnxÚDiGraphÚG2Úcreate_weightedÚGraphÚG3ÚG4)Úself© r   úZ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/networkx/tests/test_convert_numpy.pyÚsetup_method   s    z"TestConvertNumpyArray.setup_methodc                 C   s.   t dƒ}| |¡ | dd„ | ¡ D ƒ¡ |S )Né   c                 s   s    | ]\}}||d | fV  qdS )r   Nr   ©Ú.0ÚuÚvr   r   r   Ú	<genexpr>   s     z8TestConvertNumpyArray.create_weighted.<locals>.<genexpr>)r   Zadd_nodes_fromÚadd_weighted_edges_fromÚedges)r   ÚGÚgr   r   r   r      s    
z%TestConvertNumpyArray.create_weightedc                 C   s<   t | ¡ ƒt | ¡ ƒkst‚t | ¡ ƒt | ¡ ƒks8t‚d S )N)ÚsortedÚnodesÚAssertionErrorr   )r   r   r   r   r   r   Úassert_equal   s    z"TestConvertNumpyArray.assert_equalc                 C   sf   |  ¡ dkst‚tj||d�}|  ||¡ tj||d�}|  ||¡ t d|¡ |¡}|  ||¡ d S )Nr   r
   )Úsumr$   r   Úfrom_numpy_arrayr%   Zto_networkx_graphZempty_graphÚ	__class__)r   r    ÚAr   ZGGZGWZGIr   r   r   Úidentity_conversion   s    z)TestConvertNumpyArray.identity_conversionc                 C   s0   t  dddgdddgg¡}t tjtj|¡ dS )z!Conversion from non-square array.é   é   r	   r   é   é   N)ÚnpÚarrayÚpytestÚraisesr   ÚNetworkXErrorr'   ©r   r)   r   r   r   Ú
test_shape%   s    z TestConvertNumpyArray.test_shapec                 C   s$   t  | j¡}|  | j|t  ¡ ¡ dS )z(Conversion from graph to array to graph.N)r   Úto_numpy_arrayr   r*   r   r4   r   r   r   Útest_identity_graph_array*   s    z/TestConvertNumpyArray.test_identity_graph_arrayc                 C   s$   t  | j¡}|  | j|t  ¡ ¡ dS )z,Conversion from digraph to array to digraph.N)r   r6   r   r*   r   r4   r   r   r   Útest_identity_digraph_array/   s    z1TestConvertNumpyArray.test_identity_digraph_arrayc                 C   s$   t  | j¡}|  | j|t  ¡ ¡ dS )z:Conversion from weighted graph to array to weighted graph.N)r   r6   r   r*   r   r4   r   r   r   Ú"test_identity_weighted_graph_array4   s    z8TestConvertNumpyArray.test_identity_weighted_graph_arrayc                 C   s$   t  | j¡}|  | j|t  ¡ ¡ dS )z>Conversion from weighted digraph to array to weighted digraph.N)r   r6   r   r*   r   r4   r   r   r   Ú$test_identity_weighted_digraph_array9   s    z:TestConvertNumpyArray.test_identity_weighted_digraph_arrayc              	   C   s¦   t dƒ}t dƒ}t|ƒ}tj||d�}t |¡}|  ||¡ ||d g7 }tjtjtj||d� dddg}tjtjd||j	 › d�d	�� tj||d� W 5 Q R X d
S )z6Conversion from graph to array to graph with nodelist.r   r	   ©Únodelistr   éÿÿÿÿr+   zNodes z in nodelist is not in G©ÚmatchN)
r   Úlistr   r6   r   r%   r1   r2   r3   r#   )r   ÚP4ZP3r<   r)   ZGAr   r   r   Útest_nodelist>   s    

þz#TestConvertNumpyArray.test_nodelistc                 C   s‚   t  ¡ }| dd„ tdƒD ƒ¡ tdƒ}t  |¡}tj |t j|d d�¡ tj d| t  |¡¡ tj d| t j|dd�¡ d S )	Nc                 s   s"   | ]}||d  dddœfV  qdS )r+   ç      à?ç333333Ó?)ÚweightÚotherNr   )r   Únr   r   r   r   U   s     z<TestConvertNumpyArray.test_weight_keyword.<locals>.<genexpr>r	   r   ©rE   rC   rD   rF   )	r   r   Úadd_edges_fromÚranger   r6   r/   Útestingr%   )r   ZWP4rA   r)   r   r   r   Útest_weight_keywordS   s    
z)TestConvertNumpyArray.test_weight_keywordc              	   C   s¢  t  dgg¡}t |¡}t|d d d ƒtks4t‚t  dgg¡ t¡}t |¡}t|d d d ƒtksnt‚t  dgg¡ t	¡}t |¡}t|d d d ƒt	ks¨t‚t  dgg¡ t
¡}t |¡}t|d d d ƒt
ksât‚t  dgg¡ t¡}t |¡}t|d d d ƒtk�st‚t  dgg¡ t¡}t ttj|¡ t  dddgdddggdddgdddggg¡}tjtjd|j› �d�� t |¡}W 5 Q R X d S )Nr+   r   rE   zInput array must be 2D, not r>   )r/   r0   r   r'   ÚtypeÚintr$   ZastypeÚfloatÚstrÚboolÚcomplexÚobjectr1   r2   Ú	TypeErrorr3   Úndim)r   r)   r    r!   r   r   r   Útest_from_numpy_array_type\   s.    




. 
ÿz0TestConvertNumpyArray.test_from_numpy_array_typec                 C   s˜   dt fdtfg}tjdgg|d�}t |¡}t|d d d ƒt ksHt‚t|d d d ƒtksdt‚|d d d dks|t‚|d d d dks”t‚d S )NrE   Úcost)ç      ð?r,   ©Údtyper   r,   rX   )rO   rN   r/   r0   r   r'   rM   r$   )r   Údtr)   r    r   r   r   Útest_from_numpy_array_dtypez   s    
z1TestConvertNumpyArray.test_from_numpy_array_dtypec                 C   s*  t  ddgddgg¡}t ¡ }dddg}| dd„ |D ƒ¡ |jdddd� tj|d	tjd
�}t||ƒslt‚tj|dtjd
�}t||ƒsŒt‚dddddg}t 	¡ }| dd„ |D ƒ¡ tj|d	tj	d
�}t||ƒsÖt‚t 	¡ }|j
t|ƒdd� d|d d d d< tj|dtj	d
�}t||ƒ�s&t‚dS )zªTests that the :func:`networkx.from_numpy_array` function
        interprets integer weights as the number of parallel edges when
        creating a multigraph.

        r+   r,   ©r   r   ©r   r+   ©r+   r   c                 S   s   g | ]\}}||d f‘qS ©r+   r   r   r   r   r   Ú
<listcomp>Ž   s     zNTestConvertNumpyArray.test_from_numpy_array_parallel_edges.<locals>.<listcomp>rH   T)Zparallel_edgesr   F)r+   r+   c                 S   s   g | ]\}}||d f‘qS r`   r   r   r   r   r   ra   ™   s     r   rE   N)r/   r0   r   r   r   Úadd_edger'   r   r$   ÚMultiDiGraphrI   Úset)r   r)   Úexpectedr   Úactualr   r   r   Ú$test_from_numpy_array_parallel_edgesƒ   s6    
  ÿ  ÿz:TestConvertNumpyArray.test_from_numpy_array_parallel_edgesc                 C   sP   t  ddgddgg¡}tj|tjd�}t ¡ }|jdddd� t||ƒsLt‚dS )z’Tests that a symmetric array has edges added only once to an
        undirected multigraph when using :func:`networkx.from_numpy_array`.

        r   r+   r
   rH   N)r/   r0   r   r'   Ú
MultiGraphrb   r   r$   )r   r)   r    re   r   r   r   Útest_symmetric§   s
    z$TestConvertNumpyArray.test_symmetricc                 C   s*   t  d¡}t j|td�}|jtks&t‚dS ©z„Test that setting dtype int actually gives an integer array.

        For more information, see GitHub pull request #1363.

        r	   rY   N)r   Úcomplete_graphr6   rN   rZ   r$   ©r   r    r)   r   r   r   Útest_dtype_int_graph²   s    
z*TestConvertNumpyArray.test_dtype_int_graphc                 C   s0   t  t  d¡¡}t j|td�}|jtks,t‚dS rj   )r   rh   rk   r6   rN   rZ   r$   rl   r   r   r   Útest_dtype_int_multigraph¼   s    z/TestConvertNumpyArray.test_dtype_int_multigraphN)Ú__name__Ú
__module__Ú__qualname__r   r   r%   r*   r5   r7   r8   r9   r:   rB   rL   rV   r\   rg   ri   rm   rn   r   r   r   r   r      s"   			$
r   c                  C   s,   t  ¡ } | jdddd� | jdddd� | S )Nr+   r,   é   rH   éF   )r   rh   rb   )r    r   r   r   Úmultigraph_test_graphÇ   s    rt   )Úoperatorre   éM   rr   rs   c                 C   s"   t j| |d�}|d |kst‚d S )N)Úmultigraph_weightr_   )r   r6   r$   )rt   ru   re   r)   r   r   r   Útest_numpy_multigraphÏ   s    rx   c                 C   sH   | }|j dddd� tj|ddgd�}|jdks4t‚|d d	ksDt‚d S )
Nr   r+   r	   rH   r,   r;   )r,   r,   r_   rv   )rb   r   r6   Úshaper$   )rt   r    r)   r   r   r   Ú'test_to_numpy_array_multigraph_nodelistÕ   s
    rz   zG, expectedù      ð?       @rY   c                 C   s.   | j dddd� tj| td�}t ||¡ d S )Nr   r+   r{   rH   rY   )rb   r   r6   rR   ÚnptÚassert_array_equal)r    re   r)   r   r   r   Ú#test_to_numpy_array_complex_weightsÝ   s    r~   c                  C   sŒ   t  ¡ } d}| jdddd� t j| td�}tjd|gddggtd�}t ||¡ t j|  	¡ td�}tjd|g|dggtd�}t ||¡ d S )Nl   F}ÿÿÿr   r+   rH   rY   )
r   r   rb   r6   rS   r/   r0   r|   r}   Úto_undirected)r    Úwr)   re   r   r   r   Ú%test_to_numpy_array_arbitrary_weightsê   s    r�   zfunc, expectedr=   r   é   gUUUUUU@r,   c                 C   sŒ   t  ¡ }dddg}|D ]}|jdd|d� qt j|| td�}t |d|gddgg¡sXt‚t j| ¡ | td�}t |d|g|dgg¡sˆt‚dS )	z6Test various functions for reducing multiedge weights.r=   r,   g      $@r   r+   rH   )rw   rZ   N)	r   rc   rb   r6   rO   r/   Zallcloser$   r   )Úfuncre   r    Úweightsr€   r)   r   r   r   Ú)test_to_numpy_array_multiweight_reductionø   s    
r…   r]   )r   r-   c                 C   sV   | j ddddd� t dtfdtfg¡}tj| |dd	�}tj||d
�}t ||¡ dS )zƒWhen `dtype` is structured (i.e. has names) and `weight` is None, use
    the named fields of the dtype to look up edge attributes.r   r+   r   g      @)rE   rW   rE   rW   N©rZ   rE   rY   )	rb   r/   rZ   rN   r   r6   Zasarrayr|   r}   )r    re   rZ   r)   r   r   r   Ú6test_to_numpy_array_structured_dtype_attrs_from_fields
  s
    
r‡   c                  C   sd   t  d¡} t dtfg¡}t j| |d d�}tjdddgdddgdddggtd�}t |d |¡ d S )Nr	   rE   r†   r   r+   rY   )	r   r   r/   rZ   rO   r6   r0   r|   r}   )r    rZ   r)   re   r   r   r   Ú8test_to_numpy_array_structured_dtype_single_attr_default  s
    
&rˆ   )Ú
field_nameÚexpected_attr_val)rE   r+   )rW   r	   c                 C   sf   t  ¡ }|jdddd� t | tfg¡}t j||d d�}tjd|g|dggtd�}t 	||  |¡ d S )Nr   r+   r	   )rW   r†   rY   )
r   r   rb   r/   rZ   rO   r6   r0   r|   r}   )r‰   rŠ   r    rZ   r)   re   r   r   r   Ú0test_to_numpy_array_structured_dtype_single_attr#  s    r‹   Ú
graph_typeÚedger^   r+   rE   r-   éüÿÿÿ)rE   Úflowg       @iÓÿÿÿ)rE   rW   r�   c                 C   sf   | |gƒ}t  dtfdtfdtfg¡}tj||d d�}|jD ]$}tj|t|d�}t || |¡ q<d S )NrE   rW   r�   r†   )r/   rZ   rO   r   r6   Únamesr|   r}   )rŒ   r�   r    rZ   r)   Úattrre   r   r   r   Ú4test_to_numpy_array_structured_dtype_multiple_fields3  s    

r’   r    c                 C   sn   | j dddd� t dtfdtfg¡}tj| |d tjd�}|jD ](}tj| t|tjd�}t 	|| |¡ q@d S )Nr   r+   r   rH   rE   rW   ©rZ   rE   Únonedge)
rb   r/   rZ   rO   r   r6   Únanr�   r|   r}   )r    rZ   r)   r‘   re   r   r   r   Ú3test_to_numpy_array_structured_dtype_scalar_nonedgeF  s    
r–   c                 C   sˆ   | j dddd� t dtfdtfg¡}tjdtjfg|d�}tj| |d|d	�}|jD ].}|| }tj| t||d	�}t	 
|| |¡ qTdS )
z[Similar to the scalar case, except has a different non-edge value for
    each named field.r   r+   r   rH   rE   rW   rY   Nr“   )rb   r/   rZ   rO   r0   Úinfr   r6   r�   r|   r}   )r    rZ   Znonedgesr)   r‘   r”   re   r   r   r   Ú0test_to_numpy_array_structured_dtype_nonedge_aryP  s    
r˜   c               	   C   sz   t  d¡} t dtfdtfg¡}d}tjt|d�� t j| |d� W 5 Q R X tjt|d�� t j| |dd� W 5 Q R X dS )	zgUsing both a structured dtype (with named fields) and specifying a `weight`
    parameter is ambiguous.r	   rE   rW   z7Specifying `weight` not supported for structured dtypesr>   rY   r†   N)	r   r   r/   rZ   rN   r1   r2   Ú
ValueErrorr6   )r    rZ   Zexception_msgr   r   r   Ú7test_to_numpy_array_structured_dtype_with_weight_raises^  s    
rš   c              	   C   sT   t jd| d�}t dtfdtfg¡}tjt jdd�� t j||d d� W 5 Q R X d S )Nr	   r
   rE   rW   z#Structured arrays are not supportedr>   r†   )	r   r   r/   rZ   rN   r1   r2   r3   r6   )rŒ   r    rZ   r   r   r   Ú0test_to_numpy_array_structured_multigraph_raisesj  s    r›   ))r1   Zimportorskipr/   r|   Znetworkxr   Znetworkx.generators.classicr   r   r   Znetworkx.utilsr   r   Zfixturert   ÚmarkZparametrizer&   ÚminÚmaxrx   rz   r   r0   rR   r   r~   r�   ZmeanZmedianr…   r‡   rˆ   r‹   r’   r–   r˜   rš   rh   rc   r›   r   r   r   r   Ú<module>   sr   

 =

  þþ
$þ
þþ

þþ
	üþ		
	
