o
    hyJ                     @   sJ  d dl Z 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)dBdC Z*ejdDg dEg dFg dGg dHg dIfdJdK Z+ejdDg dEg dFg dGg dHg dIfdLdM Z,ejdDg dEg dFg dGg dHg dIfdNdO Z-ejdDg dEg dFg dGg dHg dIfejdPej.ej	ej/fdQdR Z0dS )S    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   g/home/www/facesmatcher.com/frenv_anti/lib/python3.10/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J t | t | ksJ 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   $   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,      z/TestConvertNumpyArray.test_identity_graph_arrayc                 C   r5   )z,Conversion from digraph to array to digraph.N)r   r6   r   r)   r   r3   r   r   r   test_identity_digraph_array1   r8   z1TestConvertNumpyArray.test_identity_digraph_arrayc                 C   r5   )z:Conversion from weighted graph to array to weighted graph.N)r   r6   r   r)   r   r3   r   r   r   "test_identity_weighted_graph_array6   r8   z8TestConvertNumpyArray.test_identity_weighted_graph_arrayc                 C   r5   )z>Conversion from weighted digraph to array to weighted digraph.N)r   r6   r   r)   r   r3   r   r   r   $test_identity_weighted_digraph_array;   r8   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	   d	S 1 sVw   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$   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   W   s   " z<TestConvertNumpyArray.test_weight_keyword.<locals>.<genexpr>r	   r   rF   rD   rE   rG   )	r   r   add_edges_fromranger   r6   r.   Ztestingr$   )r   ZWP4rB   r(   r   r   r   test_weight_keywordU   s   
 z)TestConvertNumpyArray.test_weight_keywordc                 C   s  t dgg}t|}t|d d d tksJ t dggt}t|}t|d d d tks7J t dggt}t|}t|d d d tksTJ t dggt	}t|}t|d d d t	ksqJ t dggt
}t|}t|d d d t
ksJ 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    d S 1 sw   Y  d S )Nr*   r   rF   )r*   r*   r*   zInput array must be 2D, not r?   )r.   r/   r   r&   typeintZ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s$J t|d d d tks2J |d d d dks>J |d d d dksJJ d S )NrF   cost)      ?r+   dtyper   r+   rX   )rO   rN   r.   r/   r   r&   rM   r   dtr(   r    r   r   r   test_from_numpy_array_dtype|   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||s5J tj|d	tjd}t||sEJ g d
}t }|dd |D  tj|dtjd}t||sgJ t }|j	t
|dd d|d d d d< tj|d	tjd}t||sJ 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      g | ]	\}}||d fqS r*   r   r   r   r   r   
<listcomp>       zNTestConvertNumpyArray.test_from_numpy_array_parallel_edges.<locals>.<listcomp>rI   T)parallel_edgesr   F)r^   r_   r`   r*   r*   rf   c                 S   ra   rb   r   r   r   r   r   rc      rd   r   rF   N)r.   r/   r   r   r   add_edger&   r   MultiDiGraphrJ   set)r   r(   expectedr   actualr   r   r   $test_from_numpy_array_parallel_edges   s.   z:TestConvertNumpyArray.test_from_numpy_array_parallel_edgesr\   N)rF   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s(J d S )Nr   r*   rY   	edge_attrrF   r_   )r.   r/   r   r&   r   lenr[   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 s%J t|d d d dks3J d S )Nr   r+   )r   rp   c                 s   s    | ]	\}}d |vV  qdS )rF   Nr   )r   _er   r   r   r      s    zUTestConvertNumpyArray.test_from_numpy_array_multiedge_no_edge_attr.<locals>.<genexpr>r*   )r.   r/   r   r&   rh   allitemsrq   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sJ |jd d dks&J d S )Nr   r+   r	   rW   ro   rF   r_   )r.   r/   r   r&   r   rw   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||s&J 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
   rI   N)r.   r/   r   r&   
MultiGraphrg   r   )r   r(   r    rj   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	   rY   N)r   complete_graphr6   rN   rZ   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 r|   )r   rz   r}   r6   rN   rZ   r~   r   r   r   test_dtype_int_multigraph   s   z/TestConvertNumpyArray.test_dtype_int_multigraph)__name__
__module____qualname__r   r   r$   r)   r4   r7   r9   r:   r;   rC   rL   rV   r]   rl   r0   markparametrizerN   r.   rZ   rr   rx   ry   r{   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+      rI   F   )r   rz   rg   )r    r   r   r   multigraph_test_graph   s   r   )operatorrj   M   r   r   c                 C   s"   t j| |d}|d |ksJ d S )N)multigraph_weightr`   )r   r6   )r   r   rj   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sJ |d d	ks"J d S )
Nr   r*   r	   rI   r+   r<   )r+   r+   r`   r   )rg   r   r6   shape)r   r    r(   r   r   r   'test_to_numpy_array_multigraph_nodelist   s
   r   zG, expected      ?       @rY   c                 C   s.   | j dddd tj| td}t|| d S )Nr   r*   r   rI   rY   )rg   r   r6   rR   nptassert_array_equal)r    rj   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*   rI   rY   )
r   r   rg   r6   rS   r.   r/   r   r   to_undirected)r    wr(   rj   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s+J t j| | td}t|d|g|dggsCJ dS )z6Test various functions for reducing multiedge weights.)r>   r+   g      $@r   r*   rI   )r   rZ   N)r   rh   rg   r6   rO   r.   Zallcloser   )funcrj   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      @)rF   rW   rF   rW   NrZ   rF   rY   )	rg   r.   rZ   rN   r   r6   Zasarrayr   r   )r    rj   rZ   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	   rF   r   )r   r*   r   )r*   r   r*   rY   )	r   r   r.   rZ   rO   r6   r/   r   r   )r    rZ   r(   rj   r   r   r   8test_to_numpy_array_structured_dtype_single_attr_default9  s
   
 r   )
field_nameexpected_attr_val)rF   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   rg   r.   rZ   rO   r6   r/   r   r   )r   r   r    rZ   r(   rj   r   r   r   0test_to_numpy_array_structured_dtype_single_attrA  s   r   
graph_typeedger_   r*   rF   r,   )rF   flowg       @i)rF   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 )NrF   rW   r   r   )r.   rZ   rO   r   r6   namesr   r   )r   r   r    rZ   r(   attrrj   r   r   r   4test_to_numpy_array_structured_dtype_multiple_fieldsQ  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   rI   rF   rW   rZ   rF   nonedge)
rg   r.   rZ   rO   r   r6   nanr   r   r   )r    rZ   r(   r   rj   r   r   r   3test_to_numpy_array_structured_dtype_scalar_nonedged  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	
|| | q*dS )
z[Similar to the scalar case, except has a different non-edge value for
    each named field.r   r*   r   rI   rF   rW   rY   Nr   )rg   r.   rZ   rO   r/   infr   r6   r   r   r   )r    rZ   Znonedgesr(   r   r   rj   r   r   r   0test_to_numpy_array_structured_dtype_nonedge_aryn  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 s+w   Y  tjt|d t j| |dd W d   dS 1 sKw   Y  dS )	zgUsing both a structured dtype (with named fields) and specifying a `weight`
    parameter is ambiguous.r	   rF   rW   z7Specifying `weight` not supported for structured dtypesr?   rY   Nr   )	r   r   r.   rZ   rN   r0   r1   
ValueErrorr6   )r    rZ   Zexception_msgr   r   r   7test_to_numpy_array_structured_dtype_with_weight_raises|  s   
"r   c                 C   sj   t jd| d}tdtfdtfg}tjt jdd t j||d d W d    d S 1 s.w   Y  d S )Nr	   r
   rF   rW   z#Structured arrays are not supportedr?   r   )	r   r   r.   rZ   rN   r0   r1   r2   r6   )r   r    rZ   r   r   r   0test_to_numpy_array_structured_multigraph_raises  s
   "r   c                  C   s  d} t jt | d dd}t| }ttj|dd|sJ tt| }ttj|d|d|s2J tt| d }t	j
tdd tj||d	 W d   n1 sSw   Y  tt| d }t	j
tdd tj||d	 W d   dS 1 szw   Y  dS )
z:An exception is raised when `len(nodelist) != A.shape[0]`.r,   r*   kNro   rp   r=   z'nodelist must have the same length as Ar?   r<   )r.   diagonesr   r   r   r&   rA   rK   r0   r1   r   )rH   r(   rj   r#   r   r   r   'test_from_numpy_array_nodelist_bad_size  s    
"r   r#   )r   r	   r+   r*   r   )	   r   r*   r+      )abcdrt   )r^   rf   r+   r	   )r   r+   )r	   r*   )r(   r+   r   Zspam)r*   r	   c                 C   s   t jt ddd}tjtdtt| dd}tj|d | d}t	||s(J tj
|dd	d
 tj|| d}t	||s>J d S )Nr   r*   r   r,   Tmappingcopyr   rX   rF   namer<   )r.   r   r   r   relabel_nodesr   dict	enumerater&   r   set_edge_attributes)r#   r(   rj   r    r   r   r   test_from_numpy_array_nodelist  s   r   c                 C   s   t jt ddd}tg d}tj|tt| dd}tj|tjd | d}t	||s.J tj
|dd	d
 tj|tj| d}t	||sFJ d S )Nr   r*   r   r_   )r*   r+   r   )r	   r   Tr   )r   rp   r=   rX   rF   r   )r   r=   )r.   r   r   r   r   r   r   r   r&   r   r   )r#   r(   Hrj   r    r   r   r   'test_from_numpy_array_nodelist_directed  s   r   c                 C   s   t g dg dg dg dg dg}t }tdD ]\}}|t||d  qtj|t	t| dd	}tj
|dtjd | d
}t||sJJ 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*   Tr   )re   r   rp   r=   )r.   r/   r   rz   r   rJ   	itertoolsrepeatr   r   r&   r   )r#   r(   r   ir   rj   r    r   r   r   )test_from_numpy_array_nodelist_multigraph  s(   
r   graphc                 C   s   | d}t |}t j|tt|dd}t j|d |d}t||s$J | d}|d t |}t j|tt|j	|dd}t j|d |d}t||sOJ d S )Nr,   Tr   r   r   Zfoo)
r   r6   r   r   r   r&   r   add_nodezipr#   )r   r#   r    r(   rj   r   r   r   r   'test_from_numpy_array_nodelist_rountrip  s   


r   )1r   r0   Zimportorskipr.   r   Znetworkxr   Znetworkx.generators.classicr   r   r   Znetworkx.utilsr   r   Zfixturer   r   r   r%   minmaxr   r   r   r/   rR   r   r   r   meanZmedianr   r   r   r   r   r   r   r   rz   rh   r   r   r   r   r   r}   Zwheel_graphr   r   r   r   r   <module>   s    

 Y

  
$



			
	








