U
    :vfo6                     @   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    NZ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   E/tmp/pip-unpacked-wheel-_lngutwb/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   r3   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   r5   r   r)   r   r3   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   r5   r   r)   r   r3   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   r5   r   r)   r   r3   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   r5   r   r$   r0   r1   r2   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   rD   rB   rC   rE   )	r   r   add_edges_fromranger   r5   r.   Ztestingr$   )r   ZWP4r@   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stt dggt
}t|}t|d d d t
kst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   rD   zInput array must be 2D, not r=   )r.   r/   r   r&   typeintr#   Zastypefloatstrboolcomplexobjectr0   r1   	TypeErrorr2   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std S )NrD   cost)      ?r+   dtyper   r+   rV   )rM   rL   r.   r/   r   r&   rK   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||stdddddg}t	 }|dd |D  tj|d	tj	d
}t||stt	 }|j
t|dd d|d d d d< tj|dtj	d
}t||s&t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>   s     zNTestConvertNumpyArray.test_from_numpy_array_parallel_edges.<locals>.<listcomp>rG   T)Zparallel_edgesr
   F)r*   r*   c                 S   s   g | ]\}}||d fqS r^   r   r   r   r   r   r_      s     r   rD   N)r.   r/   r   r   r   add_edger&   r   r#   MultiDiGraphrH   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 )zTests that a symmetric array has edges added only once to an
        undirected multigraph when using :func:`networkx.from_numpy_array`.

        r   r*   r	   rG   N)r.   r/   r   r&   
MultiGraphr`   r   r#   )r   r(   r   rc   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 zTest that setting dtype int actually gives an integer array.

        For more information, see GitHub pull request #1363.

        r   rW   N)r   complete_graphr5   rL   rX   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 rh   )r   rf   ri   r5   rL   rX   r#   rj   r   r   r   test_dtype_int_multigraph   s    z/TestConvertNumpyArray.test_dtype_int_multigraphN)__name__
__module____qualname__r   r   r$   r)   r4   r6   r7   r8   r9   rA   rJ   rT   rZ   re   rg   rk   rl   r   r   r   r   r      s"   			$
r   c                  C   s,   t  } | jdddd | jdddd | S )Nr*   r+      rG   F   )r   rf   r`   )r   r   r   r   multigraph_test_graph   s    rr   )operatorrc   M   rp   rq   c                 C   s"   t j| |d}|d |kstd S )N)multigraph_weightr]   )r   r5   r#   )rr   rs   rc   r(   r   r   r   test_numpy_multigraph   s    rv   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   rG   r+   r:   )r+   r+   r]   rt   )r`   r   r5   shaper#   )rr   r   r(   r   r   r   'test_to_numpy_array_multigraph_nodelist   s
    rx   zG, expected      ?       @rW   c                 C   s.   | j dddd tj| td}t|| d S )Nr   r*   ry   rG   rW   )r`   r   r5   rP   nptassert_array_equal)r   rc   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*   rG   rW   )
r   r   r`   r5   rQ   r.   r/   rz   r{   to_undirected)r   wr(   rc   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stdS )	z6Test various functions for reducing multiedge weights.r<   r+   g      $@r   r*   rG   )ru   rX   N)	r   ra   r`   r5   rM   r.   Zallcloser#   r}   )funcrc   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      @)rD   rU   rD   rU   NrX   rD   rW   )	r`   r.   rX   rL   r   r5   Zasarrayrz   r{   )r   rc   rX   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   rD   r   r   r*   rW   )	r   r   r.   rX   rM   r5   r/   rz   r{   )r   rX   r(   rc   r   r   r   8test_to_numpy_array_structured_dtype_single_attr_default  s
    
&r   )
field_nameexpected_attr_val)rD   r*   )rU   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   )rU   r   rW   )
r   r   r`   r.   rX   rM   r5   r/   rz   r{   )r   r   r   rX   r(   rc   r   r   r   0test_to_numpy_array_structured_dtype_single_attr#  s    r   
graph_typeedger\   r*   rD   r,   )rD   flowg       @i)rD   rU   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 )NrD   rU   r   r   )r.   rX   rM   r   r5   namesrz   r{   )r   r   r   rX   r(   attrrc   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   rG   rD   rU   rX   rD   nonedge)
r`   r.   rX   rM   r   r5   nanr   rz   r{   )r   rX   r(   r   rc   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   rG   rD   rU   rW   Nr   )r`   r.   rX   rM   r/   infr   r5   r   rz   r{   )r   rX   Znonedgesr(   r   r   rc   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   rD   rU   z7Specifying `weight` not supported for structured dtypesr=   rW   r   N)	r   r   r.   rX   rL   r0   r1   
ValueErrorr5   )r   rX   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	   rD   rU   z#Structured arrays are not supportedr=   r   )	r   r   r.   rX   rL   r0   r1   r2   r5   )r   r   rX   r   r   r   0test_to_numpy_array_structured_multigraph_raisesj  s    r   ))r0   Zimportorskipr.   rz   Znetworkxr   Znetworkx.generators.classicr   r   r   Znetworkx.utilsr   r   Zfixturerr   markZparametrizer%   minmaxrv   rx   r   r/   rP   r   r|   r   ZmeanZmedianr   r   r   r   r   r   r   r   rf   ra   r   r   r   r   r   <module>   sr   

 =

  
$


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