a
    hg:                     @   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ejddeedd gf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   O/var/www/auris/lib/python3.9/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>       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J t | t | ks8J d S )N)sortednodesr    )r   r   r   r   r   r   assert_equal   s    z"TestConvertNumpyArray.assert_equalc                 C   sf   |  dksJ tj||d}| || tj||d}| || td||}| || d S )Nr   r
   )sumr   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   s,   t g dg d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 g d}tjtjd||j	  dd tj||d W d	   n1 s0    Y  d	S )
z6Conversion from graph to array to graph with nodelist.r   r	   nodelistr   )r   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   r   z<TestConvertNumpyArray.test_weight_keyword.<locals>.<genexpr>r	   r   rE   rC   rD   rF   )	r   r   add_edges_fromranger   r6   r/   Z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s4J t dggt}t|}t|d d d tksnJ t dggt}t|}t|d d d tksJ t dggt	}t|}t|d d d t	ksJ t dggt
}t|}t|d d d t
ksJ t dggt}tttj| t g dg dgg dg dgg}tjtjd|j d t|}W d    n1 s0    Y  d S )Nr+   r   rE   )r+   r+   r+   zInput array must be 2D, not r>   )r/   r0   r   r'   typeintZ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sHJ t|d d d tksdJ |d d d dks|J |d d d dksJ d S )NrE   cost)      ?r,   dtyper   r,   rW   )rN   rM   r/   r0   r   r'   rL   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 }g d}|dd |D  |jdddd tj|dtjd}t||sjJ tj|d	tjd}t||sJ g d
}t }|dd |D  tj|dtjd}t||sJ t }|j	t
|dd d|d d d d< tj|d	tjd}t||sJ dS )zTests 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>   r   zNTestConvertNumpyArray.test_from_numpy_array_parallel_edges.<locals>.<listcomp>rH   T)Zparallel_edgesr   F)r]   r^   r_   r+   r+   rb   c                 S   s   g | ]\}}||d fqS r`   r   r   r   r   r   ra      r   r   rE   N)r/   r0   r   r   r   add_edger'   r   MultiDiGraphrI   set)r   r)   expectedr    actualr   r   r   $test_from_numpy_array_parallel_edges   s.    z:TestConvertNumpyArray.test_from_numpy_array_parallel_edgesr[   N)rE   Zf8)colori1c                 C   sT   t jddgddgg|d}tj|d d}d|jd vs:J t|jd dksPJ d S )Nr   r+   rX   	edge_attrrE   r^   )r/   r0   r   r'   r    lenrZ   r   r   r   "test_from_numpy_array_no_edge_attr   s    z8TestConvertNumpyArray.test_from_numpy_array_no_edge_attrc                 C   sj   t ddgddgg}tj|tjd d}tdd |d d  D sJJ t|d d d dksfJ d S )Nr   r,   )r   rl   c                 s   s   | ]\}}d |vV  qdS )rE   Nr   )r   _er   r   r   r      r   zUTestConvertNumpyArray.test_from_numpy_array_multiedge_no_edge_attr.<locals>.<genexpr>r+   )r/   r0   r   r'   rd   allitemsrm   r   r)   r!   r   r   r   ,test_from_numpy_array_multiedge_no_edge_attr   s    "zBTestConvertNumpyArray.test_from_numpy_array_multiedge_no_edge_attrc                 C   sP   t ddgddgg}tj|dd}d|jd vs6J |jd d dksLJ d S )Nr   r,   r	   rV   rk   rE   r^   )r/   r0   r   r'   r    rs   r   r   r   &test_from_numpy_array_custom_edge_attr   s    z<TestConvertNumpyArray.test_from_numpy_array_custom_edge_attrc                 C   sP   t ddgddgg}tj|tjd}t }|jdddd t||sLJ dS )zTests 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'   
MultiGraphrc   r   )r   r)   r!   rf   r   r   r   test_symmetric   s
    z$TestConvertNumpyArray.test_symmetricc                 C   s*   t d}t j|td}|jtks&J dS zTest that setting dtype int actually gives an integer array.

        For more information, see GitHub pull request #1363.

        r	   rX   N)r   complete_graphr6   rM   rY   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,J dS rx   )r   rv   ry   r6   rM   rY   rz   r   r   r   test_dtype_int_multigraph   s    z/TestConvertNumpyArray.test_dtype_int_multigraph)__name__
__module____qualname__r   r   r%   r*   r5   r7   r8   r9   r:   rB   rK   rU   r\   rh   r1   markparametrizerM   r/   rY   rn   rt   ru   rw   r{   r|   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   rv   rc   )r!   r   r   r   multigraph_test_graph   s    r   )operatorrf   M   r   r   c                 C   s"   t j| |d}|d |ksJ d S )N)multigraph_weightr_   )r   r6   )r   r   rf   r)   r   r   r   test_numpy_multigraph   s    r   c                 C   sH   | }|j dddd tj|ddgd}|jdks4J |d d	ksDJ d S )
Nr   r+   r	   rH   r,   r;   )r,   r,   r_   r   )rc   r   r6   shape)r   r!   r)   r   r   r   'test_to_numpy_array_multigraph_nodelist   s
    r   zG, expected      ?       @rX   c                 C   s.   | j dddd tj| td}t|| d S )Nr   r+   r   rH   rX   )rc   r   r6   rQ   nptassert_array_equal)r!   rf   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   rX   )
r   r   rc   r6   rR   r/   r0   r   r   to_undirected)r!   wr)   rf   r   r   r   %test_to_numpy_array_arbitrary_weights  s    r   zfunc, expectedr=   r      gUUUUUU@r,   c                 C   s   t  }g d}|D ]}|jdd|d qt j|| td}t|d|gddggsVJ t j| | td}t|d|g|dggsJ dS )z6Test various functions for reducing multiedge weights.)r=   r,   g      $@r   r+   rH   )r   rY   N)r   rd   rc   r6   rN   r/   Zallcloser   )funcrf   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 )zWhen `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   rV   rE   rV   NrY   rE   rX   )	rc   r/   rY   rM   r   r6   Zasarrayr   r   )r!   rf   rY   r)   r   r   r   6test_to_numpy_array_structured_dtype_attrs_from_fields&  s
    
r   c                  C   s^   t d} tdtfg}t j| |d d}tjg dg dg dgtd}t|d | d S )Nr	   rE   r   )r   r+   r   )r+   r   r+   rX   )	r   r   r/   rY   rN   r6   r0   r   r   )r!   rY   r)   rf   r   r   r   8test_to_numpy_array_structured_dtype_single_attr_default7  s
    
 r   )
field_nameexpected_attr_val)rE   r+   )rV   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	   )rV   r   rX   )
r   r   rc   r/   rY   rN   r6   r0   r   r   )r   r   r!   rY   r)   rf   r   r   r   0test_to_numpy_array_structured_dtype_single_attr?  s    r   
graph_typeedger^   r+   rE   r-   )rE   flowg       @i)rE   rV   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   rV   r   r   )r/   rY   rN   r   r6   namesr   r   )r   r   r!   rY   r)   attrrf   r   r   r   4test_to_numpy_array_structured_dtype_multiple_fieldsO  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   rV   rY   rE   nonedge)
rc   r/   rY   rN   r   r6   nanr   r   r   )r!   rY   r)   r   rf   r   r   r   3test_to_numpy_array_structured_dtype_scalar_nonedgeb  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   rV   rX   Nr   )rc   r/   rY   rN   r0   infr   r6   r   r   r   )r!   rY   Znonedgesr)   r   r   rf   r   r   r   0test_to_numpy_array_structured_dtype_nonedge_aryl  s    
r   c                  C   s   t d} tdtfdtfg}d}tjt|d t j| |d W d   n1 sV0    Y  tjt|d  t j| |dd W d   n1 s0    Y  dS )	zgUsing both a structured dtype (with named fields) and specifying a `weight`
    parameter is ambiguous.r	   rE   rV   z7Specifying `weight` not supported for structured dtypesr>   rX   Nr   )	r   r   r/   rY   rM   r1   r2   
ValueErrorr6   )r!   rY   Zexception_msgr   r   r   7test_to_numpy_array_structured_dtype_with_weight_raisesz  s    
,r   c                 C   sh   t jd| d}tdtfdtfg}tjt jdd  t j||d d W d    n1 sZ0    Y  d S )Nr	   r
   rE   rV   z#Structured arrays are not supportedr>   r   )	r   r   r/   rY   rM   r1   r2   r3   r6   )r   r!   rY   r   r   r   0test_to_numpy_array_structured_multigraph_raises  s    r   ))r1   Zimportorskipr/   r   Znetworkxr   Znetworkx.generators.classicr   r   r   Znetworkx.utilsr   r   Zfixturer   r   r   r&   minmaxr   r   r   r0   rQ   r   r   r   meanZmedianr   r   r   r   r   r   r   r   rv   rd   r   r   r   r   r   <module>   sr   

 Y

  
$


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